From 670fcecd1b57bf2d29e1a92fce6489bd21c01386 Mon Sep 17 00:00:00 2001 From: Andrew Gallant Date: Wed, 8 Jan 2025 12:59:53 -0500 Subject: [PATCH] test: update snapshots with trimmed lines This updates snapshots where long lines now get trimmed with `annotate-snippets`. And an ellipsis is inserted to indicate trimming. This is a little hokey to test since in tests we don't do any styling. And I believe this just uses the default "max term width" for rendering. But in real life, it seems like a big improvement to have long lines trimmed if they would otherwise wrap in the terminal. So this seems like an improvement to me. There are some other fixes here that overlap with previous categories. --- ..._flake8_pyi__tests__PYI003_PYI003.pyi.snap | 7 +- ..._flake8_pyi__tests__PYI033_PYI033.pyi.snap | 81 ++++--- ...__flake8_pyi__tests__PYI034_PYI034.py.snap | 38 ++-- ..._flake8_pyi__tests__PYI034_PYI034.pyi.snap | 22 +- ...__flake8_pyi__tests__PYI036_PYI036.py.snap | 53 +++-- ..._flake8_pyi__tests__PYI036_PYI036.pyi.snap | 55 +++-- ..._flake8_pyi__tests__PYI052_PYI052.pyi.snap | 7 +- ..._flake8_pyi__tests__PYI066_PYI066.pyi.snap | 22 +- ...ing-only-third-party-import_quote3.py.snap | 26 +-- ...ules__pycodestyle__tests__E231_E23.py.snap | 29 ++- ...les__pycodestyle__tests__E501_E501.py.snap | 13 +- ...__pycodestyle__tests__task_tags_false.snap | 85 ++++---- ...les__pyflakes__tests__F821_F821_17.py.snap | 55 +++-- ...ylint__tests__max_boolean_expressions.snap | 9 +- ...__rules__pyupgrade__tests__UP031_0.py.snap | 200 +++++++++--------- 15 files changed, 343 insertions(+), 359 deletions(-) diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI003_PYI003.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI003_PYI003.pyi.snap index 154f4567e89e7..99096e74e8d98 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI003_PYI003.pyi.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI003_PYI003.pyi.snap @@ -1,11 +1,10 @@ --- source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs -snapshot_kind: text --- PYI003.pyi:4:4: PYI003 Unrecognized `sys.version_info` check | 3 | if sys.version_info[0] == 2: ... -4 | if sys.version_info[0] == True: ... # Y003 Unrecognized sys.version_info check # E712 comparison to True should be 'if cond is True:' or 'if cond:' +4 | if sys.version_info[0] == True: ... # Y003 Unrecognized sys.version_info check # E712 comparison to True should be 'if cond is True:'… | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI003 5 | if sys.version_info[0.0] == 2: ... # Y003 Unrecognized sys.version_info check 6 | if sys.version_info[False] == 2: ... # Y003 Unrecognized sys.version_info check @@ -14,7 +13,7 @@ PYI003.pyi:4:4: PYI003 Unrecognized `sys.version_info` check PYI003.pyi:5:4: PYI003 Unrecognized `sys.version_info` check | 3 | if sys.version_info[0] == 2: ... -4 | if sys.version_info[0] == True: ... # Y003 Unrecognized sys.version_info check # E712 comparison to True should be 'if cond is True:' or 'if cond:' +4 | if sys.version_info[0] == True: ... # Y003 Unrecognized sys.version_info check # E712 comparison to True should be 'if cond is True:'… 5 | if sys.version_info[0.0] == 2: ... # Y003 Unrecognized sys.version_info check | ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI003 6 | if sys.version_info[False] == 2: ... # Y003 Unrecognized sys.version_info check @@ -23,7 +22,7 @@ PYI003.pyi:5:4: PYI003 Unrecognized `sys.version_info` check PYI003.pyi:6:4: PYI003 Unrecognized `sys.version_info` check | -4 | if sys.version_info[0] == True: ... # Y003 Unrecognized sys.version_info check # E712 comparison to True should be 'if cond is True:' or 'if cond:' +4 | if sys.version_info[0] == True: ... # Y003 Unrecognized sys.version_info check # E712 comparison to True should be 'if cond is True:'… 5 | if sys.version_info[0.0] == 2: ... # Y003 Unrecognized sys.version_info check 6 | if sys.version_info[False] == 2: ... # Y003 Unrecognized sys.version_info check | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI003 diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI033_PYI033.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI033_PYI033.pyi.snap index e8b1546f725cb..1908a7ab920e5 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI033_PYI033.pyi.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI033_PYI033.pyi.snap @@ -1,44 +1,43 @@ --- source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs -snapshot_kind: text --- PYI033.pyi:6:22: PYI033 Don't use type comments in stub file | -4 | from typing import TypeAlias -5 | -6 | A: TypeAlias = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -7 | B: TypeAlias = None # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") -8 | C: TypeAlias = None #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") +4 | … import TypeAlias +5 | … +6 | …s = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 +7 | …s = None # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x: … +8 | …s = None #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") | PYI033.pyi:7:22: PYI033 Don't use type comments in stub file | -6 | A: TypeAlias = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") -7 | B: TypeAlias = None # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -8 | C: TypeAlias = None #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") -9 | D: TypeAlias = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") +6 | …one # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") +7 | …one # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 +8 | …one #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") +9 | …one # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") | PYI033.pyi:8:22: PYI033 Don't use type comments in stub file | - 6 | A: TypeAlias = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - 7 | B: TypeAlias = None # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - 8 | C: TypeAlias = None #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 - 9 | D: TypeAlias = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") -10 | E: TypeAlias = None# type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + 6 | …s = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + 7 | …s = None # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x:… + 8 | …s = None #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 + 9 | …s = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") +10 | …s = None# type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") | PYI033.pyi:9:22: PYI033 Don't use type comments in stub file | - 7 | B: TypeAlias = None # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - 8 | C: TypeAlias = None #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - 9 | D: TypeAlias = None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -10 | E: TypeAlias = None# type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") -11 | F: TypeAlias = None#type:int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + 7 | … None # type: str # And here's an extra comment about why it's that type # Y033 Do not use type comments in stubs (e.g. use "x: in… + 8 | … None #type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + 9 | … None # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 +10 | … None# type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") +11 | … None#type:int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") | PYI033.pyi:10:20: PYI033 Don't use type comments in stub file @@ -56,35 +55,35 @@ PYI033.pyi:11:20: PYI033 Don't use type comments in stub file 10 | E: TypeAlias = None# type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") 11 | F: TypeAlias = None#type:int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -12 | +12 | 13 | def func( | PYI033.pyi:14:12: PYI033 Don't use type comments in stub file | -13 | def func( -14 | arg1, # type: dict[str, int] # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -15 | arg2 # type: Sequence[bytes] # And here's some more info about this arg # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") -16 | ): ... +13 | …func( +14 | …arg1, # type: dict[str, int] # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 +15 | …arg2 # type: Sequence[bytes] # And here's some more info about this arg # Y033 Do not use type comments in stubs (e.g. use "x: int… +16 | ….. | PYI033.pyi:15:11: PYI033 Don't use type comments in stub file | -13 | def func( -14 | arg1, # type: dict[str, int] # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") -15 | arg2 # type: Sequence[bytes] # And here's some more info about this arg # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -16 | ): ... +13 | …unc( +14 | …rg1, # type: dict[str, int] # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") +15 | …rg2 # type: Sequence[bytes] # And here's some more info about this arg # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 +16 | …. | PYI033.pyi:19:29: PYI033 Don't use type comments in stub file | -18 | class Foo: -19 | Attr: TypeAlias = None # type: set[str] # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -20 | -21 | G: TypeAlias = None # type: ignore +18 | … +19 | … None # type: set[str] # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI033 +20 | … +21 | …# type: ignore | PYI033.pyi:29:22: PYI033 Don't use type comments in stub file @@ -92,7 +91,7 @@ PYI033.pyi:29:22: PYI033 Don't use type comments in stub file 28 | # Whole line commented out # type: int 29 | M: TypeAlias = None # type: can't parse me! | ^^^^^^^^^^^^^^^^^^^^^^^ PYI033 -30 | +30 | 31 | class Bar: | diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.py.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.py.snap index d2b3356ff6077..bb520776d6b94 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.py.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.py.snap @@ -7,7 +7,7 @@ PYI034.py:21:9: PYI034 [*] `__new__` methods in classes like `Bad` usually retur 20 | ): # Y040 Do not inherit from "object" explicitly, as it is redundant in Python 3 21 | def __new__(cls, *args: Any, **kwargs: Any) -> Bad: | ^^^^^^^ PYI034 -22 | ... # Y034 "__new__" methods usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__new__", e.g. "def __new__(cls, *args: Any, **kwargs: Any) -> Self: ..." +22 | ... # Y034 "__new__" methods usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__new__", e.g.… | = help: Use `Self` as return type @@ -24,10 +24,10 @@ PYI034.py:21:9: PYI034 [*] `__new__` methods in classes like `Bad` usually retur PYI034.py:36:9: PYI034 [*] `__enter__` methods in classes like `Bad` usually return `self` at runtime | 34 | ... # Y032 Prefer "object" to "Any" for the second parameter in "__ne__" methods -35 | +35 | 36 | def __enter__(self) -> Bad: | ^^^^^^^^^ PYI034 -37 | ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__enter__", e.g. "def __enter__(self) -> Self: ..." +37 | ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self… | = help: Use `Self` as return type @@ -43,11 +43,11 @@ PYI034.py:36:9: PYI034 [*] `__enter__` methods in classes like `Bad` usually ret PYI034.py:39:15: PYI034 [*] `__aenter__` methods in classes like `Bad` usually return `self` at runtime | -37 | ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__enter__", e.g. "def __enter__(self) -> Self: ..." -38 | +37 | ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self… +38 | 39 | async def __aenter__(self) -> Bad: | ^^^^^^^^^^ PYI034 -40 | ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__aenter__", e.g. "async def __aenter__(self) -> Self: ..." +40 | ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Sel… | = help: Use `Self` as return type @@ -63,11 +63,11 @@ PYI034.py:39:15: PYI034 [*] `__aenter__` methods in classes like `Bad` usually r PYI034.py:42:9: PYI034 [*] `__iadd__` methods in classes like `Bad` usually return `self` at runtime | -40 | ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__aenter__", e.g. "async def __aenter__(self) -> Self: ..." -41 | +40 | ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Sel… +41 | 42 | def __iadd__(self, other: Bad) -> Bad: | ^^^^^^^^ PYI034 -43 | ... # Y034 "__iadd__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__iadd__", e.g. "def __iadd__(self, other: Bad) -> Self: ..." +43 | ... # Y034 "__iadd__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self"… | = help: Use `Self` as return type @@ -86,7 +86,7 @@ PYI034.py:165:9: PYI034 [*] `__iter__` methods in classes like `BadIterator1` us 164 | class BadIterator1(Iterator[int]): 165 | def __iter__(self) -> Iterator[int]: | ^^^^^^^^ PYI034 -166 | ... # Y034 "__iter__" methods in classes like "BadIterator1" usually return "self" at runtime. Consider using "typing_extensions.Self" in "BadIterator1.__iter__", e.g. "def __iter__(self) -> Self: ..." +166 | ... # Y034 "__iter__" methods in classes like "BadIterator1" usually return "self" at runtime. Consider using "typing_extens… | = help: Use `Self` as return type @@ -106,7 +106,7 @@ PYI034.py:172:9: PYI034 [*] `__iter__` methods in classes like `BadIterator2` us 171 | ): # Y022 Use "collections.abc.Iterator[T]" instead of "typing.Iterator[T]" (PEP 585 syntax) 172 | def __iter__(self) -> Iterator[int]: | ^^^^^^^^ PYI034 -173 | ... # Y034 "__iter__" methods in classes like "BadIterator2" usually return "self" at runtime. Consider using "typing_extensions.Self" in "BadIterator2.__iter__", e.g. "def __iter__(self) -> Self: ..." +173 | ... # Y034 "__iter__" methods in classes like "BadIterator2" usually return "self" at runtime. Consider using "typing_extens… | = help: Use `Self` as return type @@ -126,7 +126,7 @@ PYI034.py:179:9: PYI034 [*] `__iter__` methods in classes like `BadIterator3` us 178 | ): # Y022 Use "collections.abc.Iterator[T]" instead of "typing.Iterator[T]" (PEP 585 syntax) 179 | def __iter__(self) -> collections.abc.Iterator[int]: | ^^^^^^^^ PYI034 -180 | ... # Y034 "__iter__" methods in classes like "BadIterator3" usually return "self" at runtime. Consider using "typing_extensions.Self" in "BadIterator3.__iter__", e.g. "def __iter__(self) -> Self: ..." +180 | ... # Y034 "__iter__" methods in classes like "BadIterator3" usually return "self" at runtime. Consider using "typing_extens… | = help: Use `Self` as return type @@ -146,7 +146,7 @@ PYI034.py:185:9: PYI034 [*] `__iter__` methods in classes like `BadIterator4` us 184 | # Note: *Iterable*, not *Iterator*, returned! 185 | def __iter__(self) -> Iterable[int]: | ^^^^^^^^ PYI034 -186 | ... # Y034 "__iter__" methods in classes like "BadIterator4" usually return "self" at runtime. Consider using "typing_extensions.Self" in "BadIterator4.__iter__", e.g. "def __iter__(self) -> Self: ..." +186 | ... # Y034 "__iter__" methods in classes like "BadIterator4" usually return "self" at runtime. Consider using "typing_extens… | = help: Use `Self` as return type @@ -165,7 +165,7 @@ PYI034.py:195:9: PYI034 [*] `__aiter__` methods in classes like `BadAsyncIterato 194 | class BadAsyncIterator(collections.abc.AsyncIterator[str]): 195 | def __aiter__(self) -> typing.AsyncIterator[str]: | ^^^^^^^^^ PYI034 -196 | ... # Y034 "__aiter__" methods in classes like "BadAsyncIterator" usually return "self" at runtime. Consider using "typing_extensions.Self" in "BadAsyncIterator.__aiter__", e.g. "def __aiter__(self) -> Self: ..." # Y022 Use "collections.abc.AsyncIterator[T]" instead of "typing.AsyncIterator[T]" (PEP 585 syntax) +196 | ... # Y034 "__aiter__" methods in classes like "BadAsyncIterator" usually return "self" at runtime. Consider using "typing_e… | = help: Use `Self` as return type @@ -242,7 +242,7 @@ PYI034.py:328:9: PYI034 [*] `__enter__` methods in classes like `NonGeneric1` us 327 | def __new__(cls: type[NonGeneric1], *args, **kwargs) -> NonGeneric1: ... 328 | def __enter__(self: NonGeneric1) -> NonGeneric1: ... | ^^^^^^^^^ PYI034 -329 | +329 | 330 | class NonGeneric2(tuple): | = help: Use `Self` as return type @@ -262,7 +262,7 @@ PYI034.py:331:9: PYI034 [*] `__new__` methods in classes like `NonGeneric2` usua 330 | class NonGeneric2(tuple): 331 | def __new__(cls: Type[NonGeneric2]) -> NonGeneric2: ... | ^^^^^^^ PYI034 -332 | +332 | 333 | class Generic1[T](list): | = help: Use `Self` as return type @@ -340,7 +340,7 @@ PYI034.py:346:9: PYI034 `__enter__` methods in classes like `Generic2` usually r 345 | def __new__(cls: type[Generic2]) -> Generic2: ... 346 | def __enter__(self: Generic2) -> Generic2: ... | ^^^^^^^^^ PYI034 -347 | +347 | 348 | class Generic3(tuple[*Ts]): | = help: Use `Self` as return type @@ -380,7 +380,7 @@ PYI034.py:350:9: PYI034 `__enter__` methods in classes like `Generic3` usually r 349 | def __new__(cls: type[Generic3]) -> Generic3: ... 350 | def __enter__(self: Generic3) -> Generic3: ... | ^^^^^^^^^ PYI034 -351 | +351 | 352 | class Generic4(collections.abc.Callable[P, ...]): | = help: Use `Self` as return type @@ -420,7 +420,7 @@ PYI034.py:354:9: PYI034 `__enter__` methods in classes like `Generic4` usually r 353 | def __new__(cls: type[Generic4]) -> Generic4: ... 354 | def __enter__(self: Generic4) -> Generic4: ... | ^^^^^^^^^ PYI034 -355 | +355 | 356 | from some_module import PotentialTypeVar | = help: Use `Self` as return type diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.pyi.snap index 941c11fe99173..49952c3ef7584 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.pyi.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI034_PYI034.pyi.snap @@ -8,7 +8,7 @@ PYI034.pyi:20:9: PYI034 [*] `__new__` methods in classes like `Bad` usually retu 20 | def __new__( | ^^^^^^^ PYI034 21 | cls, *args: Any, **kwargs: Any -22 | ) -> Bad: ... # Y034 "__new__" methods usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__new__", e.g. "def __new__(cls, *args: Any, **kwargs: Any) -> Self: ..." +22 | ) -> Bad: ... # Y034 "__new__" methods usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__new__"… | = help: Use `Self` as return type @@ -29,7 +29,7 @@ PYI034.pyi:35:9: PYI034 [*] `__enter__` methods in classes like `Bad` usually re 35 | def __enter__( | ^^^^^^^^^ PYI034 36 | self, -37 | ) -> Bad: ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__enter__", e.g. "def __enter__(self) -> Self: ..." +37 | ) -> Bad: ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extension… | = help: Use `Self` as return type @@ -46,11 +46,11 @@ PYI034.pyi:35:9: PYI034 [*] `__enter__` methods in classes like `Bad` usually re PYI034.pyi:38:15: PYI034 [*] `__aenter__` methods in classes like `Bad` usually return `self` at runtime | 36 | self, -37 | ) -> Bad: ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__enter__", e.g. "def __enter__(self) -> Self: ..." +37 | ) -> Bad: ... # Y034 "__enter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extension… 38 | async def __aenter__( | ^^^^^^^^^^ PYI034 39 | self, -40 | ) -> Bad: ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__aenter__", e.g. "async def __aenter__(self) -> Self: ..." +40 | ) -> Bad: ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensio… | = help: Use `Self` as return type @@ -67,11 +67,11 @@ PYI034.pyi:38:15: PYI034 [*] `__aenter__` methods in classes like `Bad` usually PYI034.pyi:41:9: PYI034 [*] `__iadd__` methods in classes like `Bad` usually return `self` at runtime | 39 | self, -40 | ) -> Bad: ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__aenter__", e.g. "async def __aenter__(self) -> Self: ..." +40 | ) -> Bad: ... # Y034 "__aenter__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensio… 41 | def __iadd__( | ^^^^^^^^ PYI034 42 | self, other: Bad -43 | ) -> Bad: ... # Y034 "__iadd__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions.Self" in "Bad.__iadd__", e.g. "def __iadd__(self, other: Bad) -> Self: ..." +43 | ) -> Bad: ... # Y034 "__iadd__" methods in classes like "Bad" usually return "self" at runtime. Consider using "typing_extensions… | = help: Use `Self` as return type @@ -223,7 +223,7 @@ PYI034.pyi:222:9: PYI034 [*] `__enter__` methods in classes like `NonGeneric1` u 221 | def __new__(cls: type[NonGeneric1], *args, **kwargs) -> NonGeneric1: ... 222 | def __enter__(self: NonGeneric1) -> NonGeneric1: ... | ^^^^^^^^^ PYI034 -223 | +223 | 224 | class NonGeneric2(tuple): | = help: Use `Self` as return type @@ -243,7 +243,7 @@ PYI034.pyi:225:9: PYI034 [*] `__new__` methods in classes like `NonGeneric2` usu 224 | class NonGeneric2(tuple): 225 | def __new__(cls: Type[NonGeneric2]) -> NonGeneric2: ... | ^^^^^^^ PYI034 -226 | +226 | 227 | class Generic1[T](list): | = help: Use `Self` as return type @@ -321,7 +321,7 @@ PYI034.pyi:240:9: PYI034 `__enter__` methods in classes like `Generic2` usually 239 | def __new__(cls: type[Generic2]) -> Generic2: ... 240 | def __enter__(self: Generic2) -> Generic2: ... | ^^^^^^^^^ PYI034 -241 | +241 | 242 | class Generic3(tuple[*Ts]): | = help: Use `Self` as return type @@ -361,7 +361,7 @@ PYI034.pyi:244:9: PYI034 `__enter__` methods in classes like `Generic3` usually 243 | def __new__(cls: type[Generic3]) -> Generic3: ... 244 | def __enter__(self: Generic3) -> Generic3: ... | ^^^^^^^^^ PYI034 -245 | +245 | 246 | class Generic4(collections.abc.Callable[P, ...]): | = help: Use `Self` as return type @@ -401,7 +401,7 @@ PYI034.pyi:248:9: PYI034 `__enter__` methods in classes like `Generic4` usually 247 | def __new__(cls: type[Generic4]) -> Generic4: ... 248 | def __enter__(self: Generic4) -> Generic4: ... | ^^^^^^^^^ PYI034 -249 | +249 | 250 | from some_module import PotentialTypeVar | = help: Use `Self` as return type diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.py.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.py.snap index 38fe8de87fab5..34e31a8ea7aa3 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.py.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.py.snap @@ -1,6 +1,5 @@ --- source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs -snapshot_kind: text --- PYI036.py:54:31: PYI036 [*] Star-args in `__exit__` should be annotated with `object` | @@ -27,7 +26,7 @@ PYI036.py:55:24: PYI036 If there are no star-args, `__aexit__` should have at le 54 | def __exit__(self, *args: Any) -> None: ... # PYI036: Bad star-args annotation 55 | async def __aexit__(self) -> None: ... # PYI036: Missing args | ^^^^^^ PYI036 -56 | +56 | 57 | class BadTwo: | @@ -45,54 +44,54 @@ PYI036.py:59:48: PYI036 All keyword-only arguments in `__aexit__` must have a de 58 | def __exit__(self, typ, exc, tb, weird_extra_arg) -> None: ... # PYI036: Extra arg must have default 59 | async def __aexit__(self, typ, exc, tb, *, weird_extra_arg) -> None: ...# PYI036: Extra arg must have default | ^^^^^^^^^^^^^^^ PYI036 -60 | +60 | 61 | class BadThree: | PYI036.py:62:29: PYI036 The first argument in `__exit__` should be annotated with `object` or `type[BaseException] | None` | 61 | class BadThree: -62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg has bad annotation +62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg… | ^^^^^^^^^^^^^^^^^^^ PYI036 -63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI036: Second arg has bad annotation +63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI0… | PYI036.py:63:73: PYI036 The second argument in `__aexit__` should be annotated with `object` or `BaseException | None` | 61 | class BadThree: -62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg has bad annotation -63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI036: Second arg has bad annotation +62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg… +63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI0… | ^^^^^^^^^^^^^ PYI036 -64 | +64 | 65 | class BadFour: | PYI036.py:63:94: PYI036 The third argument in `__aexit__` should be annotated with `object` or `types.TracebackType | None` | 61 | class BadThree: -62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg has bad annotation -63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI036: Second arg has bad annotation +62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg… +63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI0… | ^^^^^^^^^^^^^ PYI036 -64 | +64 | 65 | class BadFour: | PYI036.py:66:111: PYI036 The third argument in `__exit__` should be annotated with `object` or `types.TracebackType | None` | -65 | class BadFour: -66 | def __exit__(self, typ: typing.Optional[type[BaseException]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation - | ^^^^^^^^^^^^^ PYI036 -67 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad annotation +65 | … +66 | …xception]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation + | ^^^^^^^^^^^^^ PYI036 +67 | …n] | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad… | PYI036.py:67:101: PYI036 The third argument in `__aexit__` should be annotated with `object` or `types.TracebackType | None` | -65 | class BadFour: -66 | def __exit__(self, typ: typing.Optional[type[BaseException]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation -67 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad annotation - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI036 -68 | -69 | class BadFive: +65 | … +66 | …eption]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation +67 | … | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad a… + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI036 +68 | … +69 | … | PYI036.py:70:29: PYI036 The first argument in `__exit__` should be annotated with `object` or `type[BaseException] | None` @@ -100,7 +99,7 @@ PYI036.py:70:29: PYI036 The first argument in `__exit__` should be annotated wit 69 | class BadFive: 70 | def __exit__(self, typ: BaseException | None, *args: list[str]) -> bool: ... # PYI036: Bad star-args annotation | ^^^^^^^^^^^^^^^^^^^^ PYI036 -71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotation +71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotati… | PYI036.py:70:58: PYI036 [*] Star-args in `__exit__` should be annotated with `object` @@ -108,7 +107,7 @@ PYI036.py:70:58: PYI036 [*] Star-args in `__exit__` should be annotated with `ob 69 | class BadFive: 70 | def __exit__(self, typ: BaseException | None, *args: list[str]) -> bool: ... # PYI036: Bad star-args annotation | ^^^^^^^^^ PYI036 -71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotation +71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotati… | = help: Annotate star-args with `object` @@ -126,9 +125,9 @@ PYI036.py:71:74: PYI036 [*] Star-args in `__aexit__` should be annotated with `o | 69 | class BadFive: 70 | def __exit__(self, typ: BaseException | None, *args: list[str]) -> bool: ... # PYI036: Bad star-args annotation -71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotation +71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotati… | ^^^ PYI036 -72 | +72 | 73 | class BadSix: | = help: Annotate star-args with `object` @@ -157,7 +156,7 @@ PYI036.py:75:48: PYI036 All keyword-only arguments in `__aexit__` must have a de 74 | def __exit__(self, typ, exc, tb, weird_extra_arg, extra_arg2 = None) -> None: ... # PYI036: Extra arg must have default 75 | async def __aexit__(self, typ, exc, tb, *, weird_extra_arg) -> None: ... # PYI036: kwargs must have default | ^^^^^^^^^^^^^^^ PYI036 -76 | +76 | 77 | class AllPositionalOnlyArgs: | @@ -175,7 +174,7 @@ PYI036.py:83:95: PYI036 The third argument in `__aexit__` should be annotated wi 82 | def __exit__(self, typ: type[Exception] | None, exc: BaseException | None, tb: TracebackType | None, /) -> None: ... 83 | async def __aexit__(self, typ: type[BaseException] | None, exc: BaseException | None, tb: TracebackType, /) -> None: ... | ^^^^^^^^^^^^^ PYI036 -84 | +84 | 85 | # Definitions not in a class scope can do whatever, we don't care | diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.pyi.snap index 84b458353f4e2..116a7f499e80d 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.pyi.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI036_PYI036.pyi.snap @@ -1,6 +1,5 @@ --- source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs -snapshot_kind: text --- PYI036.pyi:54:31: PYI036 [*] Star-args in `__exit__` should be annotated with `object` | @@ -27,7 +26,7 @@ PYI036.pyi:55:24: PYI036 If there are no star-args, `__aexit__` should have at l 54 | def __exit__(self, *args: Any) -> None: ... # PYI036: Bad star-args annotation 55 | async def __aexit__(self) -> None: ... # PYI036: Missing args | ^^^^^^ PYI036 -56 | +56 | 57 | class BadTwo: | @@ -45,7 +44,7 @@ PYI036.pyi:59:48: PYI036 All keyword-only arguments in `__aexit__` must have a d 58 | def __exit__(self, typ, exc, tb, weird_extra_arg) -> None: ... # PYI036: Extra arg must have default 59 | async def __aexit__(self, typ, exc, tb, *, weird_extra_arg1, weird_extra_arg2) -> None: ...# PYI036: kwargs must have default | ^^^^^^^^^^^^^^^^ PYI036 -60 | +60 | 61 | class BadThree: | @@ -55,54 +54,54 @@ PYI036.pyi:59:66: PYI036 All keyword-only arguments in `__aexit__` must have a d 58 | def __exit__(self, typ, exc, tb, weird_extra_arg) -> None: ... # PYI036: Extra arg must have default 59 | async def __aexit__(self, typ, exc, tb, *, weird_extra_arg1, weird_extra_arg2) -> None: ...# PYI036: kwargs must have default | ^^^^^^^^^^^^^^^^ PYI036 -60 | +60 | 61 | class BadThree: | PYI036.pyi:62:29: PYI036 The first argument in `__exit__` should be annotated with `object` or `type[BaseException] | None` | 61 | class BadThree: -62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg has bad annotation +62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg… | ^^^^^^^^^^^^^^^^^^^ PYI036 -63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI036: Second arg has bad annotation +63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI0… | PYI036.pyi:63:73: PYI036 The second argument in `__aexit__` should be annotated with `object` or `BaseException | None` | 61 | class BadThree: -62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg has bad annotation -63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI036: Second arg has bad annotation +62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg… +63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI0… | ^^^^^^^^^^^^^ PYI036 -64 | +64 | 65 | class BadFour: | PYI036.pyi:63:94: PYI036 The third argument in `__aexit__` should be annotated with `object` or `types.TracebackType | None` | 61 | class BadThree: -62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg has bad annotation -63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI036: Second arg has bad annotation +62 | def __exit__(self, typ: type[BaseException], exc: BaseException | None, tb: TracebackType | None) -> None: ... # PYI036: First arg… +63 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException, __tb: TracebackType) -> bool | None: ... # PYI0… | ^^^^^^^^^^^^^ PYI036 -64 | +64 | 65 | class BadFour: | PYI036.pyi:66:111: PYI036 The third argument in `__exit__` should be annotated with `object` or `types.TracebackType | None` | -65 | class BadFour: -66 | def __exit__(self, typ: typing.Optional[type[BaseException]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation - | ^^^^^^^^^^^^^ PYI036 -67 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad annotation +65 | … +66 | …xception]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation + | ^^^^^^^^^^^^^ PYI036 +67 | …n] | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad… | PYI036.pyi:67:101: PYI036 The third argument in `__aexit__` should be annotated with `object` or `types.TracebackType | None` | -65 | class BadFour: -66 | def __exit__(self, typ: typing.Optional[type[BaseException]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation -67 | async def __aexit__(self, __typ: type[BaseException] | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad annotation - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI036 -68 | -69 | class BadFive: +65 | … +66 | …eption]], exc: typing.Union[BaseException, None], tb: TracebackType) -> None: ... # PYI036: Third arg has bad annotation +67 | … | None, __exc: BaseException | None, __tb: typing.Union[TracebackType, None, int]) -> bool | None: ... # PYI036: Third arg has bad a… + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI036 +68 | … +69 | … | PYI036.pyi:70:29: PYI036 The first argument in `__exit__` should be annotated with `object` or `type[BaseException] | None` @@ -110,7 +109,7 @@ PYI036.pyi:70:29: PYI036 The first argument in `__exit__` should be annotated wi 69 | class BadFive: 70 | def __exit__(self, typ: BaseException | None, *args: list[str]) -> bool: ... # PYI036: Bad star-args annotation | ^^^^^^^^^^^^^^^^^^^^ PYI036 -71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotation +71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotati… | PYI036.pyi:70:58: PYI036 [*] Star-args in `__exit__` should be annotated with `object` @@ -118,7 +117,7 @@ PYI036.pyi:70:58: PYI036 [*] Star-args in `__exit__` should be annotated with `o 69 | class BadFive: 70 | def __exit__(self, typ: BaseException | None, *args: list[str]) -> bool: ... # PYI036: Bad star-args annotation | ^^^^^^^^^ PYI036 -71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotation +71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotati… | = help: Annotate star-args with `object` @@ -136,9 +135,9 @@ PYI036.pyi:71:74: PYI036 [*] Star-args in `__aexit__` should be annotated with ` | 69 | class BadFive: 70 | def __exit__(self, typ: BaseException | None, *args: list[str]) -> bool: ... # PYI036: Bad star-args annotation -71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotation +71 | async def __aexit__(self, /, typ: type[BaseException] | None, *args: Any) -> Awaitable[None]: ... # PYI036: Bad star-args annotati… | ^^^ PYI036 -72 | +72 | 73 | class BadSix: | = help: Annotate star-args with `object` @@ -183,7 +182,7 @@ PYI036.pyi:90:95: PYI036 The third argument in `__aexit__` should be annotated w 89 | def __exit__(self, typ: type[Exception] | None, exc: BaseException | None, tb: TracebackType | None, /) -> None: ... 90 | async def __aexit__(self, typ: type[BaseException] | None, exc: BaseException | None, tb: TracebackType, /) -> None: ... | ^^^^^^^^^^^^^ PYI036 -91 | +91 | 92 | # Definitions not in a class scope can do whatever, we don't care | @@ -193,7 +192,7 @@ PYI036.pyi:159:17: PYI036 Annotations for a three-argument `__exit__` overload ( 158 | @overload 159 | def __exit__(self, exc_typ: Exception, exc: Exception, tb: TracebackType) -> None: ... # PYI036 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI036 -160 | +160 | 161 | class UnacceptableOverload2: | diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI052_PYI052.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI052_PYI052.pyi.snap index 4fd76e3458b04..210dcc1918337 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI052_PYI052.pyi.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI052_PYI052.pyi.snap @@ -1,12 +1,11 @@ --- source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs -snapshot_kind: text --- PYI052.pyi:14:10: PYI052 Need type annotation for `field5` | 12 | field43: int = -0xFFFFFFFF 13 | field44: int = -1234567890 -14 | field5 = 0 # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") # Y052 Need type annotation for "field5" +14 | field5 = 0 # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") # Y052 Need ty… | ^ PYI052 15 | field6 = 0 # Y052 Need type annotation for "field6" 16 | field7 = b"" # Y052 Need type annotation for "field7" @@ -15,7 +14,7 @@ PYI052.pyi:14:10: PYI052 Need type annotation for `field5` PYI052.pyi:15:10: PYI052 Need type annotation for `field6` | 13 | field44: int = -1234567890 -14 | field5 = 0 # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") # Y052 Need type annotation for "field5" +14 | field5 = 0 # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") # Y052 Need ty… 15 | field6 = 0 # Y052 Need type annotation for "field6" | ^ PYI052 16 | field7 = b"" # Y052 Need type annotation for "field7" @@ -24,7 +23,7 @@ PYI052.pyi:15:10: PYI052 Need type annotation for `field6` PYI052.pyi:16:10: PYI052 Need type annotation for `field7` | -14 | field5 = 0 # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") # Y052 Need type annotation for "field5" +14 | field5 = 0 # type: int # Y033 Do not use type comments in stubs (e.g. use "x: int" instead of "x = ... # type: int") # Y052 Need ty… 15 | field6 = 0 # Y052 Need type annotation for "field6" 16 | field7 = b"" # Y052 Need type annotation for "field7" | ^^^ PYI052 diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI066_PYI066.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI066_PYI066.pyi.snap index 706fc9d07dbe8..3d8cec865cbd9 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI066_PYI066.pyi.snap +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI066_PYI066.pyi.snap @@ -5,8 +5,8 @@ snapshot_kind: text PYI066.pyi:3:4: PYI066 Put branches for newer Python versions first when branching on `sys.version_info` comparisons | 1 | import sys -2 | -3 | if sys.version_info < (3, 10): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 10)" +2 | +3 | if sys.version_info < (3, 10): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if s… | ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI066 4 | def foo(x): ... 5 | else: @@ -15,28 +15,28 @@ PYI066.pyi:3:4: PYI066 Put branches for newer Python versions first when branchi PYI066.pyi:8:4: PYI066 Put branches for newer Python versions first when branching on `sys.version_info` comparisons | 6 | def foo(x, *, bar=True): ... - 7 | - 8 | if sys.version_info < (3, 8): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 8)" + 7 | + 8 | if sys.version_info < (3, 8): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if s… | ^^^^^^^^^^^^^^^^^^^^^^^^^ PYI066 9 | def bar(x): ... -10 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 9)" +10 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if… | PYI066.pyi:10:6: PYI066 Put branches for newer Python versions first when branching on `sys.version_info` comparisons | - 8 | if sys.version_info < (3, 8): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 8)" + 8 | if sys.version_info < (3, 8): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if s… 9 | def bar(x): ... -10 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 9)" +10 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if… | ^^^^^^^^^^^^^^^^^^^^^^^^^ PYI066 11 | def bar(x, *, bar=True): ... -12 | elif sys.version_info < (3, 11): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 10)" +12 | elif sys.version_info < (3, 11): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "i… | PYI066.pyi:12:6: PYI066 Put branches for newer Python versions first when branching on `sys.version_info` comparisons | -10 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 9)" +10 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if… 11 | def bar(x, *, bar=True): ... -12 | elif sys.version_info < (3, 11): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 10)" +12 | elif sys.version_info < (3, 11): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "i… | ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI066 13 | def bar(x, *, bar=True, baz=False): ... 14 | else: @@ -46,7 +46,7 @@ PYI066.pyi:20:6: PYI066 Put branches for newer Python versions first when branch | 18 | if sys.version_info >= (3, 5): 19 | ... -20 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if sys.version_info >= (3, 10)" +20 | elif sys.version_info < (3, 9): # Y066 When using if/else with sys.version_info, put the code for new Python versions first, e.g. "if… | ^^^^^^^^^^^^^^^^^^^^^^^^^ PYI066 21 | ... 22 | else: diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/snapshots/ruff_linter__rules__flake8_type_checking__tests__quote_typing-only-third-party-import_quote3.py.snap b/crates/ruff_linter/src/rules/flake8_type_checking/snapshots/ruff_linter__rules__flake8_type_checking__tests__quote_typing-only-third-party-import_quote3.py.snap index be78a34c83800..8e70e33c741eb 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/snapshots/ruff_linter__rules__flake8_type_checking__tests__quote_typing-only-third-party-import_quote3.py.snap +++ b/crates/ruff_linter/src/rules/flake8_type_checking/snapshots/ruff_linter__rules__flake8_type_checking__tests__quote_typing-only-third-party-import_quote3.py.snap @@ -4,10 +4,10 @@ source: crates/ruff_linter/src/rules/flake8_type_checking/mod.rs quote3.py:4:44: TC002 [*] Move third-party import `django.contrib.auth.models.AbstractBaseUser` into a type-checking block | 2 | from typing import Literal, Union -3 | +3 | 4 | from django.contrib.auth.models import AbstractBaseUser | ^^^^^^^^^^^^^^^^ TC002 -5 | +5 | 6 | def test_union_literal_mixed_quotes(user: AbstractBaseUser[Union[Literal['active', "inactive"], str]]): | = help: Move into type-checking block @@ -31,10 +31,10 @@ quote3.py:4:44: TC002 [*] Move third-party import `django.contrib.auth.models.Ab quote3.py:13:44: TC002 [*] Move third-party import `django.contrib.auth.models.AbstractBaseUser` into a type-checking block | 11 | from typing import Callable, Literal -12 | +12 | 13 | from django.contrib.auth.models import AbstractBaseUser | ^^^^^^^^^^^^^^^^ TC002 -14 | +14 | 15 | def test_callable_literal_mixed_quotes(callable_fn: AbstractBaseUser[Callable[["int", Literal['admin', "user"]], 'bool']]): | = help: Move into type-checking block @@ -62,11 +62,11 @@ quote3.py:13:44: TC002 [*] Move third-party import `django.contrib.auth.models.A quote3.py:22:44: TC002 [*] Move third-party import `django.contrib.auth.models.AbstractBaseUser` into a type-checking block | 20 | from typing import Annotated, Callable, Literal -21 | +21 | 22 | from django.contrib.auth.models import AbstractBaseUser | ^^^^^^^^^^^^^^^^ TC002 -23 | -24 | def test_callable_annotated_literal(callable_fn: AbstractBaseUser[Callable[[int, Annotated[str, Literal['active', "inactive"]]], bool]]): +23 | +24 | def test_callable_annotated_literal(callable_fn: AbstractBaseUser[Callable[[int, Annotated[str, Literal['active', "inactive"]]], b… | = help: Move into type-checking block @@ -93,10 +93,10 @@ quote3.py:22:44: TC002 [*] Move third-party import `django.contrib.auth.models.A quote3.py:31:37: TC002 [*] Move third-party import `django.contrib.auth.models` into a type-checking block | 29 | from typing import literal -30 | +30 | 31 | from django.contrib.auth import models | ^^^^^^ TC002 -32 | +32 | 33 | def test_attribute(arg: models.AbstractBaseUser["int"]): | = help: Move into type-checking block @@ -124,10 +124,10 @@ quote3.py:31:37: TC002 [*] Move third-party import `django.contrib.auth.models` quote3.py:40:37: TC002 [*] Move third-party import `django.contrib.auth.models` into a type-checking block | 38 | from typing import Literal -39 | +39 | 40 | from django.contrib.auth import models | ^^^^^^ TC002 -41 | +41 | 42 | def test_attribute_typing_literal(arg: models.AbstractBaseUser[Literal["admin"]]): | = help: Move into type-checking block @@ -158,7 +158,7 @@ quote3.py:59:29: TC002 [*] Move third-party import `third_party.Type` into a typ 58 | from typing import Literal 59 | from third_party import Type | ^^^^ TC002 -60 | +60 | 61 | def test_string_contains_opposite_quote(self, type1: Type[Literal["'"]], type2: Type[Literal["\'"]]): | = help: Move into type-checking block @@ -189,7 +189,7 @@ quote3.py:67:29: TC002 [*] Move third-party import `third_party.Type` into a typ 66 | from typing import Literal 67 | from third_party import Type | ^^^^ TC002 -68 | +68 | 69 | def test_quote_contains_backslash(self, type1: Type[Literal["\n"]], type2: Type[Literal["\""]]): | = help: Move into type-checking block diff --git a/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E231_E23.py.snap b/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E231_E23.py.snap index 1a9c7a89ff57f..8846098bcc9b5 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E231_E23.py.snap +++ b/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E231_E23.py.snap @@ -1,6 +1,5 @@ --- source: crates/ruff_linter/src/rules/pycodestyle/mod.rs -snapshot_kind: text --- E23.py:2:7: E231 [*] Missing whitespace after ',' | @@ -107,7 +106,7 @@ E23.py:33:6: E231 [*] Missing whitespace after ',' 32 | # E231 33 | f"{(a,b)}" | ^ E231 -34 | +34 | 35 | # Okay because it's hard to differentiate between the usages of a colon in a f-string | = help: Add missing whitespace @@ -127,7 +126,7 @@ E23.py:47:37: E231 [*] Missing whitespace after ':' 46 | #: E231 47 | {len(f's3://{self.s3_bucket_name}/'):1} | ^ E231 -48 | +48 | 49 | #: Okay | = help: Add missing whitespace @@ -604,7 +603,7 @@ E23.py:112:6: E231 [*] Missing whitespace after ':' E23.py:116:18: E231 [*] Missing whitespace after ':' | 114 | pass -115 | +115 | 116 | class PEP696Bad[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes]: | ^ E231 117 | def pep_696_bad_method[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes]( @@ -625,7 +624,7 @@ E23.py:116:18: E231 [*] Missing whitespace after ':' E23.py:116:40: E231 [*] Missing whitespace after ':' | 114 | pass -115 | +115 | 116 | class PEP696Bad[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes]: | ^ E231 117 | def pep_696_bad_method[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes]( @@ -646,7 +645,7 @@ E23.py:116:40: E231 [*] Missing whitespace after ':' E23.py:116:70: E231 [*] Missing whitespace after ':' | 114 | pass -115 | +115 | 116 | class PEP696Bad[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes]: | ^ E231 117 | def pep_696_bad_method[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes]( @@ -790,10 +789,10 @@ E23.py:121:10: E231 [*] Missing whitespace after ':' E23.py:125:32: E231 [*] Missing whitespace after ':' | 123 | pass -124 | +124 | 125 | class PEP696BadWithEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](): | ^ E231 -126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_dynamic[x::-1]): +126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_d… 127 | pass | = help: Add missing whitespace @@ -811,10 +810,10 @@ E23.py:125:32: E231 [*] Missing whitespace after ':' E23.py:125:54: E231 [*] Missing whitespace after ':' | 123 | pass -124 | +124 | 125 | class PEP696BadWithEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](): | ^ E231 -126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_dynamic[x::-1]): +126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_d… 127 | pass | = help: Add missing whitespace @@ -832,10 +831,10 @@ E23.py:125:54: E231 [*] Missing whitespace after ':' E23.py:125:84: E231 [*] Missing whitespace after ':' | 123 | pass -124 | +124 | 125 | class PEP696BadWithEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](): | ^ E231 -126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_dynamic[x::-1]): +126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_d… 127 | pass | = help: Add missing whitespace @@ -853,7 +852,7 @@ E23.py:125:84: E231 [*] Missing whitespace after ':' E23.py:126:47: E231 [*] Missing whitespace after ':' | 125 | class PEP696BadWithEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](): -126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_dynamic[x::-1]): +126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_d… | ^ E231 127 | pass | @@ -872,7 +871,7 @@ E23.py:126:47: E231 [*] Missing whitespace after ':' E23.py:126:69: E231 [*] Missing whitespace after ':' | 125 | class PEP696BadWithEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](): -126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_dynamic[x::-1]): +126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_d… | ^ E231 127 | pass | @@ -891,7 +890,7 @@ E23.py:126:69: E231 [*] Missing whitespace after ':' E23.py:126:99: E231 [*] Missing whitespace after ':' | 125 | class PEP696BadWithEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](): -126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_dynamic[x::-1]): +126 | class IndentedPEP696BadWithNonEmptyBases[A:object="foo"[::-1], B:object =[[["foo", "bar"]]], C:object= bytes](object, something_d… | ^ E231 127 | pass | diff --git a/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E501_E501.py.snap b/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E501_E501.py.snap index 457411baaa622..b7eab7d0159f6 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E501_E501.py.snap +++ b/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__E501_E501.py.snap @@ -1,11 +1,10 @@ --- source: crates/ruff_linter/src/rules/pycodestyle/mod.rs -snapshot_kind: text --- E501.py:5:89: E501 Line too long (123 > 88) | 3 | https://github.com/PyCQA/pycodestyle/pull/258/files#diff-841c622497a8033d10152bfdfb15b20b92437ecdea21a260944ea86b77b51533 -4 | +4 | 5 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 6 | """ @@ -50,9 +49,9 @@ E501.py:43:89: E501 Line too long (105 > 88) E501.py:83:89: E501 Line too long (147 > 88) | -81 | class Bar: -82 | """ -83 | This is a long sentence that ends with a shortened URL and, therefore, could easily be broken across multiple lines ([source](https://ruff.rs)) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -84 | """ +81 | … +82 | … +83 | … URL and, therefore, could easily be broken across multiple lines ([source](https://ruff.rs)) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +84 | … | diff --git a/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__task_tags_false.snap b/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__task_tags_false.snap index 2efa2608b24fd..6dfc2c571a233 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__task_tags_false.snap +++ b/crates/ruff_linter/src/rules/pycodestyle/snapshots/ruff_linter__rules__pycodestyle__tests__task_tags_false.snap @@ -1,77 +1,76 @@ --- source: crates/ruff_linter/src/rules/pycodestyle/mod.rs -snapshot_kind: text --- E501_1.py:1:89: E501 Line too long (149 > 88) | -1 | # TODO: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -2 | # TODO(charlie): comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -3 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +1 | …ask-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +2 | …figured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +3 | …sk-tags sometimes are longer than line-length so that you can easily find them with `git grep` | E501_1.py:2:89: E501 Line too long (158 > 88) | -1 | # TODO: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -2 | # TODO(charlie): comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -3 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -4 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +1 | …ags sometimes are longer than line-length so that you can easily find them with `git grep` +2 | …ed task-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +3 | …gs sometimes are longer than line-length so that you can easily find them with `git grep` +4 | …task-tags sometimes are longer than line-length so that you can easily find them with `git grep` | E501_1.py:3:89: E501 Line too long (148 > 88) | -1 | # TODO: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -2 | # TODO(charlie): comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -3 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -4 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -5 | # FIXME: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +1 | …ask-tags sometimes are longer than line-length so that you can easily find them with `git grep` +2 | …figured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +3 | …sk-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +4 | …ured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +5 | …task-tags sometimes are longer than line-length so that you can easily find them with `git grep` | E501_1.py:4:89: E501 Line too long (155 > 88) | -2 | # TODO(charlie): comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -3 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -4 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -5 | # FIXME: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -6 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +2 | …ured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +3 | …tags sometimes are longer than line-length so that you can easily find them with `git grep` +4 | …d task-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +5 | …k-tags sometimes are longer than line-length so that you can easily find them with `git grep` +6 | …-tags sometimes are longer than line-length so that you can easily find them with `git grep` | E501_1.py:5:89: E501 Line too long (150 > 88) | -3 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -4 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -5 | # FIXME: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -6 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -7 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +3 | …k-tags sometimes are longer than line-length so that you can easily find them with `git grep` +4 | …red task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +5 | …ask-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +6 | …sk-tags sometimes are longer than line-length so that you can easily find them with `git grep` +7 | …ured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` | E501_1.py:6:89: E501 Line too long (149 > 88) | -4 | # TODO comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -5 | # FIXME: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -6 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -7 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -8 | # FIXME(charlie): comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +4 | …ured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +5 | …task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +6 | …ask-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +7 | …gured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +8 | …nfigured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` | E501_1.py:7:89: E501 Line too long (156 > 88) | -5 | # FIXME: comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -6 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -7 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 -8 | # FIXME(charlie): comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +5 | …-tags sometimes are longer than line-length so that you can easily find them with `git grep` +6 | …tags sometimes are longer than line-length so that you can easily find them with `git grep` +7 | …d task-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +8 | …ured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` | E501_1.py:8:89: E501 Line too long (159 > 88) | -6 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -7 | # FIXME comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` -8 | # FIXME(charlie): comments starting with one of the configured task-tags sometimes are longer than line-length so that you can easily find them with `git grep` - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 +6 | …ags sometimes are longer than line-length so that you can easily find them with `git grep` +7 | … task-tags sometimes are longer than line-length so that you can easily find them with `git grep` +8 | …red task-tags sometimes are longer than line-length so that you can easily find them with `git grep` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E501 | diff --git a/crates/ruff_linter/src/rules/pyflakes/snapshots/ruff_linter__rules__pyflakes__tests__F821_F821_17.py.snap b/crates/ruff_linter/src/rules/pyflakes/snapshots/ruff_linter__rules__pyflakes__tests__F821_F821_17.py.snap index 82e9a41c3bb66..ad86315cccf85 100644 --- a/crates/ruff_linter/src/rules/pyflakes/snapshots/ruff_linter__rules__pyflakes__tests__F821_F821_17.py.snap +++ b/crates/ruff_linter/src/rules/pyflakes/snapshots/ruff_linter__rules__pyflakes__tests__F821_F821_17.py.snap @@ -1,11 +1,10 @@ --- source: crates/ruff_linter/src/rules/pyflakes/mod.rs -snapshot_kind: text --- F821_17.py:16:12: F821 Undefined name `DoesNotExist` | 14 | # Types used in aliased assignment must exist -15 | +15 | 16 | type Foo = DoesNotExist # F821: Undefined name `DoesNotExist` | ^^^^^^^^^^^^ F821 17 | type Foo = list[DoesNotExist] # F821: Undefined name `DoesNotExist` @@ -16,7 +15,7 @@ F821_17.py:17:17: F821 Undefined name `DoesNotExist` 16 | type Foo = DoesNotExist # F821: Undefined name `DoesNotExist` 17 | type Foo = list[DoesNotExist] # F821: Undefined name `DoesNotExist` | ^^^^^^^^^^^^ F821 -18 | +18 | 19 | # Type parameters do not escape alias scopes | @@ -25,17 +24,17 @@ F821_17.py:22:1: F821 Undefined name `T` 21 | type Foo[T] = T 22 | T # F821: Undefined name `T` - not accessible afterward alias scope | ^ F821 -23 | +23 | 24 | # Type parameters in functions | F821_17.py:39:17: F821 Undefined name `T` | 37 | from some_library import some_decorator -38 | +38 | 39 | @some_decorator(T) # F821: Undefined name `T` - not accessible in decorators | ^ F821 -40 | +40 | 41 | def foo[T](t: T) -> None: ... | @@ -51,7 +50,7 @@ F821_17.py:64:17: F821 Undefined name `T` 63 | from some_library import some_decorator 64 | @some_decorator(T) # F821: Undefined name `T` - not accessible in decorators | ^ F821 -65 | +65 | 66 | class Foo[T](list[T]): ... | @@ -60,14 +59,14 @@ F821_17.py:67:1: F821 Undefined name `T` 66 | class Foo[T](list[T]): ... 67 | T # F821: Undefined name `T` - not accessible after class scope | ^ F821 -68 | +68 | 69 | # Types specified in bounds should exist | F821_17.py:71:13: F821 Undefined name `DoesNotExist` | 69 | # Types specified in bounds should exist -70 | +70 | 71 | type Foo[T: DoesNotExist] = T # F821: Undefined name `DoesNotExist` | ^^^^^^^^^^^^ F821 72 | def foo[T: DoesNotExist](t: T) -> T: return t # F821: Undefined name `DoesNotExist` @@ -88,14 +87,14 @@ F821_17.py:73:14: F821 Undefined name `DoesNotExist` 72 | def foo[T: DoesNotExist](t: T) -> T: return t # F821: Undefined name `DoesNotExist` 73 | class Foo[T: DoesNotExist](list[T]): ... # F821: Undefined name `DoesNotExist` | ^^^^^^^^^^^^ F821 -74 | +74 | 75 | type Foo[T: (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | F821_17.py:75:14: F821 Undefined name `DoesNotExist1` | 73 | class Foo[T: DoesNotExist](list[T]): ... # F821: Undefined name `DoesNotExist` -74 | +74 | 75 | type Foo[T: (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 76 | def foo[T: (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` @@ -105,7 +104,7 @@ F821_17.py:75:14: F821 Undefined name `DoesNotExist1` F821_17.py:75:29: F821 Undefined name `DoesNotExist2` | 73 | class Foo[T: DoesNotExist](list[T]): ... # F821: Undefined name `DoesNotExist` -74 | +74 | 75 | type Foo[T: (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 76 | def foo[T: (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` @@ -134,7 +133,7 @@ F821_17.py:77:15: F821 Undefined name `DoesNotExist1` 76 | def foo[T: (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` 77 | class Foo[T: (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 -78 | +78 | 79 | # Same in defaults | @@ -144,14 +143,14 @@ F821_17.py:77:30: F821 Undefined name `DoesNotExist2` 76 | def foo[T: (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` 77 | class Foo[T: (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 -78 | +78 | 79 | # Same in defaults | F821_17.py:81:14: F821 Undefined name `DoesNotExist` | 79 | # Same in defaults -80 | +80 | 81 | type Foo[T = DoesNotExist] = T # F821: Undefined name `DoesNotExist` | ^^^^^^^^^^^^ F821 82 | def foo[T = DoesNotExist](t: T) -> T: return t # F821: Undefined name `DoesNotExist` @@ -172,34 +171,34 @@ F821_17.py:83:15: F821 Undefined name `DoesNotExist` 82 | def foo[T = DoesNotExist](t: T) -> T: return t # F821: Undefined name `DoesNotExist` 83 | class Foo[T = DoesNotExist](list[T]): ... # F821: Undefined name `DoesNotExist` | ^^^^^^^^^^^^ F821 -84 | +84 | 85 | type Foo[T = (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | F821_17.py:85:15: F821 Undefined name `DoesNotExist1` | 83 | class Foo[T = DoesNotExist](list[T]): ... # F821: Undefined name `DoesNotExist` -84 | +84 | 85 | type Foo[T = (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 -86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` +86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist… 87 | class Foo[T = (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | F821_17.py:85:30: F821 Undefined name `DoesNotExist2` | 83 | class Foo[T = DoesNotExist](list[T]): ... # F821: Undefined name `DoesNotExist` -84 | +84 | 85 | type Foo[T = (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 -86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` +86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist… 87 | class Foo[T = (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | F821_17.py:86:14: F821 Undefined name `DoesNotExist1` | 85 | type Foo[T = (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` -86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` +86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist… | ^^^^^^^^^^^^^ F821 87 | class Foo[T = (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | @@ -207,7 +206,7 @@ F821_17.py:86:14: F821 Undefined name `DoesNotExist1` F821_17.py:86:29: F821 Undefined name `DoesNotExist2` | 85 | type Foo[T = (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` -86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` +86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist… | ^^^^^^^^^^^^^ F821 87 | class Foo[T = (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | @@ -215,27 +214,27 @@ F821_17.py:86:29: F821 Undefined name `DoesNotExist2` F821_17.py:87:16: F821 Undefined name `DoesNotExist1` | 85 | type Foo[T = (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` -86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` +86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist… 87 | class Foo[T = (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 -88 | +88 | 89 | # Type parameters in nested classes | F821_17.py:87:31: F821 Undefined name `DoesNotExist2` | 85 | type Foo[T = (DoesNotExist1, DoesNotExist2)] = T # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` -86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` +86 | def foo[T = (DoesNotExist1, DoesNotExist2)](t: T) -> T: return t # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist… 87 | class Foo[T = (DoesNotExist1, DoesNotExist2)](list[T]): ... # F821: Undefined name `DoesNotExist1`, Undefined name `DoesNotExist2` | ^^^^^^^^^^^^^ F821 -88 | +88 | 89 | # Type parameters in nested classes | F821_17.py:102:52: F821 Undefined name `t` | 100 | return x -101 | +101 | 102 | def cannot_access_parent_variable(self, x: t) -> t: # F821: Undefined name `T` | ^ F821 103 | t # F821: Undefined name `t` @@ -245,7 +244,7 @@ F821_17.py:102:52: F821 Undefined name `t` F821_17.py:102:58: F821 Undefined name `t` | 100 | return x -101 | +101 | 102 | def cannot_access_parent_variable(self, x: t) -> t: # F821: Undefined name `T` | ^ F821 103 | t # F821: Undefined name `t` diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__max_boolean_expressions.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__max_boolean_expressions.snap index c5da76519d183..3bab1afdea29a 100644 --- a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__max_boolean_expressions.snap +++ b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__max_boolean_expressions.snap @@ -1,6 +1,5 @@ --- source: crates/ruff_linter/src/rules/pylint/mod.rs -snapshot_kind: text --- too_many_boolean_expressions.py:11:6: PLR0916 Too many Boolean expressions (6 > 5) | @@ -169,7 +168,7 @@ too_many_boolean_expressions.py:43:6: PLR0916 Too many Boolean expressions (22 > 43 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v: | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916 44 | ... -45 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w: +45 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and … | too_many_boolean_expressions.py:45:6: PLR0916 Too many Boolean expressions (23 > 5) @@ -179,7 +178,7 @@ too_many_boolean_expressions.py:45:6: PLR0916 Too many Boolean expressions (23 > 45 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w: | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916 46 | ... -47 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x: +47 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and … | too_many_boolean_expressions.py:47:6: PLR0916 Too many Boolean expressions (24 > 5) @@ -189,7 +188,7 @@ too_many_boolean_expressions.py:47:6: PLR0916 Too many Boolean expressions (24 > 47 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x: | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916 48 | ... -49 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y: +49 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and … | too_many_boolean_expressions.py:49:6: PLR0916 Too many Boolean expressions (25 > 5) @@ -199,7 +198,7 @@ too_many_boolean_expressions.py:49:6: PLR0916 Too many Boolean expressions (25 > 49 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y: | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916 50 | ... -51 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y and z: +51 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y and … | too_many_boolean_expressions.py:51:6: PLR0916 Too many Boolean expressions (26 > 5) diff --git a/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP031_0.py.snap b/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP031_0.py.snap index 79c32ccea26e8..129a49cc93db9 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP031_0.py.snap +++ b/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP031_0.py.snap @@ -6,7 +6,7 @@ UP031_0.py:4:7: UP031 [*] Use format specifiers instead of percent format 3 | # UP031 4 | print('%s %s' % (a, b)) | ^^^^^^^^^^^^^^^^ UP031 -5 | +5 | 6 | print('%s%s' % (a, b)) | = help: Replace with format specifiers @@ -24,10 +24,10 @@ UP031_0.py:4:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:6:7: UP031 [*] Use format specifiers instead of percent format | 4 | print('%s %s' % (a, b)) -5 | +5 | 6 | print('%s%s' % (a, b)) | ^^^^^^^^^^^^^^^ UP031 -7 | +7 | 8 | print("trivial" % ()) | = help: Replace with format specifiers @@ -45,10 +45,10 @@ UP031_0.py:6:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:8:7: UP031 [*] Use format specifiers instead of percent format | 6 | print('%s%s' % (a, b)) - 7 | + 7 | 8 | print("trivial" % ()) | ^^^^^^^^^^^^^^ UP031 - 9 | + 9 | 10 | print("%s" % ("simple",)) | = help: Replace with format specifiers @@ -66,10 +66,10 @@ UP031_0.py:8:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:10:7: UP031 [*] Use format specifiers instead of percent format | 8 | print("trivial" % ()) - 9 | + 9 | 10 | print("%s" % ("simple",)) | ^^^^^^^^^^^^^^^^^^ UP031 -11 | +11 | 12 | print("%s" % ("%s" % ("nested",),)) | = help: Replace with format specifiers @@ -87,10 +87,10 @@ UP031_0.py:10:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:12:7: UP031 [*] Use format specifiers instead of percent format | 10 | print("%s" % ("simple",)) -11 | +11 | 12 | print("%s" % ("%s" % ("nested",),)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP031 -13 | +13 | 14 | print("%s%% percent" % (15,)) | = help: Replace with format specifiers @@ -108,10 +108,10 @@ UP031_0.py:12:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:12:15: UP031 [*] Use format specifiers instead of percent format | 10 | print("%s" % ("simple",)) -11 | +11 | 12 | print("%s" % ("%s" % ("nested",),)) | ^^^^^^^^^^^^^^^^^^ UP031 -13 | +13 | 14 | print("%s%% percent" % (15,)) | = help: Replace with format specifiers @@ -129,10 +129,10 @@ UP031_0.py:12:15: UP031 [*] Use format specifiers instead of percent format UP031_0.py:14:7: UP031 [*] Use format specifiers instead of percent format | 12 | print("%s" % ("%s" % ("nested",),)) -13 | +13 | 14 | print("%s%% percent" % (15,)) | ^^^^^^^^^^^^^^^^^^^^^^ UP031 -15 | +15 | 16 | print("%f" % (15,)) | = help: Replace with format specifiers @@ -150,10 +150,10 @@ UP031_0.py:14:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:16:7: UP031 [*] Use format specifiers instead of percent format | 14 | print("%s%% percent" % (15,)) -15 | +15 | 16 | print("%f" % (15,)) | ^^^^^^^^^^^^ UP031 -17 | +17 | 18 | print("%.f" % (15,)) | = help: Replace with format specifiers @@ -171,10 +171,10 @@ UP031_0.py:16:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:18:7: UP031 [*] Use format specifiers instead of percent format | 16 | print("%f" % (15,)) -17 | +17 | 18 | print("%.f" % (15,)) | ^^^^^^^^^^^^^ UP031 -19 | +19 | 20 | print("%.3f" % (15,)) | = help: Replace with format specifiers @@ -192,10 +192,10 @@ UP031_0.py:18:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:20:7: UP031 [*] Use format specifiers instead of percent format | 18 | print("%.f" % (15,)) -19 | +19 | 20 | print("%.3f" % (15,)) | ^^^^^^^^^^^^^^ UP031 -21 | +21 | 22 | print("%3f" % (15,)) | = help: Replace with format specifiers @@ -213,10 +213,10 @@ UP031_0.py:20:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:22:7: UP031 [*] Use format specifiers instead of percent format | 20 | print("%.3f" % (15,)) -21 | +21 | 22 | print("%3f" % (15,)) | ^^^^^^^^^^^^^ UP031 -23 | +23 | 24 | print("%-5f" % (5,)) | = help: Replace with format specifiers @@ -234,10 +234,10 @@ UP031_0.py:22:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:24:7: UP031 [*] Use format specifiers instead of percent format | 22 | print("%3f" % (15,)) -23 | +23 | 24 | print("%-5f" % (5,)) | ^^^^^^^^^^^^^ UP031 -25 | +25 | 26 | print("%9f" % (5,)) | = help: Replace with format specifiers @@ -255,10 +255,10 @@ UP031_0.py:24:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:26:7: UP031 [*] Use format specifiers instead of percent format | 24 | print("%-5f" % (5,)) -25 | +25 | 26 | print("%9f" % (5,)) | ^^^^^^^^^^^^ UP031 -27 | +27 | 28 | print("%#o" % (123,)) | = help: Replace with format specifiers @@ -276,10 +276,10 @@ UP031_0.py:26:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:28:7: UP031 [*] Use format specifiers instead of percent format | 26 | print("%9f" % (5,)) -27 | +27 | 28 | print("%#o" % (123,)) | ^^^^^^^^^^^^^^ UP031 -29 | +29 | 30 | print("brace {} %s" % (1,)) | = help: Replace with format specifiers @@ -297,10 +297,10 @@ UP031_0.py:28:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:30:7: UP031 [*] Use format specifiers instead of percent format | 28 | print("%#o" % (123,)) -29 | +29 | 30 | print("brace {} %s" % (1,)) | ^^^^^^^^^^^^^^^^^^^^ UP031 -31 | +31 | 32 | print(( | = help: Replace with format specifiers @@ -318,8 +318,7 @@ UP031_0.py:30:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:33:5: UP031 [*] Use format specifiers instead of percent format | 32 | print(( -33 | "foo %s " - | _____^ +33 | / "foo %s " 34 | | "bar %s" % (x, y) | |_____________________^ UP031 35 | )) @@ -341,8 +340,7 @@ UP031_0.py:33:5: UP031 [*] Use format specifiers instead of percent format UP031_0.py:38:3: UP031 [*] Use format specifiers instead of percent format | 37 | print( -38 | "%s" % ( - | ___^ +38 | / "%s" % ( 39 | | "trailing comma", 40 | | ) | |_________^ UP031 @@ -363,10 +361,10 @@ UP031_0.py:38:3: UP031 [*] Use format specifiers instead of percent format UP031_0.py:43:7: UP031 [*] Use format specifiers instead of percent format | 41 | ) -42 | +42 | 43 | print("foo %s " % (x,)) | ^^^^^^^^^^^^^^^^ UP031 -44 | +44 | 45 | print("%(k)s" % {"k": "v"}) | = help: Replace with format specifiers @@ -384,10 +382,10 @@ UP031_0.py:43:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:45:7: UP031 [*] Use format specifiers instead of percent format | 43 | print("foo %s " % (x,)) -44 | +44 | 45 | print("%(k)s" % {"k": "v"}) | ^^^^^^^^^^^^^^^^^^^^ UP031 -46 | +46 | 47 | print("%(k)s" % { | = help: Replace with format specifiers @@ -405,14 +403,14 @@ UP031_0.py:45:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:47:7: UP031 [*] Use format specifiers instead of percent format | 45 | print("%(k)s" % {"k": "v"}) -46 | +46 | 47 | print("%(k)s" % { | _______^ 48 | | "k": "v", 49 | | "i": "j" 50 | | }) | |_^ UP031 -51 | +51 | 52 | print("%(to_list)s" % {"to_list": []}) | = help: Replace with format specifiers @@ -436,10 +434,10 @@ UP031_0.py:47:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:52:7: UP031 [*] Use format specifiers instead of percent format | 50 | }) -51 | +51 | 52 | print("%(to_list)s" % {"to_list": []}) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP031 -53 | +53 | 54 | print("%(k)s" % {"k": "v", "i": 1, "j": []}) | = help: Replace with format specifiers @@ -457,10 +455,10 @@ UP031_0.py:52:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:54:7: UP031 [*] Use format specifiers instead of percent format | 52 | print("%(to_list)s" % {"to_list": []}) -53 | +53 | 54 | print("%(k)s" % {"k": "v", "i": 1, "j": []}) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP031 -55 | +55 | 56 | print("%(ab)s" % {"a" "b": 1}) | = help: Replace with format specifiers @@ -478,10 +476,10 @@ UP031_0.py:54:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:56:7: UP031 [*] Use format specifiers instead of percent format | 54 | print("%(k)s" % {"k": "v", "i": 1, "j": []}) -55 | +55 | 56 | print("%(ab)s" % {"a" "b": 1}) | ^^^^^^^^^^^^^^^^^^^^^^^ UP031 -57 | +57 | 58 | print("%(a)s" % {"a" : 1}) | = help: Replace with format specifiers @@ -499,7 +497,7 @@ UP031_0.py:56:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:58:7: UP031 [*] Use format specifiers instead of percent format | 56 | print("%(ab)s" % {"a" "b": 1}) -57 | +57 | 58 | print("%(a)s" % {"a" : 1}) | ^^^^^^^^^^^^^^^^^^^^^ UP031 | @@ -518,8 +516,7 @@ UP031_0.py:58:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:62:5: UP031 [*] Use format specifiers instead of percent format | 61 | print( -62 | "foo %(foo)s " - | _____^ +62 | / "foo %(foo)s " 63 | | "bar %(bar)s" % {"foo": x, "bar": y} | |________________________________________^ UP031 64 | ) @@ -542,8 +539,7 @@ UP031_0.py:68:5: UP031 [*] Use format specifiers instead of percent format | 66 | bar = {"bar": y} 67 | print( -68 | "foo %(foo)s " - | _____^ +68 | / "foo %(foo)s " 69 | | "bar %(bar)s" % {"foo": x, **bar} | |_____________________________________^ UP031 70 | ) @@ -565,10 +561,10 @@ UP031_0.py:68:5: UP031 [*] Use format specifiers instead of percent format UP031_0.py:72:7: UP031 [*] Use format specifiers instead of percent format | 70 | ) -71 | +71 | 72 | print("%s \N{snowman}" % (a,)) | ^^^^^^^^^^^^^^^^^^^^^^^ UP031 -73 | +73 | 74 | print("%(foo)s \N{snowman}" % {"foo": 1}) | = help: Replace with format specifiers @@ -586,10 +582,10 @@ UP031_0.py:72:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:74:7: UP031 [*] Use format specifiers instead of percent format | 72 | print("%s \N{snowman}" % (a,)) -73 | +73 | 74 | print("%(foo)s \N{snowman}" % {"foo": 1}) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP031 -75 | +75 | 76 | print(("foo %s " "bar %s") % (x, y)) | = help: Replace with format specifiers @@ -607,10 +603,10 @@ UP031_0.py:74:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:76:7: UP031 [*] Use format specifiers instead of percent format | 74 | print("%(foo)s \N{snowman}" % {"foo": 1}) -75 | +75 | 76 | print(("foo %s " "bar %s") % (x, y)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP031 -77 | +77 | 78 | # Single-value expressions | = help: Replace with format specifiers @@ -776,7 +772,7 @@ UP031_0.py:86:7: UP031 [*] Use format specifiers instead of percent format 85 | print('Hello %(arg)s' % bar.baz) 86 | print('Hello %(arg)s' % bar['bop']) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP031 -87 | +87 | 88 | # Hanging modulos | = help: Replace with format specifiers @@ -799,7 +795,7 @@ UP031_0.py:89:1: UP031 [*] Use format specifiers instead of percent format 91 | | "bar %s" 92 | | ) % (x, y) | |__________^ UP031 -93 | +93 | 94 | ( | = help: Replace with format specifiers @@ -821,13 +817,13 @@ UP031_0.py:89:1: UP031 [*] Use format specifiers instead of percent format UP031_0.py:94:1: UP031 [*] Use format specifiers instead of percent format | 92 | ) % (x, y) -93 | +93 | 94 | / ( 95 | | "foo %(foo)s " 96 | | "bar %(bar)s" 97 | | ) % {"foo": x, "bar": y} | |________________________^ UP031 -98 | +98 | 99 | ( | = help: Replace with format specifiers @@ -849,8 +845,7 @@ UP031_0.py:94:1: UP031 [*] Use format specifiers instead of percent format UP031_0.py:100:5: UP031 [*] Use format specifiers instead of percent format | 99 | ( -100 | """foo %s""" - | _____^ +100 | / """foo %s""" 101 | | % (x,) | |__________^ UP031 102 | ) @@ -871,8 +866,7 @@ UP031_0.py:100:5: UP031 [*] Use format specifiers instead of percent format UP031_0.py:105:5: UP031 [*] Use format specifiers instead of percent format | 104 | ( -105 | """ - | _____^ +105 | / """ 106 | | foo %s 107 | | """ 108 | | % (x,) @@ -897,7 +891,7 @@ UP031_0.py:105:5: UP031 [*] Use format specifiers instead of percent format UP031_0.py:111:1: UP031 [*] Use format specifiers instead of percent format | 109 | ) -110 | +110 | 111 | / "%s" % ( 112 | | x, # comment 113 | | ) @@ -919,12 +913,12 @@ UP031_0.py:116:8: UP031 [*] Use format specifiers instead of percent format | 116 | path = "%s-%s-%s.pem" % ( | ________^ -117 | | safe_domain_name(cn), # common name, which should be filename safe because it is IDNA-encoded, but in case of a malformed cert make sure it's ok to use as a filename +117 | | safe_domain_name(cn), # common name, which should be filename safe because it is IDNA-encoded, but in case of a malformed cert ma… 118 | | cert.not_valid_after.date().isoformat().replace("-", ""), # expiration date 119 | | hexlify(cert.fingerprint(hashes.SHA256())).decode("ascii")[0:8], # fingerprint prefix 120 | | ) | |_^ UP031 -121 | +121 | 122 | # UP031 (no longer false negatives; now offer potentially unsafe fixes) | = help: Replace with format specifiers @@ -944,7 +938,7 @@ UP031_0.py:123:1: UP031 [*] Use format specifiers instead of percent format 122 | # UP031 (no longer false negatives; now offer potentially unsafe fixes) 123 | 'Hello %s' % bar | ^^^^^^^^^^^^^^^^ UP031 -124 | +124 | 125 | 'Hello %s' % bar.baz | = help: Replace with format specifiers @@ -962,10 +956,10 @@ UP031_0.py:123:1: UP031 [*] Use format specifiers instead of percent format UP031_0.py:125:1: UP031 [*] Use format specifiers instead of percent format | 123 | 'Hello %s' % bar -124 | +124 | 125 | 'Hello %s' % bar.baz | ^^^^^^^^^^^^^^^^^^^^ UP031 -126 | +126 | 127 | 'Hello %s' % bar['bop'] | = help: Replace with format specifiers @@ -983,10 +977,10 @@ UP031_0.py:125:1: UP031 [*] Use format specifiers instead of percent format UP031_0.py:127:1: UP031 [*] Use format specifiers instead of percent format | 125 | 'Hello %s' % bar.baz -126 | +126 | 127 | 'Hello %s' % bar['bop'] | ^^^^^^^^^^^^^^^^^^^^^^^ UP031 -128 | +128 | 129 | # Not a valid type annotation but this test shouldn't result in a panic. | = help: Replace with format specifiers @@ -1007,7 +1001,7 @@ UP031_0.py:131:5: UP031 [*] Use format specifiers instead of percent format 130 | # Refer: https://github.com/astral-sh/ruff/issues/11736 131 | x: "'%s + %s' % (1, 2)" | ^^^^^^^^^^^^^^^^^^ UP031 -132 | +132 | 133 | # See: https://github.com/astral-sh/ruff/issues/12421 | = help: Replace with format specifiers @@ -1110,7 +1104,7 @@ UP031_0.py:138:7: UP031 [*] Use format specifiers instead of percent format 137 | print("%.00002X" % 1) 138 | print("%.20X" % 1) | ^^^^^^^^^^^ UP031 -139 | +139 | 140 | print("%2X" % 1) | = help: Replace with format specifiers @@ -1128,7 +1122,7 @@ UP031_0.py:138:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:140:7: UP031 [*] Use format specifiers instead of percent format | 138 | print("%.20X" % 1) -139 | +139 | 140 | print("%2X" % 1) | ^^^^^^^^^ UP031 141 | print("%02X" % 1) @@ -1150,7 +1144,7 @@ UP031_0.py:141:7: UP031 [*] Use format specifiers instead of percent format 140 | print("%2X" % 1) 141 | print("%02X" % 1) | ^^^^^^^^^^ UP031 -142 | +142 | 143 | # UP031 (no longer false negatives, but offer no fix because of more complex syntax) | = help: Replace with format specifiers @@ -1168,10 +1162,10 @@ UP031_0.py:141:7: UP031 [*] Use format specifiers instead of percent format UP031_0.py:145:1: UP031 Use format specifiers instead of percent format | 143 | # UP031 (no longer false negatives, but offer no fix because of more complex syntax) -144 | +144 | 145 | "%d.%d" % (a, b) | ^^^^^^^ UP031 -146 | +146 | 147 | "%*s" % (5, "hi") | = help: Replace with format specifiers @@ -1179,10 +1173,10 @@ UP031_0.py:145:1: UP031 Use format specifiers instead of percent format UP031_0.py:147:1: UP031 Use format specifiers instead of percent format | 145 | "%d.%d" % (a, b) -146 | +146 | 147 | "%*s" % (5, "hi") | ^^^^^ UP031 -148 | +148 | 149 | "%d" % (flt,) | = help: Replace with format specifiers @@ -1190,10 +1184,10 @@ UP031_0.py:147:1: UP031 Use format specifiers instead of percent format UP031_0.py:149:1: UP031 Use format specifiers instead of percent format | 147 | "%*s" % (5, "hi") -148 | +148 | 149 | "%d" % (flt,) | ^^^^ UP031 -150 | +150 | 151 | "%c" % (some_string,) | = help: Replace with format specifiers @@ -1201,10 +1195,10 @@ UP031_0.py:149:1: UP031 Use format specifiers instead of percent format UP031_0.py:151:1: UP031 Use format specifiers instead of percent format | 149 | "%d" % (flt,) -150 | +150 | 151 | "%c" % (some_string,) | ^^^^ UP031 -152 | +152 | 153 | "%.2r" % (1.25) | = help: Replace with format specifiers @@ -1212,10 +1206,10 @@ UP031_0.py:151:1: UP031 Use format specifiers instead of percent format UP031_0.py:153:1: UP031 Use format specifiers instead of percent format | 151 | "%c" % (some_string,) -152 | +152 | 153 | "%.2r" % (1.25) | ^^^^^^ UP031 -154 | +154 | 155 | "%.*s" % (5, "hi") | = help: Replace with format specifiers @@ -1223,10 +1217,10 @@ UP031_0.py:153:1: UP031 Use format specifiers instead of percent format UP031_0.py:155:1: UP031 Use format specifiers instead of percent format | 153 | "%.2r" % (1.25) -154 | +154 | 155 | "%.*s" % (5, "hi") | ^^^^^^ UP031 -156 | +156 | 157 | "%i" % (flt,) | = help: Replace with format specifiers @@ -1234,10 +1228,10 @@ UP031_0.py:155:1: UP031 Use format specifiers instead of percent format UP031_0.py:157:1: UP031 Use format specifiers instead of percent format | 155 | "%.*s" % (5, "hi") -156 | +156 | 157 | "%i" % (flt,) | ^^^^ UP031 -158 | +158 | 159 | "%()s" % {"": "empty"} | = help: Replace with format specifiers @@ -1245,10 +1239,10 @@ UP031_0.py:157:1: UP031 Use format specifiers instead of percent format UP031_0.py:159:1: UP031 Use format specifiers instead of percent format | 157 | "%i" % (flt,) -158 | +158 | 159 | "%()s" % {"": "empty"} | ^^^^^^ UP031 -160 | +160 | 161 | "%s" % {"k": "v"} | = help: Replace with format specifiers @@ -1256,10 +1250,10 @@ UP031_0.py:159:1: UP031 Use format specifiers instead of percent format UP031_0.py:161:1: UP031 Use format specifiers instead of percent format | 159 | "%()s" % {"": "empty"} -160 | +160 | 161 | "%s" % {"k": "v"} | ^^^^ UP031 -162 | +162 | 163 | "%()s" % {"": "bar"} | = help: Replace with format specifiers @@ -1267,10 +1261,10 @@ UP031_0.py:161:1: UP031 Use format specifiers instead of percent format UP031_0.py:163:1: UP031 Use format specifiers instead of percent format | 161 | "%s" % {"k": "v"} -162 | +162 | 163 | "%()s" % {"": "bar"} | ^^^^^^ UP031 -164 | +164 | 165 | "%(1)s" % {"1": "bar"} | = help: Replace with format specifiers @@ -1278,10 +1272,10 @@ UP031_0.py:163:1: UP031 Use format specifiers instead of percent format UP031_0.py:165:1: UP031 Use format specifiers instead of percent format | 163 | "%()s" % {"": "bar"} -164 | +164 | 165 | "%(1)s" % {"1": "bar"} | ^^^^^^^ UP031 -166 | +166 | 167 | "%(a)s" % {"a": 1, "a": 2} | = help: Replace with format specifiers @@ -1289,10 +1283,10 @@ UP031_0.py:165:1: UP031 Use format specifiers instead of percent format UP031_0.py:167:1: UP031 Use format specifiers instead of percent format | 165 | "%(1)s" % {"1": "bar"} -166 | +166 | 167 | "%(a)s" % {"a": 1, "a": 2} | ^^^^^^^ UP031 -168 | +168 | 169 | "%(1)s" % {1: 2, "1": 2} | = help: Replace with format specifiers @@ -1300,10 +1294,10 @@ UP031_0.py:167:1: UP031 Use format specifiers instead of percent format UP031_0.py:169:1: UP031 Use format specifiers instead of percent format | 167 | "%(a)s" % {"a": 1, "a": 2} -168 | +168 | 169 | "%(1)s" % {1: 2, "1": 2} | ^^^^^^^ UP031 -170 | +170 | 171 | "%(and)s" % {"and": 2} | = help: Replace with format specifiers @@ -1311,7 +1305,7 @@ UP031_0.py:169:1: UP031 Use format specifiers instead of percent format UP031_0.py:171:1: UP031 Use format specifiers instead of percent format | 169 | "%(1)s" % {1: 2, "1": 2} -170 | +170 | 171 | "%(and)s" % {"and": 2} | ^^^^^^^^^ UP031 |