Make ambiguous-unicode detection sensitive to 'word' context#4552
Conversation
f0851d4 to
7c9b7ca
Compare
PR Check ResultsEcosystemℹ️ ecosystem check detected changes. (+3, -69, 0 error(s)) airflow (+0, -4)
- tests/executors/test_kubernetes_executor.py:76:15: RUF001 [*] String contains ambiguous unicode character `К` (did you mean `K`?)
- tests/executors/test_kubernetes_executor.py:76:16: RUF001 [*] String contains ambiguous unicode character `о` (did you mean `o`?)
- tests/executors/test_kubernetes_executor.py:76:22: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- tests/executors/test_kubernetes_executor.py:76:23: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)disnake (+3, -0)
+ disnake/enums.py:749:30: RUF100 [*] Unused `noqa` directive (unused: `RUF001`)
+ disnake/enums.py:757:25: RUF100 [*] Unused `noqa` directive (unused: `RUF001`)
+ disnake/enums.py:803:31: RUF100 [*] Unused `noqa` directive (unused: `RUF001`)zulip (+0, -65)
- tools/linter_lib/custom_check.py:546:81: RUF001 [*] String contains ambiguous unicode character `Α` (did you mean `A`?)
- zerver/tests/test_email_mirror.py:137:24: RUF001 [*] String contains ambiguous unicode character `Т` (did you mean `T`?)
- zerver/tests/test_email_mirror.py:137:25: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_email_mirror.py:137:26: RUF001 [*] String contains ambiguous unicode character `с` (did you mean `c`?)
- zerver/tests/test_email_mirror.py:137:28: RUF001 [*] String contains ambiguous unicode character `о` (did you mean `o`?)
- zerver/tests/test_i18n.py:103:21: RUF001 [*] String contains ambiguous unicode character `Р` (did you mean `P`?)
- zerver/tests/test_i18n.py:103:22: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_i18n.py:103:23: RUF001 [*] String contains ambiguous unicode character `г` (did you mean `r`?)
- zerver/tests/test_i18n.py:103:25: RUF001 [*] String contains ambiguous unicode character `с` (did you mean `c`?)
- zerver/tests/test_i18n.py:103:27: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
- zerver/tests/test_i18n.py:103:28: RUF001 [*] String contains ambiguous unicode character `у` (did you mean `y`?)
- zerver/tests/test_i18n.py:103:29: RUF001 [*] String contains ambiguous unicode character `ј` (did you mean `j`?)
- zerver/tests/test_i18n.py:103:31: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_i18n.py:115:21: RUF001 [*] String contains ambiguous unicode character `Р` (did you mean `P`?)
- zerver/tests/test_i18n.py:115:22: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_i18n.py:115:23: RUF001 [*] String contains ambiguous unicode character `г` (did you mean `r`?)
- zerver/tests/test_i18n.py:115:25: RUF001 [*] String contains ambiguous unicode character `с` (did you mean `c`?)
- zerver/tests/test_i18n.py:115:27: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
- zerver/tests/test_i18n.py:115:28: RUF001 [*] String contains ambiguous unicode character `у` (did you mean `y`?)
- zerver/tests/test_i18n.py:115:29: RUF001 [*] String contains ambiguous unicode character `ј` (did you mean `j`?)
- zerver/tests/test_i18n.py:115:31: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_i18n.py:131:21: RUF001 [*] String contains ambiguous unicode character `Р` (did you mean `P`?)
- zerver/tests/test_i18n.py:131:22: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_i18n.py:131:23: RUF001 [*] String contains ambiguous unicode character `г` (did you mean `r`?)
- zerver/tests/test_i18n.py:131:25: RUF001 [*] String contains ambiguous unicode character `с` (did you mean `c`?)
- zerver/tests/test_i18n.py:131:27: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
- zerver/tests/test_i18n.py:131:28: RUF001 [*] String contains ambiguous unicode character `у` (did you mean `y`?)
- zerver/tests/test_i18n.py:131:29: RUF001 [*] String contains ambiguous unicode character `ј` (did you mean `j`?)
- zerver/tests/test_i18n.py:131:31: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_link_embed.py:660:54: RUF001 [*] String contains ambiguous unicode character `ν` (did you mean `v`?)
- zerver/tests/test_link_embed.py:660:56: RUF001 [*] String contains ambiguous unicode character `ι` (did you mean `i`?)
- zerver/tests/test_markdown.py:2828:46: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
- zerver/tests/test_markdown.py:2828:49: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_markdown.py:2831:24: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
- zerver/tests/test_markdown.py:2831:27: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_message_send.py:2496:24: RUF001 [*] String contains ambiguous unicode character `Р` (did you mean `P`?)
- zerver/tests/test_message_send.py:2496:25: RUF001 [*] String contains ambiguous unicode character `о` (did you mean `o`?)
- zerver/tests/test_message_send.py:2496:26: RUF001 [*] String contains ambiguous unicode character `с` (did you mean `c`?)
- zerver/tests/test_message_send.py:2496:27: RUF001 [*] String contains ambiguous unicode character `с` (did you mean `c`?)
- zerver/tests/test_upload.py:646:27: RUF001 [*] String contains ambiguous unicode character `З` (did you mean `3`?)
- zerver/tests/test_upload.py:646:29: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
- zerver/tests/test_upload.py:646:30: RUF001 [*] String contains ambiguous unicode character `а` (did you mean `a`?)
- zerver/tests/test_upload.py:646:32: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/tests/test_upload.py:646:36: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zerver/webhooks/opencollective/tests.py:12:35: RUF001 [*] String contains ambiguous unicode character `υ` (did you mean `u`?)
- zerver/webhooks/opencollective/tests.py:12:38: RUF001 [*] String contains ambiguous unicode character `ρ` (did you mean `p`?)
- zerver/webhooks/opencollective/tests.py:12:42: RUF001 [*] String contains ambiguous unicode character `Κ` (did you mean `K`?)
- zerver/webhooks/opencollective/tests.py:12:43: RUF001 [*] String contains ambiguous unicode character `υ` (did you mean `u`?)
- zerver/webhooks/opencollective/tests.py:12:44: RUF001 [*] String contains ambiguous unicode character `ρ` (did you mean `p`?)
- zerver/webhooks/opencollective/tests.py:12:45: RUF001 [*] String contains ambiguous unicode character `ι` (did you mean `i`?)
- zerver/webhooks/opencollective/tests.py:12:46: RUF001 [*] String contains ambiguous unicode character `α` (did you mean `a`?)
- zerver/webhooks/opencollective/tests.py:12:49: RUF001 [*] String contains ambiguous unicode character `ν` (did you mean `v`?)
- zerver/webhooks/opencollective/tests.py:12:50: RUF001 [*] String contains ambiguous unicode character `ο` (did you mean `o`?)
- zilencer/management/commands/populate_db.py:471:22: RUF001 [*] String contains ambiguous unicode character `А` (did you mean `A`?)
- zilencer/management/commands/populate_db.py:471:24: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zilencer/management/commands/populate_db.py:471:26: RUF001 [*] String contains ambiguous unicode character `с` (did you mean `c`?)
- zilencer/management/commands/populate_db.py:471:27: RUF001 [*] String contains ambiguous unicode character `а` (did you mean `a`?)
- zilencer/management/commands/populate_db.py:471:30: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
- zilencer/management/commands/populate_db.py:890:48: RUF003 [*] Comment contains ambiguous unicode character `е` (did you mean `e`?)
- zilencer/management/commands/populate_db.py:890:52: RUF003 [*] Comment contains ambiguous unicode character `е` (did you mean `e`?)
- zilencer/management/commands/populate_db.py:892:90: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zilencer/management/commands/populate_db.py:892:94: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zilencer/management/commands/populate_db.py:906:23: RUF001 [*] String contains ambiguous unicode character `о` (did you mean `o`?)
- zilencer/management/commands/populate_db.py:906:29: RUF001 [*] String contains ambiguous unicode character `е` (did you mean `e`?)
- zilencer/management/commands/populate_db.py:906:30: RUF001 [*] String contains ambiguous unicode character `р` (did you mean `p`?)
BenchmarkLinuxWindows |
| }, | ||
| char_range, | ||
| ); | ||
| if settings.rules.enabled(diagnostic.kind.rule()) { |
There was a problem hiding this comment.
Unrelated to this PR: I just noticed this now. Our current approach of creating the diagnostic first and then filtering it out is kind of expensive because it means that we format (and allocate) all messages to then immediately drop them again.
| if !buffer.is_empty() { | ||
| if flags.is_candidate_word() { | ||
| diagnostics.append(&mut buffer); | ||
| } | ||
| buffer.clear(); | ||
| } |
There was a problem hiding this comment.
Nit: This could be slightly faster if we only store the TextRange, confusable, and represent in the buffer and delay the generation of the diagnostics until here.
There was a problem hiding this comment.
Would that mean we would have to pass the confusable and represent to this function, or would there be any other way to add it to the buffer. (just trying to understand the codebase a bit more)
There was a problem hiding this comment.
The idea would be to change buffer to Vec<Candidate> where Candidate is defined as
struct Candidate {
range: TextRange,
confusable: char,
representant: char
}And change this loop here to:
if !word_candidates.is_empty() {
if flags.is_candidate_word() {
for candidate in word_candidates.drain() {
let kind = match context { ... };
if settings.enabled(kind) {
diagnostics.push(Diagnostic { ... })
}
}
}
word_candidates.clear();
}There was a problem hiding this comment.
Wouldn't a Vec<usize> for relative_offset alone be enough? Once we know we know we want to flag the current word and actually need to emit diagnostics we can read confusable and representant from the word
There was a problem hiding this comment.
Storing the relative_offset requires that we then do the lookup again, I think? I opted for Candidate for now.
konstin
left a comment
There was a problem hiding this comment.
can't add much to micha's review
| 31 |-x = "Р усский" | ||
| 31 |+x = "P усский" | ||
|
|
||
| confusables.py:31:7: RUF001 [*] String contains ambiguous unicode character ` ` (did you mean ` `?) |
7c9b7ca to
5e2bc0f
Compare
5e2bc0f to
522dd2a
Compare
[](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.269` -> `^0.0.270` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.270`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.270) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.269...v0.0.270) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - \[`flake8-bandit`] Implement `paramiko-call` (`S601`) by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4500](https://togithub.com/charliermarsh/ruff/pull/4500) - \[`flake8-pyi`] Add autofix for PYI009 by [@​qdegraaf](https://togithub.com/qdegraaf) in [https://github.com/charliermarsh/ruff/pull/4583](https://togithub.com/charliermarsh/ruff/pull/4583) - \[`flake8-pyi`] Implement `PYI013` by [@​density](https://togithub.com/density) in [https://github.com/charliermarsh/ruff/pull/4517](https://togithub.com/charliermarsh/ruff/pull/4517) - \[`pylint`] Add `duplicate-value` (`W0130`) by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4515](https://togithub.com/charliermarsh/ruff/pull/4515) - \[`pylint`] Add `named_expr_without_context` (`W0131`) by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4531](https://togithub.com/charliermarsh/ruff/pull/4531) - \[`ruff`] Extend `RUF005` to recursive and literal-literal concatenations by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4557](https://togithub.com/charliermarsh/ruff/pull/4557) - \[`ruff`] Make ambiguous-unicode detection sensitive to 'word' context by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4552](https://togithub.com/charliermarsh/ruff/pull/4552) - \[`ruff`] Name ambiguous characters by [@​covracer](https://togithub.com/covracer) in [https://github.com/charliermarsh/ruff/pull/4448](https://togithub.com/charliermarsh/ruff/pull/4448) ##### Settings - Implement `--extend-fixable` option by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4297](https://togithub.com/charliermarsh/ruff/pull/4297) - Support new `extend-per-file-ignores` setting by [@​aacunningham](https://togithub.com/aacunningham) in [https://github.com/charliermarsh/ruff/pull/4265](https://togithub.com/charliermarsh/ruff/pull/4265) ##### Bug Fixes - Fix RUF010 auto-fix with parenthesis by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4524](https://togithub.com/charliermarsh/ruff/pull/4524) - Parenthesize more sub-expressions in f-string conversion by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4535](https://togithub.com/charliermarsh/ruff/pull/4535) - Fix false-positive for TRY302 if exception cause is given by [@​153957](https://togithub.com/153957) in [https://github.com/charliermarsh/ruff/pull/4559](https://togithub.com/charliermarsh/ruff/pull/4559) - Fix `# isort: split` comment detection in nested blocks by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4584](https://togithub.com/charliermarsh/ruff/pull/4584) - Avoid some false positives in dunder variable assigments by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4508](https://togithub.com/charliermarsh/ruff/pull/4508) - Fix UP032 auto-fix with integers by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4525](https://togithub.com/charliermarsh/ruff/pull/4525) - Improve reference resolution for deferred-annotations-within-classes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4509](https://togithub.com/charliermarsh/ruff/pull/4509) - Improve handling of `__qualname__`, `__module__`, and `__class__` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4512](https://togithub.com/charliermarsh/ruff/pull/4512) - Include empty success test in JUnit output by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4537](https://togithub.com/charliermarsh/ruff/pull/4537) - Fix SIM110 and SIM111 ranges by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4545](https://togithub.com/charliermarsh/ruff/pull/4545) - Ignore `#region` code folding marks in eradicate rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4546](https://togithub.com/charliermarsh/ruff/pull/4546) - Avoid infinite loop for required imports with isort: off by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4581](https://togithub.com/charliermarsh/ruff/pull/4581) - Make B007 fix relevance stricter by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4607](https://togithub.com/charliermarsh/ruff/pull/4607) - Introduce `tab-size` to correcly calculate the line length with tabulations by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4167](https://togithub.com/charliermarsh/ruff/pull/4167) - Visit `TypeVar` and `NewType` name arguments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4627](https://togithub.com/charliermarsh/ruff/pull/4627) - Improve `Message` sorting performance by [@​MichaReiser](https://togithub.com/MichaReiser) in [https://github.com/charliermarsh/ruff/pull/4624](https://togithub.com/charliermarsh/ruff/pull/4624) #### New Contributors - [@​hoel-bagard](https://togithub.com/hoel-bagard) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4516](https://togithub.com/charliermarsh/ruff/pull/4516) - [@​density](https://togithub.com/density) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4517](https://togithub.com/charliermarsh/ruff/pull/4517) - [@​Mr-Pepe](https://togithub.com/Mr-Pepe) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4540](https://togithub.com/charliermarsh/ruff/pull/4540) - [@​153957](https://togithub.com/153957) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4559](https://togithub.com/charliermarsh/ruff/pull/4559) - [@​covracer](https://togithub.com/covracer) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4448](https://togithub.com/charliermarsh/ruff/pull/4448) **Full Changelog**: astral-sh/ruff@v0.0.269...v0.0.270 </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:eyJjcmVhdGVkSW5WZXIiOiIzNS45OC40IiwidXBkYXRlZEluVmVyIjoiMzUuOTguNCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> Signed-off-by: Renovate Bot <bot@renovateapp.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
[](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.269` -> `==0.0.270` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.270`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.270) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.269...v0.0.270) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - \[`flake8-bandit`] Implement `paramiko-call` (`S601`) by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4500](https://togithub.com/charliermarsh/ruff/pull/4500) - \[`flake8-pyi`] Add autofix for PYI009 by [@​qdegraaf](https://togithub.com/qdegraaf) in [https://github.com/charliermarsh/ruff/pull/4583](https://togithub.com/charliermarsh/ruff/pull/4583) - \[`flake8-pyi`] Implement `PYI013` by [@​density](https://togithub.com/density) in [https://github.com/charliermarsh/ruff/pull/4517](https://togithub.com/charliermarsh/ruff/pull/4517) - \[`pylint`] Add `duplicate-value` (`W0130`) by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4515](https://togithub.com/charliermarsh/ruff/pull/4515) - \[`pylint`] Add `named_expr_without_context` (`W0131`) by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4531](https://togithub.com/charliermarsh/ruff/pull/4531) - \[`ruff`] Extend `RUF005` to recursive and literal-literal concatenations by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4557](https://togithub.com/charliermarsh/ruff/pull/4557) - \[`ruff`] Make ambiguous-unicode detection sensitive to 'word' context by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4552](https://togithub.com/charliermarsh/ruff/pull/4552) - \[`ruff`] Name ambiguous characters by [@​covracer](https://togithub.com/covracer) in [https://github.com/charliermarsh/ruff/pull/4448](https://togithub.com/charliermarsh/ruff/pull/4448) ##### Settings - Implement `--extend-fixable` option by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4297](https://togithub.com/charliermarsh/ruff/pull/4297) - Support new `extend-per-file-ignores` setting by [@​aacunningham](https://togithub.com/aacunningham) in [https://github.com/charliermarsh/ruff/pull/4265](https://togithub.com/charliermarsh/ruff/pull/4265) ##### Bug Fixes - Fix RUF010 auto-fix with parenthesis by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4524](https://togithub.com/charliermarsh/ruff/pull/4524) - Parenthesize more sub-expressions in f-string conversion by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4535](https://togithub.com/charliermarsh/ruff/pull/4535) - Fix false-positive for TRY302 if exception cause is given by [@​153957](https://togithub.com/153957) in [https://github.com/charliermarsh/ruff/pull/4559](https://togithub.com/charliermarsh/ruff/pull/4559) - Fix `# isort: split` comment detection in nested blocks by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4584](https://togithub.com/charliermarsh/ruff/pull/4584) - Avoid some false positives in dunder variable assigments by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4508](https://togithub.com/charliermarsh/ruff/pull/4508) - Fix UP032 auto-fix with integers by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4525](https://togithub.com/charliermarsh/ruff/pull/4525) - Improve reference resolution for deferred-annotations-within-classes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4509](https://togithub.com/charliermarsh/ruff/pull/4509) - Improve handling of `__qualname__`, `__module__`, and `__class__` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4512](https://togithub.com/charliermarsh/ruff/pull/4512) - Include empty success test in JUnit output by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4537](https://togithub.com/charliermarsh/ruff/pull/4537) - Fix SIM110 and SIM111 ranges by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4545](https://togithub.com/charliermarsh/ruff/pull/4545) - Ignore `#region` code folding marks in eradicate rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4546](https://togithub.com/charliermarsh/ruff/pull/4546) - Avoid infinite loop for required imports with isort: off by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4581](https://togithub.com/charliermarsh/ruff/pull/4581) - Make B007 fix relevance stricter by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4607](https://togithub.com/charliermarsh/ruff/pull/4607) - Introduce `tab-size` to correcly calculate the line length with tabulations by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4167](https://togithub.com/charliermarsh/ruff/pull/4167) - Visit `TypeVar` and `NewType` name arguments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4627](https://togithub.com/charliermarsh/ruff/pull/4627) - Improve `Message` sorting performance by [@​MichaReiser](https://togithub.com/MichaReiser) in [https://github.com/charliermarsh/ruff/pull/4624](https://togithub.com/charliermarsh/ruff/pull/4624) #### New Contributors - [@​hoel-bagard](https://togithub.com/hoel-bagard) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4516](https://togithub.com/charliermarsh/ruff/pull/4516) - [@​density](https://togithub.com/density) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4517](https://togithub.com/charliermarsh/ruff/pull/4517) - [@​Mr-Pepe](https://togithub.com/Mr-Pepe) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4540](https://togithub.com/charliermarsh/ruff/pull/4540) - [@​153957](https://togithub.com/153957) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4559](https://togithub.com/charliermarsh/ruff/pull/4559) - [@​covracer](https://togithub.com/covracer) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4448](https://togithub.com/charliermarsh/ruff/pull/4448) **Full Changelog**: astral-sh/ruff@v0.0.269...v0.0.270 </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:eyJjcmVhdGVkSW5WZXIiOiIzNS4xMDIuNCIsInVwZGF0ZWRJblZlciI6IjM1LjEwMi40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
[](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.269` -> `==0.0.270` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>charliermarsh/ruff</summary> ### [`v0.0.270`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.270) [Compare Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.269...v0.0.270) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed ##### Rules - \[`flake8-bandit`] Implement `paramiko-call` (`S601`) by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4500](https://togithub.com/charliermarsh/ruff/pull/4500) - \[`flake8-pyi`] Add autofix for PYI009 by [@​qdegraaf](https://togithub.com/qdegraaf) in [https://github.com/charliermarsh/ruff/pull/4583](https://togithub.com/charliermarsh/ruff/pull/4583) - \[`flake8-pyi`] Implement `PYI013` by [@​density](https://togithub.com/density) in [https://github.com/charliermarsh/ruff/pull/4517](https://togithub.com/charliermarsh/ruff/pull/4517) - \[`pylint`] Add `duplicate-value` (`W0130`) by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4515](https://togithub.com/charliermarsh/ruff/pull/4515) - \[`pylint`] Add `named_expr_without_context` (`W0131`) by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4531](https://togithub.com/charliermarsh/ruff/pull/4531) - \[`ruff`] Extend `RUF005` to recursive and literal-literal concatenations by [@​hoel-bagard](https://togithub.com/hoel-bagard) in [https://github.com/charliermarsh/ruff/pull/4557](https://togithub.com/charliermarsh/ruff/pull/4557) - \[`ruff`] Make ambiguous-unicode detection sensitive to 'word' context by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4552](https://togithub.com/charliermarsh/ruff/pull/4552) - \[`ruff`] Name ambiguous characters by [@​covracer](https://togithub.com/covracer) in [https://github.com/charliermarsh/ruff/pull/4448](https://togithub.com/charliermarsh/ruff/pull/4448) ##### Settings - Implement `--extend-fixable` option by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4297](https://togithub.com/charliermarsh/ruff/pull/4297) - Support new `extend-per-file-ignores` setting by [@​aacunningham](https://togithub.com/aacunningham) in [https://github.com/charliermarsh/ruff/pull/4265](https://togithub.com/charliermarsh/ruff/pull/4265) ##### Bug Fixes - Fix RUF010 auto-fix with parenthesis by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4524](https://togithub.com/charliermarsh/ruff/pull/4524) - Parenthesize more sub-expressions in f-string conversion by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4535](https://togithub.com/charliermarsh/ruff/pull/4535) - Fix false-positive for TRY302 if exception cause is given by [@​153957](https://togithub.com/153957) in [https://github.com/charliermarsh/ruff/pull/4559](https://togithub.com/charliermarsh/ruff/pull/4559) - Fix `# isort: split` comment detection in nested blocks by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4584](https://togithub.com/charliermarsh/ruff/pull/4584) - Avoid some false positives in dunder variable assigments by [@​scop](https://togithub.com/scop) in [https://github.com/charliermarsh/ruff/pull/4508](https://togithub.com/charliermarsh/ruff/pull/4508) - Fix UP032 auto-fix with integers by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4525](https://togithub.com/charliermarsh/ruff/pull/4525) - Improve reference resolution for deferred-annotations-within-classes by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4509](https://togithub.com/charliermarsh/ruff/pull/4509) - Improve handling of `__qualname__`, `__module__`, and `__class__` by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4512](https://togithub.com/charliermarsh/ruff/pull/4512) - Include empty success test in JUnit output by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4537](https://togithub.com/charliermarsh/ruff/pull/4537) - Fix SIM110 and SIM111 ranges by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4545](https://togithub.com/charliermarsh/ruff/pull/4545) - Ignore `#region` code folding marks in eradicate rules by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4546](https://togithub.com/charliermarsh/ruff/pull/4546) - Avoid infinite loop for required imports with isort: off by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4581](https://togithub.com/charliermarsh/ruff/pull/4581) - Make B007 fix relevance stricter by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4607](https://togithub.com/charliermarsh/ruff/pull/4607) - Introduce `tab-size` to correcly calculate the line length with tabulations by [@​JonathanPlasse](https://togithub.com/JonathanPlasse) in [https://github.com/charliermarsh/ruff/pull/4167](https://togithub.com/charliermarsh/ruff/pull/4167) - Visit `TypeVar` and `NewType` name arguments by [@​charliermarsh](https://togithub.com/charliermarsh) in [https://github.com/charliermarsh/ruff/pull/4627](https://togithub.com/charliermarsh/ruff/pull/4627) - Improve `Message` sorting performance by [@​MichaReiser](https://togithub.com/MichaReiser) in [https://github.com/charliermarsh/ruff/pull/4624](https://togithub.com/charliermarsh/ruff/pull/4624) #### New Contributors - [@​hoel-bagard](https://togithub.com/hoel-bagard) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4516](https://togithub.com/charliermarsh/ruff/pull/4516) - [@​density](https://togithub.com/density) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4517](https://togithub.com/charliermarsh/ruff/pull/4517) - [@​Mr-Pepe](https://togithub.com/Mr-Pepe) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4540](https://togithub.com/charliermarsh/ruff/pull/4540) - [@​153957](https://togithub.com/153957) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4559](https://togithub.com/charliermarsh/ruff/pull/4559) - [@​covracer](https://togithub.com/covracer) made their first contribution in [https://github.com/charliermarsh/ruff/pull/4448](https://togithub.com/charliermarsh/ruff/pull/4448) **Full Changelog**: astral-sh/ruff@v0.0.269...v0.0.270 </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:eyJjcmVhdGVkSW5WZXIiOiIzNS4xMDIuMTAiLCJ1cGRhdGVkSW5WZXIiOiIzNS4xMDIuMTAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIn0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Limit match range to end of last statement
Summary
This PR upgrades our ambiguous-unicode detection to avoid some false positives by borrowing techniques from VS Code.
If you look at VS Code (microsoft/vscode#143720 (comment), microsoft/vscode#143796 (comment)), you'll see that their logic for flagging ambiguous unicode is more nuanced than ours, in that they avoid flagging all-unicode words that contain non-ambiguous unicode characters. This is helpful for avoiding false positives like
"Русский", which was brought up in a discussion that led me to look into this further.Closes #4534.
Closes #3947.