Skip to content
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

Ignore overlong pragma comments when enforcing linter line length #7692

Merged
merged 1 commit into from Sep 29, 2023

Conversation

charliermarsh
Copy link
Member

@charliermarsh charliermarsh commented Sep 28, 2023

Summary

This PR modifies the line-too-long and doc-line-too-long rules to ignore lines that are too long due to the presence of a pragma comment (e.g., # type: ignore or # noqa). That is, if a line only exceeds the limit due to the pragma comment, it will no longer be flagged as "too long". This behavior mirrors that of the formatter, thus ensuring that we don't flag lines under E501 that the formatter would otherwise avoid wrapping.

As a concrete example, given a line length of 88, the following would no longer be considered an E501 violation:

# The string literal is 88 characters, including quotes.
"shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:sh"  # type: ignore

This, however, would:

# The string literal is 89 characters, including quotes.
"shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:shape:sha"  # type: ignore

In addition to mirroring the formatter, this also means that adding a pragma comment (like # noqa) won't cause additional violations to appear (namely, E501). It's very common for users to add a # type: ignore or similar to a line, only to find that they then have to add a suppression comment after it that was required before, as in # type: ignore # noqa: E501.

Closes #7471.

Test Plan

cargo test

@charliermarsh charliermarsh added the formatter Related to the formatter label Sep 28, 2023
width = width.add_str(line.as_str());
// If the line ends in a pragma, remove it from the considered width.
let mut line = Cow::Borrowed(line);
if let [comment_range] = indexer.comment_ranges().comments_in_range(line.range()) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if we want to do this before or after computing the line width. We can avoid this lookup if we do it after computing the line width, but then we need to recompute the width after truncating the line.

@charliermarsh
Copy link
Member Author

If anyone is eager they are welcome to review, but I plan to do another clean-up pass on this with fresh eyes tomorrow.

@github-actions
Copy link

github-actions bot commented Sep 28, 2023

PR Check Results

Ecosystem

ℹ️ ecosystem check detected changes. (+2294, -54, 0 error(s))

rasa (+20, -1)

+ rasa/api.py:143:95: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/api.py:144:95: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/core/actions/action.py:1026:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/core/actions/action.py:952:95: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/core/actions/two_stage_fallback.py:184:105: RUF100 [*] Unused blanket `noqa` directive
+ rasa/core/agent.py:428:93: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/core/featurizers/single_state_featurizer.py:119:97: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/core/test.py:302:92: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/core/test.py:309:92: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/core/test.py:462:97: RUF100 [*] Unused blanket `noqa` directive
+ rasa/nlu/extractors/crf_entity_extractor.py:111:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/nlu/utils/hugging_face/registry.py:28:77: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/shared/core/events.py:88:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/shared/core/slots.py:300:95: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/shared/core/trackers.py:278:111: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/shared/core/training_data/story_writer/yaml_story_writer.py:220:107: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/shared/core/training_data/visualization.py:454:111: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/shared/nlu/training_data/entities_parser.py:27:145: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/utils/tensorflow/data_generator.py:220:97: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rasa/utils/tensorflow/model_data.py:106:108: RUF100 [*] Unused `noqa` directive (unused: `E501`)
- stubs/aio_pika/robust_channel.pyi:5:89: E501 Line too long (103 > 88 characters)

airflow (+93, -0)

+ airflow/providers/airbyte/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/alibaba/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/amazon/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/beam/__init__.py:42:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/drill/__init__.py:42:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/druid/__init__.py:42:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/flink/__init__.py:42:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/hdfs/__init__.py:42:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/hive/__init__.py:42:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/impala/__init__.py:42:111: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/kafka/__init__.py:40:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/kylin/__init__.py:40:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/livy/__init__.py:42:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/pig/__init__.py:42:108: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/pinot/__init__.py:42:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/spark/__init__.py:42:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apache/sqoop/__init__.py:42:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/apprise/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/arangodb/__init__.py:42:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/asana/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/atlassian/jira/__init__.py:40:112: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/celery/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/cloudant/__init__.py:40:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/cncf/kubernetes/__init__.py:42:113: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/common/sql/__init__.py:42:108: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/daskexecutor/__init__.py:42:110: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/databricks/__init__.py:42:108: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/datadog/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/dbt/cloud/__init__.py:42:107: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/dingding/__init__.py:40:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/discord/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/docker/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/elasticsearch/__init__.py:42:111: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/exasol/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/facebook/__init__.py:42:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/ftp/__init__.py:42:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/github/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/google/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/grpc/__init__.py:42:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/hashicorp/__init__.py:42:107: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/http/__init__.py:42:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/imap/__init__.py:42:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/influxdb/__init__.py:42:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/jdbc/__init__.py:42:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/jenkins/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/microsoft/azure/__init__.py:42:113: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/microsoft/mssql/__init__.py:42:113: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/microsoft/psrp/__init__.py:42:112: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/microsoft/winrm/__init__.py:42:113: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/mongo/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/mysql/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/neo4j/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/odbc/__init__.py:40:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/openfaas/__init__.py:40:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/openlineage/__init__.py:42:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/opsgenie/__init__.py:40:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/oracle/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/pagerduty/__init__.py:42:107: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/papermill/__init__.py:40:107: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/plexus/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/postgres/__init__.py:42:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/presto/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/qubole/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/redis/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/salesforce/__init__.py:42:108: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/samba/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/segment/__init__.py:40:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/sendgrid/__init__.py:42:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/sftp/__init__.py:42:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/sftp/operators/sftp.py:228:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/singularity/__init__.py:42:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/slack/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/smtp/__init__.py:42:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/snowflake/__init__.py:42:107: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/sqlite/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/ssh/__init__.py:42:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/tableau/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/tabular/__init__.py:40:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/telegram/__init__.py:40:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/trino/__init__.py:42:103: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/vertica/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/yandex/__init__.py:42:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ airflow/providers/zendesk/__init__.py:42:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/always/test_connection.py:187:164: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/charts/helm_template_generator.py:44:142: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/charts/helm_template_generator.py:46:157: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/providers/apache/flink/sensors/test_flink_kubernetes.py:534:1143: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/providers/openlineage/plugins/test_utils.py:46:388: RUF100 [*] Unused blanket `noqa` directive
+ tests/system/providers/amazon/aws/example_sagemaker_endpoint.py:159:118: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/utils/test_log_handlers.py:245:152: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/utils/test_log_handlers.py:611:108: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/utils/test_log_handlers.py:628:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ tests/utils/test_log_handlers.py:632:108: RUF100 [*] Unused `noqa` directive (unused: `E501`)

aws-sam-cli (+0, -1)

- tests/integration/local/start_api/test_start_api_with_terraform_application.py:58:121: E501 Line too long (122 > 120 characters)

openpilot (+2, -0)

+ system/sensord/pigeond.py:167:209: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ system/sensord/pigeond.py:172:225: RUF100 [*] Unused `noqa` directive (unused: `E501`)

content (+17, -25)

+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:177:131: E501 Line too long (147 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:177:131: E501 Line too long (160 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:179:131: E501 Line too long (680 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:179:131: E501 Line too long (693 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:279:131: E501 Line too long (132 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:293:131: E501 Line too long (384 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:293:131: E501 Line too long (396 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:295:131: E501 Line too long (1104 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:295:131: E501 Line too long (1116 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:296:131: E501 Line too long (847 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:296:131: E501 Line too long (859 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:307:131: E501 Line too long (132 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:325:131: E501 Line too long (384 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:325:131: E501 Line too long (396 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:327:131: E501 Line too long (1104 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:327:131: E501 Line too long (1116 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:328:131: E501 Line too long (847 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:328:131: E501 Line too long (859 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:339:131: E501 Line too long (132 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:353:131: E501 Line too long (384 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:353:131: E501 Line too long (396 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:355:131: E501 Line too long (1104 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:355:131: E501 Line too long (1116 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:366:131: E501 Line too long (132 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:384:131: E501 Line too long (384 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:384:131: E501 Line too long (396 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:386:131: E501 Line too long (1104 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:386:131: E501 Line too long (1116 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:419:131: E501 Line too long (144 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:419:131: E501 Line too long (157 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:451:131: E501 Line too long (147 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:451:131: E501 Line too long (160 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:453:131: E501 Line too long (680 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:453:131: E501 Line too long (693 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:479:131: E501 Line too long (135 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:479:131: E501 Line too long (148 > 130 characters)
+ Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:481:131: E501 Line too long (398 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:481:131: E501 Line too long (411 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:505:131: E501 Line too long (166 > 130 characters)
- Packs/CofenseTriage/Integrations/CofenseTriagev2/CofenseTriagev2_test.py:530:131: E501 Line too long (166 > 130 characters)
- Packs/TrustwaveFusion/Integrations/TrustwaveFusion/TrustwaveFusion_test.py:227:131: E501 Line too long (148 > 130 characters)
- Packs/TrustwaveFusion/Integrations/TrustwaveFusion/TrustwaveFusion_test.py:244:131: E501 Line too long (148 > 130 characters)

securedrop (+11, -0)

+ securedrop/pretty_bad_protocol/_meta.py:1045:106: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/_meta.py:721:106: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/_meta.py:752:111: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/_util.py:402:117: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/_util.py:471:100: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/gnupg.py:1085:121: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/gnupg.py:377:103: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/gnupg.py:413:114: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/gnupg.py:495:99: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/gnupg.py:592:122: RUF100 [*] Unused blanket `noqa` directive
+ securedrop/pretty_bad_protocol/gnupg.py:683:133: RUF100 [*] Unused blanket `noqa` directive

pandas (+0, -7)

- pandas/core/indexes/base.py:5357:89: E501 Line too long (105 > 88 characters)
- pandas/core/reshape/merge.py:1392:89: E501 Line too long (101 > 88 characters)
- pandas/core/reshape/merge.py:1398:89: E501 Line too long (101 > 88 characters)
- pandas/io/parquet.py:169:89: E501 Line too long (107 > 88 characters)
- pandas/io/parsers/base_parser.py:714:89: E501 Line too long (99 > 88 characters)
- pandas/io/parsers/base_parser.py:750:89: E501 Line too long (95 > 88 characters)
- pandas/io/parsers/base_parser.py:813:89: E501 Line too long (90 > 88 characters)

setuptools (+0, -1)

- pkg_resources/_vendor/platformdirs/windows.py:157:89: E501 Line too long (115 > 88 characters)

rotki (+2149, -0)

+ package.py:1098:100: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/cost_basis/base.py:188:93: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/cost_basis/base.py:378:94: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/export/csv.py:149:73: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/export/csv.py:97:99: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/history_base_entries.py:36:99: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/pot.py:407:135: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/pot.py:416:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/pot.py:418:134: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/pot.py:420:126: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/structures/eth2.py:170:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/structures/eth2.py:297:100: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/accounting/structures/eth2.py:394:97: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:1045:99: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:1204:132: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:1642:176: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:1741:99: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:1856:99: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:2514:105: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:2598:106: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:2917:92: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:3045:100: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:3239:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:3354:111: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:3355:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:4072:97: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:4092:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:4110:96: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:516:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/rest.py:665:102: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/v1/fields.py:173:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/v1/fields.py:682:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/v1/parser.py:51:124: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/v1/schemas.py:1301:113: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/v1/schemas.py:195:77: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/v1/schemas.py:3024:104: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/websockets/notifier.py:110:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/websockets/notifier.py:36:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/websockets/notifier.py:41:97: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/api/websockets/notifier.py:60:101: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/asset.py:64:109: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/converters.py:595:13: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:10:91: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:12:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:14:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:16:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:22:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:23:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:24:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:25:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:26:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:28:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:32:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:33:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:34:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:38:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:39:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:40:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:42:91: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:43:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:44:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:45:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:47:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:48:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:49:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:50:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:51:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:55:89: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:7:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:8:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/exchanges_mappings/okx.py:9:90: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:128:124: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:129:125: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:159:124: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:160:125: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:71:124: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:72:124: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:97:124: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/resolver.py:98:125: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/utils.py:66:87: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/assets/utils.py:77:115: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/balances/manual.py:97:99: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/chain/aggregator.py:1011:156: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/chain/aggregator.py:1014:175: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/chain/aggregator.py:1021:194: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/chain/aggregator.py:1023:193: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/chain/aggregator.py:1098:97: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ rotkehlchen/chain/aggregator.py:291:100: RUF100 [*] Unused `noqa` directive (unused: `E501`)
+ 

Copy link
Member

@MichaReiser MichaReiser left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't read through the code yet. Does the exclusion apply to end of line comments or own-line comments too?

@charliermarsh
Copy link
Member Author

It applies to both.

@MichaReiser
Copy link
Member

It applies to both.

Interesting. I guess that's fine because the formatter isn't opinionated about own-line pragma comments and the listed pragma comments are intended to be used as end-of-line comments. But it is a deviation from the formatter that only implements the special casing for end of line comments.

Base automatically changed from charlie/pragma to main September 28, 2023 18:55
@charliermarsh charliermarsh force-pushed the charlie/overlong branch 3 times, most recently from be29c74 to 0bf409b Compare September 28, 2023 19:30
@charliermarsh charliermarsh marked this pull request as ready for review September 28, 2023 19:33
@charliermarsh
Copy link
Member Author

@LefterisJP - Since this causes a lot of # noqa: E501 markers to become redundant in Rotki, want to flag this for you and also welcome any feedback you might have.

Comment on lines +28 to +30
// The maximum width of the line is the number of bytes multiplied by the tab size (the
// worst-case scenario is that the line is all tabs). If the maximum width is less than the
// limit, then the line is not overlong.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's very conservative (but correct). It means only lines with less than 22 characters skip the check below. This optimisation becomes less effective if we increase the default tab_size to 8 (making it only applies to lines with less or equal to 11 characters).

Although I'm not sure what we should do about it. Dividing by two could be an option, considering that it's unlikely that every second character is a tab but it will reduce correctness,

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was already present, just moved. We used to have a much better heuristic, because we assumed each byte was at most one character, but tabs ruin that -- a single byte can be as large as the tab width, sadly.

Comment on lines 43 to 53
let (line, width) = if let Some(line) = Overlong::strip_trailing(line, indexer, task_tags) {
// Re-measure the line.
let width = Overlong::measure(line.as_str(), tab_size);
if width <= limit {
return None;
}

(Cow::Owned(line), width)
} else {
(Cow::Borrowed(line), width)
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make sense for strip_trailing to return the pragma comment instead, considering that the pragma comment tends to be shorter (no indent) than the code? Or is the intention to only highlight the non-pragma part in the violation? (In which case we could return Option<(&str, &str)>

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The intention is to only highlight the non-pragma part of the violation.

}

// Strip trailing pragma comments and, if necessary, re-measure the line.
let (line, width) = if let Some(line) = Overlong::strip_trailing(line, indexer, task_tags) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To make it clear what trailing part it splits (may remove the need for the comment)

Suggested change
let (line, width) = if let Some(line) = Overlong::strip_trailing(line, indexer, task_tags) {
let (line, width) = if let Some(line) = Overlong::strip_trailing_pragma_comment(line, indexer, task_tags) {

crates/ruff_linter/src/rules/pycodestyle/overlong.rs Outdated Show resolved Hide resolved
crates/ruff_linter/src/rules/pycodestyle/overlong.rs Outdated Show resolved Hide resolved
crates/ruff_linter/src/rules/pycodestyle/overlong.rs Outdated Show resolved Hide resolved
return None;
}

(Cow::Owned(line), width)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should Line be Copy instead? it's an &str and a u32.

@charliermarsh charliermarsh force-pushed the charlie/overlong branch 2 times, most recently from 4ee4758 to 35ce76a Compare September 29, 2023 23:19
@charliermarsh charliermarsh enabled auto-merge (squash) September 29, 2023 23:24
@charliermarsh charliermarsh merged commit 1646939 into main Sep 29, 2023
15 checks passed
@charliermarsh charliermarsh deleted the charlie/overlong branch September 29, 2023 23:26
Julian added a commit to bowtie-json-schema/bowtie that referenced this pull request Oct 2, 2023
renovate bot added a commit to Hapag-Lloyd/dist-comm-vis that referenced this pull request Dec 7, 2023
[![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://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `==0.0.263` -> `==0.1.7` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.1.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.1.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.0.263/0.1.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.0.263/0.1.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.1.7`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#017)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.1.6...v0.1.7)

##### Preview features

- Implement multiline dictionary and list hugging for preview style
([#&#8203;8293](https://togithub.com/astral-sh/ruff/pull/8293))
- Implement the `fix_power_op_line_length` preview style
([#&#8203;8947](https://togithub.com/astral-sh/ruff/pull/8947))
- Use Python version to determine typing rewrite safety
([#&#8203;8919](https://togithub.com/astral-sh/ruff/pull/8919))
- \[`flake8-annotations`] Enable auto-return-type involving `Optional`
and `Union` annotations
([#&#8203;8885](https://togithub.com/astral-sh/ruff/pull/8885))
- \[`flake8-bandit`] Implement `django-raw-sql` (`S611`)
([#&#8203;8651](https://togithub.com/astral-sh/ruff/pull/8651))
- \[`flake8-bandit`] Implement `tarfile-unsafe-members` (`S202`)
([#&#8203;8829](https://togithub.com/astral-sh/ruff/pull/8829))
- \[`flake8-pyi`] Implement fix for `unnecessary-literal-union`
(`PYI030`)
([#&#8203;7934](https://togithub.com/astral-sh/ruff/pull/7934))
- \[`flake8-simplify`] Extend `dict-get-with-none-default` (`SIM910`) to
non-literals
([#&#8203;8762](https://togithub.com/astral-sh/ruff/pull/8762))
- \[`pylint`] - add `unnecessary-list-index-lookup` (`PLR1736`) +
autofix ([#&#8203;7999](https://togithub.com/astral-sh/ruff/pull/7999))
- \[`pylint`] - implement R0202 and R0203 with autofixes
([#&#8203;8335](https://togithub.com/astral-sh/ruff/pull/8335))
- \[`pylint`] Implement `repeated-keyword` (`PLe1132`)
([#&#8203;8706](https://togithub.com/astral-sh/ruff/pull/8706))
- \[`pylint`] Implement `too-many-positional` (`PLR0917`)
([#&#8203;8995](https://togithub.com/astral-sh/ruff/pull/8995))
- \[`pylint`] Implement `unnecessary-dict-index-lookup` (`PLR1733`)
([#&#8203;8036](https://togithub.com/astral-sh/ruff/pull/8036))
- \[`refurb`] Implement `redundant-log-base` (`FURB163`)
([#&#8203;8842](https://togithub.com/astral-sh/ruff/pull/8842))

##### Rule changes

- \[`flake8-boolean-trap`] Allow booleans in `@override` methods
([#&#8203;8882](https://togithub.com/astral-sh/ruff/pull/8882))
- \[`flake8-bugbear`] Avoid `B015`,`B018` for last expression in a cell
([#&#8203;8815](https://togithub.com/astral-sh/ruff/pull/8815))
- \[`flake8-pie`] Allow ellipses for enum values in stub files
([#&#8203;8825](https://togithub.com/astral-sh/ruff/pull/8825))
- \[`flake8-pyi`] Check PEP 695 type aliases for `snake-case-type-alias`
and `t-suffixed-type-alias`
([#&#8203;8966](https://togithub.com/astral-sh/ruff/pull/8966))
- \[`flake8-pyi`] Check for kwarg and vararg `NoReturn` type annotations
([#&#8203;8948](https://togithub.com/astral-sh/ruff/pull/8948))
- \[`flake8-simplify`] Omit select context managers from `SIM117`
([#&#8203;8801](https://togithub.com/astral-sh/ruff/pull/8801))
- \[`pep8-naming`] Allow Django model loads in
`non-lowercase-variable-in-function` (`N806`)
([#&#8203;8917](https://togithub.com/astral-sh/ruff/pull/8917))
- \[`pycodestyle`] Avoid `E703` for last expression in a cell
([#&#8203;8821](https://togithub.com/astral-sh/ruff/pull/8821))
- \[`pycodestyle`] Update `E402` to work at cell level for notebooks
([#&#8203;8872](https://togithub.com/astral-sh/ruff/pull/8872))
- \[`pydocstyle`] Avoid `D100` for Jupyter Notebooks
([#&#8203;8816](https://togithub.com/astral-sh/ruff/pull/8816))
- \[`pylint`] Implement fix for `unspecified-encoding` (`PLW1514`)
([#&#8203;8928](https://togithub.com/astral-sh/ruff/pull/8928))

##### Formatter

- Avoid unstable formatting in ellipsis-only body with trailing comment
([#&#8203;8984](https://togithub.com/astral-sh/ruff/pull/8984))
- Inline trailing comments for type alias similar to assignments
([#&#8203;8941](https://togithub.com/astral-sh/ruff/pull/8941))
- Insert trailing comma when function breaks with single argument
([#&#8203;8921](https://togithub.com/astral-sh/ruff/pull/8921))

##### CLI

- Update `ruff check` and `ruff format` to default to the current
directory
([#&#8203;8791](https://togithub.com/astral-sh/ruff/pull/8791))
- Stop at the first resolved parent configuration
([#&#8203;8864](https://togithub.com/astral-sh/ruff/pull/8864))

##### Configuration

- \[`pylint`] Default `max-positional-args` to `max-args`
([#&#8203;8998](https://togithub.com/astral-sh/ruff/pull/8998))
- \[`pylint`] Add `allow-dunder-method-names` setting for
`bad-dunder-method-name` (`PLW3201`)
([#&#8203;8812](https://togithub.com/astral-sh/ruff/pull/8812))
- \[`isort`] Add support for `from-first` setting
([#&#8203;8663](https://togithub.com/astral-sh/ruff/pull/8663))
- \[`isort`] Add support for `length-sort` settings
([#&#8203;8841](https://togithub.com/astral-sh/ruff/pull/8841))

##### Bug fixes

- Add support for `@functools.singledispatch`
([#&#8203;8934](https://togithub.com/astral-sh/ruff/pull/8934))
- Avoid off-by-one error in stripping noqa following multi-byte char
([#&#8203;8979](https://togithub.com/astral-sh/ruff/pull/8979))
- Avoid off-by-one error in with-item named expressions
([#&#8203;8915](https://togithub.com/astral-sh/ruff/pull/8915))
- Avoid syntax error via invalid ur string prefix
([#&#8203;8971](https://togithub.com/astral-sh/ruff/pull/8971))
- Avoid underflow in `get_model` matching
([#&#8203;8965](https://togithub.com/astral-sh/ruff/pull/8965))
- Avoid unnecessary index diagnostics when value is modified
([#&#8203;8970](https://togithub.com/astral-sh/ruff/pull/8970))
- Convert over-indentation rule to use number of characters
([#&#8203;8983](https://togithub.com/astral-sh/ruff/pull/8983))
- Detect implicit returns in auto-return-types
([#&#8203;8952](https://togithub.com/astral-sh/ruff/pull/8952))
- Fix start >= end error in over-indentation
([#&#8203;8982](https://togithub.com/astral-sh/ruff/pull/8982))
- Ignore `@overload` and `@override` methods for too-many-arguments
checks ([#&#8203;8954](https://togithub.com/astral-sh/ruff/pull/8954))
- Lexer start of line is false only for `Mode::Expression`
([#&#8203;8880](https://togithub.com/astral-sh/ruff/pull/8880))
- Mark `pydantic_settings.BaseSettings` as having default copy semantics
([#&#8203;8793](https://togithub.com/astral-sh/ruff/pull/8793))
- Respect dictionary unpacking in `NamedTuple` assignments
([#&#8203;8810](https://togithub.com/astral-sh/ruff/pull/8810))
- Respect local subclasses in `flake8-type-checking`
([#&#8203;8768](https://togithub.com/astral-sh/ruff/pull/8768))
- Support type alias statements in simple statement positions
([#&#8203;8916](https://togithub.com/astral-sh/ruff/pull/8916))
- \[`flake8-annotations`] Avoid filtering out un-representable types in
return annotation
([#&#8203;8881](https://togithub.com/astral-sh/ruff/pull/8881))
- \[`flake8-pie`] Retain extra ellipses in protocols and abstract
methods ([#&#8203;8769](https://togithub.com/astral-sh/ruff/pull/8769))
- \[`flake8-pyi`] Respect local enum subclasses in `simple-defaults`
(`PYI052`)
([#&#8203;8767](https://togithub.com/astral-sh/ruff/pull/8767))
- \[`flake8-trio`] Use correct range for `TRIO115` fix
([#&#8203;8933](https://togithub.com/astral-sh/ruff/pull/8933))
- \[`flake8-trio`] Use full arguments range for zero-sleep-call
([#&#8203;8936](https://togithub.com/astral-sh/ruff/pull/8936))
- \[`isort`] fix: mark `__main__` as first-party import
([#&#8203;8805](https://togithub.com/astral-sh/ruff/pull/8805))
- \[`pep8-naming`] Avoid `N806` errors for type alias statements
([#&#8203;8785](https://togithub.com/astral-sh/ruff/pull/8785))
- \[`perflint`] Avoid `PERF101` if there's an append in loop body
([#&#8203;8809](https://togithub.com/astral-sh/ruff/pull/8809))
- \[`pycodestyle`] Allow space-before-colon after end-of-slice
([#&#8203;8838](https://togithub.com/astral-sh/ruff/pull/8838))
- \[`pydocstyle`] Avoid non-character breaks in `over-indentation`
(`D208`) ([#&#8203;8866](https://togithub.com/astral-sh/ruff/pull/8866))
- \[`pydocstyle`] Ignore underlines when determining docstring logical
lines ([#&#8203;8929](https://togithub.com/astral-sh/ruff/pull/8929))
- \[`pylint`] Extend `self-assigning-variable` to multi-target
assignments
([#&#8203;8839](https://togithub.com/astral-sh/ruff/pull/8839))
- \[`tryceratops`] Avoid repeated triggers in nested `tryceratops`
diagnostics
([#&#8203;8772](https://togithub.com/astral-sh/ruff/pull/8772))

##### Documentation

- Add advice for fixing RUF008 when mutability is not desired
([#&#8203;8853](https://togithub.com/astral-sh/ruff/pull/8853))
- Added the command to run ruff using pkgx to the installation.md
([#&#8203;8955](https://togithub.com/astral-sh/ruff/pull/8955))
- Document fix safety for flake8-comprehensions and some pyupgrade rules
([#&#8203;8918](https://togithub.com/astral-sh/ruff/pull/8918))
- Fix doc formatting for zero-sleep-call
([#&#8203;8937](https://togithub.com/astral-sh/ruff/pull/8937))
- Remove duplicate imports from os-stat documentation
([#&#8203;8930](https://togithub.com/astral-sh/ruff/pull/8930))
- Replace generated reference to MkDocs
([#&#8203;8806](https://togithub.com/astral-sh/ruff/pull/8806))
- Update Arch Linux package URL in installation.md
([#&#8203;8802](https://togithub.com/astral-sh/ruff/pull/8802))
- \[`flake8-pyi`] Fix error in `t-suffixed-type-alias` (`PYI043`)
example ([#&#8203;8963](https://togithub.com/astral-sh/ruff/pull/8963))
- \[`flake8-pyi`] Improve motivation for `custom-type-var-return-type`
(`PYI019`)
([#&#8203;8766](https://togithub.com/astral-sh/ruff/pull/8766))

###
[`v0.1.6`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#016)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.1.5...v0.1.6)

##### Preview features

- \[`flake8-boolean-trap`] Extend
`boolean-type-hint-positional-argument` (`FBT001`) to include booleans
in unions
([#&#8203;7501](https://togithub.com/astral-sh/ruff/pull/7501))
- \[`flake8-pie`] Extend `reimplemented-list-builtin` (`PIE807`) to
`dict` reimplementations
([#&#8203;8608](https://togithub.com/astral-sh/ruff/pull/8608))
- \[`flake8-pie`] Extend `unnecessary-pass` (`PIE790`) to include
ellipses (`...`)
([#&#8203;8641](https://togithub.com/astral-sh/ruff/pull/8641))
- \[`flake8-pie`] Implement fix for `unnecessary-spread` (`PIE800`)
([#&#8203;8668](https://togithub.com/astral-sh/ruff/pull/8668))
- \[`flake8-quotes`] Implement `unnecessary-escaped-quote` (`Q004`)
([#&#8203;8630](https://togithub.com/astral-sh/ruff/pull/8630))
- \[`pycodestyle`] Implement fix for `multiple-spaces-after-keyword`
(`E271`) and `multiple-spaces-before-keyword` (`E272`)
([#&#8203;8622](https://togithub.com/astral-sh/ruff/pull/8622))
- \[`pycodestyle`] Implement fix for `multiple-spaces-after-operator`
(`E222`) and `multiple-spaces-before-operator` (`E221`)
([#&#8203;8623](https://togithub.com/astral-sh/ruff/pull/8623))
- \[`pyflakes`] Extend `is-literal` (`F632`) to include comparisons
against mutable initializers
([#&#8203;8607](https://togithub.com/astral-sh/ruff/pull/8607))
- \[`pylint`] Implement `redefined-argument-from-local` (`PLR1704`)
([#&#8203;8159](https://togithub.com/astral-sh/ruff/pull/8159))
- \[`pylint`] Implement fix for `unnecessary-lambda` (`PLW0108`)
([#&#8203;8621](https://togithub.com/astral-sh/ruff/pull/8621))
- \[`refurb`] Implement `if-expr-min-max` (`FURB136`)
([#&#8203;8664](https://togithub.com/astral-sh/ruff/pull/8664))
- \[`refurb`] Implement `math-constant` (`FURB152`)
([#&#8203;8727](https://togithub.com/astral-sh/ruff/pull/8727))

##### Rule changes

- \[`flake8-annotations`] Add autotyping-like return type inference for
annotation rules
([#&#8203;8643](https://togithub.com/astral-sh/ruff/pull/8643))
- \[`flake8-future-annotations`] Implement fix for
`future-required-type-annotation` (`FA102`)
([#&#8203;8711](https://togithub.com/astral-sh/ruff/pull/8711))
- \[`flake8-implicit-namespace-package`] Avoid missing namespace
violations in scripts with shebangs
([#&#8203;8710](https://togithub.com/astral-sh/ruff/pull/8710))
- \[`pydocstyle`] Update `over-indentation` (`D208`) to preserve
indentation offsets when fixing overindented lines
([#&#8203;8699](https://togithub.com/astral-sh/ruff/pull/8699))
- \[`pyupgrade`] Refine `timeout-error-alias` (`UP041`) to remove false
positives
([#&#8203;8587](https://togithub.com/astral-sh/ruff/pull/8587))

##### Formatter

- Fix instability in `await` formatting with fluent style
([#&#8203;8676](https://togithub.com/astral-sh/ruff/pull/8676))
- Compare formatted and unformatted ASTs during formatter tests
([#&#8203;8624](https://togithub.com/astral-sh/ruff/pull/8624))
- Preserve trailing semicolon for Notebooks
([#&#8203;8590](https://togithub.com/astral-sh/ruff/pull/8590))

##### CLI

- Improve debug printing for resolving origin of config settings
([#&#8203;8729](https://togithub.com/astral-sh/ruff/pull/8729))
- Write unchanged, excluded files to stdout when read via stdin
([#&#8203;8596](https://togithub.com/astral-sh/ruff/pull/8596))

##### Configuration

- \[`isort`] Support disabling sections with `no-sections = true`
([#&#8203;8657](https://togithub.com/astral-sh/ruff/pull/8657))
- \[`pep8-naming`] Support local and dynamic class- and static-method
decorators
([#&#8203;8592](https://togithub.com/astral-sh/ruff/pull/8592))
- \[`pydocstyle`] Allow overriding pydocstyle convention rules
([#&#8203;8586](https://togithub.com/astral-sh/ruff/pull/8586))

##### Bug fixes

- Avoid syntax error via importing `trio.lowlevel`
([#&#8203;8730](https://togithub.com/astral-sh/ruff/pull/8730))
- Omit unrolled augmented assignments in `PIE794`
([#&#8203;8634](https://togithub.com/astral-sh/ruff/pull/8634))
- Slice source code instead of generating it for `EM` fixes
([#&#8203;7746](https://togithub.com/astral-sh/ruff/pull/7746))
- Allow whitespace around colon in slices for
`whitespace-before-punctuation` (`E203`)
([#&#8203;8654](https://togithub.com/astral-sh/ruff/pull/8654))
- Use function range for `no-self-use`
([#&#8203;8637](https://togithub.com/astral-sh/ruff/pull/8637))
- F-strings doesn't contain bytes literal for `PLW0129`
([#&#8203;8675](https://togithub.com/astral-sh/ruff/pull/8675))
- Improve detection of `TYPE_CHECKING` blocks imported from
`typing_extensions` or `_typeshed`
([#&#8203;8429](https://togithub.com/astral-sh/ruff/pull/8429))
- Treat display as a builtin in IPython
([#&#8203;8707](https://togithub.com/astral-sh/ruff/pull/8707))
- Avoid `FURB113` autofix if comments are present
([#&#8203;8494](https://togithub.com/astral-sh/ruff/pull/8494))
- Consider the new f-string tokens for `flake8-commas`
([#&#8203;8582](https://togithub.com/astral-sh/ruff/pull/8582))
- Remove erroneous bad-dunder-name reference
([#&#8203;8742](https://togithub.com/astral-sh/ruff/pull/8742))
- Avoid recommending Self usages in metaclasses
([#&#8203;8639](https://togithub.com/astral-sh/ruff/pull/8639))
- Detect runtime-evaluated base classes defined in the current file
([#&#8203;8572](https://togithub.com/astral-sh/ruff/pull/8572))
- Avoid inserting trailing commas within f-strings
([#&#8203;8574](https://togithub.com/astral-sh/ruff/pull/8574))
- Remove incorrect deprecation label for stdout and stderr
([#&#8203;8743](https://togithub.com/astral-sh/ruff/pull/8743))
- Fix unnecessary parentheses in UP007 fix
([#&#8203;8610](https://togithub.com/astral-sh/ruff/pull/8610))
- Remove repeated and erroneous scoped settings headers in docs
([#&#8203;8670](https://togithub.com/astral-sh/ruff/pull/8670))
- Trim trailing empty strings when converting to f-strings
([#&#8203;8712](https://togithub.com/astral-sh/ruff/pull/8712))
- Fix ordering for `force-sort-within-sections`
([#&#8203;8665](https://togithub.com/astral-sh/ruff/pull/8665))
- Run unicode prefix rule over tokens
([#&#8203;8709](https://togithub.com/astral-sh/ruff/pull/8709))
- Update UP032 to unescape curly braces in literal parts of converted
strings ([#&#8203;8697](https://togithub.com/astral-sh/ruff/pull/8697))
- List all ipython builtins
([#&#8203;8719](https://togithub.com/astral-sh/ruff/pull/8719))

##### Documentation

- Document conventions in the FAQ
([#&#8203;8638](https://togithub.com/astral-sh/ruff/pull/8638))
- Redirect from rule codes to rule pages in docs
([#&#8203;8636](https://togithub.com/astral-sh/ruff/pull/8636))
- Fix permalink to convention setting
([#&#8203;8575](https://togithub.com/astral-sh/ruff/pull/8575))

###
[`v0.1.5`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#015)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.1.4...v0.1.5)

##### Preview features

- \[`flake8-bandit`] Implement `mako-templates` (`S702`)
([#&#8203;8533](https://togithub.com/astral-sh/ruff/pull/8533))
- \[`flake8-trio`] Implement `TRIO105`
([#&#8203;8490](https://togithub.com/astral-sh/ruff/pull/8490))
- \[`flake8-trio`] Implement `TRIO109`
([#&#8203;8534](https://togithub.com/astral-sh/ruff/pull/8534))
- \[`flake8-trio`] Implement `TRIO110`
([#&#8203;8537](https://togithub.com/astral-sh/ruff/pull/8537))
- \[`flake8-trio`] Implement `TRIO115`
([#&#8203;8486](https://togithub.com/astral-sh/ruff/pull/8486))
- \[`refurb`] Implement `type-none-comparison` (`FURB169`)
([#&#8203;8487](https://togithub.com/astral-sh/ruff/pull/8487))
- Flag all comparisons against builtin types in `E721`
([#&#8203;8491](https://togithub.com/astral-sh/ruff/pull/8491))
- Make `SIM118` fix as safe when the expression is a known dictionary
([#&#8203;8525](https://togithub.com/astral-sh/ruff/pull/8525))

##### Formatter

- Fix multiline lambda expression statement formatting
([#&#8203;8466](https://togithub.com/astral-sh/ruff/pull/8466))

##### CLI

- Add hidden `--extension` to override inference of source type from
file extension
([#&#8203;8373](https://togithub.com/astral-sh/ruff/pull/8373))

##### Configuration

- Account for selector specificity when merging `extend_unsafe_fixes`
and `override extend_safe_fixes`
([#&#8203;8444](https://togithub.com/astral-sh/ruff/pull/8444))
- Add support for disabling cache with `RUFF_NO_CACHE` environment
variable ([#&#8203;8538](https://togithub.com/astral-sh/ruff/pull/8538))

##### Bug fixes

- \[`E721`] Flag comparisons to `memoryview`
([#&#8203;8485](https://togithub.com/astral-sh/ruff/pull/8485))
- Allow collapsed-ellipsis bodies in other statements
([#&#8203;8499](https://togithub.com/astral-sh/ruff/pull/8499))
- Avoid `D301` autofix for `u` prefixed strings
([#&#8203;8495](https://togithub.com/astral-sh/ruff/pull/8495))
- Only flag `flake8-trio` rules when `trio` import is present
([#&#8203;8550](https://togithub.com/astral-sh/ruff/pull/8550))
- Reject more syntactically invalid Python programs
([#&#8203;8524](https://togithub.com/astral-sh/ruff/pull/8524))
- Avoid raising `TRIO115` violations for `trio.sleep(...)` calls with
non-number values
([#&#8203;8532](https://togithub.com/astral-sh/ruff/pull/8532))
- Fix `F841` false negative on assignment to multiple variables
([#&#8203;8489](https://togithub.com/astral-sh/ruff/pull/8489))

##### Documentation

- Fix link to isort `known-first-party`
([#&#8203;8562](https://togithub.com/astral-sh/ruff/pull/8562))
- Add notes on fix safety to a few rules
([#&#8203;8500](https://togithub.com/astral-sh/ruff/pull/8500))
- Add missing toml config tabs
([#&#8203;8512](https://togithub.com/astral-sh/ruff/pull/8512))
- Add instructions for configuration of Emacs
([#&#8203;8488](https://togithub.com/astral-sh/ruff/pull/8488))
- Improve detail link contrast in dark mode
([#&#8203;8548](https://togithub.com/astral-sh/ruff/pull/8548))
- Fix typo in example
([#&#8203;8506](https://togithub.com/astral-sh/ruff/pull/8506))
- Added tabs for configuration files in the documentation
([#&#8203;8480](https://togithub.com/astral-sh/ruff/pull/8480))
- Recommend `project.requires-python` over `target-version`
([#&#8203;8513](https://togithub.com/astral-sh/ruff/pull/8513))
- Add singleton escape hatch to `B008` documentation
([#&#8203;8501](https://togithub.com/astral-sh/ruff/pull/8501))
- Fix tab configuration docs
([#&#8203;8502](https://togithub.com/astral-sh/ruff/pull/8502))

###
[`v0.1.4`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#014)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.1.3...v0.1.4)

##### Preview features

- \[`flake8-trio`] Implement `timeout-without-await` (`TRIO001`)
([#&#8203;8439](https://togithub.com/astral-sh/ruff/pull/8439))
- \[`numpy`] Implement NumPy 2.0 migration rule (`NPY200`)
([#&#8203;7702](https://togithub.com/astral-sh/ruff/pull/7702))
- \[`pylint`] Implement `bad-open-mode` (`W1501`)
([#&#8203;8294](https://togithub.com/astral-sh/ruff/pull/8294))
- \[`pylint`] Implement `import-outside-toplevel` (`C0415`) rule
([#&#8203;5180](https://togithub.com/astral-sh/ruff/pull/5180))
- \[`pylint`] Implement `useless-with-lock` (`W2101`)
([#&#8203;8321](https://togithub.com/astral-sh/ruff/pull/8321))
- \[`pyupgrade`] Implement `timeout-error-alias` (`UP041`)
([#&#8203;8476](https://togithub.com/astral-sh/ruff/pull/8476))
- \[`refurb`] Implement `isinstance-type-none` (`FURB168`)
([#&#8203;8308](https://togithub.com/astral-sh/ruff/pull/8308))
- Detect confusable Unicode-to-Unicode units in `RUF001`, `RUF002`, and
`RUF003` ([#&#8203;4430](https://togithub.com/astral-sh/ruff/pull/4430))
- Add newline after module docstrings in preview style
([#&#8203;8283](https://togithub.com/astral-sh/ruff/pull/8283))

##### Formatter

- Add a note on line-too-long to the formatter docs
([#&#8203;8314](https://togithub.com/astral-sh/ruff/pull/8314))
- Preserve trailing statement semicolons when using `fmt: skip`
([#&#8203;8273](https://togithub.com/astral-sh/ruff/pull/8273))
- Preserve trailing semicolons when using `fmt: off`
([#&#8203;8275](https://togithub.com/astral-sh/ruff/pull/8275))
- Avoid duplicating linter-formatter compatibility warnings
([#&#8203;8292](https://togithub.com/astral-sh/ruff/pull/8292))
- Avoid inserting a newline after function docstrings
([#&#8203;8375](https://togithub.com/astral-sh/ruff/pull/8375))
- Insert newline between docstring and following own line comment
([#&#8203;8216](https://togithub.com/astral-sh/ruff/pull/8216))
- Split tuples in return positions by comma first
([#&#8203;8280](https://togithub.com/astral-sh/ruff/pull/8280))
- Avoid treating byte strings as docstrings
([#&#8203;8350](https://togithub.com/astral-sh/ruff/pull/8350))
- Add `--line-length` option to `format` command
([#&#8203;8363](https://togithub.com/astral-sh/ruff/pull/8363))
- Avoid parenthesizing unsplittable because of comments
([#&#8203;8431](https://togithub.com/astral-sh/ruff/pull/8431))

##### CLI

- Add `--output-format` to `ruff rule` and `ruff linter`
([#&#8203;8203](https://togithub.com/astral-sh/ruff/pull/8203))

##### Bug fixes

- Respect `--force-exclude` in `lint.exclude` and `format.exclude`
([#&#8203;8393](https://togithub.com/astral-sh/ruff/pull/8393))
- Respect `--extend-per-file-ignores` on the CLI
([#&#8203;8329](https://togithub.com/astral-sh/ruff/pull/8329))
- Extend `bad-dunder-method-name` to permit `__index__`
([#&#8203;8300](https://togithub.com/astral-sh/ruff/pull/8300))
- Fix panic with 8 in octal escape
([#&#8203;8356](https://togithub.com/astral-sh/ruff/pull/8356))
- Avoid raising `D300` when both triple quote styles are present
([#&#8203;8462](https://togithub.com/astral-sh/ruff/pull/8462))
- Consider unterminated f-strings in `FStringRanges`
([#&#8203;8154](https://togithub.com/astral-sh/ruff/pull/8154))
- Avoid including literal `shell=True` for truthy, non-`True`
diagnostics
([#&#8203;8359](https://togithub.com/astral-sh/ruff/pull/8359))
- Avoid triggering single-element test for starred expressions
([#&#8203;8433](https://togithub.com/astral-sh/ruff/pull/8433))
- Detect and ignore Jupyter automagics
([#&#8203;8398](https://togithub.com/astral-sh/ruff/pull/8398))
- Fix invalid E231 error with f-strings
([#&#8203;8369](https://togithub.com/astral-sh/ruff/pull/8369))
- Avoid triggering `NamedTuple` rewrite with starred annotation
([#&#8203;8434](https://togithub.com/astral-sh/ruff/pull/8434))
- Avoid un-setting bracket flag in logical lines
([#&#8203;8380](https://togithub.com/astral-sh/ruff/pull/8380))
- Place 'r' prefix before 'f' for raw format strings
([#&#8203;8464](https://togithub.com/astral-sh/ruff/pull/8464))
- Remove trailing periods from NumPy 2.0 code actions
([#&#8203;8475](https://togithub.com/astral-sh/ruff/pull/8475))
- Fix bug where `PLE1307` was raised when formatting `%c` with
characters
([#&#8203;8407](https://togithub.com/astral-sh/ruff/pull/8407))
- Remove unicode flag from comparable
([#&#8203;8440](https://togithub.com/astral-sh/ruff/pull/8440))
- Improve B015 message
([#&#8203;8295](https://togithub.com/astral-sh/ruff/pull/8295))
- Use `fixedOverflowWidgets` for playground popover
([#&#8203;8458](https://togithub.com/astral-sh/ruff/pull/8458))
- Mark `byte_bounds` as a non-backwards-compatible NumPy 2.0 change
([#&#8203;8474](https://togithub.com/astral-sh/ruff/pull/8474))

##### Internals

- Add a dedicated cache directory per Ruff version
([#&#8203;8333](https://togithub.com/astral-sh/ruff/pull/8333))
- Allow selective caching for `--fix` and `--diff`
([#&#8203;8316](https://togithub.com/astral-sh/ruff/pull/8316))
- Improve performance of comment parsing
([#&#8203;8193](https://togithub.com/astral-sh/ruff/pull/8193))
- Improve performance of string parsing
([#&#8203;8227](https://togithub.com/astral-sh/ruff/pull/8227))
- Use a dedicated sort key for isort import sorting
([#&#8203;7963](https://togithub.com/astral-sh/ruff/pull/7963))

###
[`v0.1.3`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#013)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.1.2...v0.1.3)

This release includes a variety of improvements to the Ruff formatter,
removing several known and
unintentional deviations from Black.

##### Formatter

- Avoid space around pow for `None`, `True` and `False`
([#&#8203;8189](https://togithub.com/astral-sh/ruff/pull/8189))
- Avoid sorting all paths in the format command
([#&#8203;8181](https://togithub.com/astral-sh/ruff/pull/8181))
- Insert necessary blank line between class and leading comments
([#&#8203;8224](https://togithub.com/astral-sh/ruff/pull/8224))
- Avoid introducing new parentheses in annotated assignments
([#&#8203;8233](https://togithub.com/astral-sh/ruff/pull/8233))
- Refine the warnings about incompatible linter options
([#&#8203;8196](https://togithub.com/astral-sh/ruff/pull/8196))
- Add test and basic implementation for formatter preview mode
([#&#8203;8044](https://togithub.com/astral-sh/ruff/pull/8044))
- Refine warning about incompatible `isort` settings
([#&#8203;8192](https://togithub.com/astral-sh/ruff/pull/8192))
- Only omit optional parentheses for starting or ending with parentheses
([#&#8203;8238](https://togithub.com/astral-sh/ruff/pull/8238))
- Use source type to determine parser mode for formatting
([#&#8203;8205](https://togithub.com/astral-sh/ruff/pull/8205))
- Don't warn about magic trailing comma when `isort.force-single-line`
is true ([#&#8203;8244](https://togithub.com/astral-sh/ruff/pull/8244))
- Use `SourceKind::diff` for formatter
([#&#8203;8240](https://togithub.com/astral-sh/ruff/pull/8240))
- Fix `fmt:off` with trailing child comment
([#&#8203;8234](https://togithub.com/astral-sh/ruff/pull/8234))
- Formatter parentheses support for `IpyEscapeCommand`
([#&#8203;8207](https://togithub.com/astral-sh/ruff/pull/8207))

##### Linter

- \[`pylint`] Add buffer methods to `bad-dunder-method-name` (`PLW3201`)
exclusions
([#&#8203;8190](https://togithub.com/astral-sh/ruff/pull/8190))
- Match rule prefixes from `external` codes setting in `unused-noqa`
([#&#8203;8177](https://togithub.com/astral-sh/ruff/pull/8177))
- Use `line-length` setting for isort in lieu of
`pycodestyle.max-line-length`
([#&#8203;8235](https://togithub.com/astral-sh/ruff/pull/8235))
- Update fix for `unnecessary-paren-on-raise-exception` to unsafe for
unknown types
([#&#8203;8231](https://togithub.com/astral-sh/ruff/pull/8231))
- Correct quick fix message for `W605`
([#&#8203;8255](https://togithub.com/astral-sh/ruff/pull/8255))

##### Documentation

- Fix typo in max-doc-length documentation
([#&#8203;8201](https://togithub.com/astral-sh/ruff/pull/8201))
- Improve documentation around linter-formatter conflicts
([#&#8203;8257](https://togithub.com/astral-sh/ruff/pull/8257))
- Fix link to error suppression documentation in `unused-noqa`
([#&#8203;8172](https://togithub.com/astral-sh/ruff/pull/8172))
- Add `external` option to `unused-noqa` documentation
([#&#8203;8171](https://togithub.com/astral-sh/ruff/pull/8171))
- Add title attribute to icons
([#&#8203;8060](https://togithub.com/astral-sh/ruff/pull/8060))
- Clarify unsafe case in RSE102
([#&#8203;8256](https://togithub.com/astral-sh/ruff/pull/8256))
- Fix skipping formatting examples
([#&#8203;8210](https://togithub.com/astral-sh/ruff/pull/8210))
- docs: fix name of `magic-trailing-comma` option in README
([#&#8203;8200](https://togithub.com/astral-sh/ruff/pull/8200))
- Add note about scope of rule changing in versioning policy
([#&#8203;8169](https://togithub.com/astral-sh/ruff/pull/8169))
- Document: Fix default lint rules
([#&#8203;8218](https://togithub.com/astral-sh/ruff/pull/8218))
- Fix a wrong setting in configuration.md
([#&#8203;8186](https://togithub.com/astral-sh/ruff/pull/8186))
- Fix misspelled TOML headers in the tutorial
([#&#8203;8209](https://togithub.com/astral-sh/ruff/pull/8209))

###
[`v0.1.2`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#012)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.1.1...v0.1.2)

This release includes the Beta version of the Ruff formatter — an
extremely fast, Black-compatible Python formatter.
Try it today with `ruff format`! [Check out the blog
post](https://astral.sh/blog/the-ruff-formatter) and [read the
docs](https://docs.astral.sh/ruff/formatter/).

##### Preview features

- \[`pylint`] Implement `non-ascii-module-import` (`C2403`)
([#&#8203;8056](https://togithub.com/astral-sh/ruff/pull/8056))
- \[`pylint`] implement `non-ascii-name` (`C2401`)
([#&#8203;8038](https://togithub.com/astral-sh/ruff/pull/8038))
- \[`pylint`] Implement unnecessary-lambda (W0108)
([#&#8203;7953](https://togithub.com/astral-sh/ruff/pull/7953))
- \[`refurb`] Implement `read-whole-file` (`FURB101`)
([#&#8203;7682](https://togithub.com/astral-sh/ruff/pull/7682))
- Add fix for `E223`, `E224`, and `E242`
([#&#8203;8143](https://togithub.com/astral-sh/ruff/pull/8143))
- Add fix for `E225`, `E226`, `E227`, and `E228`
([#&#8203;8136](https://togithub.com/astral-sh/ruff/pull/8136))
- Add fix for `E252`
([#&#8203;8142](https://togithub.com/astral-sh/ruff/pull/8142))
- Add fix for `E261`
([#&#8203;8114](https://togithub.com/astral-sh/ruff/pull/8114))
- Add fix for `E273` and `E274`
([#&#8203;8144](https://togithub.com/astral-sh/ruff/pull/8144))
- Add fix for `E275`
([#&#8203;8133](https://togithub.com/astral-sh/ruff/pull/8133))
- Update `SIM401` to catch ternary operations
([#&#8203;7415](https://togithub.com/astral-sh/ruff/pull/7415))
- Update `E721` to allow `is` and `is` not for direct type comparisons
([#&#8203;7905](https://togithub.com/astral-sh/ruff/pull/7905))

##### Rule changes

- Add `backports.strenum` to `deprecated-imports`
([#&#8203;8113](https://togithub.com/astral-sh/ruff/pull/8113))
- Update `SIM112` to ignore `https_proxy`, `http_proxy`, and `no_proxy`
([#&#8203;8140](https://togithub.com/astral-sh/ruff/pull/8140))
- Update fix for `literal-membership` (`PLR6201`) to be unsafe
([#&#8203;8097](https://togithub.com/astral-sh/ruff/pull/8097))
- Update fix for `mutable-argument-defaults` (`B006`) to be unsafe
([#&#8203;8108](https://togithub.com/astral-sh/ruff/pull/8108))

##### Formatter

- Change `line-ending` default to `auto`
([#&#8203;8057](https://togithub.com/astral-sh/ruff/pull/8057))
- Respect parenthesized generators in `has_own_parentheses`
([#&#8203;8100](https://togithub.com/astral-sh/ruff/pull/8100))
- Add caching to formatter
([#&#8203;8089](https://togithub.com/astral-sh/ruff/pull/8089))
- Remove `--line-length` option from `format` command
([#&#8203;8131](https://togithub.com/astral-sh/ruff/pull/8131))
- Add formatter to `line-length` documentation
([#&#8203;8150](https://togithub.com/astral-sh/ruff/pull/8150))
- Warn about incompatible formatter options
([#&#8203;8088](https://togithub.com/astral-sh/ruff/pull/8088))
- Fix range of unparenthesized tuple subject in match statement
([#&#8203;8101](https://togithub.com/astral-sh/ruff/pull/8101))
- Remove experimental formatter warning
([#&#8203;8148](https://togithub.com/astral-sh/ruff/pull/8148))
- Don't move type param opening parenthesis comment
([#&#8203;8163](https://togithub.com/astral-sh/ruff/pull/8163))
- Update versions in format benchmark script
([#&#8203;8110](https://togithub.com/astral-sh/ruff/pull/8110))
- Avoid loading files for cached format results
([#&#8203;8134](https://togithub.com/astral-sh/ruff/pull/8134))

##### CLI

- Show the `ruff format` command in help menus
([#&#8203;8167](https://togithub.com/astral-sh/ruff/pull/8167))
- Add `ruff version` command with long version display
([#&#8203;8034](https://togithub.com/astral-sh/ruff/pull/8034))

##### Configuration

- New `pycodestyle.max-line-length` option
([#&#8203;8039](https://togithub.com/astral-sh/ruff/pull/8039))

##### Bug fixes

- Detect `sys.version_info` slices in `outdated-version-block`
([#&#8203;8112](https://togithub.com/astral-sh/ruff/pull/8112))
- Avoid if-else simplification for `TYPE_CHECKING` blocks
([#&#8203;8072](https://togithub.com/astral-sh/ruff/pull/8072))
- Avoid false-positive print separator diagnostic with starred argument
([#&#8203;8079](https://togithub.com/astral-sh/ruff/pull/8079))

##### Documentation

- Fix message for `too-many-arguments` lint
([#&#8203;8092](https://togithub.com/astral-sh/ruff/pull/8092))
- Fix `extend-unsafe-fixes` and `extend-safe-fixes` example
([#&#8203;8139](https://togithub.com/astral-sh/ruff/pull/8139))
- Add links to `flake8-import-conventions` options
([#&#8203;8115](https://togithub.com/astral-sh/ruff/pull/8115))
- Rework the documentation to incorporate the Ruff formatter
([#&#8203;7732](https://togithub.com/astral-sh/ruff/pull/7732))
- Fix `Options` JSON schema description
([#&#8203;8081](https://togithub.com/astral-sh/ruff/pull/8081))
- Fix typo (`pytext` -> `pytest`)
([#&#8203;8117](https://togithub.com/astral-sh/ruff/pull/8117))
- Improve `magic-value-comparison` example in docs
([#&#8203;8111](https://togithub.com/astral-sh/ruff/pull/8111))

###
[`v0.1.1`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#011)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.1.0...v0.1.1)

##### Rule changes

- Add unsafe fix for `escape-sequence-in-docstring` (`D301`)
([#&#8203;7970](https://togithub.com/astral-sh/ruff/pull/7970))

##### Configuration

- Respect `#(deprecated)` attribute in configuration options
([#&#8203;8035](https://togithub.com/astral-sh/ruff/pull/8035))
- Add `[format|lint].exclude` options
([#&#8203;8000](https://togithub.com/astral-sh/ruff/pull/8000))
- Respect `tab-size` setting in formatter
([#&#8203;8006](https://togithub.com/astral-sh/ruff/pull/8006))
- Add `lint.preview`
([#&#8203;8002](https://togithub.com/astral-sh/ruff/pull/8002))

##### Preview features

- \[`pylint`] Implement `literal-membership` (`PLR6201`)
([#&#8203;7973](https://togithub.com/astral-sh/ruff/pull/7973))
- \[`pylint`] Implement `too-many-boolean-expressions` (`PLR0916`)
([#&#8203;7975](https://togithub.com/astral-sh/ruff/pull/7975))
- \[`pylint`] Implement `misplaced-bare-raise` (`E0704`)
([#&#8203;7961](https://togithub.com/astral-sh/ruff/pull/7961))
- \[`pylint`] Implement `global-at-module-level` (`W0604`)
([#&#8203;8058](https://togithub.com/astral-sh/ruff/pull/8058))
- \[`pylint`] Implement `unspecified-encoding` (`PLW1514`)
([#&#8203;7939](https://togithub.com/astral-sh/ruff/pull/7939))
- Add fix for `triple-single-quotes` (`D300`)
([#&#8203;7967](https://togithub.com/astral-sh/ruff/pull/7967))

##### Formatter

- New code style badge for `ruff format`
([#&#8203;7878](https://togithub.com/astral-sh/ruff/pull/7878))
- Fix comments outside expression parentheses
([#&#8203;7873](https://togithub.com/astral-sh/ruff/pull/7873))
- Add `--target-version` to `ruff format`
([#&#8203;8055](https://togithub.com/astral-sh/ruff/pull/8055))
- Skip over parentheses when detecting `in` keyword
([#&#8203;8054](https://togithub.com/astral-sh/ruff/pull/8054))
- Add `--diff` option to `ruff format`
([#&#8203;7937](https://togithub.com/astral-sh/ruff/pull/7937))
- Insert newline after nested function or class statements
([#&#8203;7946](https://togithub.com/astral-sh/ruff/pull/7946))
- Use `pass` over ellipsis in non-function/class contexts
([#&#8203;8049](https://togithub.com/astral-sh/ruff/pull/8049))

##### Bug fixes

- Lazily evaluate all PEP 695 type alias values
([#&#8203;8033](https://togithub.com/astral-sh/ruff/pull/8033))
- Avoid failed assertion when showing fixes from stdin
([#&#8203;8029](https://togithub.com/astral-sh/ruff/pull/8029))
- Avoid flagging HTTP and HTTPS literals in urllib-open
([#&#8203;8046](https://togithub.com/astral-sh/ruff/pull/8046))
- Avoid flagging `bad-dunder-method-name` for `_`
([#&#8203;8015](https://togithub.com/astral-sh/ruff/pull/8015))
- Remove Python 2-only methods from `URLOpen` audit
([#&#8203;8047](https://togithub.com/astral-sh/ruff/pull/8047))
- Use set bracket replacement for `iteration-over-set` to preserve
whitespace and comments
([#&#8203;8001](https://togithub.com/astral-sh/ruff/pull/8001))

##### Documentation

- Update tutorial to match revised Ruff defaults
([#&#8203;8066](https://togithub.com/astral-sh/ruff/pull/8066))
- Update rule `B005` docs
([#&#8203;8028](https://togithub.com/astral-sh/ruff/pull/8028))
- Update GitHub actions example in docs to use `--output-format`
([#&#8203;8014](https://togithub.com/astral-sh/ruff/pull/8014))
- Document `lint.preview` and `format.preview`
([#&#8203;8032](https://togithub.com/astral-sh/ruff/pull/8032))
- Clarify that new rules should be added to `RuleGroup::Preview`.
([#&#8203;7989](https://togithub.com/astral-sh/ruff/pull/7989))

###
[`v0.1.0`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#010)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.292...v0.1.0)

This is the first release which uses the `CHANGELOG` file. See [GitHub
Releases](https://togithub.com/astral-sh/ruff/releases) for prior
changelog entries.

Read Ruff's new [versioning
policy](https://docs.astral.sh/ruff/versioning/).

##### Breaking changes

- Unsafe fixes are no longer displayed or applied without opt-in
([#&#8203;7769](https://togithub.com/astral-sh/ruff/pull/7769))
- Drop formatting specific rules from the default set
([#&#8203;7900](https://togithub.com/astral-sh/ruff/pull/7900))
- The deprecated `format` setting has been removed
([#&#8203;7984](https://togithub.com/astral-sh/ruff/pull/7984))
- The `format` setting cannot be used to configure the output format,
use `output-format` instead
- The `RUFF_FORMAT` environment variable is ignored, use
`RUFF_OUTPUT_FORMAT` instead
- The `--format` option has been removed from `ruff check`, use
`--output-format` instead

##### Rule changes

- Extend `reimplemented-starmap` (`FURB140`) to catch calls with a
single and starred argument
([#&#8203;7768](https://togithub.com/astral-sh/ruff/pull/7768))
- Improve cases covered by `RUF015`
([#&#8203;7848](https://togithub.com/astral-sh/ruff/pull/7848))
- Update `SIM15` to allow `open` followed by `close`
([#&#8203;7916](https://togithub.com/astral-sh/ruff/pull/7916))
- Respect `msgspec.Struct` default-copy semantics in `RUF012`
([#&#8203;7786](https://togithub.com/astral-sh/ruff/pull/7786))
- Add `sqlalchemy` methods to \`flake8-boolean-trap\`\` exclusion list
([#&#8203;7874](https://togithub.com/astral-sh/ruff/pull/7874))
- Add fix for `PLR1714`
([#&#8203;7910](https://togithub.com/astral-sh/ruff/pull/7910))
- Add fix for `PIE804`
([#&#8203;7884](https://togithub.com/astral-sh/ruff/pull/7884))
- Add fix for `PLC0208`
([#&#8203;7887](https://togithub.com/astral-sh/ruff/pull/7887))
- Add fix for `PYI055`
([#&#8203;7886](https://togithub.com/astral-sh/ruff/pull/7886))
- Update `non-pep695-type-alias` to require `--unsafe-fixes` outside of
stub files
([#&#8203;7836](https://togithub.com/astral-sh/ruff/pull/7836))
- Improve fix message for `UP018`
([#&#8203;7913](https://togithub.com/astral-sh/ruff/pull/7913))
- Update `PLW3201` to support `Enum` [sunder
names](https://docs.python.org/3/library/enum.html#supported-sunder-names)
([#&#8203;7987](https://togithub.com/astral-sh/ruff/pull/7987))

##### Preview features

- Only show warnings for empty preview selectors when enabling rules
([#&#8203;7842](https://togithub.com/astral-sh/ruff/pull/7842))
- Add `unnecessary-key-check` to simplify `key in dct and dct[key]` to
`dct.get(key)`
([#&#8203;7895](https://togithub.com/astral-sh/ruff/pull/7895))
- Add `assignment-in-assert` to prevent walrus expressions in assert
statements
([#&#8203;7856](https://togithub.com/astral-sh/ruff/pull/7856))
- \[`refurb`] Add `single-item-membership-test` (`FURB171`)
([#&#8203;7815](https://togithub.com/astral-sh/ruff/pull/7815))
- \[`pylint`] Add `and-or-ternary` (`R1706`)
([#&#8203;7811](https://togithub.com/astral-sh/ruff/pull/7811))

*New rules are added in
[preview](https://docs.astral.sh/ruff/preview/).*

##### Configuration

- Add `unsafe-fixes` setting
([#&#8203;7769](https://togithub.com/astral-sh/ruff/pull/7769))
- Add `extend-safe-fixes` and `extend-unsafe-fixes` for promoting and
demoting fixes
([#&#8203;7841](https://togithub.com/astral-sh/ruff/pull/7841))

##### CLI

- Added `--unsafe-fixes` option for opt-in to display and apply unsafe
fixes ([#&#8203;7769](https://togithub.com/astral-sh/ruff/pull/7769))
- Fix use of deprecated `--format` option in warning
([#&#8203;7837](https://togithub.com/astral-sh/ruff/pull/7837))
- Show changed files when running under `--check`
([#&#8203;7788](https://togithub.com/astral-sh/ruff/pull/7788))
- Write summary messages to stderr when fixing via stdin instead of
omitting them
([#&#8203;7838](https://togithub.com/astral-sh/ruff/pull/7838))
- Update fix summary message in `check --diff` to include unsafe fix
hints ([#&#8203;7790](https://togithub.com/astral-sh/ruff/pull/7790))
- Add notebook `cell` field to JSON output format
([#&#8203;7664](https://togithub.com/astral-sh/ruff/pull/7664))
- Rename applicability levels to `Safe`, `Unsafe`, and `Display`
([#&#8203;7843](https://togithub.com/astral-sh/ruff/pull/7843))

##### Bug fixes

- Fix bug where f-strings were allowed in match pattern literal
([#&#8203;7857](https://togithub.com/astral-sh/ruff/pull/7857))
- Fix `SIM110` with a yield in the condition
([#&#8203;7801](https://togithub.com/astral-sh/ruff/pull/7801))
- Preserve trailing comments in `C414` fixes
([#&#8203;7775](https://togithub.com/astral-sh/ruff/pull/7775))
- Check sequence type before triggering `unnecessary-enumerate` `len`
suggestion
([#&#8203;7781](https://togithub.com/astral-sh/ruff/pull/7781))
- Use correct start location for class/function clause header
([#&#8203;7802](https://togithub.com/astral-sh/ruff/pull/7802))
- Fix incorrect fixes for `SIM101`
([#&#8203;7798](https://togithub.com/astral-sh/ruff/pull/7798))
- Format comment before parameter default correctly
([#&#8203;7870](https://togithub.com/astral-sh/ruff/pull/7870))
- Fix `E251` false positive inside f-strings
([#&#8203;7894](https://togithub.com/astral-sh/ruff/pull/7894))
- Allow bindings to be created and referenced within annotations
([#&#8203;7885](https://togithub.com/astral-sh/ruff/pull/7885))
- Show per-cell diffs when analyzing notebooks over `stdin`
([#&#8203;7789](https://togithub.com/astral-sh/ruff/pull/7789))
- Avoid curly brace escape in f-string format spec
([#&#8203;7780](https://togithub.com/astral-sh/ruff/pull/7780))
- Fix lexing single-quoted f-string with multi-line format spec
([#&#8203;7787](https://togithub.com/astral-sh/ruff/pull/7787))
- Consider nursery rules to be in-preview for `ruff rule`
([#&#8203;7812](https://togithub.com/astral-sh/ruff/pull/7812))
- Report precise location for invalid conversion flag
([#&#8203;7809](https://togithub.com/astral-sh/ruff/pull/7809))
- Visit pattern match guard as a boolean test
([#&#8203;7911](https://togithub.com/astral-sh/ruff/pull/7911))
- Respect `--unfixable` in `ISC` rules
([#&#8203;7917](https://togithub.com/astral-sh/ruff/pull/7917))
- Fix edge case with `PIE804`
([#&#8203;7922](https://togithub.com/astral-sh/ruff/pull/7922))
- Show custom message in `PTH118` for `Path.joinpath` with starred
arguments
([#&#8203;7852](https://togithub.com/astral-sh/ruff/pull/7852))
- Fix false negative in `outdated-version-block` when using greater than
comparisons
([#&#8203;7920](https://togithub.com/astral-sh/ruff/pull/7920))
- Avoid converting f-strings within Django `gettext` calls
([#&#8203;7898](https://togithub.com/astral-sh/ruff/pull/7898))
- Fix false positive in `PLR6301`
([#&#8203;7933](https://togithub.com/astral-sh/ruff/pull/7933))
- Treat type aliases as typing-only expressions e.g. resolves false
positive in `TCH004`
([#&#8203;7968](https://togithub.com/astral-sh/ruff/pull/7968))
- Resolve `cache-dir` relative to project root
([#&#8203;7962](https://togithub.com/astral-sh/ruff/pull/7962))
- Respect subscripted base classes in type-checking rules e.g. resolves
false positive in `TCH003`
([#&#8203;7954](https://togithub.com/astral-sh/ruff/pull/7954))
- Fix JSON schema limit for `line-length`
([#&#8203;7883](https://togithub.com/astral-sh/ruff/pull/7883))
- Fix commented-out `coalesce` keyword
([#&#8203;7876](https://togithub.com/astral-sh/ruff/pull/7876))

##### Documentation

- Document `reimplemented-starmap` performance effects
([#&#8203;7846](https://togithub.com/astral-sh/ruff/pull/7846))
- Default to following the system dark/light mode
([#&#8203;7888](https://togithub.com/astral-sh/ruff/pull/7888))
- Add documentation for fixes
([#&#8203;7901](https://togithub.com/astral-sh/ruff/pull/7901))
- Fix typo in docs of `PLR6301`
([#&#8203;7831](https://togithub.com/astral-sh/ruff/pull/7831))
- Update `UP038` docs to note that it results in slower code
([#&#8203;7872](https://togithub.com/astral-sh/ruff/pull/7872))
- crlf -> cr-lf
([#&#8203;7766](https://togithub.com/astral-sh/ruff/pull/7766))
- Add an example of an unsafe fix
([#&#8203;7924](https://togithub.com/astral-sh/ruff/pull/7924))
- Fix documented examples for `unnecessary-subscript-reversal`
([#&#8203;7774](https://togithub.com/astral-sh/ruff/pull/7774))
- Correct error in tuple example in ruff formatter docs
([#&#8203;7822](https://togithub.com/astral-sh/ruff/pull/7822))
- Add versioning policy to documentation
([#&#8203;7923](https://togithub.com/astral-sh/ruff/pull/7923))
- Fix invalid code in `FURB177` example
([#&#8203;7832](https://togithub.com/astral-sh/ruff/pull/7832))

##### Formatter

- Less scary `ruff format` message
([#&#8203;7867](https://togithub.com/astral-sh/ruff/pull/7867))
- Remove spaces from import statements
([#&#8203;7859](https://togithub.com/astral-sh/ruff/pull/7859))
- Formatter quoting for f-strings with triple quotes
([#&#8203;7826](https://togithub.com/astral-sh/ruff/pull/7826))
- Update `ruff_python_formatter` generate.py comment
([#&#8203;7850](https://togithub.com/astral-sh/ruff/pull/7850))
- Document one-call chaining deviation
([#&#8203;7767](https://togithub.com/astral-sh/ruff/pull/7767))
- Allow f-string modifications in line-shrinking cases
([#&#8203;7818](https://togithub.com/astral-sh/ruff/pull/7818))
- Add trailing comment deviation to README
([#&#8203;7827](https://togithub.com/astral-sh/ruff/pull/7827))
- Add trailing zero between dot and exponential
([#&#8203;7956](https://togithub.com/astral-sh/ruff/pull/7956))
- Force parentheses for power operations in unary expressions
([#&#8203;7955](https://togithub.com/astral-sh/ruff/pull/7955))

##### Playground

- Fix playground `Quick Fix` action
([#&#8203;7824](https://togithub.com/astral-sh/ruff/pull/7824))

###
[`v0.0.292`](https://togithub.com/astral-sh/ruff/releases/tag/v0.0.292)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.291...v0.0.292)

<!-- Release notes generated using configuration in .github/release.yml
at v0.0.292 -->

#### What's Changed

##### Highlights

**This release includes full support for Python 3.12 ([out
now!](https://www.python.org/downloads/release/python-3120/)), including
the new type parameter ([PEP 695](https://peps.python.org/pep-0695/))
and f-string syntaxes ([PEP 701](https://peps.python.org/pep-0701/)).**

PEP 701 lifts many of the restrictions on f-strings that existed in the
past, allowing for arbitrarily nested f-strings, consistent quote style
within f-strings, and more, all of which are now supported by Ruff
(thanks to [@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/7376](https://togithub.com/astral-sh/ruff/pull/7376)).

##### Breaking Changes

- In the formatter, `format.quote-style` no longer affects triple-quoted
strings, to align with common conventions as well as the guidance from
PEP 8 and PEP 257 (see:
[https://github.com/astral-sh/ruff/pull/7680](https://togithub.com/astral-sh/ruff/pull/7680)).
- `line-too-long` (`E501`) now ignores trailing pragma comments (like `#
type: ignore` and `# noqa`) when computing line length (see:
[https://github.com/astral-sh/ruff/pull/7692](https://togithub.com/astral-sh/ruff/pull/7692)).
This is similar to flake8-bugbear's methodology for detecting overlong
lines, and ensures that adding pragmas like `# noqa` does not introduce
further lint errors.

##### Rules

- \[`refurb`] Implement `print-empty-string` (`FURB105`) by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/7617](https://togithub.com/astral-sh/ruff/pull/7617)
- \[`flake8-bandit`] Implement `weak-cryptographic-key` (`S505`) by
[@&#8203;mkniewallner](https://togithub.com/mkniewallner) in
[https://github.com/astral-sh/ruff/pull/7703](https://togithub.com/astral-sh/ruff/pull/7703)
- \[`refurb`] Implement `implicit-cwd` (`FURB177`) by
[@&#8203;danparizher](https://togithub.com/danparizher) in
[https://github.com/astral-sh/ruff/pull/7704](https://togithub.com/astral-sh/ruff/pull/7704)
- `unnecessary-pass` (`PIE790`) now flags all unnecessary `pass`
statements; previously, the rule only flagged `pass` statements that
followed a docstring in a two-statement body (see:
[https://github.com/astral-sh/ruff/pull/7697](https://togithub.com/astral-sh/ruff/pull/7697)).

##### Settings

- Add `lint` section to Ruff configuration by
[@&#8203;MichaReiser](https://togithub.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/7549](https://togithub.com/astral-sh/ruff/pull/7549)
- Add `explicit-preview-rules` to toggle explicit selection of preview
rules by [@&#8203;zanieb](https://togithub.com/zanieb) in
[https://github.com/astral-sh/ruff/pull/7390](https://togithub.com/astral-sh/ruff/pull/7390)
- Decrease PEP 593 error to a debug warning by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7745](https://togithub.com/astral-sh/ruff/pull/7745)
- Write full Jupyter notebook to `stdout` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7748](https://togithub.com/astral-sh/ruff/pull/7748)
- Extend `unnecessary-pass` (`PIE790`) to trigger on all unnecessary
`pass` statements by [@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/7697](https://togithub.com/astral-sh/ruff/pull/7697)

##### Bug Fixes

- Ignore blank lines between comments when counting
newlines-after-imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7607](https://togithub.com/astral-sh/ruff/pull/7607)
- Avoid reordering mixed-indent-level comments after branches by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7609](https://togithub.com/astral-sh/ruff/pull/7609)
- Avoid flagging B009 and B010 on starred expressions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7621](https://togithub.com/astral-sh/ruff/pull/7621)
- Use deletion for D215 full-line removals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7625](https://togithub.com/astral-sh/ruff/pull/7625)
- Avoid searching for bracketed comments in unparenthesized generators
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7627](https://togithub.com/astral-sh/ruff/pull/7627)
- Update return type for `PT022` autofix by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/7613](https://togithub.com/astral-sh/ruff/pull/7613)
- Flag FURB105 with starred kwargs by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7630](https://togithub.com/astral-sh/ruff/pull/7630)
- Don't suggest replacing `builtin.open()` with `Path.open()` if the
latter doesn't support all options by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/7637](https://togithub.com/astral-sh/ruff/pull/7637)
- Use 1-based cell indices consistently for Notebooks by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/7662](https://togithub.com/astral-sh/ruff/pull/7662)
- Add `Expr::Name` checks to rules which use `is_logger_candidate` by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/7521](https://togithub.com/astral-sh/ruff/pull/7521)
- Ensure that B006 autofixes are inserted after imports by
[@&#8203;Hoxbro](https://togithub.com/Hoxbro) in
[https://github.com/astral-sh/ruff/pull/7629](https://togithub.com/astral-sh/ruff/pull/7629)
- Allow named expressions in `__all__` assignments by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7673](https://togithub.com/astral-sh/ruff/pull/7673)
- Include radix base prefix in large number representation by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7700](https://togithub.com/astral-sh/ruff/pull/7700)
- Parenthesize multi-line attributes in B009 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7701](https://togithub.com/astral-sh/ruff/pull/7701)
- Insert necessary padding in B014 fixes by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7699](https://togithub.com/astral-sh/ruff/pull/7699)
- fix(rules): improve S507 detection by
[@&#8203;mkniewallner](https://togithub.com/mkniewallner) in
[https://github.com/astral-sh/ruff/pull/7661](https://togithub.com/astral-sh/ruff/pull/7661)
- Ignore TODO tags in `commented-out-code` by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/7523](https://togithub.com/astral-sh/ruff/pull/7523)
- Track fix isolation in `unnecessary-pass` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7715](https://togithub.com/astral-sh/ruff/pull/7715)
- Use fixed source code for parser context by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7717](https://togithub.com/astral-sh/ruff/pull/7717)
- Preserve parentheses in `quadratic-list-summation` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7719](https://togithub.com/astral-sh/ruff/pull/7719)
- Compute `NotebookIndex` for `Diagnostics` on stdin by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/7663](https://togithub.com/astral-sh/ruff/pull/7663)
- Perform insertions before replacements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7739](https://togithub.com/astral-sh/ruff/pull/7739)
- Skip all bracketed expressions when locating comparison ops by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7740](https://togithub.com/astral-sh/ruff/pull/7740)
- Fix PLE251 rules with f-string escaping by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/7741](https://togithub.com/astral-sh/ruff/pull/7741)
- Skip BOM when inserting start-of-file imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/7622](https://togithub.com/astral-sh/ruff/pull/7622)
- Emit `LexError` for dedent to incorrect level by
[@&#8203;MichaReiser](https://togithub.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/7638](https://togithub.com/astral-sh/ruff/pull/7638)
- Expand `DeprecatedLogWarn` to check for `Expr::Atrribute` calls by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/7677](https://togithub.com/astral-sh/ruff/pull/7677)


</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://developer.mend.io/github/Hapag-Lloyd/dist-comm-vis).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy41OS44IiwidXBkYXRlZEluVmVyIjoiMzcuODEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
formatter Related to the formatter
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Formatter conflict with E501 and comments
3 participants