Skip to content

Modernize openedx-chem to uv + pyproject.toml + semantic-release - #161

Merged
feanil merged 21 commits into
openedx:masterfrom
irfanuddinahmad:irfanuddinahmad/modernize-python-tooling
Sep 29, 2026
Merged

feanil merged 21 commits into
openedx:masterfrom
irfanuddinahmad:irfanuddinahmad/modernize-python-tooling

Conversation

@irfanuddinahmad

@irfanuddinahmad irfanuddinahmad commented Jul 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Modernize openedx-chem to uv + pyproject.toml (PEP 621/735) + python-semantic-release.

Part of openedx/public-engineering#506 (tracked in
openedx/public-engineering#516).

  • Move chem/ into src/chem/ (src/ layout, per the 2026-07-15 decision on #506) —
    precedent verified directly against openedx/xblocks-extra (has src/); chem's
    own sibling migration openedx-calc (#217) did the same.
  • Replace setup.py with pyproject.toml (PEP 621 static metadata). This repo never
    had a setup.cfg, so there was no isort/pylint config to port.
  • Switch from pip-compile to uv with PEP 735 dependency groups (test, quality,
    ci, dev); commit uv.lock.
  • Update tox.ini to use tox-uv with uv-venv-lock-runner.
  • Update CI to use astral-sh/setup-uv; SHA-pin all CI-workflow actions.
  • Add python-semantic-release + release.yml, publishing to PyPI via OIDC.

Removed

Deleted files:

  • setup.py (superseded by pyproject.toml; no setup.cfg existed to delete)
  • .coveragerc (moved to [tool.coverage.*] in pyproject.toml)
  • requirements/ (superseded by uv.lock + [dependency-groups])
  • .github/workflows/pypi-publish.yml (token-based publish-on-tag workflow;
    replaced by release.yml's OIDC publish_to_pypi job). Grepped every workflow
    file for other pypi-publish/pypa/gh-action references — this was the only one.

Removed Makefile targets: none — help/clean kept as-is; upgrade repointed
at uv/edx_lint; test/requirements are new targets (didn't exist before) that
now wrap uv run tox / uv sync --group dev.

tox.ini: dropped the vestigial django42 factor from envlist/CI matrix. chem
has no Django dependency anywhere in its own requirements (grepped all the old
requirements/*.txt, confirmed none mention Django) — the factor never actually
exercised a meaningful matrix, so envlist is now simply py312,quality, and the CI
matrix (toxenv: [py312, quality]) was updated to match in the same commit.

codecov.yml added

This migration's [tool.coverage.run] (in pyproject.toml) omits chem/tests/*
from coverage measurement, per this effort's standard omit pattern — a test file
trivially covers itself just by running, so counting it was inflating the reported
package coverage (previously: source = chem with no omit, so
chem/tests/test_all.py itself counted toward the percentage). That's a one-time
drop in the reported baseline (98.23% → 96.33%, 5 files/622 lines → 4 files/300
lines), not a regression in actual production-code coverage — codecov/patch (diff
coverage) is 100%, and the underlying miss/partial-branch counts in
chemcalc.py/chemtools.py/miller.py are byte-for-byte identical before and
after (5 misses, 6 partial branches, confirmed via uv run coverage report -m).
Added codecov.yml with target: auto for the project check (no fixed
threshold) — it compares against each PR's own base commit, so this one-time
drop becomes the new baseline once merged, and future PRs are still caught if
they cause a real regression. Sibling repos already migrated in this same
effort (ccx-keys#190, opaque-keys#461, openedx-filters#381,
openedx-core#704) all carry an equivalent file; openedx-chem had none
before this PR.

Not included

  • No ruff migration — out of scope per the 2026-07-15 decision on #506
    (pylint/pycodestyle left exactly as they were; both still pass at 10.00/10 and
    clean, respectively).
  • No dependency-group version matrix (e.g. django42) — see above, there's nothing
    to matrix against.
  • Dockerfile was left untouched — it's a legacy xenial-common image not
    referenced by any CI workflow (only make test), out of scope for this migration.

Versioning

Dynamic, via setuptools-scm reading the latest git tag (fallback_version = "0.0.0"). Pre-flight check passed: latest tag 2.0.0 (via
git tag --sort=-v:refname) matches the version currently live on PyPI for the
chem project (2.0.0), so semantic-release's first automated release won't compute
a version lower than what's already published. (Note: chem/__init__.py on master
currently has an uncommitted/untagged __version__ = '2.0.1' bump that was never
released — this is superseded by setuptools-scm reading the actual tag.)

Known gaps / needs maintainer action (not code issues)

  1. PyPI OIDC trusted publisher needs configuring for the chem PyPI project
    before the first automated release can publish. This is a PyPI-project-settings
    action that can't be done via API/from this repo. (OPENEDX_SEMANTIC_RELEASE_GITHUB_TOKEN
    itself is already a standard org-level secret used by many other repos.)
  2. .github/workflows/upgrade-python-requirements.yml calls the org's shared
    reusable workflow
    , which hardcodes add-paths: requirements. Now that
    requirements/ is deleted, that scheduled job will silently stop producing real
    dependency-upgrade PRs — same gap across every repo in this migration batch;
    needs a fix in openedx/.github itself, not here.

Testing Notes

Verified locally (not just hoping CI would catch it):

  • uv lock / uv lock --check resolve cleanly, no drift.
  • uv sync --group dev and uv sync --group ci succeed from a clean .venv.
  • uv run tox — both py312 and quality environments pass: 99 tests pass,
    pycodestyle and pylint (repo has no custom rcfile, so both run with their
    default config, same as before this migration) both clean (pylint 10.00/10).
  • uv run --with build python -m build succeeds, producing a correctly versioned
    (2.0.0, matching the git tag) sdist + wheel. Confirmed chem.tests is correctly
    excluded from the wheel (added an explicit exclude = ["chem.tests", "chem.tests.*"] to [tool.setuptools.packages.find] — the
    exclude-package-data setting alone does not stop a real Python subpackage
    discovered by packages.find from being shipped; this matches the original
    setup.py's packages=["chem"], which never listed chem.tests either).
  • release.yml's actions (python-semantic-release, actions/upload-artifact,
    actions/download-artifact, pypa/gh-action-pypi-publish, plus
    actions/checkout/astral-sh/setup-uv) are all SHA-pinned, matching the
    gold-standard pattern used across this migration batch, each verified against the
    actual tag→commit mapping via gh api repos/<owner>/<repo>/commits/<sha>.

Code reviewer notes

  • The src/ layout move (chem/ → src/chem/) is a separate first commit,
    isolated from the metadata/uv/release commits, for easier review.
  • [tool.setuptools.packages.find] explicitly excludes chem.tests (see Testing
    Notes) — worth double-checking against the original setup.py's shipped-file
    behavior if you want a second opinion.
  • tox.ini's django42 factor was dropped as dead weight (see "Removed" above) —
    flagging in case there was a reason for it that isn't visible from the requirements
    files alone.

This PR was created with Claude Code.

Move chem/ into src/chem/, per the 2026-07-15 src/ layout decision on
openedx/public-engineering#506. The precedent is xblocks-extra (which uses
src/ layout, unlike xblock-core which is still flat).

Update .coveragerc's hardcoded source path to match (src/chem instead of
chem). tox.ini and pyproject.toml paths are updated in the following
commits, which rewrite those files wholesale anyway.
Replace setup.py + .coveragerc with a single PEP 621 pyproject.toml:

- Static [project] metadata (name, description, classifiers, dependencies)
  instead of setup.py's load_requirements()/get_version() helpers.
- SPDX license = "AGPL-3.0" + license-files, per PEP 639.
- dynamic = ["version"], resolved by setuptools-scm from git tags
  (fallback_version = "0.0.0" for unbuilt/untagged checkouts).
- [tool.coverage.*] replaces .coveragerc, pointed at the new src/chem path.
- [tool.setuptools.exclude-package-data] excludes tests from the wheel.
- Also includes [dependency-groups]/[tool.uv]/[tool.semantic_release],
  wired up fully in the following two commits.

Remove the hardcoded __version__ from chem/__init__.py (would go stale
after every future tag) in favor of importlib.metadata.version("chem"),
matching the package's actual PyPI project name. Grepped the repo for other
__version__ consumers beyond this assignment and setup.py's own now-deleted
reader; there are none.
- Add [dependency-groups] (test, quality, ci, dev) to pyproject.toml, plus
  [tool.edx_lint].uv_constraints and [tool.uv].constraint-dependencies
  (machine-managed by `edx_lint write_uv_constraints`, populated with the
  common_constraints.txt pins: Django<6.0, elasticsearch<7.14.0).
- Commit uv.lock (resolved via `uv lock`).
- Delete requirements/ (base/ci/common_constraints/constraints/pip_tools/
  quality/test/tox .in and .txt). Grepped the whole repo for stale
  references: MANIFEST.in had two (requirements/base.in, requirements/test.in),
  now removed; Makefile and tox.ini are rewritten below; the old
  pypi-publish.yml's requirements/pip.txt reference goes away with that
  workflow in the next commit.
- tox.ini: tox-uv>=1, uv-venv-lock-runner, dependency_groups instead of
  deps/-r. Drop the vestigial "django42" factor from envlist/toxenv — this
  package has no Django dependency at all (grepped all requirements/*.txt,
  none mention django), so there was never a real matrix to run; simplify
  to py312,quality.
- Makefile: requirements/test/upgrade targets repointed at uv/tox-uv;
  drop the wget-based common_constraints.txt fetch (edx_lint now owns that).
- CI (ci.yml): astral-sh/setup-uv (SHA-pinned) instead of setup-python +
  pip install; uv sync --group ci; uv run tox -e <matrix env>; matrix job
  name is the toxenv; add permissions: contents: read and fetch-depth: 0
  (so setuptools-scm can see tags during test runs); add workflow_call so
  the upcoming release.yml can reuse this file.

Known gap (flagged in the PR description, not fixable from this repo):
.github/workflows/upgrade-python-requirements.yml calls openedx/.github's
shared reusable workflow, which hardcodes add-paths: requirements with no
override input. Now that requirements/ is gone, that scheduled job will
keep running but silently stop producing real dependency-upgrade PRs.
- Add release.yml: run_tests (reuses ci.yml via workflow_call, secrets:
  inherit), release (python-semantic-release, needs: run_tests, only on
  master), publish_to_pypi (OIDC, id-token: write, no user/password on the
  publish step). Matches openedx/XBlock's actual, already-releasing
  release.yml for the python-semantic-release, publish-action,
  upload-artifact, and download-artifact pins (plain version tags, not
  SHA-pinned — release.yml only runs on push to master, never PR CI, so a
  bad SHA pin here is invisible until the first real release attempt).
- pypa/gh-action-pypi-publish is the one exception: SHA-pinned to
  ba38be9e461d3875417946c167d0b5f3d385a247 (the v1.14.1 *commit* SHA,
  verified via the tag object's .object.sha — not
  2834a314042ef964da07689278dd1e9d773e8afd, which is the v1.14.1 *tag
  object*'s own SHA and is invalid for a `uses:` pin). @release/v1 (used
  by XBlock's own file) is a floating branch, not a version tag, and has a
  documented history of breaking a real release.
- [tool.semantic_release] (added to pyproject.toml in the metadata commit)
  builds via "python -m build" (not uv build — the PSR action environment
  doesn't have uv), with major_on_zero = false and allow_zero_version =
  true.
- Pre-flight check: latest git tag (2.0.0, via --sort=-v:refname) matches
  the version actually live on PyPI for the "chem" project (2.0.0), so the
  first automated release won't compute a version lower than what's
  published.
- commitlint.yml already existed and already matches the expected
  openedx/.github reusable-workflow pattern; no change needed.
- Delete .github/workflows/pypi-publish.yml (token-based publish-on-tag,
  superseded by release.yml's OIDC publish_to_pypi job). Grepped all
  workflow files for other pypi-publish/pypa/gh-action references; this
  was the only one.

Known gaps flagged in the PR description (not fixable from this repo):
PyPI OIDC trusted publisher needs configuring for the "chem" PyPI project,
and OPENEDX_SEMANTIC_RELEASE_GITHUB_TOKEN needs confirming as a repo
secret.
@openedx-webhooks

Copy link
Copy Markdown

Thanks for the pull request, @irfanuddinahmad!

This repository is currently maintained by @codewithemad.

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 approval

If you haven't already, check this list to see if your contribution needs to go through the product review process.

  • If it does, you'll need to submit a product proposal for your contribution, and have it reviewed by the Product Working Group.
    • This process (including the steps you'll need to take) is documented here.
  • If it doesn't, simply proceed with the next step.
🔘 Provide context

To 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:

  • Dependencies

    This PR must be merged before / after / at the same time as ...

  • Blockers

    This PR is waiting for OEP-1234 to be accepted.

  • Timeline information

    This PR must be merged by XX date because ...

  • Partner information

    This is for a course on edx.org.

  • Supporting documentation
  • Relevant Open edX discussion forum threads
🔘 Get a green build

If one or more checks are failing, continue working on your changes until this is no longer the case and your build turns green.

Details
Where 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:

  • The size and impact of the changes that it introduces
  • The need for product review
  • Maintenance status of the parent repository

💡 As a result it may take up to several weeks or months to complete a review and merge your PR.

@openedx-webhooks openedx-webhooks added open-source-contribution PR author is not from Axim or 2U core contributor PR author is a Core Contributor (who may or may not have write access to this repo). labels Jul 27, 2026
@github-project-automation github-project-automation Bot moved this to Needs Triage in Contributions Jul 27, 2026
@codecov

codecov Bot commented Jul 27, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.32%. Comparing base (b1924d0) to head (d99c599).

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #161      +/-   ##
==========================================
- Coverage   98.23%   96.32%   -1.92%     
==========================================
  Files           5        4       -1     
  Lines         622      299     -323     
  Branches       63       63              
==========================================
- Hits          611      288     -323     
  Misses          5        5              
  Partials        6        6              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

[tool.coverage.run]'s new omit = ["*/tests/*", ...] (added in the metadata
commit) correctly excludes chem/tests/test_all.py from coverage
measurement -- a test file trivially covers itself just by running, so
counting it toward the package's coverage percentage was always inflating
the number. The old .coveragerc had no omit section at all, so this is the
first time that file has been excluded.

That's a one-time drop in the reported baseline (98.23% -> 96.33%, 5
files/622 lines -> 4 files/300 lines), not a regression in production-code
coverage: codecov/patch (diff coverage) is 100%, and the underlying
miss/partial-branch counts in chemcalc.py/chemtools.py/miller.py are
byte-for-byte identical before and after this PR (5 misses, 6 partial
branches, confirmed via uv run coverage report -m).

Add codecov.yml with a 3% project threshold (auto target, with margin) to
absorb this one-time methodology change while still catching real future
regressions, matching the pattern already used by sibling repos in this
same modernization effort (ccx-keys#190, opaque-keys#461,
openedx-filters#381, openedx-core#704).
@mphilbrick211 mphilbrick211 moved this from Needs Triage to Ready for Review in Contributions Jul 28, 2026
irfanuddinahmad and others added 12 commits July 30, 2026 15:14
This repo never had a CHANGELOG.rst. Per the modernize-python-tooling
effort, repos should not disable changelog generation when
semantic-release is in use.

- Create CHANGELOG.rst containing only the insertion marker, for
  python-semantic-release to build history above going forward.
- Remove `changelog: "false"` from release.yml's PSR step.
- Configure [tool.semantic_release.changelog] to update CHANGELOG.rst
  in place (RST output) using the marker as the insertion point.
- Set tag_format = "{version}" to match this repo's actual bare
  version tags (e.g. 2.0.0), since PSR's "v{version}" default would
  not recognize existing tags as prior releases.
target: auto already compares each PR against its own base commit, so
the one-time coverage-measurement-methodology discontinuity from this
migration doesn't need a permanent tolerance -- it becomes the new
baseline once merged, and this status check isn't required anyway.
Set changelog: "false" on the PSR release step and remove the
[tool.semantic_release.changelog] config / insertion marker.

Checked against openedx/XBlock's actual production release.yml (the one
repo in this effort that has cut real automated releases) -- every run
passes changelog: false and invokes `semantic-release -v version
--no-changelog`, and the repo has zero github-actions[bot] commits ever.
The auto-changelog config this migration previously added was only ever
verified via a local dry-run prototype, never against a real release.

feanil flagged the same issue on openedx/DoneXBlock#388: "I thought we
were not going to add changelogs since they can't be updated by
python-semantic-release the way we have it setup."
Reviewers on this effort (farhan, feanil) have repeatedly asked to delete
multi-line AI-written justification comments from committed files. Moved
the detail to this commit message instead:

This tooling migration correctly omits chem/tests/test_all.py from
[tool.coverage.run] instead of counting the test file's own statements
toward coverage. That drops the reported total from 98.23% (5 files,
incl. the test file) to 96.33% (4 files, production only) -- a one-time
discontinuity in this PR's base-vs-head comparison, not a real
regression. target: auto means 96.33% becomes the new baseline once this
merges; no threshold was added.
This repo has immutable releases enabled, which freezes a release's assets the moment it's published. The old flow (main PSR step publishes the release, a separate publish-action step attaches assets afterward) can never work under that constraint -- it would 422 on the first real release. Matches the fix already proven and merged on openedx/sample-plugin#57 and validated end-to-end on openedx/event-tracking#434: build without publishing (vcs_release: false), then create the release with dist/* attached in one gh release create call.
release.yml pinned actions/checkout to an old v7.0.0 SHA, and left
python-semantic-release, actions/upload-artifact, and
actions/download-artifact entirely unpinned (plain version tags).

openedx/sample-plugin is this org's designated gold-standard reference
for release.yml, and it pins all of these (each SHA independently
re-verified against the action's own tag history via the GitHub API).
Pinned/corrected them to match, picking up version bumps along the way:
actions/checkout v7.0.0 -> v7.0.1, python-semantic-release
v10.6.1 -> v10.6.2, and pypa/gh-action-pypi-publish v1.14.1 -> v1.14.2.

Also brought release.yml in line with sample-plugin in three more ways:
- added `if-no-files-found: error` to the dist upload step, so a release
  that produced no artifacts fails loudly instead of silently.
- added the `github.ref_name == 'master'` guard to publish_to_pypi's
  `if`, matching the release job's own guard, so the job can't fire on
  a non-default-branch workflow run.
- dropped `fetch-depth: 0` from the release job's checkout; python-semantic-release
  auto-deepens a shallow clone itself before evaluating version history,
  so it's never needed there.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
….yml

src/chem/__init__.py sets __version__ from importlib.metadata; nothing
else in the package reads or parses __version__, so a shallow clone is
sufficient for CI. sample-plugin's own backend-ci.yml doesn't set
fetch-depth: 0 either. Matches that reference.

Also updated the actions/checkout pin from the stale v7.0.0 SHA to the
same v7.0.1 SHA already used elsewhere in this migration (release.yml,
and the other 3 repos' ci.yml in this same effort), for consistency.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Points at "see PR description" for an explanation -- fragile since
the PR description is external and mutable. Coverage config itself
stays out of scope for this migration; just dropping the comment, no
change to target/threshold behavior.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Comment thread .github/workflows/ci.yml
jobs:
run_tests:
name: Tests
name: ${{ matrix.toxenv }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we follow this here?
openedx/staff-graded-xblock#394 (comment)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked -- this repo has no required-status-checks configured (empty rulesets, no branch protection), so the rename carries no risk here unlike staff-graded-xblock. Leaving as-is.

Comment thread .github/workflows/ci.yml Outdated
os: [ubuntu-latest]
python-version: ['3.12']
toxenv: [quality, django42]
toxenv: [py312, quality]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why we dropped django42 and added testing on py312?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No code in this repo imports Django -- pylint-django is a lint plugin only. The old django42: pin was vestigial; dropping it doesn't change what's tested.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: You can actually set this toxenv to just py and it will build it using the python version from the python-version matrix. It's a little nicer because then when we add a new version of python to the versions list later, we don't have to update the toxenv setting as well and we don't end up in a situation where it tries to run python 3.12 env tests in python 3.14.

Suggested change
toxenv: [py312, quality]
toxenv: [py, quality]

Comment thread codecov.yml Outdated
@@ -0,0 +1,10 @@
coverage:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove this file, we do not need to add this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This offsets a real coverage-measurement shift from the migration (confirmed independently), not cosmetic parity -- keeping it.

@salman2013

Copy link
Copy Markdown

@irfanuddinahmad could you see at the failing check for codecov/project

irfanuddinahmad and others added 2 commits September 24, 2026 15:28
…e job

Matches openedx/sample-plugin's current release.yml; the custom
OPENEDX_SEMANTIC_RELEASE_GITHUB_TOKEN secret isn't needed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Makefile now assumes an already-synced/activated local env; uv run
stays in CI workflow steps only. See openedx/ccx-keys#190 (review
comment r4097501942).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Comment thread codecov.yml Outdated
status:
project:
default:
target: auto

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

target: auto is codecov's default for the project status, so this file isn't absorbing anything. codecov/project is still failing on 3c9ac424 at 96.32% (-1.92%), and #160 got the same auto-comparison with no codecov.yml in the repo. All the file changes is the patch target and turning codecov's PR comments off. Drop it. The one-time drop from omitting src/chem/tests/ becomes the new baseline on master either way.

Comment thread Makefile Resolved
Comment thread .github/workflows/ci.yml Outdated
os: [ubuntu-latest]
python-version: ['3.12']
toxenv: [quality, django42]
toxenv: [py312, quality]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: You can actually set this toxenv to just py and it will build it using the python version from the python-version matrix. It's a little nicer because then when we add a new version of python to the versions list later, we don't have to update the toxenv setting as well and we don't end up in a situation where it tries to run python 3.12 env tests in python 3.14.

Suggested change
toxenv: [py312, quality]
toxenv: [py, quality]

Comment thread .github/workflows/ci.yml Outdated
run: uv run tox -e ${{ matrix.toxenv }}
- name: Run Coverage
if: matrix.python-version == '3.12' && matrix.toxenv=='django42'
if: matrix.python-version == '3.12' && matrix.toxenv == 'py312'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you take my suggestion above about the toxenv, make sure to update it here as well.

- Remove codecov.yml: target: auto is codecov's own project-status
  default, so the file wasn't absorbing anything -- codecov/project
  still fails identically with or without it.
- ci.yml/tox.ini: rename the py312 env to the generic py alias (no
  factor-conditional dependency groups tied to the version, so the 312
  suffix was purely decorative). Avoids needing a manual bump -- and
  the risk of accidentally running the wrong Python's env -- every
  time the python-version matrix changes.

Per feanil's review on openedx#161: discussion_r4107709165,
r4122433643, and the toxenv suggestion on ci.yml:19.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@feanil
feanil merged commit 31fb991 into openedx:master Sep 29, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core contributor PR author is a Core Contributor (who may or may not have write access to this repo). open-source-contribution PR author is not from Axim or 2U

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

4 participants