Skip to content

Conversation

@TaKO8Ki
Copy link
Contributor

@TaKO8Ki TaKO8Ki commented Sep 6, 2025

Summary

Fixes #20255

Mark single-item-membership-test fixes as always unsafe

  • Always set Applicability::Unsafe for FURB171 fixes
  • Update “Fix safety” docs to reflect always-unsafe behavior
  • Expand tests (not in, nested set/frozenset, commented args)

Test Plan

I have added new test cases to crates/ruff_linter/resources/test/fixtures/refurb/FURB171_0.py and crates/ruff_linter/resources/test/fixtures/refurb/FURB171_1.py.

Applicability::Safe
};
// All supported cases can change runtime behavior; mark as unsafe.
let applicability = Applicability::Unsafe;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Previously, fixes were marked unsafe only for string literals and when comments intersected the edit range, but single‑item list/tuple/set/frozenset cases can also
change behavior (e.g., NaN identity differences and non‑boolean eq), so we now mark all FURB171 fixes as unsafe.

@github-actions
Copy link
Contributor

github-actions bot commented Sep 6, 2025

ruff-ecosystem results

Linter (stable)

✅ ecosystem check detected no linter changes.

Linter (preview)

ℹ️ ecosystem check detected linter changes. (+0 -0 violations, +0 -64 fixes in 5 projects; 50 projects unchanged)

apache/airflow (+0 -0 violations, +0 -44 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --no-fix --output-format concise --preview --select ALL

+ airflow-core/src/airflow/utils/db.py:1419:8: FURB171 Membership test against single-item container
- airflow-core/src/airflow/utils/db.py:1419:8: FURB171 [*] Membership test against single-item container
+ airflow-core/tests/unit/cli/commands/test_variable_command.py:516:16: FURB171 Membership test against single-item container
- airflow-core/tests/unit/cli/commands/test_variable_command.py:516:16: FURB171 [*] Membership test against single-item container
+ airflow-core/tests/unit/cli/commands/test_variable_command.py:533:16: FURB171 Membership test against single-item container
- airflow-core/tests/unit/cli/commands/test_variable_command.py:533:16: FURB171 [*] Membership test against single-item container
+ dev/breeze/src/airflow_breeze/utils/run_tests.py:427:8: FURB171 Membership test against single-item container
- dev/breeze/src/airflow_breeze/utils/run_tests.py:427:8: FURB171 [*] Membership test against single-item container
+ dev/react-plugin-tools/bootstrap.py:59:10: FURB171 Membership test against single-item container
- dev/react-plugin-tools/bootstrap.py:59:10: FURB171 [*] Membership test against single-item container
+ dev/react-plugin-tools/bootstrap.py:62:10: FURB171 Membership test against single-item container
- dev/react-plugin-tools/bootstrap.py:62:10: FURB171 [*] Membership test against single-item container
+ devel-common/src/docs/provider_conf.py:270:4: FURB171 Membership test against single-item container
- devel-common/src/docs/provider_conf.py:270:4: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:140:103: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:140:103: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:164:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:164:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:186:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:186:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:187:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:187:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:209:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:209:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:210:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:210:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:267:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:267:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:268:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:268:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:278:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:278:31: FURB171 [*] Membership test against single-item container
+ providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:279:31: FURB171 Membership test against single-item container
- providers/common/sql/tests/unit/common/sql/sensors/test_sql.py:279:31: FURB171 [*] Membership test against single-item container
... 10 additional changes omitted for project

apache/superset (+0 -0 violations, +0 -4 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --no-fix --output-format concise --preview --select ALL

+ superset/connectors/sqla/models.py:796:62: FURB171 Membership test against single-item container
- superset/connectors/sqla/models.py:796:62: FURB171 [*] Membership test against single-item container
+ superset/models/helpers.py:2120:26: FURB171 Membership test against single-item container
- superset/models/helpers.py:2120:26: FURB171 [*] Membership test against single-item container

reflex-dev/reflex (+0 -0 violations, +0 -2 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --no-fix --output-format concise --preview

+ reflex/utils/templates.py:388:34: FURB171 Membership test against single-item container
- reflex/utils/templates.py:388:34: FURB171 [*] Membership test against single-item container

scikit-build/scikit-build-core (+0 -0 violations, +0 -2 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --no-fix --output-format concise --preview

+ tests/test_settings_overrides.py:441:8: FURB171 Membership test against single-item container
- tests/test_settings_overrides.py:441:8: FURB171 [*] Membership test against single-item container

zulip/zulip (+0 -0 violations, +0 -12 fixes)

ruff check --no-cache --exit-zero --ignore RUF9 --no-fix --output-format concise --preview --select ALL

+ tools/lib/provision.py:155:28: FURB171 Membership test against single-item container
- tools/lib/provision.py:155:28: FURB171 [*] Membership test against single-item container
+ zerver/actions/presence.py:87:8: FURB171 Membership test against single-item container
- zerver/actions/presence.py:87:8: FURB171 [*] Membership test against single-item container
+ zerver/lib/emoji.py:107:12: FURB171 Membership test against single-item container
- zerver/lib/emoji.py:107:12: FURB171 [*] Membership test against single-item container
+ zerver/lib/narrow_predicate.py:60:39: FURB171 Membership test against single-item container
- zerver/lib/narrow_predicate.py:60:39: FURB171 [*] Membership test against single-item container
+ zerver/lib/url_decoding.py:136:30: FURB171 Membership test against single-item container
- zerver/lib/url_decoding.py:136:30: FURB171 [*] Membership test against single-item container
... 2 additional changes omitted for project

Changes by rule (1 rules affected)

code total + violation - violation + fix - fix
FURB171 64 0 0 0 64

Copy link
Contributor

@ntBre ntBre left a comment

Choose a reason for hiding this comment

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

Thanks, this looks good! I just had a couple of minor suggestions. I agree with marking the fix as always unsafe instead of trying to look for the few special safe cases mentioned in the issue. I think that could get pretty complicated.

@ntBre ntBre added fixes Related to suggested fixes for violations preview Related to preview mode features labels Sep 11, 2025
@ntBre ntBre changed the title [refurb] Mark single-item-membership-test fixes as always unsafe [refurb] Mark single-item-membership-test fix as always unsafe (FURB171) Sep 11, 2025
Copy link
Contributor

@ntBre ntBre left a comment

Choose a reason for hiding this comment

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

Thank you! Just a couple of small docs nits that I'll apply and then merge this :)

@ntBre ntBre enabled auto-merge (squash) September 18, 2025 15:13
@ntBre ntBre merged commit 821b2f8 into astral-sh:main Sep 18, 2025
34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fixes Related to suggested fixes for violations preview Related to preview mode features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

single-item-membership-test (FURB171) should be marked unsafe

2 participants