Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __repr__(self):
project_dir = short(MetaDefs.project_dir)
return "%s definitions, %s" % (len(self.definitions), project_dir)
def __init__(self, meta, scm):
"""
:param setupmeta.model.SetupMeta meta: Parent meta object
:param Scm scm: Backend SCM
"""
self.meta = meta
given = meta.value("versioning")
self.strategy = Strategy.from_meta(given)
self.enabled = bool(given and self.strategy and not self.strategy.problem)
self.scm = scm
self.generate_version_file = scm and scm.root != setupmeta.MetaDefs.project_dir and not os.environ.get(setupmeta.SCM_DESCRIBE)
self.problem = None
if not self.strategy:
self.problem = "setupmeta versioning not enabled"
elif self.strategy.problem:
self.problem = self.strategy.problem
elif not self.scm:
self.problem = "project not under a supported SCM"
setupmeta.trace("versioning given: '%s', strategy: [%s], problem: [%s]" % (given, self.strategy, self.problem))
def run(self):
if not self.setupmeta:
return
self.deleted = 0
self.by_ext = collections.defaultdict(int)
self.clean_direct()
for dirpath, dirnames, filenames in os.walk(setupmeta.MetaDefs.project_dir):
remove = []
for dname in dirnames:
if dname in self.ignored:
remove.append(dname)
elif dname in self.dirs:
remove.append(dname)
self.delete(os.path.join(dirpath, dname))
else:
ext = dname.rpartition(".")[2]
if ext in self.extensions:
remove.append(dname)
self.delete(os.path.join(dirpath, dname))
for dname in remove:
def auto_fill_include_package_data(self):
"""Auto-fill 'include_package_data' if a MANIFEST.in file exists in project"""
if "include_package_data" not in self.attrs:
manifest = os.path.join(MetaDefs.project_dir, "MANIFEST.in")
if os.path.isfile(manifest):
self.add_definition("include_package_data", True, os.path.basename(manifest))
for frame in inspect.stack():
module = inspect.getmodule(frame[0])
if module and is_setup_py_path(module.__file__):
setup_py_path = module.__file__
trace("setup.py found from call stack: %s" % setup_py_path)
break
if not setup_py_path and sys.argv:
if is_setup_py_path(sys.argv[0]):
setup_py_path = sys.argv[0]
trace("setup.py found from sys.argv: %s" % setup_py_path)
if is_setup_py_path(setup_py_path):
setup_py_path = os.path.abspath(setup_py_path)
MetaDefs.project_dir = os.path.dirname(setup_py_path)
trace("project dir: %s" % MetaDefs.project_dir)
# Determine path to setup.py module from call stack
for frame in inspect.stack():
module = inspect.getmodule(frame[0])
if module and is_setup_py_path(module.__file__):
setup_py_path = module.__file__
trace("setup.py found from call stack: %s" % setup_py_path)
break
if not setup_py_path and sys.argv:
if is_setup_py_path(sys.argv[0]):
setup_py_path = sys.argv[0]
trace("setup.py found from sys.argv: %s" % setup_py_path)
if is_setup_py_path(setup_py_path):
setup_py_path = os.path.abspath(setup_py_path)
MetaDefs.project_dir = os.path.dirname(setup_py_path)
trace("project dir: %s" % MetaDefs.project_dir)
self.merge(
SimpleModule(package, "__about__.py"),
SimpleModule(package, "__version__.py"),
SimpleModule(package, "__init__.py"),
SimpleModule("src", package, "__about__.py"),
SimpleModule("src", package, "__version__.py"),
SimpleModule("src", package, "__init__.py"),
)
if not self.name:
warn("'name' not specified in setup.py, auto-fill will be incomplete")
elif not self.definitions.get("packages") and not self.definitions.get("py_modules"):
warn("No 'packages' or 'py_modules' defined, this is an empty python package")
scm = scm or project_scm(MetaDefs.project_dir)
self.versioning = Versioning(self, scm)
self.versioning.auto_fill_version()
self.fill_urls()
self.auto_adjust("author", self.extract_email)
self.auto_adjust("contact", self.extract_email)
self.auto_adjust("maintainer", self.extract_email)
self.requirements = Requirements(self.pkg_info)
self.auto_fill_requires("install_requires")
self.auto_fill_requires("tests_require")
if self.requirements.dependency_links:
self.auto_fill("dependency_links", self.requirements.dependency_links, self.requirements.links_source)
self.auto_fill_classifiers()
def finalize(self, upstream):
self.attrs.update(MetaDefs.dist_to_dict(upstream))
self.find_project_dir(self.attrs.pop("_setup_py_path", None))
scm = self.attrs.pop("scm", None)
# Add definitions from setup()'s attrs (highest priority)
for key, value in self.attrs.items():
if key not in self.definitions:
self.add_definition(key, value, EXPLICIT)
# Add definitions from PKG-INFO, when available
self.pkg_info = PackageInfo(MetaDefs.project_dir)
for key, value in self.pkg_info.info.items():
if key in MetaDefs.all_fields:
self.add_definition(key, value, relative_path(self.pkg_info.path))
# Allow to auto-fill 'name' from setup.py's __title__, if any
self.merge(SimpleModule("setup.py"))
title = self.definitions.get("title")
if title:
self.auto_fill("name", title.value, source=title.source)
if "--name" in sys.argv[1:3]:
# No need to waste time auto-filling anything if all we need to show is package name
return self
packages = self.attrs.get("packages", [])
py_modules = self.attrs.get("py_modules", [])