Conversation
|
| code | total | + violation | - violation | + fix | - fix |
|---|---|---|---|---|---|
| UP043 | 250 | 250 | 0 | 0 | 0 |
| RUF061 | 206 | 206 | 0 | 0 | 0 |
| FURB110 | 154 | 154 | 0 | 0 | 0 |
| PLW0108 | 144 | 144 | 0 | 0 | 0 |
| PLC0207 | 54 | 54 | 0 | 0 | 0 |
| FURB171 | 35 | 35 | 0 | 0 | 0 |
| invalid-syntax: | 15 | 15 | 0 | 0 | 0 |
| SIM910 | 6 | 6 | 0 | 0 | 0 |
| RUF100 | 6 | 0 | 6 | 0 | 0 |
| RUF060 | 4 | 4 | 0 | 0 | 0 |
| RUF037 | 3 | 3 | 0 | 0 | 0 |
| A003 | 2 | 2 | 0 | 0 | 0 |
Linter (preview)
ℹ️ ecosystem check detected linter changes. (+69 -54 violations, +0 -0 fixes in 16 projects; 39 projects unchanged)
PlasmaPy/PlasmaPy (+1 -1 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
- noxfile.py:448:15: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + noxfile.py:448:15: PLC0207 [*] String is split more times than necessary
apache/airflow (+16 -16 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select ALL
- dev/backport/update_backport_status.py:80:21: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + dev/backport/update_backport_status.py:80:21: PLC0207 [*] String is split more times than necessary - dev/breeze/src/airflow_breeze/commands/common_options.py:524:26: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + dev/breeze/src/airflow_breeze/commands/common_options.py:524:26: PLC0207 [*] String is split more times than necessary - dev/breeze/src/airflow_breeze/commands/release_management_commands.py:2815:50: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + dev/breeze/src/airflow_breeze/commands/release_management_commands.py:2815:50: PLC0207 [*] String is split more times than necessary - dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py:719:34: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py:719:34: PLC0207 [*] String is split more times than necessary - dev/breeze/src/airflow_breeze/utils/click_validators.py:46:17: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + dev/breeze/src/airflow_breeze/utils/click_validators.py:46:17: PLC0207 [*] String is split more times than necessary - dev/breeze/src/airflow_breeze/utils/run_utils.py:120:25: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + dev/breeze/src/airflow_breeze/utils/run_utils.py:120:25: PLC0207 [*] String is split more times than necessary - dev/breeze/src/airflow_breeze/utils/selective_checks.py:1779:23: PLC0207 [*] Replace with `split(..., maxsplit=1)`. ... 19 additional changes omitted for project
apache/superset (+3 -3 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select ALL
- superset/db_engine_specs/lint_metadata.py:100:17: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + superset/db_engine_specs/lint_metadata.py:100:17: PLC0207 [*] String is split more times than necessary - tests/common/query_context_generator.py:214:29: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + tests/common/query_context_generator.py:214:29: PLC0207 [*] String is split more times than necessary - tests/common/query_context_generator.py:255:22: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + tests/common/query_context_generator.py:255:22: PLC0207 [*] String is split more times than necessary
bokeh/bokeh (+3 -3 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select ALL
- src/bokeh/io/notebook.py:663:26: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + src/bokeh/io/notebook.py:663:26: PLC0207 [*] String is split more times than necessary - src/bokeh/util/token.py:142:41: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + src/bokeh/util/token.py:142:41: PLC0207 [*] String is split more times than necessary - src/bokeh/util/token.py:155:41: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + src/bokeh/util/token.py:155:41: PLC0207 [*] String is split more times than necessary
facebookresearch/chameleon (+8 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ chameleon/inference/chameleon.py:648:19: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8) + chameleon/miniviewer/miniviewer.py:190:16: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8) + chameleon/viewer/backend/models/chameleon_distributed.py:405:13: invalid-syntax: Cannot use `match` statement on Python 3.7 (syntax was added in Python 3.10) + chameleon/viewer/backend/models/chameleon_distributed.py:818:17: invalid-syntax: Cannot use `match` statement on Python 3.7 (syntax was added in Python 3.10) + chameleon/viewer/backend/models/chameleon_local.py:633:13: invalid-syntax: Cannot use `match` statement on Python 3.7 (syntax was added in Python 3.10) + chameleon/viewer/backend/models/service.py:131:21: invalid-syntax: Cannot use `match` statement on Python 3.7 (syntax was added in Python 3.10) + chameleon/viewer/backend/models/service.py:154:17: invalid-syntax: Cannot use `match` statement on Python 3.7 (syntax was added in Python 3.10) + chameleon/viewer/backend/models/service.py:226:25: invalid-syntax: Cannot use `match` statement on Python 3.7 (syntax was added in Python 3.10)
freedomofpress/securedrop (+1 -1 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
- securedrop/store.py:345:49: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + securedrop/store.py:345:49: PLC0207 [*] String is split more times than necessary
ibis-project/ibis (+1 -1 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
- ibis/examples/gen_registry.py:125:52: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + ibis/examples/gen_registry.py:125:52: PLC0207 [*] String is split more times than necessary
langchain-ai/langchain (+10 -10 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
- libs/langchain/langchain_classic/agents/chat/output_parser.py:66:22: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + libs/langchain/langchain_classic/agents/chat/output_parser.py:66:22: PLC0207 [*] String is split more times than necessary - libs/langchain/langchain_classic/agents/conversational/output_parser.py:34:28: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + libs/langchain/langchain_classic/agents/conversational/output_parser.py:34:28: PLC0207 [*] String is split more times than necessary - libs/langchain/langchain_classic/agents/mrkl/output_parser.py:72:28: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + libs/langchain/langchain_classic/agents/mrkl/output_parser.py:72:28: PLC0207 [*] String is split more times than necessary - libs/langchain/langchain_classic/agents/output_parsers/react_json_single_input.py:81:22: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + libs/langchain/langchain_classic/agents/output_parsers/react_json_single_input.py:81:22: PLC0207 [*] String is split more times than necessary - libs/langchain/langchain_classic/agents/output_parsers/react_single_input.py:72:28: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + libs/langchain/langchain_classic/agents/output_parsers/react_single_input.py:72:28: PLC0207 [*] String is split more times than necessary ... 10 additional changes omitted for project
pandas-dev/pandas (+1 -1 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
- pandas/compat/_optional.py:165:14: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + pandas/compat/_optional.py:165:14: PLC0207 [*] String is split more times than necessary
pypa/cibuildwheel (+3 -3 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
- bin/update_pythons.py:129:22: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + bin/update_pythons.py:129:22: PLC0207 [*] String is split more times than necessary - cibuildwheel/platforms/macos.py:154:31: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + cibuildwheel/platforms/macos.py:154:31: PLC0207 [*] String is split more times than necessary - cibuildwheel/selector.py:78:26: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + cibuildwheel/selector.py:78:26: PLC0207 [*] String is split more times than necessary
qdrant/qdrant-client (+2 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview
+ qdrant_client/async_qdrant_fastembed.py:226:16: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8) + qdrant_client/qdrant_fastembed.py:223:16: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8)
zulip/zulip (+10 -10 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select ALL
- zerver/lib/send_email.py:301:16: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + zerver/lib/send_email.py:301:16: PLC0207 [*] String is split more times than necessary - zerver/lib/send_email.py:449:21: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + zerver/lib/send_email.py:449:21: PLC0207 [*] String is split more times than necessary - zerver/lib/webhooks/common.py:285:26: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + zerver/lib/webhooks/common.py:285:26: PLC0207 [*] String is split more times than necessary - zerver/lib/webhooks/common.py:297:16: PLC0207 [*] Replace with `split(..., maxsplit=1)`. + zerver/lib/webhooks/common.py:297:16: PLC0207 [*] String is split more times than necessary - zerver/middleware.py:230:49: PLC0207 [*] Replace with `rsplit(..., maxsplit=1)`. + zerver/middleware.py:230:49: PLC0207 [*] String is split more times than necessary ... 10 additional changes omitted for project
openai/openai-cookbook (+5 -0 violations, +0 -0 fixes)
ruff check --no-cache --exit-zero --no-fix --output-format concise --preview --select A,E703,F704,B015,B018,D100
+ examples/Context_summarization_with_realtime_api.ipynb:cell 15:7:16: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8) + examples/Embedding_long_inputs.ipynb:cell 12:9:12: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8) + examples/agents_sdk/session_memory.ipynb:cell 42:30:53: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8) + examples/chatgpt/rag-quickstart/azure/Azure_AI_Search_with_Azure_Functions_and_GPT_Actions_in_ChatGPT.ipynb:cell 21:7:12: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8) + examples/chatgpt/rag-quickstart/gcp/Getting_started_with_bigquery_vector_search_and_openai.ipynb:cell 18:7:12: invalid-syntax: Cannot use named assignment expression (`:=`) on Python 3.7 (syntax was added in Python 3.8)
... Truncated remaining completed project reports due to GitHub comment length restrictions
Changes by rule (2 rules affected)
| code | total | + violation | - violation | + fix | - fix |
|---|---|---|---|---|---|
| PLC0207 | 108 | 54 | 54 | 0 | 0 |
| invalid-syntax: | 15 | 15 | 0 | 0 | 0 |
Formatter (stable)
ℹ️ ecosystem check detected format changes. (+1293 -691 lines in 470 files in 33 projects; 22 projects unchanged)
PostHog/HouseWatch (+2 -0 lines across 2 files)
housewatch/api/async_migration.py~L52
@action(methods=["POST"], detail=True)
def trigger(self, request, **kwargs):
+
migration = self.get_object()
migration.status = MigrationStatus.Startinghousewatch/async_migrations/runner.py~L27
def start_async_migration(
migration: AsyncMigration, ignore_posthog_version=False
) -> bool:
+
if migration.status not in [MigrationStatus.Starting, MigrationStatus.NotStarted]:
logger.error(f"Initial check failed for async migration {migration.name}")
return FalseRasaHQ/rasa (+178 -20 lines across 92 files)
data/test_classes/custom_slots.py~L28
value_reset_delay: Optional[int] = None,
influence_conversation: bool = True,
) -> None:
+
super().__init__(
name=name,
initial_value=initial_value,examples/reminderbot/actions/actions.py~L28
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
+
dispatcher.utter_message("I will remind you in 5 seconds.")
date = datetime.datetime.now() + datetime.timedelta(seconds=5)examples/reminderbot/actions/actions.py~L56
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
+
name = next(tracker.get_slot("PERSON"), "someone")
dispatcher.utter_message(f"Remember to call {name}!")
examples/reminderbot/actions/actions.py~L71
async def run(
self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
) -> List[Dict[Text, Any]]:
+
conversation_id = tracker.sender_id
dispatcher.utter_message(f"The ID of this conversation is '{conversation_id}'.")examples/reminderbot/actions/actions.py~L98
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
+
plant = next(tracker.get_latest_entity_values("plant"), "someone")
dispatcher.utter_message(f"Your {plant} needs some water!")
examples/reminderbot/actions/actions.py~L113
async def run(
self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
) -> List[Dict[Text, Any]]:
+
dispatcher.utter_message("Okay, I'll cancel all your reminders.")
# Cancel all remindersexamples/reminderbot/callback_server.py~L4
def create_app() -> Sanic:
+
bot_app = Sanic("callback_server", configure_logging=False)
@bot_app.post("/bot")
async def _export_trackers(args: argparse.Namespace) -> None:
+
_assert_max_timestamp_is_greater_than_min_timestamp(args)
endpoints = rasa.core.utils.read_endpoints_from_path(args.endpoints)<a href='https://github.com/RasaHQ/rasa/blob/c4069568b4fe2adb5d5a1e55d17ce8cb9dda27fc
... (truncated 8993 lines) ...
Summary -- This PR stabilizes the changes from #21097 and closes #19552. Note that this has two effects: - the default output format in `--watch` mode becomes `full` instead of `concise` - the `--output-format` flag will now be respected So the default output is now more verbose, but the old stable behavior can be retained by passing `--output-format=concise` (or any other supported format) instead. Test Plan -- Manual testing. I think we tried to set up automated tests in an earlier PR but decided they were too complex. I really should have cropped these, but I'll just collapse them instead: <details><summary>Screenshots</summary> <p> ### Current output, no `--output-format` <img width="783" height="514" alt="image" src="https://github.com/user-attachments/assets/a758daa8-534e-4dab-9cff-858321cede61" /> ### Current output, `--output-format=json` The same as above, the flag has no effect <img width="783" height="514" alt="image" src="https://github.com/user-attachments/assets/e5b0743a-6bd5-4dec-83e0-de24e44567ca" /> ### PR branch output, no `--output-format` Default format is now `full` rather than `concise` <img width="783" height="514" alt="image" src="https://github.com/user-attachments/assets/cf51947d-52e3-4420-83e7-73530557c324" /> ### PR branch output, `--output-format=json` JSON output, the flag works <img width="783" height="514" alt="image" src="https://github.com/user-attachments/assets/e7127c5a-88ad-4b2a-80b4-193b63b631ee" /> </p> </details>
## Summary Closes #21956 **Root cause:** When a .ruff.toml, ruff.toml config was discovered via ancestor search, Ruff eagerly derived target-version from requires-python in pyproject.toml during config loading. That fallback value then participated in config merging and incorrectly overrode an explicit target-version defined in an extended config. **Fix:** Defer the requires-python fallback until after the full extend chain across .ruff.toml / ruff.toml is merged, and apply it only if target-version is still unset. **Impact:** Explicit target-version settings in extended configs are now respected, requires-python is only used as a fallback. ## Test Plan Added a new test. I was useful to validate the fix but may be redundant to keep, lmk if you would love me to remove it --------- Co-authored-by: dylwil3 <dylwil3@gmail.com>
Styles stabilized: - [`avoid_parens_for_long_as_captures`](#22743) - [`remove_parens_around_except_types`](#22741) - [`allow_newline_after_block_open`](#22742) - [`no_chaperone_for_escaped_quote_in_triple_quoted_docstring `](#22739) - [`blank_line_before_decorated_class_in_stub `](#22740) - [`parenthesize_lambda_bodies`](#22744) To-do: - [x] Change target branch to 0.15 release branch - [x] Update documentation - [x] Remove empty commit --------- Co-authored-by: Brent Westbrook <brentrwestbrook@gmail.com>
Summary
Release branch for Ruff 0.15.0. Also see #22735 for the 2026 formatter style guide, which will be part of this release.
Breaking changes
Behavior changes
--output-formatin--watchmode #22908A003detection #22973Optionalas a union inPYI016#22974SIM905whenmaxsplitis provided #22975SIM910#22976UP008#22977UP043for stub files on any Python version #22978Recoded rules
Deprecated rules
Changed rules
Removed rules
Stabilized rules
ASYNC240#22909B912#22910ASYNC250#22911ASYNC212#22914RUF064#22915RUF061#22917PLC0207#22918RUF060#22919RUF102#22922RUF037#22923UP042#22924FURB110#22926PLW0108#22927FURB171#22928RUF103#22979RUF104#22980New or improved fixes
Deferred stabilizations
TODOs
emptyfirst commit (random whitespace change to get a baseline ecosystem check executable)