Skip to content
Snippets Groups Projects

fix(rules): detect unrequired Python packages

Open Jelle van der Waa requested to merge jelle/namcap:teach-pydepends-metadata into master
3 unresolved threads
Files
2
+ 26
0
@@ -6,6 +6,7 @@ import ast
import importlib
import sys
import sysconfig
from packaging.metadata import parse_email, Metadata
import Namcap.package
from Namcap.util import is_script, script_type
from Namcap.ruleclass import TarballRule
@@ -119,6 +120,26 @@ def get_imports(fileobj, filename, modules, gir_modules, gir_versions):
gir_versions[module.value] = version.value
def get_unrequired_deps(metadata):
try:
raw, _ = parse_email(metadata.read())
parsed = Metadata.from_raw(raw)
except Exception:
return []
pyversion = f"{sys.version_info.major}.{sys.version_info.minor}"
environment = {"python_version": pyversion}
unrequired_dep = []
for dep in parsed.requires_dist:
if dep.marker is None:
continue
if "python_version" in str(dep.marker) and not dep.marker.evaluate(environment):
# Some modules on PyPi are typing-extensions while upstream calls them typing_extensions
unrequired_dep.append(f"python-{dep.name.replace('-', '_')}")
return unrequired_dep
class PythonDependencyRule(TarballRule):
name = "pydepends"
description = "Checks python dependencies"
@@ -127,11 +148,14 @@ class PythonDependencyRule(TarballRule):
modules = defaultdict(set)
gir_modules = defaultdict(set)
gir_versions = defaultdict(str)
unrequired_packages = []
for entry in tar:
if not entry.isfile():
continue
f = tar.extractfile(entry)
if entry.name.endswith("METADATA"):
Please register or sign in to reply
unrequired_packages = get_unrequired_deps(f)
if not entry.name.endswith(".py") and not is_script(f):
continue
if is_script(f) and script_type(f) not in ["python", "python3"]:
@@ -157,6 +181,8 @@ class PythonDependencyRule(TarballRule):
# Print python module deps
for pkg, libraries in (dependlist | gir_dependlist).items():
if pkg in unrequired_packages:
continue
if isinstance(libraries, set):
files = list(libraries)
needing = set().union(*[liblist[lib] for lib in libraries])
Loading