Modernize Python tooling (uv, pyproject.toml, src layout, semantic release) - #246
Modernize Python tooling (uv, pyproject.toml, src layout, semantic release)#246salman2013 wants to merge 6 commits into
Conversation
- Add pyproject.toml with PEP 621 metadata, setuptools-scm dynamic versioning, coverage config, isort config, and semantic-release changelog config - Add .. changelog-insertion-marker to CHANGELOG.rst for PSR - Remove __version__ from __init__.py (unused at runtime) - Update docs/conf.py to use importlib.metadata for version - Delete setup.py, setup.cfg, and .coveragerc Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add dependency-groups (test-base/test/django42/quality/doc/ci/dev) - Add uv.lock (94 packages resolved) - Add constraint-dependencies via edx_lint write_uv_constraints - Rewrite tox.ini to use tox-uv>=1 and uv-venv-lock-runner - Rewrite Makefile to use uv run tox and uv sync - Rewrite ci.yml: setup-uv, uv sync --group ci, uv run tox, workflow_call trigger, matrix job name - Delete requirements/ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add release.yml: runs CI via workflow_call, PSR v10.5.3, uploads dist artifact, publishes to PyPI via OIDC trusted publisher - Delete pypi-publish.yml (replaced by release.yml) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move code_annotations/ to src/code_annotations/ - Add where = ["src"] to [tool.setuptools.packages.find] - Update tox.ini quality commands to src/code_annotations paths - Update docs/conf.py sphinx-apidoc path to src/code_annotations - Update coverage omit path in pyproject.toml - Rewrite Makefile to use direct uv run --group commands (no tox) - Regenerate uv.lock Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Thanks for the pull request, @salman2013! This repository is currently maintained by Once you've gone through the following steps feel free to tag them in a comment and let them know that your changes are ready for engineering review. 🔘 Get product approvalIf you haven't already, check this list to see if your contribution needs to go through the product review process.
🔘 Provide contextTo help your reviewers and other members of the community understand the purpose and larger context of your changes, feel free to add as much of the following information to the PR description as you can:
🔘 Get a green buildIf one or more checks are failing, continue working on your changes until this is no longer the case and your build turns green. DetailsWhere can I find more information?If you'd like to get more details on all aspects of the review process for open source pull requests (OSPRs), check out the following resources: When can I expect my changes to be merged?Our goal is to get community contributions seen and reviewed as efficiently as possible. However, the amount of time that it takes to review and merge a PR can vary significantly based on factors such as:
💡 As a result it may take up to several weeks or months to complete a review and merge your PR. |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
requirements/doc.txt was removed in the uv migration, so RTD builds were failing. Switch to installing via uv export and pip install. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
irfanuddinahmad
left a comment
There was a problem hiding this comment.
Verified against actual current file content, live CI, and by actually running commands locally against this branch -- not just reading the diff. All CI checks are green, which is expected since the bugs below aren't caught by CI.
Same changelog: "false" bug as edx-lint#563 and api-doc-tools#409 -- identical release.yml pattern across all three, looks template-derived rather than repo-specific.
What's done correctly here and worth not re-litigating: license/SPDX handling (confirmed via an actual local build that it doesn't raise InvalidConfigError), the Django version-matrix uses the correct [tool.uv].conflicts pattern, isort is both declared and actually wired into the quality targets (unlike a sibling repo), no ruff scope-creep, and the OIDC publish + pre-flight tag/PyPI version check both check out.
| with: | ||
| git_committer_name: "github-actions" | ||
| git_committer_email: "github-actions@github.com" | ||
| changelog: "false" |
There was a problem hiding this comment.
changelog: "false" overrides the [tool.semantic_release.changelog] config this same PR carefully builds in pyproject.toml (mode = "update", matching insertion_flag) -- the action-level flag wins, silently disabling changelog generation entirely despite the config looking correct. This is the exact incident class that already caused real CHANGELOG.rst content loss in a sibling repo in this effort.
| {include-group = "ci"}, | ||
| ] | ||
|
|
||
| [tool.uv] |
There was a problem hiding this comment.
Missing default-groups = []. I reproduced this directly against the PR branch:
$ uv run --group django42 python -Wd -m pytest --collect-only -q
error: Groups `dev` (enabled by default) and `django42` are incompatible with the conflicts: {`code-annotations:dev`, `code-annotations:django42`}
This is make test-all's first line (Makefile), so that target is broken today for anyone running it locally. CI stays green only because tox-uv happens to pass --no-default-groups internally when driving tests through tox -- it masks the gap rather than avoiding it. uv.lock's own [manifest].conflicts list independently corroborates this: it enumerates django42 vs. test, doc, quality, and dev.
| pull_request: | ||
| branches: | ||
| - "**" | ||
| workflow_call: |
There was a problem hiding this comment.
This new workflow_call: trigger, combined with the pre-existing push: [master] trigger a few lines up (unchanged by this PR), means every push to master now runs this full matrix twice concurrently: once via the direct push trigger, once via release.yml calling this workflow as its run_tests job. Recommend dropping the push: [master] trigger now that release.yml owns that path.
|
One more, on a file this PR doesn't touch so I can't anchor it inline: Line 1 references a file this PR deletes ( |
Summary
pyproject.toml(PEP 621/639):setuptools-scmdynamic versioning,importlib.metadatafor docs version, coverage + isort config, semantic-release changelog config. Deletesetup.py,setup.cfg,.coveragerc.uv:dependency-groups(test-base/test/django42/quality/doc/ci/dev),uv.lock, rewritetox.iniwithtox-uv>=1/uv-venv-lock-runner, rewriteMakefilewith directuv run --groupcommands, update CI toastral-sh/setup-uvwithworkflow_calltrigger. Deleterequirements/.python-semantic-releaseworkflow:release.ymlruns CI, cuts releases via PSR v10.5.3, publishes to PyPI via OIDC trusted publisher. Deletepypi-publish.yml.src/layout:git mv code_annotations/ src/code_annotations/, update all filesystem paths intox.ini,docs/conf.py,pyproject.toml,Makefile.Ticket: openedx/public-engineering#519
Test plan
release.ymlbefore merging🤖 Generated with Claude Code