setup_file.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import distutils.core
  2. import re
  3. import setuptools
  4. def parse(setup_py_content):
  5. """Parse a setup.py file and extract the arguments passed to the setup method"""
  6. # Make the setup method return the arguments that are passed to it
  7. def _save_passed_args(**kwargs):
  8. return kwargs
  9. distutils.core.setup = _save_passed_args
  10. setuptools.setup = _save_passed_args
  11. setup_py_content = setup_py_content.replace("setup(", "passed_arguments = setup(")
  12. # Fetch the arguments that were passed to the setup.py
  13. exec(setup_py_content, globals())
  14. return globals()["passed_arguments"]
  15. def parse_name_and_version(setup_py_content):
  16. """Extract the name and version from a setup.py file"""
  17. passed_arguments = parse(setup_py_content)
  18. return passed_arguments.get("name"), passed_arguments.get("version")
  19. def get_provenance(setup_py_content):
  20. """Provenance for a setup.py file is the index of the line that contains `install_requires`"""
  21. for index, line in enumerate(setup_py_content.splitlines()):
  22. if re.search(r"(packages|install_requires)\s*=", line):
  23. return index + 1
  24. return -1
  25. def parse_requirements(setup_py_content):
  26. """Extract the dependencies from a setup.py file"""
  27. passed_arguments = parse(setup_py_content)
  28. requirements = passed_arguments.get("install_requires", passed_arguments.get("packages", []))
  29. return "\n".join(requirements)