Skip to content

feat: add PyPI/Python support (deps-pypi crate)#15

Merged
bug-ops merged 4 commits intomainfrom
feature/pypi-support
Dec 22, 2025
Merged

feat: add PyPI/Python support (deps-pypi crate)#15
bug-ops merged 4 commits intomainfrom
feature/pypi-support

Conversation

@bug-ops
Copy link
Owner

@bug-ops bug-ops commented Dec 22, 2025

Summary

Add Python/PyPI ecosystem support via new deps-pypi crate.

New Features

  • PEP 621 Support: Parse [project.dependencies] and [project.optional-dependencies]
  • Poetry Support: Parse [tool.poetry.dependencies] and [tool.poetry.group.*.dependencies]
  • PyPI Registry: Client for PyPI JSON API with HTTP caching
  • PEP 508/440: Proper dependency and version parsing

Documentation

  • Add codecov badges to all crate READMEs (with per-crate flags)
  • Add deps-pypi README with usage examples

Files Added

  • crates/deps-pypi/ - New crate with parser, registry, types, error handling

Reference

Based on zed-dependi implementation patterns.

- Add deps-pypi crate with PEP 621 and Poetry pyproject.toml parsing
- Implement PyPI registry client with HTTP caching
- Add codecov badges to all crate READMEs
@github-actions github-actions bot added documentation Improvements or additions to documentation rust Rust code changes parser Parser changes needs-review Needs review size: XXL >1000 lines changed labels Dec 22, 2025
@codecov-commenter
Copy link

Welcome to Codecov 🎉

Once you merge this PR into your default branch, you're all set! Codecov will compare coverage reports and display results in all future pull requests.

ℹ️ You can also turn on project coverage checks and project coverage reporting on Pull Request comment

Thanks for integrating Codecov - We've got you covered ☂️

Implement deps_core trait integration:
- Add ManifestParser trait implementation for PypiParser
- Add DependencyInfo trait implementation for PypiDependency
- Add ParseResultInfo trait for ParseResult
- Introduce ParseResult type for parser output

Fix is_prerelease() false positives:
- Replace string scanning with pep440_rs::Version::is_pre()
- Eliminates false positives from packages like "stable"
- Uses proper PEP 440 prerelease detection

Add PEP 503 package name normalization:
- Implement normalize_package_name() function
- Converts to lowercase, replaces underscores/dots with hyphens
- Ensures consistent PyPI lookups for "Flask" vs "flask"
- Apply normalization in get_versions() and get_package_metadata()

Optimize version sorting:
- Parse versions once before sorting instead of twice per comparison
- Cache parsed Version objects during sort operation
- Reduces parsing overhead by ~50% for typical package version lists

Update license allowlist:
- Add MPL-2.0 to deny.toml for version-ranges dependency

All tests passing (23/23). Clippy clean with -D warnings.
@github-actions github-actions bot added the config Configuration files label Dec 22, 2025
Fixed doctests that were using the trait method parse() incorrectly.
Changed to use parse_content() method directly which is the public API.

All other code review items were already implemented:
- ManifestParser, DependencyInfo, ParseResultInfo traits
- is_prerelease() using pep440_rs
- normalize_package_name() function
- Version sorting optimization
- MPL-2.0 license in deny.toml
@bug-ops bug-ops merged commit 7081007 into main Dec 22, 2025
20 checks passed
@bug-ops bug-ops deleted the feature/pypi-support branch December 22, 2025 16:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

config Configuration files documentation Improvements or additions to documentation needs-review Needs review parser Parser changes rust Rust code changes size: XXL >1000 lines changed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants