Repository navigation
Ruff 0.17 - #28694
Ruff 0.17#28694
Conversation
|
| code | total | + violation | - violation | + fix | - fix |
|---|---|---|---|---|---|
| ICN001 | 682 | 682 | 0 | 0 | 0 |
| DTZ001 | 75 | 0 | 75 | 0 | 0 |
| I001 | 70 | 68 | 2 | 0 | 0 |
| DTZ005 | 58 | 0 | 58 | 0 | 0 |
| UP017 | 28 | 28 | 0 | 0 | 0 |
| RUF100 | 18 | 18 | 0 | 0 | 0 |
| DTZ007 | 5 | 0 | 5 | 0 | 0 |
| DTZ011 | 4 | 0 | 4 | 0 | 0 |
| RUF071 | 3 | 3 | 0 | 0 | 0 |
| UP041 | 2 | 2 | 0 | 0 | 0 |
| E501 | 2 | 1 | 1 | 0 | 0 |
| DTZ006 | 2 | 0 | 2 | 0 | 0 |
| UP036 | 1 | 1 | 0 | 0 | 0 |
Linter (preview)
ℹ️ ecosystem check detected linter changes. (+784 -1 violations, +0 -0 fixes in 22 projects; 36 projects unchanged)
DisnakeDev/disnake (+34 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ disnake/activity.py:5:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/audit_logs.py:35:12: unconventional-import-alias `datetime` should be imported as `dt` + disnake/automod.py:5:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/channel.py:6:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/embeds.py:5:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/entitlement.py:5:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/ext/commands/base_core.py:6:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/ext/commands/core.py:6:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/ext/tasks/__init__.py:6:8: unconventional-import-alias `datetime` should be imported as `dt` + disnake/guild.py:6:8: unconventional-import-alias `datetime` should be imported as `dt` ... 24 additional changes omitted for project
apache/airflow (+237 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select ALL
+ airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/cli/commands/dag_command.py:23:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/cli/utils.py:33:12: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_custom_weight.py:22:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_inlet_event_extra.py:26:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_latest_only_with_trigger.py:25:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_outlet_event_extra.py:26:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_params_trigger_ui.py:25:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_params_ui_tutorial.py:27:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_passing_params_via_test_command.py:22:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_skip_dag.py:22:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/example_dags/example_time_delta_sensor_async.py:24:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/models/taskreschedule.py:22:8: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/models/taskreschedule.py:39:12: unconventional-import-alias `datetime` should be imported as `dt` + airflow-core/src/airflow/models/trigger.py:19:8: unconventional-import-alias `datetime` should be imported as `dt` ... 222 additional changes omitted for project
apache/superset (+15 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select ALL
+ superset/common/utils/dataframe_utils.py:19:8: unconventional-import-alias `datetime` should be imported as `dt` + superset/extensions/metadb.py:41:8: unconventional-import-alias `datetime` should be imported as `dt` + superset/mcp_service/system/tool/generate_bug_report.py:29:8: unconventional-import-alias `datetime` should be imported as `dt` + superset/mcp_service/system/tool/health_check.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` + superset/migrations/versions/2018-07-05_15-19_3dda56f1c4c6_migrate_num_period_compare_and_period_.py:27:8: unconventional-import-alias `datetime` should be imported as `dt` + superset/result_set.py:19:8: unconventional-import-alias `datetime` should be imported as `dt` + superset/security/manager.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/integration_tests/celery_tests.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/integration_tests/core_tests.py:19:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/integration_tests/dao/base_dao_test.py:30:8: unconventional-import-alias `datetime` should be imported as `dt` ... 5 additional changes omitted for project
binary-husky/gpt_academic (+2 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ shared_utils/fastapi_stream_server.py:327:32: timeout-error-alias [*] Replace aliased errors with `TimeoutError` + shared_utils/fastapi_stream_server.py:371:32: timeout-error-alias [*] Replace aliased errors with `TimeoutError`
bokeh/bokeh (+11 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select ALL
+ examples/server/app/weather/main.py:10:8: unconventional-import-alias `datetime` should be imported as `dt` + scripts/milestone.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + src/bokeh/_types.pyi:9:8: unconventional-import-alias `datetime` should be imported as `dt` + src/bokeh/core/property/datetime.py:24:8: unconventional-import-alias `datetime` should be imported as `dt` + src/bokeh/core/property/visual.py:25:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/unit/bokeh/core/property/test_aliases.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/unit/bokeh/core/property/test_dataspec.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/unit/bokeh/core/property/test_datetime.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/unit/bokeh/core/property/test_visual.py:21:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/unit/bokeh/plotting/test__plot.py:20:8: unconventional-import-alias `datetime` should be imported as `dt` ... 1 additional changes omitted for project
facebookresearch/chameleon (+2 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ chameleon/viewer/backend/data_types.py:17:7: replace-str-enum Class WSMessageType inherits from both `str` and `enum.Enum` + chameleon/viewer/backend/data_types.py:28:7: replace-str-enum Class ContentType inherits from both `str` and `enum.Enum`
ibis-project/ibis (+36 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ ibis/backends/bigquery/tests/system/test_client.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/bigquery/tests/unit/test_compiler.py:3:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/clickhouse/converter.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/exasol/__init__.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/exasol/converter.py:3:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/flink/utils.py:3:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/impala/tests/test_client.py:3:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/mssql/__init__.py:6:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/mysql/converter.py:3:8: unconventional-import-alias `datetime` should be imported as `dt` + ibis/backends/polars/compiler.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` ... 26 additional changes omitted for project
jrnl-org/jrnl (+6 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ jrnl/journals/DayOneJournal.py:5:8: unconventional-import-alias `datetime` should be imported as `dt` + jrnl/journals/Entry.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + jrnl/journals/Journal.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + jrnl/time.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/unit/test_journals_folder_journal.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + tests/unit/test_time.py:4:8: unconventional-import-alias `datetime` should be imported as `dt`
langchain-ai/langchain (+9 -1 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ .github/scripts/check_diff.py:16:1: unsorted-imports [*] Import block is un-sorted or un-formatted - .github/scripts/check_extras_sync.py:9:1: unsorted-imports [*] Import block is un-sorted or un-formatted + .github/scripts/check_prerelease_dependencies.py:3:1: unsorted-imports [*] Import block is un-sorted or un-formatted + .github/scripts/get_min_versions.py:6:4: outdated-version-block Version block is outdated for minimum Python version + libs/core/langchain_core/document_loaders/langsmith.py:3:8: unconventional-import-alias `datetime` should be imported as `dt` + libs/core/langchain_core/utils/utils.py:4:8: unconventional-import-alias `datetime` should be imported as `dt` + libs/core/tests/unit_tests/document_loaders/test_langsmith.py:1:8: unconventional-import-alias `datetime` should be imported as `dt` + libs/langchain/langchain_classic/chains/query_constructor/parser.py:1:8: unconventional-import-alias `datetime` should be imported as `dt` + libs/langchain/langchain_classic/retrievers/time_weighted_retriever.py:1:8: unconventional-import-alias `datetime` should be imported as `dt` + libs/partners/anthropic/langchain_anthropic/chat_models.py:6:8: unconventional-import-alias `datetime` should be imported as `dt` ... 1 additional changes omitted for rule unconventional-import-alias
... Truncated remaining completed project reports due to GitHub comment length restrictions
Changes by rule (6 rules affected)
| code | total | + violation | - violation | + fix | - fix |
|---|---|---|---|---|---|
| unconventional-import-alias | 682 | 682 | 0 | 0 | 0 |
| replace-str-enum | 69 | 69 | 0 | 0 | 0 |
| datetime-timezone-utc | 28 | 28 | 0 | 0 | 0 |
| unsorted-imports | 3 | 2 | 1 | 0 | 0 |
| timeout-error-alias | 2 | 2 | 0 | 0 | 0 |
| outdated-version-block | 1 | 1 | 0 | 0 | 0 |
Formatter (stable)
ℹ️ ecosystem check detected format changes. (+152 -136 lines in 29 files in 3 projects; 55 projects unchanged)
PlasmaPy/PlasmaPy (+1 -3 lines across 1 file)
src/plasmapy/formulary/braginskii.py~L364
self.m_i = m_i
self.Z = _grab_charge(ion, Z) * u.dimensionless_unscaled
if self.Z < 0:
- raise ValueError(
- "Z is not allowed to be negative!"
- ) # TODO: remove? # noqa: FIX002
+ raise ValueError("Z is not allowed to be negative!") # TODO: remove? # noqa: FIX002
# decide on the particle string for the electrons
self.e_particle = "e-"demisto/content (+3 -9 lines across 1 file)
return CommandResults(readable_output="Could not create IP named location")
-def azure_ad_identity_protection_confirm_compromised_command(
- ms_client: Client, args: dict
-) -> CommandResults: # pragma: no cover # noqa
+def azure_ad_identity_protection_confirm_compromised_command(ms_client: Client, args: dict) -> CommandResults: # pragma: no cover # noqa
user_ids = str(args.get("user_ids")).split(",")
data = {"userIds": user_ids}
try: return CommandResults(readable_output=f"Could not compromised {user_ids!s}:\n{e}")
-def azure_
... (truncated 568 lines) ...
Typing conformance resultsNo changes detected ✅Current numbersThe percentage of diagnostics emitted that were expected errors held steady at 98.24%. The percentage of expected errors that received a diagnostic held steady at 98.24%. The number of fully passing files held steady at 134/146. |
Memory usage reportMemory usage unchanged ✅ |
|
| Project | Old Time | New Time | Change |
|---|---|---|---|
com2ann |
0.07s | 0.11s | +63% |
Flaky changes detected. This PR summary excludes flaky changes; see the HTML report for details.
Merging this PR will improve performance by 5.55%
Performance Changes
Tip Curious why performance improved? Comment Comparing |
c126681 to
b4c7fc2
Compare
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [unicode-normalization](https://redirect.github.com/unicode-rs/unicode-normalization) | workspace.dependencies | patch | `0.1.24` → `0.1.25` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - "before 4am on Wednesday" - 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 was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/astral-sh/ruff). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNTkuNCIsInVwZGF0ZWRJblZlciI6IjQzLjE0MS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJpbnRlcm5hbCJdfQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Summary -- This is the CLI accompaniment to #27807. The main change here is showing display-only fix diffs in the CLI. However, display-only fixes don't have a corresponding flag like `--unsafe-fixes`, and I thought it would be weird to show them unconditionally when we don't do the same for unsafe fixes, so this PR also unconditionally renders unsafe fix diffs, even when that flag isn't passed. We already emit a note about the fix being unsafe, so I think it makes sense always to show you the fix, and make `--unsafe-fixes` enable actually applying the fix. We also don't want to apply display-only fixes, so enabling rendering of the fixes with `--display-only-fixes` or similar would also disagree with the semantics of the unsafe flag. I'm open to other ideas here, though. The sub-diagnostic for display-only fixes uses a higher severity than the note for unsafe fixes and renders in red, as shown below. The change here also affects ty, which now has both unsafe and display-only fixes. I again checked what clippy and rustc do in these cases, and they don't include any additional note or warning about the fix being unsafe: <details><summary>Rust diagnostics</summary> <p> Here's a [`clippy::needless_pass_by_value`](https://rust-lang.github.io/rust-clippy/rust-1.97.0/index.html#needless_pass_by_value) diagnostic, which is `MaybeIncorrect` ( similar to our `Unsafe`): ``` warning: this argument is passed by value, but not consumed in the function body --> src/main.rs:3:15 | 3 | fn size(data: Data) -> usize { | ^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.97.0/index.html#needless_pass_by_value = note: requested on the command line with `-W clippy::needless-pass-by-value` help: consider taking a reference instead | 3 | fn size(data: &Data) -> usize { | + ``` and here's a rustc [`LetLike`](https://github.com/rust-lang/rust/blob/8bab26f4f68e0e26f0bb7960be334d5b520ea452/compiler/rustc_trait_selection/src/errors.rs#L268-L288) diagnostic, which is `has-placeholders` (similar to our `DisplayOnly` but definitely produces invalid code in this case): ``` error[E0282]: type annotations needed for `Vec<_>` --> placeholder.rs:2:9 | 2 | let values = Vec::new(); | ^^^^^^ ---------- type must be known at this point | help: consider giving `values` an explicit type, where the type for type parameter `T` is specified | 2 | let values: Vec<T> = Vec::new(); | ++++++++ ``` </p> </details> Fixes astral-sh/ty#1679 Test Plan -- Updated existing snapshots, and some manual testing in the CLI: <img width="965" height="400" alt="image" src="https://github.com/user-attachments/assets/888ad79a-6853-48d4-8344-48da4af47d74" /> --------- Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This PR updates quick-junit to [v0.8.0](https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.8.0). The original renovate description of the bump to v0.7.0 is below. Note that I also had to update `fuzz/Cargo.lock` to get the fuzz build to run: ```console cargo update --manifest-path fuzz/Cargo.toml thiserror@2.0.18 --precise 2.0.20 ``` <hr> This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [quick-junit](https://redirect.github.com/nextest-rs/quick-junit) | workspace.dependencies | minor | `0.6.0` → `0.7.0` | `0.8.0` | --- <details> <summary>nextest-rs/quick-junit (quick-junit)</summary> [`v0.7.0`](https://redirect.github.com/nextest-rs/quick-junit/blob/HEAD/CHANGELOG.md#070---2026-07-20) [Compare Source](https://redirect.github.com/nextest-rs/quick-junit/compare/quick-junit-0.6.1...quick-junit-0.7.0) Skipped test counts are now reported via the `skipped` attribute rather than `disabled`. For `<testsuite>`, `skipped` matches the [llg schema](https://llg.cubic.org/docs/junit/) and the Jenkins [junit-10 schema](https://redirect.github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd), as well as pytest and Maven Surefire. - Each `<testsuite>` now emits `skipped="N"`, and the root `<testsuites>` element now emits an aggregated `skipped="N"` count. Previously the root didn't carry a skip count at all. - Root-level `skipped` is a quick-junit extension. It follows the modern JUnit convention (as documented, for example, by [testmoapp/junitxml](https://redirect.github.com/testmoapp/junitxml)) and is similar to quick-junit's existing extensions such as `uuid`. - `TestSuite`'s `disabled` field has been renamed to `skipped`. - `Report` gains new public `skipped` and `disabled` fields, and `Report::add_test_suite` now aggregates skip counts into `Report::skipped`. `disabled` is now modeled as a separate optional count on both `Report` and `TestSuite`, distinct from `skipped`. (`disabled` is intended to count tests that are disabled by design, such as googletest's `DISABLED_`-prefixed tests. Note, however, that quick-junit doesn't have a notion of disabled tests at the moment.) - `Report` is now `#[non_exhaustive]`, consistent with `TestSuite` and `TestCase`. Construct it via `Report::new` and then assign fields, so that future field additions are non-breaking. - Childless `<testsuite>` and `<testcase>` elements are now serialized as self-closing tags (for example, `<testcase name="my-test"/>` rather than `<testcase name="my-test"></testcase>`). The output is semantically identical XML, only more compact and idiomatic. The deserializer already accepted these self-closing forms, so serializing them means round-trip tests now cover those parse paths. </details> --- 📅 **Schedule**: (UTC) - Branch creation - "before 4am on Wednesday" - 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 was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/astral-sh/ruff). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODAuMCIsInVwZGF0ZWRJblZlciI6IjQ0Ljc5LjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImludGVybmFsIl19--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Brent Westbrook <brentrwestbrook@gmail.com>
Remove the deprecated `ruff-lsp` compatibility CI job, its dependency group and Python constraint, and the associated `pygls` Renovate rule. Prune ten unused packages from the root lockfile while preserving all remaining package versions and Git revisions. Related: #28545, astral-sh/ruff-vscode#1170
Summary -- This makes a few modifications to our default rule set for v0.17. As the snapshots show, these had already been incorporated into our preview defaults via rule recategorization. This just ports them back to the stable default rules. This closes #27197, which brought the problems with the DTZ rules to our attention. F406 being a syntax error was raised in [this comment]. [this comment]: #27199 (comment) Test Plan -- Updated snapshots
Summary -- I wasn't really planning to do a full stabilization pass, but I quickly skimmed through `preview.rs` and remembered that the isort pragma change was kind a bug fix but technically breaking and thought we might want to stabilize it. This PR stabilizes the isort pragma comment width handling introduced in #27313, along with the related pragma handling for `E501` and `W505` from #24071. There was a comment about also stabilizing the related formatter preview feature on the function from #24071, so that is stabilized here too. I'm fine holding off on this, especially if the formatter change is a better fit for the 2027 style guide. Like I said above, I mostly wanted to stabilize the isort change, but that snowballed a bit since the helpers were shared. Test Plan -- Updated existing snapshots
Update the editor documentation for the VS Code extension's transition to always using Ruff's native language server. Remove the retired `ruff-lsp` settings entries, links to those entries, and obsolete setup notes while retaining migration examples and replacement guidance. Document `ruff.nativeServer` as deprecated in Ruff 0.17 and describe `ruff.interpreter` solely in terms of executable discovery. Related: #28545, astral-sh/ruff-vscode#1170 <!-- codex-thread: 01a0c3c7-f498-7682-9193-6e0e5307066b -->
Summary -- This PR updates our default Python version to 3.11, in line with 3.10 reaching [EOL] next month, and updates our latest Python version to 3.15. I followed last year's PR (#20725) to find everywhere that needed to change. Fortunately there were not as many test changes needed as last year's deferred annotation issues. I also updated the language classifier in our pyproject.toml. [EOL]: https://devguide.python.org/versions/#supported-versions Test Plan -- Existing tests with updated snapshots. Most of the updates were to snapshots for TC001, TC002, and TC003, which now default to the lazy-import fix. After updating the snapshots, I tried to make sure we still had coverage for whatever changed. That meant adding a few more mdtests for the TC rules, and one small mdtest for RUF017 to restore coverage for the `functools.reduce` fix.
…alias (`ICN001`) (#28790) Summary -- Closes #28604 by adding the alias. This alias is now being recommended in the CPython docs for 3.13+. See https://docs.python.org/3.13/library/datetime.html#datetime.timedelta as one of many examples on the page. Test Plan -- Updated existing test
Copy the upstream runtime and generator before the alias-lookup API changes. Source: https://github.com/progval/unicode_names2/tree/63eda5de2bd0dd1e6243c9797efe5a84919a756b Adapt vendored Unicode crates to the Ruff workspace Wire the crates into the workspace, disable nightly-only targets, and configure lint and formatting checks to preserve the vendored source. Replace the relocated generator's broken license symlinks with copies of the licenses.
Restore registered alias spellings as lookup keys before removing loose matching. This reverts progval/unicode_names2#61. Reproduced in an upstream checkout at 63eda5de2bd0dd1e6243c9797efe5a84919a756b: git revert --no-commit 63eda5de2bd0dd1e6243c9797efe5a84919a756b Copy generator/src/lib.rs and src/lib.rs back into the corresponding vendored crates. The revert applies without conflicts.
Restore case-insensitive lookup with exact separator matching by reverting progval/unicode_names2#46. Keep Unicode 17 data and the later name-decoding performance improvements. After reverting alias normalization in the upstream checkout: git revert --no-commit d6b2923654a8c65a0155419d206e24b839ccd315 Resolve the sole conflict in src/lib.rs by deleting both the loose-matching documentation and the obsolete Cargo-enabled section, which upstream had already removed. Copy src/lib.rs, generator/src/lib.rs, and generator/src/phf.rs back into the corresponding vendored crates.
Use the vendored runtime and generator instead of the registry dependency, providing Unicode 17 names with Python-compatible matching. Update workspace dependencies and tool configuration, add parser regressions, and document how to update Unicode data when supporting a new Python version.
Summary
Release branch for Ruff 0.17.0. Closes #28206.
Breaking changes
unicode_names2#28784flake8-import-conventions] Adddatetime as dtas a conventional alias (ICN001) #28790Stabilized rules
flake8-tidy-imports] Stabilizelazy-import-mismatch(TID254) #28760flake8-tidy-imports] Stabilizelazy-import-immediately-resolved(TID255) #28761ruff] Stabilizeos-path-commonprefix(RUF071) #28764TODOs
emptyfirst commit (random whitespace change to get a baseline ecosystem check executable)Previous minor releases