From b40a40b117606a26aa2f48081667014ff17fffa8 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 31 Mar 2025 12:21:19 +0200 Subject: [PATCH 1/6] [pyflakes] Update to 3.3.* Replace or comment instances of `typing.Any`. --- stubs/pyflakes/@tests/stubtest_allowlist.txt | 1 + stubs/pyflakes/METADATA.toml | 2 +- stubs/pyflakes/pyflakes/api.pyi | 8 +- stubs/pyflakes/pyflakes/checker.pyi | 2 - stubs/pyflakes/pyflakes/messages.pyi | 113 ++++++++++--------- 5 files changed, 65 insertions(+), 61 deletions(-) diff --git a/stubs/pyflakes/@tests/stubtest_allowlist.txt b/stubs/pyflakes/@tests/stubtest_allowlist.txt index 3ea3547712bd..c803fc98bd1b 100644 --- a/stubs/pyflakes/@tests/stubtest_allowlist.txt +++ b/stubs/pyflakes/@tests/stubtest_allowlist.txt @@ -22,4 +22,5 @@ pyflakes.messages.UndefinedLocal.message_args pyflakes.messages.UndefinedName.message_args pyflakes.messages.UnusedAnnotation.message_args pyflakes.messages.UnusedImport.message_args +pyflakes.messages.UnusedIndirectAssignment.message_args pyflakes.messages.UnusedVariable.message_args diff --git a/stubs/pyflakes/METADATA.toml b/stubs/pyflakes/METADATA.toml index 0974abae9341..c9441665253a 100644 --- a/stubs/pyflakes/METADATA.toml +++ b/stubs/pyflakes/METADATA.toml @@ -1,4 +1,4 @@ -version = "3.2.*" +version = "3.3.*" upstream_repository = "https://github.com/PyCQA/pyflakes" partial_stub = true diff --git a/stubs/pyflakes/pyflakes/api.pyi b/stubs/pyflakes/pyflakes/api.pyi index 3cf6893906eb..59dc4ca8affe 100644 --- a/stubs/pyflakes/pyflakes/api.pyi +++ b/stubs/pyflakes/pyflakes/api.pyi @@ -1,6 +1,6 @@ +from _typeshed import Incomplete from collections.abc import Iterable, Iterator, Sequence from re import Pattern -from typing import Any from pyflakes.reporter import Reporter @@ -11,6 +11,6 @@ PYTHON_SHEBANG_REGEX: Pattern[bytes] def check(codeString: str, filename: str, reporter: Reporter | None = None) -> int: ... def checkPath(filename, reporter: Reporter | None = None) -> int: ... def isPythonFile(filename) -> bool: ... -def iterSourceCode(paths: Iterable[Any]) -> Iterator[Any]: ... -def checkRecursive(paths: Iterable[Any], reporter: Reporter) -> int: ... -def main(prog: str | None = None, args: Sequence[Any] | None = None) -> None: ... +def iterSourceCode(paths: Iterable[Incomplete]) -> Iterator[Incomplete]: ... +def checkRecursive(paths: Iterable[Incomplete], reporter: Reporter) -> int: ... +def main(prog: str | None = None, args: Sequence[Incomplete] | None = None) -> None: ... diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 0d60f10dcd35..2f0375e0570c 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -33,8 +33,6 @@ def parse_percent_format(s: str) -> tuple[_PercentFormat, ...]: ... class _FieldsOrder(dict[type[ast.AST], tuple[str, ...]]): def __missing__(self, node_class: type[ast.AST]) -> tuple[str, ...]: ... -def counter(items: Iterable[_T]) -> dict[_T, int]: ... - _OmitType: TypeAlias = str | tuple[str, ...] | None def iter_child_nodes(node: ast.AST, omit: _OmitType = None, _fields_order: _FieldsOrder = ...) -> Iterator[ast.AST]: ... diff --git a/stubs/pyflakes/pyflakes/messages.pyi b/stubs/pyflakes/pyflakes/messages.pyi index 07371e5828b4..1338e037b354 100644 --- a/stubs/pyflakes/pyflakes/messages.pyi +++ b/stubs/pyflakes/pyflakes/messages.pyi @@ -1,83 +1,88 @@ import ast +from _typeshed import Incomplete from typing import Any, ClassVar class Message: message: ClassVar[str] - message_args: tuple[Any, ...] - filename: Any + message_args: tuple[Any, ...] # Tuple types differ between sub-classes. + filename: str lineno: int col: int - def __init__(self, filename, loc: ast.AST) -> None: ... + def __init__(self, filename: str, loc: ast.AST) -> None: ... class UnusedImport(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, name) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, name) -> None: ... class RedefinedWhileUnused(Message): - message_args: tuple[Any, int] - def __init__(self, filename, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... + message_args: tuple[Incomplete, int] + def __init__(self, filename: str, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... class ImportShadowedByLoopVar(Message): - message_args: tuple[Any, int] - def __init__(self, filename, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... + message_args: tuple[Incomplete, int] + def __init__(self, filename: str, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... class ImportStarNotPermitted(Message): - message_args: Any - def __init__(self, filename, loc, modname) -> None: ... + message_args: Incomplete + def __init__(self, filename: str, loc, modname) -> None: ... class ImportStarUsed(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, modname) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, modname) -> None: ... class ImportStarUsage(Message): - message_args: tuple[Any, Any] - def __init__(self, filename, loc: ast.AST, name, from_list) -> None: ... + message_args: tuple[Incomplete, Incomplete] + def __init__(self, filename: str, loc: ast.AST, name, from_list) -> None: ... class UndefinedName(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, name) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, name) -> None: ... class DoctestSyntaxError(Message): message_args: tuple[()] - def __init__(self, filename, loc: ast.AST, position: tuple[int, int] | None = None) -> None: ... + def __init__(self, filename: str, loc: ast.AST, position: tuple[int, int] | None = None) -> None: ... class UndefinedExport(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, name) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, name) -> None: ... class UndefinedLocal(Message): default: ClassVar[str] builtin: ClassVar[str] - message_args: tuple[Any, int] - def __init__(self, filename, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... + message_args: tuple[Incomplete, int] + def __init__(self, filename: str, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... class DuplicateArgument(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, name) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, name) -> None: ... class MultiValueRepeatedKeyLiteral(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, key) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, key) -> None: ... class MultiValueRepeatedKeyVariable(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, key) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, key) -> None: ... class LateFutureImport(Message): message_args: tuple[()] - def __init__(self, filename, loc: ast.AST) -> None: ... + def __init__(self, filename: str, loc: ast.AST) -> None: ... class FutureFeatureNotDefined(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, name) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, name) -> None: ... class UnusedVariable(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, names) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, names) -> None: ... class UnusedAnnotation(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, names) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, names) -> None: ... + +class UnusedIndirectAssignment(Message): + message_args: tuple[str, str] + def __init__(self, filename: str, loc: ast.AST, name: str) -> None: ... class ReturnOutsideFunction(Message): ... class YieldOutsideFunction(Message): ... @@ -90,8 +95,8 @@ class IfTuple(Message): ... class AssertTuple(Message): ... class ForwardAnnotationSyntaxError(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, annotation) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, annotation) -> None: ... class RaiseNotImplemented(Message): ... class InvalidPrintSyntax(Message): ... @@ -99,44 +104,44 @@ class IsLiteral(Message): ... class FStringMissingPlaceholders(Message): ... class StringDotFormatExtraPositionalArguments(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, extra_positions) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, extra_positions) -> None: ... class StringDotFormatExtraNamedArguments(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, extra_keywords) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, extra_keywords) -> None: ... class StringDotFormatMissingArgument(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, missing_arguments) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, missing_arguments) -> None: ... class StringDotFormatMixingAutomatic(Message): ... class StringDotFormatInvalidFormat(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, error) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, error) -> None: ... class PercentFormatInvalidFormat(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, error) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, error) -> None: ... class PercentFormatMixedPositionalAndNamed(Message): ... class PercentFormatUnsupportedFormatCharacter(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, c) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, c) -> None: ... class PercentFormatPositionalCountMismatch(Message): message_args: tuple[int, int] - def __init__(self, filename, loc: ast.AST, n_placeholders: int, n_substitutions: int) -> None: ... + def __init__(self, filename: str, loc: ast.AST, n_placeholders: int, n_substitutions: int) -> None: ... class PercentFormatExtraNamedArguments(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, extra_keywords) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, extra_keywords) -> None: ... class PercentFormatMissingArgument(Message): - message_args: tuple[Any] - def __init__(self, filename, loc: ast.AST, missing_arguments) -> None: ... + message_args: tuple[Incomplete] + def __init__(self, filename: str, loc: ast.AST, missing_arguments) -> None: ... class PercentFormatExpectedMapping(Message): ... class PercentFormatExpectedSequence(Message): ... From 39f285235ecfc705c9c01c95dde9ff943ce0defd Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 31 Mar 2025 12:28:06 +0200 Subject: [PATCH 2/6] Remove unused type var --- stubs/pyflakes/pyflakes/checker.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 2f0375e0570c..c20448cab698 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -11,7 +11,6 @@ from pyflakes.messages import Message _AnyFunction: TypeAlias = Callable[..., Any] _F = TypeVar("_F", bound=_AnyFunction) _P = ParamSpec("_P") -_T = TypeVar("_T") PYPY: bool From e0fa6b99deb21433c41e9b40771314bf118bb379 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 31 Mar 2025 12:29:15 +0200 Subject: [PATCH 3/6] Replace more instances of `Any` --- stubs/pyflakes/pyflakes/checker.pyi | 45 +++++++++++++++-------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index c20448cab698..388a3b831c1c 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -1,5 +1,6 @@ import ast import sys +from _typeshed import Incomplete from collections.abc import Callable, Generator, Iterable, Iterator from contextlib import contextmanager from re import Pattern @@ -40,9 +41,9 @@ def convert_to_value(item: ast.Str) -> str: ... # type: ignore[overload-overlap @overload def convert_to_value(item: ast.Bytes) -> bytes: ... # type: ignore[overload-overlap] @overload -def convert_to_value(item: ast.Tuple) -> tuple[Any, ...]: ... # type: ignore[overload-overlap] +def convert_to_value(item: ast.Tuple) -> tuple[Incomplete, ...]: ... # type: ignore[overload-overlap] @overload -def convert_to_value(item: ast.Name | ast.NameConstant) -> Any: ... +def convert_to_value(item: ast.Name | ast.NameConstant) -> Incomplete: ... @overload def convert_to_value(item: ast.AST) -> UnhandledKeyType: ... def is_notimplemented_name_node(node: object) -> bool: ... @@ -50,7 +51,7 @@ def is_notimplemented_name_node(node: object) -> bool: ... class Binding: name: str source: ast.AST | None - used: Literal[False] | tuple[Any, ast.AST] + used: Literal[False] | tuple[Incomplete, ast.AST] def __init__(self, name: str, source: ast.AST | None) -> None: ... def redefines(self, other: Binding) -> bool: ... @@ -69,7 +70,7 @@ class VariableKey: class Importation(Definition): fullName: str - redefined: list[Any] + redefined: list[Incomplete] def __init__(self, name: str, source: ast.AST | None, full_name: str | None = None) -> None: ... @property def source_statement(self) -> str: ... @@ -86,7 +87,7 @@ class StarImportation(Importation): def __init__(self, name: str, source: ast.AST) -> None: ... class FutureImportation(ImportationFrom): - used: tuple[Any, ast.AST] + used: tuple[Incomplete, ast.AST] def __init__(self, name: str, source: ast.AST, scope) -> None: ... class Argument(Binding): ... @@ -111,7 +112,7 @@ class FunctionScope(Scope): usesLocals: bool alwaysUsed: ClassVar[set[str]] globals: set[str] - returnValue: Any + returnValue: Incomplete isGenerator: bool def __init__(self) -> None: ... def unused_assignments(self) -> Iterator[tuple[str, Binding]]: ... @@ -151,34 +152,34 @@ if sys.version_info >= (3, 10): _MatchAs: TypeAlias = ast.MatchAs _MatchOr: TypeAlias = ast.MatchOr else: - _Match: TypeAlias = Any - _MatchCase: TypeAlias = Any - _MatchValue: TypeAlias = Any - _MatchSingleton: TypeAlias = Any - _MatchSequence: TypeAlias = Any - _MatchStar: TypeAlias = Any - _MatchMapping: TypeAlias = Any - _MatchClass: TypeAlias = Any - _MatchAs: TypeAlias = Any - _MatchOr: TypeAlias = Any + _Match: TypeAlias = Incomplete + _MatchCase: TypeAlias = Incomplete + _MatchValue: TypeAlias = Incomplete + _MatchSingleton: TypeAlias = Incomplete + _MatchSequence: TypeAlias = Incomplete + _MatchStar: TypeAlias = Incomplete + _MatchMapping: TypeAlias = Incomplete + _MatchClass: TypeAlias = Incomplete + _MatchAs: TypeAlias = Incomplete + _MatchOr: TypeAlias = Incomplete if sys.version_info >= (3, 12): _TypeVar: TypeAlias = ast.TypeVar _TypeAlias: TypeAlias = ast.TypeAlias else: - _TypeVar: TypeAlias = Any - _TypeAlias: TypeAlias = Any + _TypeVar: TypeAlias = Incomplete + _TypeAlias: TypeAlias = Incomplete class Checker: nodeDepth: int offset: tuple[int, int] | None builtIns: set[str] - deadScopes: list[Any] - messages: list[Any] + deadScopes: list[Incomplete] + messages: list[Incomplete] filename: str withDoctest: bool scopeStack: list[Scope] - exceptHandlers: list[Any] + exceptHandlers: list[Incomplete] root: ast.AST def __init__( self, @@ -186,7 +187,7 @@ class Checker: filename: str = "(none)", builtins: Iterable[str] | None = None, withDoctest: bool = False, - file_tokens: tuple[Any, ...] = (), + file_tokens: tuple[Incomplete, ...] = (), ) -> None: ... def deferFunction(self, callable: _AnyFunction) -> None: ... @property From 4eb2d985774fe54cfb5c6e8890d28c40c54c5753 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 31 Mar 2025 12:46:45 +0200 Subject: [PATCH 4/6] Re-annotate convert_to_value --- stubs/pyflakes/pyflakes/checker.pyi | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 388a3b831c1c..16cf66d824fe 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -37,13 +37,11 @@ _OmitType: TypeAlias = str | tuple[str, ...] | None def iter_child_nodes(node: ast.AST, omit: _OmitType = None, _fields_order: _FieldsOrder = ...) -> Iterator[ast.AST]: ... @overload -def convert_to_value(item: ast.Str) -> str: ... # type: ignore[overload-overlap] +def convert_to_value(item: ast.Constant) -> Any: ... # type: ignore[overload-overlap] # Any value allowed for ast.Constant.value @overload -def convert_to_value(item: ast.Bytes) -> bytes: ... # type: ignore[overload-overlap] +def convert_to_value(item: ast.Tuple) -> tuple[Any, ...]: ... # type: ignore[overload-overlap] # Items depend on their ast type @overload -def convert_to_value(item: ast.Tuple) -> tuple[Incomplete, ...]: ... # type: ignore[overload-overlap] -@overload -def convert_to_value(item: ast.Name | ast.NameConstant) -> Incomplete: ... +def convert_to_value(item: ast.Name) -> VariableKey: ... # type: ignore[overload-overlap] @overload def convert_to_value(item: ast.AST) -> UnhandledKeyType: ... def is_notimplemented_name_node(node: object) -> bool: ... From 10e88a5e6bf114958af10203b60f7ba66ae29528 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 31 Mar 2025 12:48:32 +0200 Subject: [PATCH 5/6] Annotate type aliases with Never --- stubs/pyflakes/pyflakes/checker.pyi | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 16cf66d824fe..9fa6cadbe063 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -5,7 +5,7 @@ from collections.abc import Callable, Generator, Iterable, Iterator from contextlib import contextmanager from re import Pattern from typing import Any, ClassVar, Literal, TypeVar, overload -from typing_extensions import ParamSpec, TypeAlias +from typing_extensions import Never, ParamSpec, TypeAlias from pyflakes.messages import Message @@ -150,23 +150,25 @@ if sys.version_info >= (3, 10): _MatchAs: TypeAlias = ast.MatchAs _MatchOr: TypeAlias = ast.MatchOr else: - _Match: TypeAlias = Incomplete - _MatchCase: TypeAlias = Incomplete - _MatchValue: TypeAlias = Incomplete - _MatchSingleton: TypeAlias = Incomplete - _MatchSequence: TypeAlias = Incomplete - _MatchStar: TypeAlias = Incomplete - _MatchMapping: TypeAlias = Incomplete - _MatchClass: TypeAlias = Incomplete - _MatchAs: TypeAlias = Incomplete - _MatchOr: TypeAlias = Incomplete + # The methods using these should never be called on Python < 3.10. + _Match: TypeAlias = Never + _MatchCase: TypeAlias = Never + _MatchValue: TypeAlias = Never + _MatchSingleton: TypeAlias = Never + _MatchSequence: TypeAlias = Never + _MatchStar: TypeAlias = Never + _MatchMapping: TypeAlias = Never + _MatchClass: TypeAlias = Never + _MatchAs: TypeAlias = Never + _MatchOr: TypeAlias = Never if sys.version_info >= (3, 12): _TypeVar: TypeAlias = ast.TypeVar _TypeAlias: TypeAlias = ast.TypeAlias else: - _TypeVar: TypeAlias = Incomplete - _TypeAlias: TypeAlias = Incomplete + # The methods using these should never be called on Python < 3.12. + _TypeVar: TypeAlias = Never + _TypeAlias: TypeAlias = Never class Checker: nodeDepth: int From e1dfe9c5d36599beb2a487d884cbe215707b7104 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Mon, 31 Mar 2025 12:50:21 +0200 Subject: [PATCH 6/6] Improve comments --- stubs/pyflakes/pyflakes/checker.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 9fa6cadbe063..51385f672324 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -37,9 +37,9 @@ _OmitType: TypeAlias = str | tuple[str, ...] | None def iter_child_nodes(node: ast.AST, omit: _OmitType = None, _fields_order: _FieldsOrder = ...) -> Iterator[ast.AST]: ... @overload -def convert_to_value(item: ast.Constant) -> Any: ... # type: ignore[overload-overlap] # Any value allowed for ast.Constant.value +def convert_to_value(item: ast.Constant) -> Any: ... # type: ignore[overload-overlap] # See ast.Constant.value for possible return types @overload -def convert_to_value(item: ast.Tuple) -> tuple[Any, ...]: ... # type: ignore[overload-overlap] # Items depend on their ast type +def convert_to_value(item: ast.Tuple) -> tuple[Any, ...]: ... # type: ignore[overload-overlap] # Tuple items depend on their ast type @overload def convert_to_value(item: ast.Name) -> VariableKey: ... # type: ignore[overload-overlap] @overload