@@ -91,3 +91,49 @@ def _git_head_sha(repo_dir: Path) -> Optional[str]:
9191def _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