Skip to content

Commit 35ea2bf

Browse files
committed
python, pypi, features added
1 parent 72108ab commit 35ea2bf

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

scripts/sbom_fetcher.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,49 @@ def _git_head_sha(repo_dir: Path) -> Optional[str]:
9191
def _find_files(root: Path, filename: str) -> List[Path]:
9292
return [p for p in root.rglob(filename)]
9393

94+
# Python/PyPI: pyproject.toml (PEP 621 + Poetry), requirements*.txt
95+
96+
def _parse_python(repo: Path) -> List[dict]:
97+
results = []
98+
for pyproj in _find_files(repo, "pyproject.toml"):
99+
data = _read_toml(pyproj)
100+
if not data:
101+
continue
102+
for dep in (data.get("project", {}).get("dependencies") or []):
103+
results.append({
104+
"package_manager": "pypi",
105+
"dependency_name": str(dep).split()[0],
106+
"dependency_version_requirement": str(dep),
107+
"dependency_scope": "runtime",
108+
"manifest_path": str(pyproj.relative_to(repo)),
109+
"source_type": "manifest",
110+
"direct": True,
111+
})
112+
poetry = data.get("tool", {}).get("poetry", {})
113+
for section, scope in (("dependencies", "runtime"), ("dev-dependencies", "development")):
114+
for name, spec in (poetry.get(section) or {}).items():
115+
results.append({
116+
"package_manager": "pypi",
117+
"dependency_name": name,
118+
"dependency_version_requirement": spec if isinstance(spec, str) else json.dumps(spec),
119+
"dependency_scope": scope,
120+
"manifest_path": str(pyproj.relative_to(repo)),
121+
"source_type": "manifest",
122+
"direct": True,
123+
})
124+
for req in list(repo.rglob("requirements*.txt")):
125+
content = _read_text(req) or ""
126+
for line in content.splitlines():
127+
line = line.strip()
128+
if not line or line.startswith("#") or line.startswith("-r") or line.startswith("--"):
129+
continue
130+
results.append({
131+
"package_manager": "pypi",
132+
"dependency_name": re.split(r"[<>=!~ ]", line, maxsplit=1)[0],
133+
"dependency_version_requirement": line,
134+
"dependency_scope": "runtime",
135+
"manifest_path": str(req.relative_to(repo)),
136+
"source_type": "manifest",
137+
"direct": True,
138+
})
139+
return results

0 commit comments

Comments
 (0)