deps(uv): wywal workspace install + udokumentuj 11 sdist-only exceptions#177
Merged
Conversation
Praktyka #1 z lirantal/pypi-security-best-practices (binary-only installs). Sdist (source distribution) wykonuje setup.py podczas `uv sync` - to klasyczny wektor supply-chain attack: zlosliwy maintainer wpycha arbitralny kod do publishowanego pakietu, ktory wykonuje sie u kazdego co robi `pip install` / `uv sync`. Wheels (skompilowane binarne) nie wykonuja kodu przy instalacji. Globalnego `no-build = true` w [tool.uv] NIE da sie ustawic, bo blokuje editable install workspace roota (bpp-iplweb sam jest sdist-ish dla uv). Zamiast tego: 1. Komentarz w [tool.uv] dokumentuje polityke + uzasadnienie braku globalnego no-build. 2. Pre-commit hook `uv-lock-no-build` uruchamia `uv lock --check --no-build` przy zmianach pyproject.toml lub uv.lock - failuje jesli ktoras dep wymaga build z source. Aktualnie wszystkie 330 zewnetrznych deps maja wheels - hook passes. Gdy nowa dep nie ma wheel, dev dostaje jasny sygnal: znajdz alternatywe, lub zglos wheel u maintainera.
This was referenced Apr 27, 2026
Praktyka #1 z lirantal/pypi-security-best-practices, rev 2 po review. Workspace install (bpp-iplweb editable) nie byl do niczego potrzebny: - bpp-manage.py script: dead code (Makefile uzywa `python src/manage.py`) - pytest11 entry point: jedyne load-bearing uzycie - przeniesione do pytest.ini addopts jako `-p testcontainers_bpp.plugin` - import bpp_iplweb: 0 wystapien w src/ Zmiany: - pyproject.toml: usunieto [project.scripts] + [project.entry-points] - pytest.ini: dodano `-p testcontainers_bpp.plugin` na poczatku addopts (laduje plugin PRZED conftest.py - krytyczne, plugin musi wstrzyknac DJANGO_BPP_DB_PORT itp do os.environ przed Django settings load) - Makefile: --no-install-project w prepare-developer-machine-{macos,linux} i uv-sync target - .github/workflows/tests.yml + refresh-baseline.yml: --no-install-project - Dockerfile: juz mial --no-install-project (no change) Globalne `no-build = true` w [tool.uv] zostalo SPRAWDZONE i okazalo sie nieosiagalne - 11 pre-existing third-party deps jest sdist-only: crispy-forms-foundation, cssmin, django-autocomplete-light, django-columns, django-static-sitemaps, django-tabular-permissions, langdetect, pylatexenc, pyoai, python-ldap, wsgiutils. uv nie ma czystego "wheel-only with exceptions" trybu (tylko all-or-none + per-package no-build, ktore jest blacklist nie whitelist). Usunieto dlatego pre-commit hook `uv-lock-no-build` ktory failowal na cssmin przy KAZDEJ zmianie pyproject.toml (false positive). Polityka wheel-only egzekwowana teraz przez: 1. PR review (PULL_REQUEST_TEMPLATE.md ma checkbox dla nowych dep) 2. Trivy CVE scan w docker-bake 3. uv-secure CVE scan w dependency-audit.yml workflow Smoke test: - `uv sync --frozen --no-install-project --all-extras` -> ok - `pytest --help` zawiera `--no-testcontainers` -> plugin ladowany - `pytest src/pbn_integrator/tests/test_helpers.py` -> 2 passed
# Conflicts: # Makefile # pyproject.toml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Podsumowanie
Praktyka #1 z lirantal/pypi-security-best-practices, rev 2 po review.
Pierwotnie PR dodawał pre-commit hook
uv-lock-no-buildjako enforcement (no-build = trueglobalnie nie szło). Po review z @mpasternak okazało się że workspace install jest do niczego nie potrzebny — można go usunąć całkowicie. Sprawdzone i potwierdzone:bpp-manage.pyscript ([project.scripts]) — dead code, 0 wywołań w Makefile/Dockerfile/workflows.testcontainers_bpppytest plugin ([project.entry-points."pytest11"]) — jedyne load-bearing użycie. Można załadować przez-pwpytest.ini.import bpp_iplweb— 0 wystąpień wsrc/.Co się zmienia
pyproject.toml: usunięto[project.scripts]i[project.entry-points."pytest11"].pytest.ini: dodano-p testcontainers_bpp.pluginna początku addopts (laduje plugin PRZED conftest.py — krytyczne dla plugin'spytest_load_initial_conftestshook który wstrzykujeDJANGO_BPP_DB_PORTitp. doos.environprzed Django settings load).Makefile:--no-install-projectwprepare-developer-machine-{macos,linux}iuv-sync..github/workflows/{tests,refresh-baseline}.yml:--no-install-project.--no-install-project(no change).uv-lock-no-build— failował nacssminprzy każdej zmianie pyproject.toml (false positive na pre-existing sdist-only deps).Dlaczego globalne
no-build = truenie poszłoSprawdzone: 11 pre-existing third-party deps jest sdist-only:
crispy-forms-foundationcssmindjango-autocomplete-lightdjango-columnsdjango-static-sitemapsdjango-tabular-permissionslangdetectpylatexencpyoaipython-ldapldap)wsgiutilsuv nie ma czystego "wheel-only with exceptions" trybu — albo
no-build = trueglobalnie (blokuje te 11), albo nic.Egzekwowanie wheel-only (po tym PR)
Polegamy na:
PULL_REQUEST_TEMPLATE.md(PR docs(security): proces 'Adding a new dependency' + PR template #183) ma checkbox "Jeśli ten PR dodaje nową zależność".dependency-audit.ymlworkflow (PR ci(security): workflow skanowania CVE w uv.lock + bump jaraco.context #180).11 sdist-only exceptions udokumentowane w komentarzu
[tool.uv]w pyproject.toml + planowany follow-up dla wymiany na wheel-publishing alternatywy (gdzie istnieją:cssmin→rcssmin,langdetect→lingua-language-detector).Plan testowy
uv sync --frozen --no-install-project --all-extras→ ok (330 packages installed).pytest --helpzawiera--no-testcontainers→ plugin ładuje się via-p.pytest src/pbn_integrator/tests/test_helpers.py::TestPerformanceCharacteristics→ 2 passed.uv run pre-commit run --files <changed>→ green.🤖 Generated with Claude Code