feat(python): add pyproject.toml provider support#358
Conversation
Review Summary by QodoAdd pyproject.toml provider support for Python dependencies
WalkthroughsDescription• Add PythonPyprojectProvider to parse pyproject.toml manifest files • Support PEP 621 and Poetry dependency formats • Integrate provider into Ecosystem.resolveProvider() switch statement • Add comprehensive unit tests and documentation updates Diagramflowchart LR
A["pyproject.toml manifest"] -->|"Ecosystem.resolveProvider()"| B["PythonPyprojectProvider"]
B -->|"parseDependencyStrings()"| C["PEP 621 & Poetry formats"]
C -->|"generateRequirementsTxt()"| D["Temporary requirements.txt"]
D -->|"PythonControllerBase"| E["Dependency resolution"]
E -->|"SBOM generation"| F["CycloneDX output"]
B -->|"handleIgnoredDependencies()"| G["Filter ignored deps"]
File Changes1. src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
|
Code Review by Qodo
1. Poetry pre-release crash
|
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Outdated
Show resolved
Hide resolved
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Outdated
Show resolved
Hide resolved
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Outdated
Show resolved
Hide resolved
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Outdated
Show resolved
Hide resolved
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Outdated
Show resolved
Hide resolved
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Outdated
Show resolved
Hide resolved
|
Forgot to mention, This needs a rebase and new provider needs to support license identification. |
src/test/java/io/github/guacsec/trustifyda/providers/Python_Pyproject_Provider_Test.java
Outdated
Show resolved
Hide resolved
|
/review |
|
Persistent review updated to latest commit 1036cbc |
There was a problem hiding this comment.
Verification Report for TC-3851
| Check | Result | Details |
|---|---|---|
| Scope Containment | WARN | 9 files changed. PythonProvider.java (new base class) and PythonPipProvider.java (refactored) are out-of-scope but justified by refactoring. 3 test fixtures are reasonable additions. |
| Diff Size | PASS | ~1123 lines across 9 files — proportionate for new provider + refactoring + tests + README |
| Commit Traceability | PASS | All 5 commits reference TC-3851 in message body |
| Sensitive Patterns | PASS | No sensitive patterns detected (false positive on Environment import) |
| CI Status | WARN | Java 17/21 builds PASS. All Python, Go, Maven, Gradle, Cargo, Syft integration tests PASS. npm/pnpm/yarn integration tests FAIL — unrelated to Python changes (Stack analysis validation in JS ecosystem) |
| Acceptance Criteria | PASS | 6/6 criteria met (see below) |
| Verification Commands | PASS | Python_Pyproject_Provider_Test — all 15 tests pass |
Acceptance Criteria Details
| # | Criterion | Result | Evidence |
|---|---|---|---|
| 1 | pyproject.toml recognized by Ecosystem.resolveProvider() |
✅ PASS | case "pyproject.toml" -> new PythonPyprojectProvider(manifestPath) in switch statement |
| 2 | PEP 621 [project.dependencies] parsed correctly |
✅ PASS | parseDependencyStrings() reads toml.getArray("project.dependencies"). Test test_parse_pep621_dependencies verifies anyio==3.6.2, flask==2.0.3, requests==2.25.1 |
| 3 | Poetry [tool.poetry.dependencies] parsed correctly |
✅ PASS | parseDependencyStrings() reads toml.getTable("tool.poetry.dependencies") with poetryDepToRequirement() converting ^/~ to PEP 440 ranges. Test test_parse_poetry_dependencies_converts_to_pep440 verifies anyio>=3.6.2,<4.0.0 etc. |
| 4 | Valid pypi PURLs generated |
✅ PASS | toPurl() in PythonProvider uses Ecosystem.Type.PYTHON.getType() (= "pypi"). Test test_provideComponent_generates_correct_media_type checks pkg:pypi/ in SBOM |
| 5 | Stack and component analysis work end-to-end | ✅ PASS | PythonProvider.provideStack() and provideComponent() use getRequirementsPath() → temp file → PythonControllerBase.getDependencies() → SBOM. Test covers provideComponent() |
| 6 | README.md updated | ✅ PASS | pyproject.toml mentioned in Python support section, exhortignore examples, CLI usage, and dedicated Python support section |
Overall: WARN
All acceptance criteria are met. The WARN is due to:
- Out-of-scope files from justified refactoring (extracting
PythonProviderbase class) - Pre-existing npm/pnpm/yarn CI failures unrelated to this PR's Python changes
This comment was AI-generated by sdlc-workflow/verify-pr v0.4.2.
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Show resolved
Hide resolved
src/main/java/io/github/guacsec/trustifyda/providers/PythonPyprojectProvider.java
Show resolved
Hide resolved
|
/review |
Code Review by QodoSorry, something went wrongWe weren't able to complete the code review on our side. Please try againⓘ The new review experience is currently in Beta. Learn more |
Add support for pyproject.toml manifest files in the Java client library, enabling analysis of Python projects using Poetry, uv, or PEP 621-compliant tools. - New PythonPyprojectProvider that parses TOML dependency sections and generates temporary requirements.txt for dependency tree resolution - Refactor shared Python infrastructure into PythonProvider base class - Support PEP 621 [project.dependencies] and Poetry [tool.poetry.dependencies] (production deps only) - Convert Poetry version operators (^ and ~) to PEP 440 ranges - Handle bare versions, pre-release suffixes, and ignore patterns - Add license resolution and identification support - Update README with pyproject.toml documentation - Comprehensive unit tests for parsing, conversion, and edge cases Jira-Issue: TC-3851 Assisted-by: Claude Code Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary
PythonPyprojectProviderto parsepyproject.tomlmanifest files, supporting PEP 621 ([project.dependencies],[project.optional-dependencies]) and Poetry ([tool.poetry.dependencies],[tool.poetry.group.*.dependencies]) dependency formatspyproject.tomlcase inEcosystem.resolveProvider()switch statementpyproject.tomlsupport alongsiderequirements.txtTest plan
Ecosystem.getProvider()returnsPythonPyprojectProviderforpyproject.toml(unit test)[project.dependencies]parsing with version specifiers (unit test)[project.optional-dependencies]parsing (unit test)[tool.poetry.dependencies]parsing (unit test)[tool.poetry.group.*.dependencies]parsing (unit test)pythonexcluded from Poetry dependencies (unit test)RUN_PYTHON_BIN=true)Implements TC-3851
🤖 Generated with Claude Code