diff --git a/crates/ruff/resources/test/fixtures/pyupgrade/UP035.py b/crates/ruff/resources/test/fixtures/pyupgrade/UP035.py index 80c0eb966f..d0da69d47f 100644 --- a/crates/ruff/resources/test/fixtures/pyupgrade/UP035.py +++ b/crates/ruff/resources/test/fixtures/pyupgrade/UP035.py @@ -74,6 +74,8 @@ from typing import Collection from typing import AsyncGenerator from typing import Reversible from typing import Generator +from typing import Callable +from typing import cast # OK from a import b diff --git a/crates/ruff/src/rules/pyupgrade/rules/deprecated_import.rs b/crates/ruff/src/rules/pyupgrade/rules/deprecated_import.rs index b4898f8a07..6a2f385215 100644 --- a/crates/ruff/src/rules/pyupgrade/rules/deprecated_import.rs +++ b/crates/ruff/src/rules/pyupgrade/rules/deprecated_import.rs @@ -138,16 +138,52 @@ const PIPES_TO_SHLEX: &[&str] = &["quote"]; // Members of `typing_extensions` that were moved to `typing`. const TYPING_EXTENSIONS_TO_TYPING: &[&str] = &[ + "AbstractSet", + "AnyStr", "AsyncIterable", "AsyncIterator", "Awaitable", + "BinaryIO", + "Callable", "ClassVar", + "Collection", + "Container", "ContextManager", "Coroutine", "DefaultDict", + "Dict", + "FrozenSet", + "Generator", + "Generic", + "Hashable", + "IO", + "ItemsView", + "Iterable", + "Iterator", + "KeysView", + "List", + "Mapping", + "MappingView", + "Match", + "MutableMapping", + "MutableSequence", + "MutableSet", + "Optional", + "Pattern", + "Reversible", + "Sequence", + "Set", + "Sized", "TYPE_CHECKING", "Text", + "TextIO", + "Tuple", "Type", + "Union", + "ValuesView", + "cast", + "no_type_check", + "no_type_check_decorator", // Introduced in Python 3.5.2, but `typing_extensions` contains backported bugfixes and // optimizations, // "NewType", @@ -165,6 +201,7 @@ const TYPING_EXTENSIONS_TO_TYPING_37: &[&str] = &[ "ChainMap", "Counter", "Deque", + "ForwardRef", "NoReturn", ]; @@ -287,6 +324,18 @@ const TYPING_EXTENSIONS_TO_TYPING_311: &[&str] = &[ // Members of `typing_extensions` that were moved to `typing`. const TYPING_EXTENSIONS_TO_TYPING_312: &[&str] = &[ + "NamedTuple", + // Introduced in Python 3.8, but `typing_extensions` backports a ton of optimizations that were + // added in Python 3.12. + "Protocol", + "SupportsAbs", + "SupportsBytes", + "SupportsComplex", + "SupportsFloat", + "SupportsInt", + "SupportsRound", + "TypedDict", + "Unpack", // Introduced in Python 3.11, but `typing_extensions` backports the `frozen_default` argument, // which was introduced in Python 3.12. "dataclass_transform", diff --git a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap index 04319f36dc..323380add2 100644 --- a/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap +++ b/crates/ruff/src/rules/pyupgrade/snapshots/ruff__rules__pyupgrade__tests__UP035.py.snap @@ -931,7 +931,7 @@ UP035.py:74:1: UP035 [*] Import from `collections.abc` instead: `AsyncGenerator` 74 |+from collections.abc import AsyncGenerator 75 75 | from typing import Reversible 76 76 | from typing import Generator -77 77 | +77 77 | from typing import Callable UP035.py:75:1: UP035 [*] Import from `collections.abc` instead: `Reversible` | @@ -940,6 +940,7 @@ UP035.py:75:1: UP035 [*] Import from `collections.abc` instead: `Reversible` 75 | from typing import Reversible | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP035 76 | from typing import Generator +77 | from typing import Callable | = help: Import from `collections.abc` @@ -950,8 +951,8 @@ UP035.py:75:1: UP035 [*] Import from `collections.abc` instead: `Reversible` 75 |-from typing import Reversible 75 |+from collections.abc import Reversible 76 76 | from typing import Generator -77 77 | -78 78 | # OK +77 77 | from typing import Callable +78 78 | from typing import cast UP035.py:76:1: UP035 [*] Import from `collections.abc` instead: `Generator` | @@ -959,8 +960,8 @@ UP035.py:76:1: UP035 [*] Import from `collections.abc` instead: `Generator` 75 | from typing import Reversible 76 | from typing import Generator | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP035 -77 | -78 | # OK +77 | from typing import Callable +78 | from typing import cast | = help: Import from `collections.abc` @@ -970,23 +971,63 @@ UP035.py:76:1: UP035 [*] Import from `collections.abc` instead: `Generator` 75 75 | from typing import Reversible 76 |-from typing import Generator 76 |+from collections.abc import Generator -77 77 | -78 78 | # OK -79 79 | from a import b +77 77 | from typing import Callable +78 78 | from typing import cast +79 79 | -UP035.py:88:1: UP035 [*] Import from `typing` instead: `dataclass_transform` +UP035.py:77:1: UP035 [*] Import from `collections.abc` instead: `Callable` | -87 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). -88 | from typing_extensions import dataclass_transform +75 | from typing import Reversible +76 | from typing import Generator +77 | from typing import Callable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP035 +78 | from typing import cast + | + = help: Import from `collections.abc` + +ℹ Suggested fix +74 74 | from typing import AsyncGenerator +75 75 | from typing import Reversible +76 76 | from typing import Generator +77 |-from typing import Callable + 77 |+from collections.abc import Callable +78 78 | from typing import cast +79 79 | +80 80 | # OK + +UP035.py:87:1: UP035 [*] Import from `typing` instead: `NamedTuple` + | +86 | # Ok: `typing_extensions` contains backported improvements. +87 | from typing_extensions import NamedTuple + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP035 +88 | +89 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). + | + = help: Import from `typing` + +ℹ Suggested fix +84 84 | from typing_extensions import SupportsIndex +85 85 | +86 86 | # Ok: `typing_extensions` contains backported improvements. +87 |-from typing_extensions import NamedTuple + 87 |+from typing import NamedTuple +88 88 | +89 89 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). +90 90 | from typing_extensions import dataclass_transform + +UP035.py:90:1: UP035 [*] Import from `typing` instead: `dataclass_transform` + | +89 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). +90 | from typing_extensions import dataclass_transform | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP035 | = help: Import from `typing` ℹ Suggested fix -85 85 | from typing_extensions import NamedTuple -86 86 | -87 87 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). -88 |-from typing_extensions import dataclass_transform - 88 |+from typing import dataclass_transform +87 87 | from typing_extensions import NamedTuple +88 88 | +89 89 | # Ok: `typing_extensions` supports `frozen_default` (backported from 3.12). +90 |-from typing_extensions import dataclass_transform + 90 |+from typing import dataclass_transform