-
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
Invert quote-style when generating code within f-strings #4487
Conversation
@@ -134,6 +135,53 @@ impl<'a> Checker<'a> { | |||
} | |||
noqa::rule_is_ignored(code, offset, self.noqa_line_for, self.locator) | |||
} | |||
|
|||
/// Create a [`Generator`] to generate source code based on the current AST state. | |||
pub fn generator(&self) -> Generator { |
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 don't know where this belongs -- it requires the Context
, Indexer
, Locator
, and Stylist
, so right now it lives on Checker
...
@@ -62,14 +62,14 @@ fn unparse_string_format_expression(checker: &mut Checker, expr: &Expr) -> Optio | |||
}) => { | |||
let Some(parent) = checker.ctx.expr_parent() else { | |||
if any_over_expr(expr, &has_string_literal) { | |||
return Some(unparse_expr(expr, checker.stylist)); | |||
return Some(unparse_expr(expr, checker.generator())); |
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.
These are all mechanical.
triple_quoted_string_ranges.push(*range); | ||
} | ||
if matches!(kind, StringKind::FString | StringKind::RawFString) { | ||
f_string_ranges.push(*range); |
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.
We now track f-string ranges, which lets us do a binary search to find the containing f-string whenever we need to fix within an f-string.
As part of this effort... we may want to consider |
bbc239f
to
867c7bd
Compare
PR Check ResultsEcosystem✅ ecosystem check detected no changes. BenchmarkLinux
Windows
|
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.
This PR modifies our logic by "inverting" the preferred quote style whenever we're inside a single-quoted f-string. This in turn requires that we track all f-strings, and are able to map from the current expression to the surrounding f-strings.
My understanding is that the preferred quote style only reflects the most used quote sign. This does not guarantee that the source code contains no fstrings with the not preferred fstring.
Edit: Your implementation handles this correctly, I think.
This doesn't really deal with nested f-strings. I'm not sure what we want to do in those cases. The grammar is so limiting and complicated. We may want to avoid fixing issues within nested f-strings altogether?
An alternative would be to make this a manual
fix. This won't be very helpful now because our default text renderer doesn't show fixes (we should improve our diagnostics).
How difficult do you think would it be to add source map support to the Generator
? We could then generate the code for the enclosing expression or statement and then extract the fstring range. They way this could work is that the generator writes a source map entry at the start and end of every node, mapping the node's start/end offset to the offset in the generated source (similar to the Printer in the formatter)
use crate::statement_visitor::{walk_body, walk_stmt, StatementVisitor}; | ||
|
||
/// Generate source code from an [`Expr`]. | ||
pub fn unparse_expr(expr: &Expr, stylist: &Stylist) -> String { | ||
let mut generator: Generator = stylist.into(); | ||
pub fn unparse_expr(expr: &Expr, mut generator: Generator) -> String { |
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.
For another PR: Should we move these methods to Generator
instead, now that they always require a generator.
generator.unparse_expr(expr)
// or
generator.generate_expr(expr)
👍 Yeah, sorry, the implementation does do this correctly, but I'll improve the summary. |
Can you elaborate on this a bit more? What does this buy us? (Genuinely asking, not objecting.) |
867c7bd
to
2d1b3a7
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) ([changelog](https://togithub.com/charliermarsh/ruff/releases)) | `^0.0.267` -> `^0.0.269` | [![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/compatibility-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/confidence-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.269`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.269) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.267...v0.0.269) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed (This is a rerelease of `v0.0.268`, which didn't make it to PyPI due to user error. As such, the release notes are copied below.) ##### `pycodestyle` This release includes optimized implementations of a large portion of `pycodestyle`, for those that use Ruff without an autoformatter. In this initial release, the rules are being introduced under a "nursery" flag, which requires that users explicitly select them (e.g., `select = ["E111"]`); in other words, these rules are not yet enabled via `select = ["E"]`. If you're interested in testing the `pycodestyle` rules, you can enable them via: ```toml select = [ "E111", "E112", "E113", "E114", "E115", "E116", "E117", "E201", "E202", "E203", "E211", "E221", "E222", "E223", "E224", "E225", "E226", "E227", "E228", "E231", "E251", "E252", "E261", "E262", "E265", "E266", "E271", "E272", "E273", "E274", "E275", ] ``` These rules will be included as part of the `E` category in a future release. ##### Breaking Changes - \[`pyupgrade`] Remove `keep-runtime-typing` setting by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4427](https://togithub.com/charliermarsh/ruff/pull/4427) ##### Rules - \[`pylint`] Add `duplicate-bases` rule by [@​alonme](https://togithub.com/alonme) in [https://github.com/charliermarsh/ruff/pull/4411](https://togithub.com/charliermarsh/ruff/pull/4411) - \[`pylint`] Fix `PLW3301` auto-fix with generators by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4412](https://togithub.com/charliermarsh/ruff/pull/4412) - \[`flake8-async`] Implement flake8-async plugin by [@​qdegraaf](https://togithub.com/qdegraaf) in [https://github.com/charliermarsh/ruff/pull/4432](https://togithub.com/charliermarsh/ruff/pull/4432) - \[`pyupgrade`] Enable automatic rewrites of `typing.Deque` and `typing.DefaultDict` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4420](https://togithub.com/charliermarsh/ruff/pull/4420) - \[`flake8-pyi`] Implement `unannotated-assignment-in-stub` (`PY052`) by [@​sladyn98](https://togithub.com/sladyn98) in [https://github.com/charliermarsh/ruff/pull/4293](https://togithub.com/charliermarsh/ruff/pull/4293) - \[`tryceratops`] Implement TRY302 - `raise` after `except` by [@​john-h-k](https://togithub.com/john-h-k) in [https://github.com/charliermarsh/ruff/pull/4461](https://togithub.com/charliermarsh/ruff/pull/4461) - \[`flake8-bandit`] Improve SQL injection detection logic (`S608`) by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4499](https://togithub.com/charliermarsh/ruff/pull/4499) - \[`flake8-todos`] Implement `flake8_todos` by [@​evanrittenhouse](https://togithub.com/evanrittenhouse) in [https://github.com/charliermarsh/ruff/pull/3921](https://togithub.com/charliermarsh/ruff/pull/3921) - \[`flake8-future-annotations`] Implement `flake8-future-annotations` FA100 by [@​TylerYep](https://togithub.com/TylerYep) in [https://github.com/charliermarsh/ruff/pull/3979](https://togithub.com/charliermarsh/ruff/pull/3979) - Enable `pycodestyle` rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/3689](https://togithub.com/charliermarsh/ruff/pull/3689) - Enable `pycodestyle` rules under new "nursery" category by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4407](https://togithub.com/charliermarsh/ruff/pull/4407) ##### Settings - Merge subsettings when extending configurations by [@​bendoerry](https://togithub.com/bendoerry) in [https://github.com/charliermarsh/ruff/pull/4431](https://togithub.com/charliermarsh/ruff/pull/4431) ##### Bug Fixes - Extend multi-line noqa directives to start-of-line by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4490](https://togithub.com/charliermarsh/ruff/pull/4490) - Fix scoping of comprehensions within classes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4494](https://togithub.com/charliermarsh/ruff/pull/4494) - Enable autofix for split-assertions at top level by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4405](https://togithub.com/charliermarsh/ruff/pull/4405) - Ignore ANN401 for overridden methods by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4409](https://togithub.com/charliermarsh/ruff/pull/4409) - Fix `RUF010` autofix within f-strings by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4423](https://togithub.com/charliermarsh/ruff/pull/4423) - Update C419 to be a suggested fix by [@​madkinsz](https://togithub.com/madkinsz) in [https://github.com/charliermarsh/ruff/pull/4424](https://togithub.com/charliermarsh/ruff/pull/4424) - Fix expected-indentation errors with end-of-line comments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4438](https://togithub.com/charliermarsh/ruff/pull/4438) - Emit non-logical newlines for "empty" lines by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4444](https://togithub.com/charliermarsh/ruff/pull/4444) - Avoid emitting empty logical lines by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4452](https://togithub.com/charliermarsh/ruff/pull/4452) - Avoid flagging missing whitespace for decorators by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4454](https://togithub.com/charliermarsh/ruff/pull/4454) - Remove special-casing for whitespace-around-@​ by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4458](https://togithub.com/charliermarsh/ruff/pull/4458) - Avoid triggering `pd#at` and friends on non-subscripts by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4474](https://togithub.com/charliermarsh/ruff/pull/4474) - Include precise tokens for extraneous-whitespace diagnostics by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4471](https://togithub.com/charliermarsh/ruff/pull/4471) - Allow shebang comments at start-of-file by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4473](https://togithub.com/charliermarsh/ruff/pull/4473) - Bring pycodestyle rules into full compatibility (on SciPy) by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4472](https://togithub.com/charliermarsh/ruff/pull/4472) - Invert quote-style when generating code within f-strings by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4487](https://togithub.com/charliermarsh/ruff/pull/4487) - Fix COM812 false positive in string subscript by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4493](https://togithub.com/charliermarsh/ruff/pull/4493) - Overhaul sdist handling by [@​konstin](https://togithub.com/konstin) in [https://github.com/charliermarsh/ruff/pull/4439](https://togithub.com/charliermarsh/ruff/pull/4439) #### New Contributors - [@​TylerYep](https://togithub.com/TylerYep) made their first contribution in [https://github.com/charliermarsh/ruff/pull/3979](https://togithub.com/charliermarsh/ruff/pull/3979) - [@​yanksyoon](https://togithub.com/yanksyoon) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4428](https://togithub.com/charliermarsh/ruff/pull/4428) - [@​bendoerry](https://togithub.com/bendoerry) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4431](https://togithub.com/charliermarsh/ruff/pull/4431) - [@​qdegraaf](https://togithub.com/qdegraaf) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4432](https://togithub.com/charliermarsh/ruff/pull/4432) - [@​jameslamb](https://togithub.com/jameslamb) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4446](https://togithub.com/charliermarsh/ruff/pull/4446) - [@​john-h-k](https://togithub.com/john-h-k) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4461](https://togithub.com/charliermarsh/ruff/pull/4461) **Full Changelog**: astral-sh/ruff@v0.0.267...v0.0.269 </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:eyJjcmVhdGVkSW5WZXIiOiIzNS45NS4xIiwidXBkYXRlZEluVmVyIjoiMzUuOTUuMSIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> Signed-off-by: Renovate Bot <[email protected]> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
30 | f"{str()}" | ||
| ^^^^^ UP018 | ||
| | ||
= help: Replace with `str` |
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.
that suggestion looks wrong
I wrote this before I understood that your fix solves the problem. The main benefit would be that it would make the Generator context aware. You won't need any special handling because you generate on a statement level. |
[![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) ([changelog](https://togithub.com/charliermarsh/ruff/releases)) | `==0.0.267` -> `==0.0.269` | [![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/compatibility-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/confidence-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.269`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.269) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.267...v0.0.269) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed (This is a rerelease of `v0.0.268`, which didn't make it to PyPI due to user error. As such, the release notes are copied below.) ##### `pycodestyle` This release includes optimized implementations of a large portion of `pycodestyle`, for those that use Ruff without an autoformatter. In this initial release, the rules are being introduced under a "nursery" flag, which requires that users explicitly select them (e.g., `select = ["E111"]`); in other words, these rules are not yet enabled via `select = ["E"]`. If you're interested in testing the `pycodestyle` rules, you can enable them via: ```toml select = [ "E111", "E112", "E113", "E114", "E115", "E116", "E117", "E201", "E202", "E203", "E211", "E221", "E222", "E223", "E224", "E225", "E226", "E227", "E228", "E231", "E251", "E252", "E261", "E262", "E265", "E266", "E271", "E272", "E273", "E274", "E275", ] ``` These rules will be included as part of the `E` category in a future release. ##### Breaking Changes - \[`pyupgrade`] Remove `keep-runtime-typing` setting by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4427](https://togithub.com/charliermarsh/ruff/pull/4427) ##### Rules - \[`pylint`] Add `duplicate-bases` rule by [@​alonme](https://togithub.com/alonme) in [https://github.com/charliermarsh/ruff/pull/4411](https://togithub.com/charliermarsh/ruff/pull/4411) - \[`pylint`] Fix `PLW3301` auto-fix with generators by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4412](https://togithub.com/charliermarsh/ruff/pull/4412) - \[`flake8-async`] Implement flake8-async plugin by [@​qdegraaf](https://togithub.com/qdegraaf) in [https://github.com/charliermarsh/ruff/pull/4432](https://togithub.com/charliermarsh/ruff/pull/4432) - \[`pyupgrade`] Enable automatic rewrites of `typing.Deque` and `typing.DefaultDict` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4420](https://togithub.com/charliermarsh/ruff/pull/4420) - \[`flake8-pyi`] Implement `unannotated-assignment-in-stub` (`PY052`) by [@​sladyn98](https://togithub.com/sladyn98) in [https://github.com/charliermarsh/ruff/pull/4293](https://togithub.com/charliermarsh/ruff/pull/4293) - \[`tryceratops`] Implement TRY302 - `raise` after `except` by [@​john-h-k](https://togithub.com/john-h-k) in [https://github.com/charliermarsh/ruff/pull/4461](https://togithub.com/charliermarsh/ruff/pull/4461) - \[`flake8-bandit`] Improve SQL injection detection logic (`S608`) by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4499](https://togithub.com/charliermarsh/ruff/pull/4499) - \[`flake8-todos`] Implement `flake8_todos` by [@​evanrittenhouse](https://togithub.com/evanrittenhouse) in [https://github.com/charliermarsh/ruff/pull/3921](https://togithub.com/charliermarsh/ruff/pull/3921) - \[`flake8-future-annotations`] Implement `flake8-future-annotations` FA100 by [@​TylerYep](https://togithub.com/TylerYep) in [https://github.com/charliermarsh/ruff/pull/3979](https://togithub.com/charliermarsh/ruff/pull/3979) - Enable `pycodestyle` rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/3689](https://togithub.com/charliermarsh/ruff/pull/3689) - Enable `pycodestyle` rules under new "nursery" category by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4407](https://togithub.com/charliermarsh/ruff/pull/4407) ##### Settings - Merge subsettings when extending configurations by [@​bendoerry](https://togithub.com/bendoerry) in [https://github.com/charliermarsh/ruff/pull/4431](https://togithub.com/charliermarsh/ruff/pull/4431) ##### Bug Fixes - Extend multi-line noqa directives to start-of-line by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4490](https://togithub.com/charliermarsh/ruff/pull/4490) - Fix scoping of comprehensions within classes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4494](https://togithub.com/charliermarsh/ruff/pull/4494) - Enable autofix for split-assertions at top level by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4405](https://togithub.com/charliermarsh/ruff/pull/4405) - Ignore ANN401 for overridden methods by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4409](https://togithub.com/charliermarsh/ruff/pull/4409) - Fix `RUF010` autofix within f-strings by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4423](https://togithub.com/charliermarsh/ruff/pull/4423) - Update C419 to be a suggested fix by [@​madkinsz](https://togithub.com/madkinsz) in [https://github.com/charliermarsh/ruff/pull/4424](https://togithub.com/charliermarsh/ruff/pull/4424) - Fix expected-indentation errors with end-of-line comments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4438](https://togithub.com/charliermarsh/ruff/pull/4438) - Emit non-logical newlines for "empty" lines by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4444](https://togithub.com/charliermarsh/ruff/pull/4444) - Avoid emitting empty logical lines by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4452](https://togithub.com/charliermarsh/ruff/pull/4452) - Avoid flagging missing whitespace for decorators by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4454](https://togithub.com/charliermarsh/ruff/pull/4454) - Remove special-casing for whitespace-around-@​ by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4458](https://togithub.com/charliermarsh/ruff/pull/4458) - Avoid triggering `pd#at` and friends on non-subscripts by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4474](https://togithub.com/charliermarsh/ruff/pull/4474) - Include precise tokens for extraneous-whitespace diagnostics by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4471](https://togithub.com/charliermarsh/ruff/pull/4471) - Allow shebang comments at start-of-file by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4473](https://togithub.com/charliermarsh/ruff/pull/4473) - Bring pycodestyle rules into full compatibility (on SciPy) by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4472](https://togithub.com/charliermarsh/ruff/pull/4472) - Invert quote-style when generating code within f-strings by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4487](https://togithub.com/charliermarsh/ruff/pull/4487) - Fix COM812 false positive in string subscript by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4493](https://togithub.com/charliermarsh/ruff/pull/4493) - Overhaul sdist handling by [@​konstin](https://togithub.com/konstin) in [https://github.com/charliermarsh/ruff/pull/4439](https://togithub.com/charliermarsh/ruff/pull/4439) #### New Contributors - [@​TylerYep](https://togithub.com/TylerYep) made their first contribution in [https://github.com/charliermarsh/ruff/pull/3979](https://togithub.com/charliermarsh/ruff/pull/3979) - [@​yanksyoon](https://togithub.com/yanksyoon) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4428](https://togithub.com/charliermarsh/ruff/pull/4428) - [@​bendoerry](https://togithub.com/bendoerry) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4431](https://togithub.com/charliermarsh/ruff/pull/4431) - [@​qdegraaf](https://togithub.com/qdegraaf) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4432](https://togithub.com/charliermarsh/ruff/pull/4432) - [@​jameslamb](https://togithub.com/jameslamb) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4446](https://togithub.com/charliermarsh/ruff/pull/4446) - [@​john-h-k](https://togithub.com/john-h-k) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4461](https://togithub.com/charliermarsh/ruff/pull/4461) **Full Changelog**: astral-sh/ruff@v0.0.267...v0.0.269 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **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/allenporter/pyrainbird). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45NS4xIiwidXBkYXRlZEluVmVyIjoiMzUuOTUuMSIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> 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) ([changelog](https://togithub.com/charliermarsh/ruff/releases)) | `==0.0.267` -> `==0.0.269` | [![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/compatibility-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/confidence-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.269`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.269) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.267...v0.0.269) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed (This is a rerelease of `v0.0.268`, which didn't make it to PyPI due to user error. As such, the release notes are copied below.) ##### `pycodestyle` This release includes optimized implementations of a large portion of `pycodestyle`, for those that use Ruff without an autoformatter. In this initial release, the rules are being introduced under a "nursery" flag, which requires that users explicitly select them (e.g., `select = ["E111"]`); in other words, these rules are not yet enabled via `select = ["E"]`. If you're interested in testing the `pycodestyle` rules, you can enable them via: ```toml select = [ "E111", "E112", "E113", "E114", "E115", "E116", "E117", "E201", "E202", "E203", "E211", "E221", "E222", "E223", "E224", "E225", "E226", "E227", "E228", "E231", "E251", "E252", "E261", "E262", "E265", "E266", "E271", "E272", "E273", "E274", "E275", ] ``` These rules will be included as part of the `E` category in a future release. ##### Breaking Changes - \[`pyupgrade`] Remove `keep-runtime-typing` setting by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4427](https://togithub.com/charliermarsh/ruff/pull/4427) ##### Rules - \[`pylint`] Add `duplicate-bases` rule by [@​alonme](https://togithub.com/alonme) in [https://github.com/charliermarsh/ruff/pull/4411](https://togithub.com/charliermarsh/ruff/pull/4411) - \[`pylint`] Fix `PLW3301` auto-fix with generators by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4412](https://togithub.com/charliermarsh/ruff/pull/4412) - \[`flake8-async`] Implement flake8-async plugin by [@​qdegraaf](https://togithub.com/qdegraaf) in [https://github.com/charliermarsh/ruff/pull/4432](https://togithub.com/charliermarsh/ruff/pull/4432) - \[`pyupgrade`] Enable automatic rewrites of `typing.Deque` and `typing.DefaultDict` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4420](https://togithub.com/charliermarsh/ruff/pull/4420) - \[`flake8-pyi`] Implement `unannotated-assignment-in-stub` (`PY052`) by [@​sladyn98](https://togithub.com/sladyn98) in [https://github.com/charliermarsh/ruff/pull/4293](https://togithub.com/charliermarsh/ruff/pull/4293) - \[`tryceratops`] Implement TRY302 - `raise` after `except` by [@​john-h-k](https://togithub.com/john-h-k) in [https://github.com/charliermarsh/ruff/pull/4461](https://togithub.com/charliermarsh/ruff/pull/4461) - \[`flake8-bandit`] Improve SQL injection detection logic (`S608`) by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4499](https://togithub.com/charliermarsh/ruff/pull/4499) - \[`flake8-todos`] Implement `flake8_todos` by [@​evanrittenhouse](https://togithub.com/evanrittenhouse) in [https://github.com/charliermarsh/ruff/pull/3921](https://togithub.com/charliermarsh/ruff/pull/3921) - \[`flake8-future-annotations`] Implement `flake8-future-annotations` FA100 by [@​TylerYep](https://togithub.com/TylerYep) in [https://github.com/charliermarsh/ruff/pull/3979](https://togithub.com/charliermarsh/ruff/pull/3979) - Enable `pycodestyle` rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/3689](https://togithub.com/charliermarsh/ruff/pull/3689) - Enable `pycodestyle` rules under new "nursery" category by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4407](https://togithub.com/charliermarsh/ruff/pull/4407) ##### Settings - Merge subsettings when extending configurations by [@​bendoerry](https://togithub.com/bendoerry) in [https://github.com/charliermarsh/ruff/pull/4431](https://togithub.com/charliermarsh/ruff/pull/4431) ##### Bug Fixes - Extend multi-line noqa directives to start-of-line by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4490](https://togithub.com/charliermarsh/ruff/pull/4490) - Fix scoping of comprehensions within classes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4494](https://togithub.com/charliermarsh/ruff/pull/4494) - Enable autofix for split-assertions at top level by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4405](https://togithub.com/charliermarsh/ruff/pull/4405) - Ignore ANN401 for overridden methods by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4409](https://togithub.com/charliermarsh/ruff/pull/4409) - Fix `RUF010` autofix within f-strings by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4423](https://togithub.com/charliermarsh/ruff/pull/4423) - Update C419 to be a suggested fix by [@​madkinsz](https://togithub.com/madkinsz) in [https://github.com/charliermarsh/ruff/pull/4424](https://togithub.com/charliermarsh/ruff/pull/4424) - Fix expected-indentation errors with end-of-line comments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4438](https://togithub.com/charliermarsh/ruff/pull/4438) - Emit non-logical newlines for "empty" lines by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4444](https://togithub.com/charliermarsh/ruff/pull/4444) - Avoid emitting empty logical lines by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4452](https://togithub.com/charliermarsh/ruff/pull/4452) - Avoid flagging missing whitespace for decorators by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4454](https://togithub.com/charliermarsh/ruff/pull/4454) - Remove special-casing for whitespace-around-@​ by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4458](https://togithub.com/charliermarsh/ruff/pull/4458) - Avoid triggering `pd#at` and friends on non-subscripts by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4474](https://togithub.com/charliermarsh/ruff/pull/4474) - Include precise tokens for extraneous-whitespace diagnostics by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4471](https://togithub.com/charliermarsh/ruff/pull/4471) - Allow shebang comments at start-of-file by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4473](https://togithub.com/charliermarsh/ruff/pull/4473) - Bring pycodestyle rules into full compatibility (on SciPy) by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4472](https://togithub.com/charliermarsh/ruff/pull/4472) - Invert quote-style when generating code within f-strings by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4487](https://togithub.com/charliermarsh/ruff/pull/4487) - Fix COM812 false positive in string subscript by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4493](https://togithub.com/charliermarsh/ruff/pull/4493) - Overhaul sdist handling by [@​konstin](https://togithub.com/konstin) in [https://github.com/charliermarsh/ruff/pull/4439](https://togithub.com/charliermarsh/ruff/pull/4439) #### New Contributors - [@​TylerYep](https://togithub.com/TylerYep) made their first contribution in [https://github.com/charliermarsh/ruff/pull/3979](https://togithub.com/charliermarsh/ruff/pull/3979) - [@​yanksyoon](https://togithub.com/yanksyoon) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4428](https://togithub.com/charliermarsh/ruff/pull/4428) - [@​bendoerry](https://togithub.com/bendoerry) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4431](https://togithub.com/charliermarsh/ruff/pull/4431) - [@​qdegraaf](https://togithub.com/qdegraaf) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4432](https://togithub.com/charliermarsh/ruff/pull/4432) - [@​jameslamb](https://togithub.com/jameslamb) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4446](https://togithub.com/charliermarsh/ruff/pull/4446) - [@​john-h-k](https://togithub.com/john-h-k) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4461](https://togithub.com/charliermarsh/ruff/pull/4461) **Full Changelog**: astral-sh/ruff@v0.0.267...v0.0.269 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **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/allenporter/flux-local). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45Ni4zIiwidXBkYXRlZEluVmVyIjoiMzUuOTYuMyIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Summary
When we generate source code from an AST (via
Generator
), we have a preferred quote style, based on the inferred quote style in the file. Unfortunately, when we try to generate autofixes within f-strings, theGenerator
is unaware of the fact that we're "inside" an f-string, and so continues to use that preferred quote style, which often leads to syntax errors.This PR modifies our logic to detect when we're inside a single-quoted f-string, and then pass in the "inverted" quote style based on whatever was used to quote that f-string. This in turn requires that we track all f-strings, and are able to map from the current expression to the surrounding f-strings.
Two considerations here:
Generator
is really a "preferred" quote style. TheGenerator
will "ignore" that preference if, e.g., it lets us avoid escaping a quote within a string, similar to Black's preferences. This would be problematic within f-strings. However, f-strings can't contain backslashes (it's a syntax error?), so... it might be fine?Closes #4322.
Closes #4324.
Closes #4323.
Closes #4321.