feat: add local PyPI repository support #50

Merged
benvin merged 1 commits from benvin/local-pypi into master 2026-06-23 22:13:09 +10:00
Owner

Summary

  • Upload Python wheels/sdists to local PyPI repos with filename validation
  • PEP 503 simple index computed on-demand from stored files
  • Package names normalized per PEP 503 (lowercase, hyphens)
  • Overwrites rejected (409 Conflict)

Test plan

  • Build wheel with uv build → upload → verify simple index HTML → uv pip install from local repo
  • Bad filename rejection (400)
  • Overwrite rejection (409)
  • Hash integrity verification on download
## Summary - Upload Python wheels/sdists to local PyPI repos with filename validation - PEP 503 simple index computed on-demand from stored files - Package names normalized per PEP 503 (lowercase, hyphens) - Overwrites rejected (409 Conflict) ## Test plan - [x] Build wheel with `uv build` → upload → verify simple index HTML → `uv pip install` from local repo - [x] Bad filename rejection (400) - [x] Overwrite rejection (409) - [x] Hash integrity verification on download
unkinben added 1 commit 2026-06-23 22:04:24 +10:00
feat: add local PyPI repository support
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/build Pipeline was successful
bb81eafa71
Upload Python wheels and sdists to local PyPI repos. The simple index
(PEP 503) is computed on-demand from stored files.

- Upload validates .whl/.tar.gz/.zip filenames, parses and normalizes
  package names per PEP 503, stores under {package}/{filename}
- GET /api/v1/local/{name}/simple/ serves root index listing all packages
- GET /api/v1/local/{name}/simple/{pkg}/ serves per-package file listing
  with sha256 hashes for integrity verification
- Files are downloadable at /api/v1/local/{name}/{package}/{filename}
- Overwrites rejected with 409

Tested e2e: uv build wheel → upload → uv pip install from local repo
benvin merged commit de96637122 into master 2026-06-23 22:13:09 +10:00
benvin deleted branch benvin/local-pypi 2026-06-23 22:13:09 +10:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unkin/artifactapi#50