Conversation
why: uv's global `exclude-newer = "3 days"` supply-chain cooldown hides ruff 0.16.0 (released 2026-07-23) from the resolver, so the version floor in the next commit cannot resolve. what: - Add `ruff = false` to `[tool.uv.exclude-newer-package]` Temporary. Revert before merge - the cooldown clears on its own and the `ruff>=0.16` floor is what actually holds the version.
why: ruff 0.16.0 stabilizes rules inside prefixes this project already selects and starts formatting Python code blocks in Markdown. Pinning a floor keeps contributors and CI on the same diagnostics instead of splitting on whatever ruff each machine resolved. what: - Raise `ruff` to `>=0.16.0` in the `dev` and `lint` dependency groups - Relock `uv.lock`: ruff 0.15.22 -> 0.16.0 https://astral.sh/blog/ruff-v0.16.0
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #356 +/- ##
=======================================
Coverage 88.98% 88.98%
=======================================
Files 12 12
Lines 690 690
=======================================
Hits 614 614
Misses 76 76 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
why: The unreleased entry tracks dev-tooling floors so contributors know which ruff their local run must match. what: - Add `#### Ruff 0.16 lint floor (#356)` under `### Development`
why: ruff 0.16.0 published 2026-07-23T19:10Z and has now cleared uv's 3-day supply-chain cooldown, so the resolver reaches it unaided. The `ruff>=0.16.0` floor is what holds the version; leaving the exemption would permanently opt ruff out of the cooldown guard. what: - Drop `ruff = false` from `[tool.uv.exclude-newer-package]` - Relock: the setting is recorded in `uv.lock`, so removing it forces a re-resolve. ruff stays at 0.16.0 and no other package moves. This reverts commit bf2852c.
why: ruff 0.16 ships a curated 413-rule default set as its recommended baseline. An explicit `select` replaces that set rather than extending it, so this project was running 351 rules and silently opting out of the default set. `extend-select` layers the project's own linters on top of the default set instead of in place of it. what: - Replace `select` with `extend-select`, same entries, one per line - Note in the file why `select` stays unset Enabled rules go from 351 to 565. https://docs.astral.sh/ruff/linter/#rule-selection
why: `str.startswith` accepts a tuple of prefixes, so the docs-only
package filter needs one call rather than a chain of `or`ed calls
against the same name.
what:
- Pass `("gp-", "sphinx")` to a single `startswith`
https://docs.astral.sh/ruff/rules/multiple-starts-ends-with/
why: `docs/conf.py` reads the package's version metadata by exec'ing `__about__.py` so the docs build does not import the package it is documenting. The input is a file in this repository, not user data, so the flake8-bandit warning has nothing to warn about here. what: - Per-file-ignore S102 for `docs/conf.py` https://docs.astral.sh/ruff/rules/exec-builtin/
why: The unreleased entry tracks dev-tooling changes, and adopting ruff's default rules changes what a contributor's local `ruff check` reports. what: - Add `#### Ruff's default rule set (#356)` under `### Development`
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.
Summary
ruff>=0.16.0in thedevandlintdependency groups so contributors and CI see the same diagnostics[tool.ruff.lint] selecttoextend-select, taking the enabled-rule count from 351 to 565Changes
Dependencies
pyproject.toml:rufffloor raised to>=0.16.0in thedevandlintgroups.uv.lock: relocked, ruff 0.15.22 -> 0.16.0.Lint configuration
selectis nowextend-select, with every entry on its own line carrying the name of the linter it selects. An explicitselectreplaces ruff's default rule set rather than extending it, so the project was silently opting out of the 413 rules ruff 0.16 recommends as its baseline. There is noDEFAULTtoken that aselectlist could name — leavingselectunset is the only way to get defaults-plus-extras — so the file carries a comment saying so, to stop the key being reintroduced.Findings fixed
PIE810(multiple-starts-ends-with) intests/test_install_widget.py: the docs-only package filter chained twostartswithcalls against the same name withor.str.startswithtakes a tuple of prefixes, so this is one call.Findings ignored
S102(exec-builtin) indocs/conf.py: the Sphinx config reads the package's version metadata by exec'ing__about__.py, which keeps the docs build off an import of the package it documents. The input is a file in this repository, not user data, so the flake8-bandit warning has nothing to warn about. Scoped per-file, not globally.Design decisions
Floor, not pin:
>=0.16.0rather than==. The lockfile already reproduces the exact version for this repo; the floor exists to keep a contributor on an older ruff from producing a passing local run that fails CI.extend-select, not wider prefixes: expanding the existingselectto whole prefixes (PL,S,D, …) was measured elsewhere in this ecosystem and rejected — it is one to two orders of magnitude noisier than the curated default set, because it drags in every rule in each family rather than the subset ruff recommends.One commit per decision: the config change, the fix, and the ignore each land alone, so the rationale for each rule is recoverable from
git lograther than buried in a batch.Test plan
uv run ruff check .— cleanuv run ruff format --check .— clean, now including Markdown code blocksuv run mypy— cleanuv run py.test— full suite green, including doctests oversrc/,tests/, anddocs/