-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve rule config resolution #2312
Improve rule config resolution #2312
Conversation
I think this makes much more sense and is much more user-friendly / understandable. This obviously breaks existing configurations that relied on the previous weird behavior ... however I'd expect most ruff config files to not rely on this weird behavior ... but that's just a hunch. How you want to go about this is very much your call. It would be possible to support both the old and the new config resolution at the same time and only use the new resolution based on some |
I just have to take a look at some of the more complex setups in the wild and see how they'd be affected. |
Don't worry, I definitely don't want to support both. |
let mut select_set: FxHashSet<_> = defaults::PREFIXES.iter().flatten().collect(); | ||
let mut fixable_set: FxHashSet<_> = RuleSelector::All.into_iter().collect(); | ||
|
||
let mut redirects = FxHashMap::default(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you mind adding some comments throughout this method? Or explaining the logic in more detail here? I'm tracing it but having trouble following.
As a specific example: if I have select = ["F"]
in my pyproject.toml
, and I do --select A
, then I end up with two rule selections:
[RuleSelection { select: Some([Prefix { prefix: F, redirected_from: None }]), ignore: Some([Prefix { prefix: A, redirected_from: None }]), extend_select: None, extend_ignore: None, fixable: None, unfixable: None }, RuleSelection { select: Some([Prefix { prefix: A, redirected_from: None }]), ignore: None, extend_select: None, extend_ignore: None, fixable: None, unfixable: None }]
But, how do the F
rules not end up in the select set?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I see -- do we, in effect, only use the last RuleSelection
that contains a non-empty select
? The rest gets discarded?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If that's the correct interpretation how would I do the following: create a pyproject.toml
that enables all the F
rules, then extend it from another pyproject.toml
to also include the E
rules? I think I know the answer, but it would be helpful to hear it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Separate question: under this scheme, is there ever any difference between specifying ignore
and extend-ignore
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added some comments :)
if I have select = ["F"] in my pyproject.toml, and I do --select A, [..] But, how do the F rules not end up in the select set?
If selection.select.is_some()
then the select_set
is overridden.
do we, in effect, only use the last RuleSelection that contains a non-empty select? The rest gets discarded?
No, multiple RuleSelections can all contribute to select_set
if they only use extend_select
/ ignore
but not select
.
how would I do the following: create a pyproject.toml that enables all the F rules, then extend it from another pyproject.toml to also include the E rules?
select
can be extended via extend-select
.
Separate question: under this scheme, is there ever any difference between specifying ignore and extend-ignore?
Very good catch! I didn't even notice that but indeed we can deprecate extend-ignore
since it now can always be replaced with ignore
. The reasoning behind that is that now ignore
/extend-ignore
can only ever deselect already selected rules ... it's impossible for an ignore option to take precedence over a latter select option. Since the "ignore set" isn't something that is kept track of anymore ... the function only keeps track of the effectively selected rules, extend-ignore
doesn't fulfill any purpose anymore.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Definitely, will do. Mechanically, probably easiest for me to open those changes as a separate PR on main
and then just rebase that PR after this merges...?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You have write permissions on my branch so you could just push your commits there :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I went ahead and pushed a first-pass in the README.md
and BREAKING_CHANGES.md
. Feedback welcome.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you so much, I think you described it very well :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great. I'll try to get this out tomorrow!
02c0ea2
to
99887d8
Compare
99887d8
to
db633ae
Compare
(force pushed a small refactor that removed |
Previously we tested the resolve_codes helper function directly. Since we want to rewrite our resolution logic in the next commit, this commit changes the tests to test the more high-level From impl.
c024514
to
26ba908
Compare
(force pushed to fix the CI failure, which was caused by the README now including the I think we should also mention in the new Rule resolution section in the README and the BREAKING_CHANGES.md entry that (This is now already mentioned in the documentation of the |
26ba908
to
61822bd
Compare
@@ -433,8 +433,6 @@ Rule selection: | |||
Comma-separated list of rule codes to disable | |||
--extend-select <RULE_CODE> | |||
Like --select, but adds additional rule codes on top of the selected ones | |||
--extend-ignore <RULE_CODE> | |||
Like --ignore, but adds additional rule codes on top of the ignored ones |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do kind of wonder if we should just leave this visible in the CLI to avoid confusion (due to the asymmetry with --select
). What do you think? Bad idea?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we leave it I think we should add DEPRECATED
to the description ... however I don't think that would really reduce the confusion since we'd have to explain why it's deprecated ... which would probably be too verbose. I consider --extend-ignore
to effectively be an alias for --ignore
... and we currently don't document e.g. that ruff clean
has ruff --clean
as an alias in the CLI help.
I don't have a strong opinion about this, if you think it should be listed we can add it back.
Note that I have also removed extend-ignore
from the JSON schema ... which could also be confusing for users but I think it's worth it to stop it from being autocompleted for users writing new configs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I prefer to hide it. I have updated the message to mention that it's deprecated since it still shows up in the clap shell completion.
61822bd
to
3947ad0
Compare
Ruff allows rules to be enabled with `select` and disabled with `ignore`, where the more specific rule selector takes precedence, for example: `--select ALL --ignore E501` selects all rules except E501 `--ignore ALL --select E501` selects only E501 (If both selectors have the same specificity ignore selectors take precedence.) Ruff always had two quirks: * If `pyproject.toml` specified `ignore = ["E501"]` then you could previously not override that with `--select E501` on the command-line (since the resolution didn't take into account that the select was specified after the ignore). * If `pyproject.toml` specified `select = ["E501"]` then you could previously not override that with `--ignore E` on the command-line (since the resolution didn't take into account that the ignore was specified after the select). Since d067efe (astral-sh#1245) `extend-select` and `extend-ignore` always override `select` and `ignore` and are applied iteratively in pairs, which introduced another quirk: * If some `pyproject.toml` file specified `extend-select` or `extend-ignore`, `select` and `ignore` became pretty much unreliable after that with no way of resetting that. This commit fixes all of these quirks by making later configuration sources take precedence over earlier configuration sources. While this is a breaking change, we expect most ruff configuration files to not rely on the previous unintutive behavior.
Now that the option is deprecated we no longer want IDEs to suggest it in their autocompletion.
3947ad0
to
0264772
Compare
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [ruff](https://togithub.com/charliermarsh/ruff) | `^0.0.237` -> `^0.0.238` | [![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.238/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.238/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.238/compatibility-slim/0.0.237)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.238/confidence-slim/0.0.237)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.238`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.238) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.237...v0.0.238) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed #####⚠️ Breaking Changes⚠️ ##### `select`, `extend-select`, `ignore`, and `extend-ignore` have new semantics ([#​2312](https://togithub.com/charliermarsh/ruff/pull/2312)) Previously, the interplay between `select` and its related options could lead to unexpected behavior. For example, `ruff --select E501 --ignore ALL` and `ruff --select E501 --extend-ignore ALL` behaved differently. (See [#​2312](https://togithub.com/charliermarsh/ruff/pull/2312) for more examples.) The new semantics are such that Ruff uses the "highest-priority" `select` as the basis for the rule set, and then applies any `extend-select`, `ignore`, and `extend-ignore` adjustments. CLI options are given higher priority than `pyproject.toml` options, and the current `pyproject.toml` file is given higher priority than any inherited `pyproject.toml` files. As an example: `ruff --select F401` will select rule `F401`, and ignore any of the modifiers from the `pyproject.toml`, as the "highest-priorty" select kicks off the resolution chain. This change is largely backwards compatible -- most users should experience no change in behavior. For more, see [BREAKING_CHANGES.md](https://togithub.com/charliermarsh/ruff/blob/main/BREAKING_CHANGES.md#select-extend-select-ignore-and-extend-ignore-have-new-semantics-2312). ##### `remove-six-compat` (`UP016`) has been removed ([#​2332](https://togithub.com/charliermarsh/ruff/pull/2332)) The `remove-six-compat` rule has been removed. This rule was only useful for one-time Python 2-to-3 upgrades. ##### Rules - Implement Pylint's `too-many-arguments` rule (`PLR0913`) by [@​akhildevelops](https://togithub.com/akhildevelops) in [https://github.com/charliermarsh/ruff/pull/2308](https://togithub.com/charliermarsh/ruff/pull/2308) - Extend conventional imports defaults to include TensorFlow et al by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2353](https://togithub.com/charliermarsh/ruff/pull/2353) ##### Settings - feat: add ruff --statistics by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2284](https://togithub.com/charliermarsh/ruff/pull/2284) - Ignore magic comparisons to bytes by default by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2365](https://togithub.com/charliermarsh/ruff/pull/2365) - Implement `ruff linter` subcommand by [@​not-my-profile](https://togithub.com/not-my-profile) in [https://github.com/charliermarsh/ruff/pull/2294](https://togithub.com/charliermarsh/ruff/pull/2294) - Improve rule config resolution by [@​not-my-profile](https://togithub.com/not-my-profile) in [https://github.com/charliermarsh/ruff/pull/2312](https://togithub.com/charliermarsh/ruff/pull/2312) ##### Bug Fixes - Refine criteria for `exc_info` logger rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2364](https://togithub.com/charliermarsh/ruff/pull/2364) - Respect per-file-ignores when checking noqa by [@​sciyoshi](https://togithub.com/sciyoshi) in [https://github.com/charliermarsh/ruff/pull/2309](https://togithub.com/charliermarsh/ruff/pull/2309) - Place star before other member imports by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2320](https://togithub.com/charliermarsh/ruff/pull/2320) - Allow list comprehensions for **all** assignment by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2326](https://togithub.com/charliermarsh/ruff/pull/2326) - \[`TRY201`] don't check raise statements in nested exception handlers by [@​sciyoshi](https://togithub.com/sciyoshi) in [https://github.com/charliermarsh/ruff/pull/2337](https://togithub.com/charliermarsh/ruff/pull/2337) - include tomllib in standard lib by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2345](https://togithub.com/charliermarsh/ruff/pull/2345) - Avoid removing trailing comments when autofixing by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2352](https://togithub.com/charliermarsh/ruff/pull/2352) - \[`I001`] fix isort for files with tab-based indentation by [@​sciyoshi](https://togithub.com/sciyoshi) in [https://github.com/charliermarsh/ruff/pull/2361](https://togithub.com/charliermarsh/ruff/pull/2361) - Disable incompatible rules rather than merely warning by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2369](https://togithub.com/charliermarsh/ruff/pull/2369) #### New Contributors - [@​chirag127](https://togithub.com/chirag127) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2307](https://togithub.com/charliermarsh/ruff/pull/2307) - [@​akhildevelops](https://togithub.com/akhildevelops) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2308](https://togithub.com/charliermarsh/ruff/pull/2308) **Full Changelog**: astral-sh/ruff@v0.0.237...v0.0.238 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/ixm-one/pytest-cmake-presets). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMTYuMSIsInVwZGF0ZWRJblZlciI6IjM0LjExNi4xIn0=--> Signed-off-by: Renovate Bot <[email protected]> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [ruff](https://togithub.com/charliermarsh/ruff) | `^0.0.237` -> `^0.0.247` | [![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.247/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.247/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.247/compatibility-slim/0.0.237)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.247/confidence-slim/0.0.237)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.247`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.247) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.246...v0.0.247) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - \[`NPY001`] deprecated type aliases by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2810](https://togithub.com/charliermarsh/ruff/pull/2810) - \[`RUF006`] Implement `asyncio-dangling-task` to track `asyncio.create_task` calls by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2935](https://togithub.com/charliermarsh/ruff/pull/2935) ##### CLI - Implement shell autocompletion for rule codes by [@​not-my-profile](https://togithub.com/not-my-profile) in [https://github.com/charliermarsh/ruff/pull/2906](https://togithub.com/charliermarsh/ruff/pull/2906) ##### Bug Fixes - Handle multiple receiver decorators in receiver-decorator by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2858](https://togithub.com/charliermarsh/ruff/pull/2858) - Avoid false-positives with multi-byte characters in B005 by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2862](https://togithub.com/charliermarsh/ruff/pull/2862) - Avoid false-positives for runtime-types in type checking blocks by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2863](https://togithub.com/charliermarsh/ruff/pull/2863) - Avoid noqa removal upon unhandled syntax errors by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2864](https://togithub.com/charliermarsh/ruff/pull/2864) - Ignore non-imperative-mood in Google docstring convention by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2900](https://togithub.com/charliermarsh/ruff/pull/2900) - \[`flake8-tidy-imports`] autofix relative imports by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2891](https://togithub.com/charliermarsh/ruff/pull/2891) - Respect self as positional-only argument in annotation rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2927](https://togithub.com/charliermarsh/ruff/pull/2927) - Apply nullable-model-string-field to all classes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2928](https://togithub.com/charliermarsh/ruff/pull/2928) - Deduplicate files provided on the command-line by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2931](https://togithub.com/charliermarsh/ruff/pull/2931) - Re-show --target-version on CLI interface by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2859](https://togithub.com/charliermarsh/ruff/pull/2859) - Remove autofix for prefer-type-error by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2880](https://togithub.com/charliermarsh/ruff/pull/2880) - Avoid unnecessary-else violations in `elif` branches by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2881](https://togithub.com/charliermarsh/ruff/pull/2881) - Extend B904 to else branches by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2886](https://togithub.com/charliermarsh/ruff/pull/2886) - Allow private accesses on current class by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2929](https://togithub.com/charliermarsh/ruff/pull/2929) #### New Contributors - [@​Jeremiah-England](https://togithub.com/Jeremiah-England) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2884](https://togithub.com/charliermarsh/ruff/pull/2884) - [@​Chris-May](https://togithub.com/Chris-May) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2896](https://togithub.com/charliermarsh/ruff/pull/2896) - [@​simon04](https://togithub.com/simon04) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2904](https://togithub.com/charliermarsh/ruff/pull/2904) **Full Changelog**: astral-sh/ruff@v0.0.246...v0.0.247 ### [`v0.0.246`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.246) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.245...v0.0.246) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Breaking Changes - Remove multiple-statements-on-one-line-def (E704) by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2773](https://togithub.com/charliermarsh/ruff/pull/2773) ##### Rules - \[`flake8-pyi`]: add rules for unrecognized platform check (PYI007, PYI008) by [@​SigureMo](https://togithub.com/SigureMo) in [https://github.com/charliermarsh/ruff/pull/2805](https://togithub.com/charliermarsh/ruff/pull/2805) - \[`flake8-simplify`]: combine-if-conditions by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2823](https://togithub.com/charliermarsh/ruff/pull/2823) - \[`flake8-django`] Implemented flake8-django plugin rules by [@​konysko](https://togithub.com/konysko) in [https://github.com/charliermarsh/ruff/pull/2586](https://togithub.com/charliermarsh/ruff/pull/2586) ##### CLI - Implement `config` subcommand by [@​not-my-profile](https://togithub.com/not-my-profile) in [https://github.com/charliermarsh/ruff/pull/2775](https://togithub.com/charliermarsh/ruff/pull/2775) - Add rendering of rule markdown for terminal output by [@​ngnpope](https://togithub.com/ngnpope) in [https://github.com/charliermarsh/ruff/pull/2747](https://togithub.com/charliermarsh/ruff/pull/2747) - Add `--show-fixes` flag to show applied fixes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2707](https://togithub.com/charliermarsh/ruff/pull/2707) ##### Settings - implemented option lines-between-types for isort by [@​PushUpek](https://togithub.com/PushUpek) in [https://github.com/charliermarsh/ruff/pull/2762](https://togithub.com/charliermarsh/ruff/pull/2762) ##### Autofix - \[`pyflakes`] Support unused variable removal in multi-assignment statements by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2786](https://togithub.com/charliermarsh/ruff/pull/2786) - \[`flake8-comprehensions`] autofix C414 and C417 + bugfix by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2693](https://togithub.com/charliermarsh/ruff/pull/2693) - \[`flake8-comprehensions`] bugfix for C413 autofix by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2804](https://togithub.com/charliermarsh/ruff/pull/2804) - \[`flake8-simplify`] Use smarter inversion for comparison checks by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2831](https://togithub.com/charliermarsh/ruff/pull/2831) - \[`flake8-comprehensions`] improve autofix for C401, C402 and C417 by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2806](https://togithub.com/charliermarsh/ruff/pull/2806) ##### Bug Fixes - Ignore colon-after-lambda in compound statement rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2771](https://togithub.com/charliermarsh/ruff/pull/2771) - Don't treat all future import accesses as non-runtime by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2774](https://togithub.com/charliermarsh/ruff/pull/2774) - Avoid treating deferred string annotations as required-at-runtime by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2779](https://togithub.com/charliermarsh/ruff/pull/2779) - Respect continuations in `noqa` enforcement by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2783](https://togithub.com/charliermarsh/ruff/pull/2783) - Improve unused-variable autofixes for with statements by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2785](https://togithub.com/charliermarsh/ruff/pull/2785) - Refactor generator to use Astor-derived precedence levels by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2798](https://togithub.com/charliermarsh/ruff/pull/2798) - Allow private accesses on super calls by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2815](https://togithub.com/charliermarsh/ruff/pull/2815) - Allow non-verbose raise when cause is present by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2816](https://togithub.com/charliermarsh/ruff/pull/2816) - Avoid duplicates in if-with-same-arms by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2827](https://togithub.com/charliermarsh/ruff/pull/2827) - Include package inference during --add-noqa command by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2832](https://togithub.com/charliermarsh/ruff/pull/2832) - Allow compound statements of single ellipsis by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2837](https://togithub.com/charliermarsh/ruff/pull/2837) #### New Contributors - [@​trag1c](https://togithub.com/trag1c) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2757](https://togithub.com/charliermarsh/ruff/pull/2757) - [@​PushUpek](https://togithub.com/PushUpek) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2762](https://togithub.com/charliermarsh/ruff/pull/2762) - [@​konysko](https://togithub.com/konysko) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2586](https://togithub.com/charliermarsh/ruff/pull/2586) - [@​SigureMo](https://togithub.com/SigureMo) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2805](https://togithub.com/charliermarsh/ruff/pull/2805) **Full Changelog**: astral-sh/ruff@v0.0.245...v0.0.246 ### [`v0.0.245`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.245) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.244...v0.0.245) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Breaking Changes - Remove public Rust API by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2709](https://togithub.com/charliermarsh/ruff/pull/2709) ##### Rules - \[`flake8-pyi`]Add flake8-pyi with one rule by [@​sbdchd](https://togithub.com/sbdchd) in [https://github.com/charliermarsh/ruff/pull/2682](https://togithub.com/charliermarsh/ruff/pull/2682) - \[`pylint`]: bad-string-format-type by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2572](https://togithub.com/charliermarsh/ruff/pull/2572) - \[`pylint`]: yield-in-init by [@​tomecki](https://togithub.com/tomecki) in [https://github.com/charliermarsh/ruff/pull/2716](https://togithub.com/charliermarsh/ruff/pull/2716) - \[`flake8-tidy-imports`] Implement autofix for relative imports (TID252) by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2739](https://togithub.com/charliermarsh/ruff/pull/2739) - \[`flake8-bandit`]: try-except-continue by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2674](https://togithub.com/charliermarsh/ruff/pull/2674) - \[`flake8-bandit`] Implement bandit's 'hardcoded-sql-expressions' S608 by [@​mattoberle](https://togithub.com/mattoberle) in [https://github.com/charliermarsh/ruff/pull/2698](https://togithub.com/charliermarsh/ruff/pull/2698) - \[`pycodestyle`] Implement compound-statements (E701, E702, E703, E704) by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2680](https://togithub.com/charliermarsh/ruff/pull/2680) ##### Settings - feat(isort): Implement known-local-folder by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2657](https://togithub.com/charliermarsh/ruff/pull/2657) - Suppress parse errors with explicit `# noqa: E999` directives by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2697](https://togithub.com/charliermarsh/ruff/pull/2697) ##### Bug Fixes - Support callable decorators in classmethod_decorators et al by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2675](https://togithub.com/charliermarsh/ruff/pull/2675) - Avoid flagging typed exceptions in tuples by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2728](https://togithub.com/charliermarsh/ruff/pull/2728) - Mark flake8-simplify rules as unfixable in non-fixable cases by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2676](https://togithub.com/charliermarsh/ruff/pull/2676) - Treat re-exported annotations as used-at-runtime by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2689](https://togithub.com/charliermarsh/ruff/pull/2689) - Gate `Path.readlink()` behind Python 3.9+ guard by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2708](https://togithub.com/charliermarsh/ruff/pull/2708) - Handle functions that never return in RET503 ([#​2602](https://togithub.com/charliermarsh/ruff/issues/2602)) by [@​ppentchev](https://togithub.com/ppentchev) in [https://github.com/charliermarsh/ruff/pull/2701](https://togithub.com/charliermarsh/ruff/pull/2701) - Handle more functions that never return in RET503 by [@​ngnpope](https://togithub.com/ngnpope) in [https://github.com/charliermarsh/ruff/pull/2719](https://togithub.com/charliermarsh/ruff/pull/2719) - Expand S110 and S112 ranges to include entire exception handler by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2729](https://togithub.com/charliermarsh/ruff/pull/2729) - Relax conditions in bad-string-format-type by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2731](https://togithub.com/charliermarsh/ruff/pull/2731) - Mark `__all__` members as used at end-of-scope by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2733](https://togithub.com/charliermarsh/ruff/pull/2733) - Only validate `__all__` bindings for global scope by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2738](https://togithub.com/charliermarsh/ruff/pull/2738) - Only trigger compound statements after select keywords by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2737](https://togithub.com/charliermarsh/ruff/pull/2737) - Use `function_type::classify` for `yield-in-init` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2742](https://togithub.com/charliermarsh/ruff/pull/2742) - Allow named unicodes in bidirectional escape check by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2710](https://togithub.com/charliermarsh/ruff/pull/2710) - Respect NO_COLOR flags in --show-source by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2750](https://togithub.com/charliermarsh/ruff/pull/2750) - Flag private member accesses on calls et al by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2753](https://togithub.com/charliermarsh/ruff/pull/2753) #### New Contributors - [@​ngnpope](https://togithub.com/ngnpope) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2692](https://togithub.com/charliermarsh/ruff/pull/2692) - [@​ppentchev](https://togithub.com/ppentchev) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2701](https://togithub.com/charliermarsh/ruff/pull/2701) - [@​tomecki](https://togithub.com/tomecki) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2716](https://togithub.com/charliermarsh/ruff/pull/2716) **Full Changelog**: astral-sh/ruff@v0.0.244...v0.0.245 ### [`v0.0.244`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.244) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.243...v0.0.244) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - \[`pylint`]: bidirectional-unicode by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2589](https://togithub.com/charliermarsh/ruff/pull/2589) - Implement whitespace-around-keywords (E271, E272, E273, E274) by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2653](https://togithub.com/charliermarsh/ruff/pull/2653) - Implement whitespace-before-comment (E261, E262, E265, E266) by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2654](https://togithub.com/charliermarsh/ruff/pull/2654) ##### Settings - flake8-annotations: add ignore-fully-untyped by [@​akx](https://togithub.com/akx) in [https://github.com/charliermarsh/ruff/pull/2128](https://togithub.com/charliermarsh/ruff/pull/2128) - Add `--exit-non-zero-on-fix` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2668](https://togithub.com/charliermarsh/ruff/pull/2668) ##### Documentation - Derive `explanation` method on Rule struct via rustdoc by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2642](https://togithub.com/charliermarsh/ruff/pull/2642) - Create per-rule pages and link from README by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2644](https://togithub.com/charliermarsh/ruff/pull/2644) - Add documentation for flake8-quotes rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2650](https://togithub.com/charliermarsh/ruff/pull/2650) - Disable autofix for flake8-print rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2651](https://togithub.com/charliermarsh/ruff/pull/2651) - Add documentation for eradicate, flake8-import-conventions, and flake8-no-pep420 by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2652](https://togithub.com/charliermarsh/ruff/pull/2652) - doc: add documentation for TRY002 by [@​nm-remarkable](https://togithub.com/nm-remarkable) in [https://github.com/charliermarsh/ruff/pull/2655](https://togithub.com/charliermarsh/ruff/pull/2655) ##### Bug Fixes - Accommodate pos-only arguments when checking self name by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2626](https://togithub.com/charliermarsh/ruff/pull/2626) - Avoid non-recursion in nested typing function calls by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2627](https://togithub.com/charliermarsh/ruff/pull/2627) - Avoid no-unnecessary-dict-kwargs errors with reserved keywords by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2628](https://togithub.com/charliermarsh/ruff/pull/2628) - Treat [@​staticmethod](https://togithub.com/staticmethod) as higher-precedence than ABC by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2635](https://togithub.com/charliermarsh/ruff/pull/2635) - Avoid boolean-trap errors in `__setitem__` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2636](https://togithub.com/charliermarsh/ruff/pull/2636) - Skip ternary fixes for yields and awaits by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2637](https://togithub.com/charliermarsh/ruff/pull/2637) - Ignore all non-`.py` wrt. implicit namespace package by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/2640](https://togithub.com/charliermarsh/ruff/pull/2640) - Avoid false-positive in chained type calls by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2663](https://togithub.com/charliermarsh/ruff/pull/2663) - Treat annotated assignments in class and module scopes as runtime by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2667](https://togithub.com/charliermarsh/ruff/pull/2667) - Accommodate multiple `@pytest.mark.parametrize` decorators by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2662](https://togithub.com/charliermarsh/ruff/pull/2662) - Use separate exit codes for fatal errors vs. lint errors by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2670](https://togithub.com/charliermarsh/ruff/pull/2670) #### New Contributors - [@​nm-remarkable](https://togithub.com/nm-remarkable) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2655](https://togithub.com/charliermarsh/ruff/pull/2655) **Full Changelog**: astral-sh/ruff@v0.0.243...v0.0.244 ### [`v0.0.243`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.243) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.242...v0.0.243) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - Add flake8-pie single_starts_ends_with by [@​sbdchd](https://togithub.com/sbdchd) in [https://github.com/charliermarsh/ruff/pull/2616](https://togithub.com/charliermarsh/ruff/pull/2616) ##### Bug Fixes - fix(pep8-naming): `typing.NamedTuple` and `typing.TypedDict` treatment by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/2611](https://togithub.com/charliermarsh/ruff/pull/2611) - Support `ignore-names` for all relevant pep8-naming rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2617](https://togithub.com/charliermarsh/ruff/pull/2617) - Avoid removing quotes from runtime annotations by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2614](https://togithub.com/charliermarsh/ruff/pull/2614) - Support relative paths for typing-modules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2615](https://togithub.com/charliermarsh/ruff/pull/2615) **Full Changelog**: astral-sh/ruff@v0.0.242...v0.0.243 ### [`v0.0.242`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.242) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.241...v0.0.242) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - Implement pylint's `too-many-branches` rule (`PLR0912`) by [@​chanman3388](https://togithub.com/chanman3388) in [https://github.com/charliermarsh/ruff/pull/2550](https://togithub.com/charliermarsh/ruff/pull/2550) - Implement pylint's `too-many-return-statements` rule (`PLR0911`) by [@​chanman3388](https://togithub.com/chanman3388) in [https://github.com/charliermarsh/ruff/pull/2564](https://togithub.com/charliermarsh/ruff/pull/2564) - \[`pyupgrade`]: Removes quotes from annotations by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2431](https://togithub.com/charliermarsh/ruff/pull/2431) - \[`pylint`]: bad-str-strip-call by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2570](https://togithub.com/charliermarsh/ruff/pull/2570) - Implement pycodestyle's logical line detection by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/1130](https://togithub.com/charliermarsh/ruff/pull/1130) - Enable autofix for unnecessary-paren-on-raise-exception by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2596](https://togithub.com/charliermarsh/ruff/pull/2596) - Automatically remove empty type-checking blocks by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2598](https://togithub.com/charliermarsh/ruff/pull/2598) ##### Bug Fixes - Avoid infinite renames for unused-loop-control-variable by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2581](https://togithub.com/charliermarsh/ruff/pull/2581) - Ignore direct root-children in implicit-namespace-package by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2565](https://togithub.com/charliermarsh/ruff/pull/2565) - Allow blank line before sticky-comment functions in docstrings by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2597](https://togithub.com/charliermarsh/ruff/pull/2597) - Visit deferred assignments after deferred type annotations by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2607](https://togithub.com/charliermarsh/ruff/pull/2607) - Fix python module invocation by [@​trottomv](https://togithub.com/trottomv) in [https://github.com/charliermarsh/ruff/pull/2563](https://togithub.com/charliermarsh/ruff/pull/2563) - Portably find ruff binary path from Python by [@​andersk](https://togithub.com/andersk) in [https://github.com/charliermarsh/ruff/pull/2574](https://togithub.com/charliermarsh/ruff/pull/2574) - fix(commented-out-code): `mypy` and `SPDX-License-Identifier` false positives by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/2587](https://togithub.com/charliermarsh/ruff/pull/2587) #### New Contributors - [@​trottomv](https://togithub.com/trottomv) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2563](https://togithub.com/charliermarsh/ruff/pull/2563) - [@​MichaReiser](https://togithub.com/MichaReiser) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2088](https://togithub.com/charliermarsh/ruff/pull/2088) **Full Changelog**: astral-sh/ruff@v0.0.241...v0.0.242 ### [`v0.0.241`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.241) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.240...v0.0.241) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Deprecates - Soft-deprecate `update-check` by [@​akx](https://togithub.com/akx) in [https://github.com/charliermarsh/ruff/pull/2530](https://togithub.com/charliermarsh/ruff/pull/2530) ##### Rules - feat: add autofix for PLR0402 by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2504](https://togithub.com/charliermarsh/ruff/pull/2504) - Allow F811 noqa declarations on containing import lines by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2553](https://togithub.com/charliermarsh/ruff/pull/2553) ##### Features - Mark fixable issues in printer output by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2500](https://togithub.com/charliermarsh/ruff/pull/2500) - Always report parse errors back to the user by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2505](https://togithub.com/charliermarsh/ruff/pull/2505) - Notify user if autofix introduces syntax error by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2507](https://togithub.com/charliermarsh/ruff/pull/2507) - Add `known-standard-library` for each Python version by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/2491](https://togithub.com/charliermarsh/ruff/pull/2491) ##### Bug Fixes - Avoid renaming unused loop variables with deferred usages by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2509](https://togithub.com/charliermarsh/ruff/pull/2509) - \[`flake8-self`] Fix False Negative Issue on Rule `SLF001` by [@​saadmk11](https://togithub.com/saadmk11) in [https://github.com/charliermarsh/ruff/pull/2527](https://togithub.com/charliermarsh/ruff/pull/2527) - Minor fixes to PLR0915 logic by [@​chanman3388](https://togithub.com/chanman3388) in [https://github.com/charliermarsh/ruff/pull/2518](https://togithub.com/charliermarsh/ruff/pull/2518) - Exit upon showing files with `--show-files` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2543](https://togithub.com/charliermarsh/ruff/pull/2543) - Ignore direct source-children in `implicit-namespace-package` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2560](https://togithub.com/charliermarsh/ruff/pull/2560) - Allow `list()` and `tuple()` calls in `__all__` assignments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2499](https://togithub.com/charliermarsh/ruff/pull/2499) - Don't walk past project root when figuring out exclusion by [@​akx](https://togithub.com/akx) in [https://github.com/charliermarsh/ruff/pull/2471](https://togithub.com/charliermarsh/ruff/pull/2471) - Avoid hang when detecting trailing comments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2549](https://togithub.com/charliermarsh/ruff/pull/2549) #### New Contributors - [@​JacobCoffee](https://togithub.com/JacobCoffee) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2516](https://togithub.com/charliermarsh/ruff/pull/2516) - [@​Pierre-Sassoulas](https://togithub.com/Pierre-Sassoulas) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2559](https://togithub.com/charliermarsh/ruff/pull/2559) **Full Changelog**: astral-sh/ruff@v0.0.240...v0.0.241 ### [`v0.0.240`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.240) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.239...v0.0.240) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - \[`pyupgrade`]: Remove outdated `sys.version_info` blocks by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2099](https://togithub.com/charliermarsh/ruff/pull/2099) - \[`flake8-self`] Add Plugin and Rule `SLF001` by [@​saadmk11](https://togithub.com/saadmk11) in [https://github.com/charliermarsh/ruff/pull/2470](https://togithub.com/charliermarsh/ruff/pull/2470) - \[`pylint`] Implement pylint's `too-many-statements` rule (`PLR0915`) by [@​chanman3388](https://togithub.com/chanman3388) in [https://github.com/charliermarsh/ruff/pull/2445](https://togithub.com/charliermarsh/ruff/pull/2445) ##### Settings - \[`isort`] Support forced_separate by [@​akx](https://togithub.com/akx) in [https://github.com/charliermarsh/ruff/pull/2268](https://togithub.com/charliermarsh/ruff/pull/2268) - \[`isort`] Add isort option lines-after-imports by [@​reidswan](https://togithub.com/reidswan) in [https://github.com/charliermarsh/ruff/pull/2440](https://togithub.com/charliermarsh/ruff/pull/2440) - Allow non-ruff.toml-named files for --config by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2463](https://togithub.com/charliermarsh/ruff/pull/2463) ##### Bug Fixes - Trigger, but don't fix, SIM rules if comments are present by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2450](https://togithub.com/charliermarsh/ruff/pull/2450) - Only avoid PEP604 rewrites for pre-Python 3.10 code by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2449](https://togithub.com/charliermarsh/ruff/pull/2449) - Use LibCST to reverse Yoda conditions by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2468](https://togithub.com/charliermarsh/ruff/pull/2468) - fix: assertTrue()/assertFalse() fixer should not test for identity by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2476](https://togithub.com/charliermarsh/ruff/pull/2476) - Treat `if 0:` and `if False:` as type-checking blocks by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2485](https://togithub.com/charliermarsh/ruff/pull/2485) - Avoid iterating over body twice by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2439](https://togithub.com/charliermarsh/ruff/pull/2439) - more builtin name checks when autofixing by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2430](https://togithub.com/charliermarsh/ruff/pull/2430) - Respect parent noqa in --add-noqa by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2464](https://togithub.com/charliermarsh/ruff/pull/2464) - Avoid removing un-selected codes when applying `--add-noqa` edits by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2465](https://togithub.com/charliermarsh/ruff/pull/2465) - Carry-over `ignore` to next config layer if `select = []` by [@​not-my-profile](https://togithub.com/not-my-profile) in [https://github.com/charliermarsh/ruff/pull/2467](https://togithub.com/charliermarsh/ruff/pull/2467) - Visit NamedExpr values before targets by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2484](https://togithub.com/charliermarsh/ruff/pull/2484) #### New Contributors - [@​reidswan](https://togithub.com/reidswan) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2440](https://togithub.com/charliermarsh/ruff/pull/2440) - [@​chanman3388](https://togithub.com/chanman3388) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2445](https://togithub.com/charliermarsh/ruff/pull/2445) **Full Changelog**: astral-sh/ruff@v0.0.239...v0.0.240 ### [`v0.0.239`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.239) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.238...v0.0.239) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - \[`pyupgrade`] Implement import-replacement rule (`UP035`) by [@​colin99d](https://togithub.com/colin99d) in [https://github.com/charliermarsh/ruff/pull/2049](https://togithub.com/charliermarsh/ruff/pull/2049) - \[`flake8-raise`] Add Plugin and `RSE102` Rule by [@​saadmk11](https://togithub.com/saadmk11) in [https://github.com/charliermarsh/ruff/pull/2354](https://togithub.com/charliermarsh/ruff/pull/2354) - \[`flake8-quotes`] Allow implicit multiline strings with internal quotes to use non-preferred quote by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2416](https://togithub.com/charliermarsh/ruff/pull/2416) ##### Documentation - Add a link to MkDocs by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2370](https://togithub.com/charliermarsh/ruff/pull/2370) - Use human-readable types for documentation values by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2375](https://togithub.com/charliermarsh/ruff/pull/2375) ##### Bug Fixes - \[`I001`] fix isort check for files with tabs and no indented blocks by [@​sciyoshi](https://togithub.com/sciyoshi) in [https://github.com/charliermarsh/ruff/pull/2374](https://togithub.com/charliermarsh/ruff/pull/2374) - Don't panic for --statistics with no errors by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2391](https://togithub.com/charliermarsh/ruff/pull/2391) - Handle multi-byte lines in RUF100 by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2392](https://togithub.com/charliermarsh/ruff/pull/2392) - Avoid implicit-namespace-package checks for .pyi files by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2420](https://togithub.com/charliermarsh/ruff/pull/2420) - Include per-file ignore matches in debug logging by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2376](https://togithub.com/charliermarsh/ruff/pull/2376) - Include method name in B027 message by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2403](https://togithub.com/charliermarsh/ruff/pull/2403) - Avoid flagging same-condition cases in SIM103 by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2404](https://togithub.com/charliermarsh/ruff/pull/2404) - feat: let SIM103 return expressions without bool() wrapping by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2410](https://togithub.com/charliermarsh/ruff/pull/2410) - feat: let SIM210 return expressions without bool() wrapping ([#​2410](https://togithub.com/charliermarsh/ruff/issues/2410)) by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2426](https://togithub.com/charliermarsh/ruff/pull/2426) - fix: ignore fix if "bool" is not builtin by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2429](https://togithub.com/charliermarsh/ruff/pull/2429) - Avoid Bandit false-positives for empty-string-as-password by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2421](https://togithub.com/charliermarsh/ruff/pull/2421) #### New Contributors - [@​eriknw](https://togithub.com/eriknw) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2380](https://togithub.com/charliermarsh/ruff/pull/2380) - [@​has2k1](https://togithub.com/has2k1) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2386](https://togithub.com/charliermarsh/ruff/pull/2386) **Full Changelog**: astral-sh/ruff@v0.0.238...v0.0.239 ### [`v0.0.238`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.238) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.237...v0.0.238) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed #####⚠️ Breaking Changes⚠️ ##### `select`, `extend-select`, `ignore`, and `extend-ignore` have new semantics ([#​2312](https://togithub.com/charliermarsh/ruff/pull/2312)) Previously, the interplay between `select` and its related options could lead to unexpected behavior. For example, `ruff --select E501 --ignore ALL` and `ruff --select E501 --extend-ignore ALL` behaved differently. (See [#​2312](https://togithub.com/charliermarsh/ruff/pull/2312) for more examples.) The new semantics are such that Ruff uses the "highest-priority" `select` as the basis for the rule set, and then applies any `extend-select`, `ignore`, and `extend-ignore` adjustments. CLI options are given higher priority than `pyproject.toml` options, and the current `pyproject.toml` file is given higher priority than any inherited `pyproject.toml` files. As an example: `ruff --select F401` will select rule `F401`, and ignore any of the modifiers from the `pyproject.toml`, as the "highest-priorty" select kicks off the resolution chain. This change is largely backwards compatible -- most users should experience no change in behavior. For more, see [BREAKING_CHANGES.md](https://togithub.com/charliermarsh/ruff/blob/main/BREAKING_CHANGES.md#select-extend-select-ignore-and-extend-ignore-have-new-semantics-2312). ##### `remove-six-compat` (`UP016`) has been removed ([#​2332](https://togithub.com/charliermarsh/ruff/pull/2332)) The `remove-six-compat` rule has been removed. This rule was only useful for one-time Python 2-to-3 upgrades. ##### Rules - Implement Pylint's `too-many-arguments` rule (`PLR0913`) by [@​akhildevelops](https://togithub.com/akhildevelops) in [https://github.com/charliermarsh/ruff/pull/2308](https://togithub.com/charliermarsh/ruff/pull/2308) - Extend conventional imports defaults to include TensorFlow et al by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2353](https://togithub.com/charliermarsh/ruff/pull/2353) ##### Settings - feat: add ruff --statistics by [@​spaceone](https://togithub.com/spaceone) in [https://github.com/charliermarsh/ruff/pull/2284](https://togithub.com/charliermarsh/ruff/pull/2284) - Ignore magic comparisons to bytes by default by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2365](https://togithub.com/charliermarsh/ruff/pull/2365) - Implement `ruff linter` subcommand by [@​not-my-profile](https://togithub.com/not-my-profile) in [https://github.com/charliermarsh/ruff/pull/2294](https://togithub.com/charliermarsh/ruff/pull/2294) - Improve rule config resolution by [@​not-my-profile](https://togithub.com/not-my-profile) in [https://github.com/charliermarsh/ruff/pull/2312](https://togithub.com/charliermarsh/ruff/pull/2312) ##### Bug Fixes - Refine criteria for `exc_info` logger rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2364](https://togithub.com/charliermarsh/ruff/pull/2364) - Respect per-file-ignores when checking noqa by [@​sciyoshi](https://togithub.com/sciyoshi) in [https://github.com/charliermarsh/ruff/pull/2309](https://togithub.com/charliermarsh/ruff/pull/2309) - Place star before other member imports by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2320](https://togithub.com/charliermarsh/ruff/pull/2320) - Allow list comprehensions for **all** assignment by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2326](https://togithub.com/charliermarsh/ruff/pull/2326) - \[`TRY201`] don't check raise statements in nested exception handlers by [@​sciyoshi](https://togithub.com/sciyoshi) in [https://github.com/charliermarsh/ruff/pull/2337](https://togithub.com/charliermarsh/ruff/pull/2337) - include tomllib in standard lib by [@​sbrugman](https://togithub.com/sbrugman) in [https://github.com/charliermarsh/ruff/pull/2345](https://togithub.com/charliermarsh/ruff/pull/2345) - Avoid removing trailing comments when autofixing by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2352](https://togithub.com/charliermarsh/ruff/pull/2352) - \[`I001`] fix isort for files with tab-based indentation by [@​sciyoshi](https://togithub.com/sciyoshi) in [https://github.com/charliermarsh/ruff/pull/2361](https://togithub.com/charliermarsh/ruff/pull/2361) - Disable incompatible rules rather than merely warning by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/2369](https://togithub.com/charliermarsh/ruff/pull/2369) #### New Contributors - [@​chirag127](https://togithub.com/chirag127) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2307](https://togithub.com/charliermarsh/ruff/pull/2307) - [@​akhildevelops](https://togithub.com/akhildevelops) made their first contribution in [https://github.com/charliermarsh/ruff/pull/2308](https://togithub.com/charliermarsh/ruff/pull/2308) **Full Changelog**: astral-sh/ruff@v0.0.237...v0.0.238 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/premiscale/premiscale). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xNDMuMSIsInVwZGF0ZWRJblZlciI6IjM0LjE0My4xIn0=-->
Ruff allows rules to be enabled with
select
and disabled withignore
, where the more specific rule selector takes precedence,for example:
(If both selectors have the same specificity ignore selectors
take precedence.)
Ruff always had two quirks:
If
pyproject.toml
specifiedignore = ["E501"]
then you couldpreviously not override that with
--select E501
on the command-line(since the resolution didn't take into account that the select was
specified after the ignore).
If
pyproject.toml
specifiedselect = ["E501"]
then you couldpreviously not override that with
--ignore E
on the command-line(since the resolution didn't take into account that the ignore was
specified after the select).
Since d067efe (#1245)
extend-select
andextend-ignore
always overrideselect
andignore
and are applied iteratively in pairs,which introduced another quirk:
pyproject.toml
file specifiedextend-select
or
extend-ignore
,select
andignore
became pretty muchunreliable after that with no way of resetting that.
This commit fixes all of these quirks by making later configuration
sources take precedence over earlier configuration sources.
While this is a breaking change, it fixes the broken status quo.
Fixes #2300.