From 5379a122c0e6623d3bceb747f4876a5aaa5b1924 Mon Sep 17 00:00:00 2001 From: donBarbos Date: Thu, 17 Apr 2025 17:23:44 +0400 Subject: [PATCH 1/5] Improve `pyflakes` --- stubs/pyflakes/@tests/stubtest_allowlist.txt | 4 ++ stubs/pyflakes/METADATA.toml | 4 -- stubs/pyflakes/pyflakes/__init__.pyi | 4 +- stubs/pyflakes/pyflakes/__main__.pyi | 1 + stubs/pyflakes/pyflakes/api.pyi | 15 ++--- stubs/pyflakes/pyflakes/checker.pyi | 49 +++++++++++----- stubs/pyflakes/pyflakes/messages.pyi | 60 ++++++++++---------- stubs/pyflakes/pyflakes/reporter.pyi | 12 ++-- 8 files changed, 89 insertions(+), 60 deletions(-) create mode 100644 stubs/pyflakes/pyflakes/__main__.pyi diff --git a/stubs/pyflakes/@tests/stubtest_allowlist.txt b/stubs/pyflakes/@tests/stubtest_allowlist.txt index c803fc98bd1b..109ee305c802 100644 --- a/stubs/pyflakes/@tests/stubtest_allowlist.txt +++ b/stubs/pyflakes/@tests/stubtest_allowlist.txt @@ -3,6 +3,7 @@ pyflakes.messages.DuplicateArgument.message_args pyflakes.messages.ForwardAnnotationSyntaxError.message_args pyflakes.messages.FutureFeatureNotDefined.message_args pyflakes.messages.ImportShadowedByLoopVar.message_args +pyflakes.messages.ImportStarNotPermitted.message_args pyflakes.messages.ImportStarUsage.message_args pyflakes.messages.ImportStarUsed.message_args pyflakes.messages.MultiValueRepeatedKeyLiteral.message_args @@ -24,3 +25,6 @@ pyflakes.messages.UnusedAnnotation.message_args pyflakes.messages.UnusedImport.message_args pyflakes.messages.UnusedIndirectAssignment.message_args pyflakes.messages.UnusedVariable.message_args + +# Tests are not included: +pyflakes.test.* diff --git a/stubs/pyflakes/METADATA.toml b/stubs/pyflakes/METADATA.toml index 615ddbc4e61b..2308bd579d7b 100644 --- a/stubs/pyflakes/METADATA.toml +++ b/stubs/pyflakes/METADATA.toml @@ -1,6 +1,2 @@ version = "~=3.3.2" upstream_repository = "https://github.com/PyCQA/pyflakes" -partial_stub = true - -[tool.stubtest] -ignore_missing_stub = true diff --git a/stubs/pyflakes/pyflakes/__init__.pyi b/stubs/pyflakes/pyflakes/__init__.pyi index bda5b5a7f4cc..c5dd95466063 100644 --- a/stubs/pyflakes/pyflakes/__init__.pyi +++ b/stubs/pyflakes/pyflakes/__init__.pyi @@ -1 +1,3 @@ -__version__: str +from typing import Final + +__version__: Final[str] diff --git a/stubs/pyflakes/pyflakes/__main__.pyi b/stubs/pyflakes/pyflakes/__main__.pyi new file mode 100644 index 000000000000..e70d627ae91d --- /dev/null +++ b/stubs/pyflakes/pyflakes/__main__.pyi @@ -0,0 +1 @@ +from pyflakes.api import main as main diff --git a/stubs/pyflakes/pyflakes/api.pyi b/stubs/pyflakes/pyflakes/api.pyi index 59dc4ca8affe..b2f910227c5a 100644 --- a/stubs/pyflakes/pyflakes/api.pyi +++ b/stubs/pyflakes/pyflakes/api.pyi @@ -1,16 +1,17 @@ -from _typeshed import Incomplete +from _typeshed import GenericPath from collections.abc import Iterable, Iterator, Sequence from re import Pattern +from typing import Final, NoReturn from pyflakes.reporter import Reporter __all__ = ["check", "checkPath", "checkRecursive", "iterSourceCode", "main"] -PYTHON_SHEBANG_REGEX: Pattern[bytes] +PYTHON_SHEBANG_REGEX: Final[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[Incomplete]) -> Iterator[Incomplete]: ... -def checkRecursive(paths: Iterable[Incomplete], reporter: Reporter) -> int: ... -def main(prog: str | None = None, args: Sequence[Incomplete] | None = None) -> None: ... +def checkPath(filename: str, reporter: Reporter | None = None) -> int: ... +def isPythonFile(filename: str) -> bool: ... +def iterSourceCode(paths: Iterable[GenericPath[str]]) -> Iterator[GenericPath[str]]: ... +def checkRecursive(paths: Iterable[GenericPath[str]], reporter: Reporter) -> int: ... +def main(prog: str | None = None, args: Sequence[str] | None = None) -> NoReturn: ... diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 1736ae44cff1..7d12470abd4a 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -1,10 +1,10 @@ import ast import sys -from _typeshed import Incomplete +from _typeshed import Incomplete, StrOrLiteralStr 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 import Any, ClassVar, Final, Literal, TypeVar, overload from typing_extensions import Never, ParamSpec, TypeAlias from pyflakes.messages import Message @@ -13,16 +13,25 @@ _AnyFunction: TypeAlias = Callable[..., Any] _F = TypeVar("_F", bound=_AnyFunction) _P = ParamSpec("_P") -PYPY: bool +PYPY: Final[bool] +builtin_vars: Final[list[str]] -def getAlternatives(n: ast.If | ast.Try) -> list[ast.AST]: ... +def parse_format_string( + format_string: StrOrLiteralStr, +) -> Iterable[tuple[StrOrLiteralStr, StrOrLiteralStr | None, StrOrLiteralStr | None, StrOrLiteralStr | None]]: ... -FOR_TYPES: tuple[type[ast.For], type[ast.AsyncFor]] -MAPPING_KEY_RE: Pattern[str] -CONVERSION_FLAG_RE: Pattern[str] -WIDTH_RE: Pattern[str] -PRECISION_RE: Pattern[str] -LENGTH_RE: Pattern[str] +if sys.version_info >= (3, 10): + def getAlternatives(n: ast.If | ast.Try | ast.Match) -> list[ast.AST]: ... + +else: + def getAlternatives(n: ast.If | ast.Try) -> list[ast.AST]: ... + +FOR_TYPES: Final[tuple[type[ast.For], type[ast.AsyncFor]]] +MAPPING_KEY_RE: Final[Pattern[str]] +CONVERSION_FLAG_RE: Final[Pattern[str]] +WIDTH_RE: Final[Pattern[str]] +PRECISION_RE: Final[Pattern[str]] +LENGTH_RE: Final[Pattern[str]] VALID_CONVERSIONS: frozenset[str] _FormatType: TypeAlias = tuple[str | None, str | None, str | None, str | None, str] @@ -44,7 +53,7 @@ def convert_to_value(item: ast.Tuple) -> tuple[Any, ...]: ... # type: ignore[ov 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: ... +def is_notimplemented_name_node(node: ast.AST) -> bool: ... class Binding: name: str @@ -90,6 +99,7 @@ class FutureImportation(ImportationFrom): class Argument(Binding): ... class Assignment(Binding): ... +class NamedExprAssignment(Assignment): ... class Annotation(Binding): def redefines(self, other: Binding) -> Literal[False]: ... @@ -165,18 +175,22 @@ else: if sys.version_info >= (3, 12): _TypeVar: TypeAlias = ast.TypeVar + _ParamSpec: TypeAlias = ast.ParamSpec + _TypeVarTuple: TypeAlias = ast.TypeVarTuple _TypeAlias: TypeAlias = ast.TypeAlias else: # The methods using these should never be called on Python < 3.12. _TypeVar: TypeAlias = Never + _ParamSpec: TypeAlias = Never + _TypeVarTuple: TypeAlias = Never _TypeAlias: TypeAlias = Never class Checker: nodeDepth: int offset: tuple[int, int] | None builtIns: set[str] - deadScopes: list[Incomplete] - messages: list[Incomplete] + deadScopes: list[Scope] + messages: list[Message] filename: str withDoctest: bool scopeStack: list[Scope] @@ -211,7 +225,7 @@ class Checker: def getScopeNode(self, node: ast.AST) -> ast.AST | None: ... def differentForks(self, lnode: ast.AST, rnode: ast.AST) -> bool: ... def addBinding(self, node: ast.AST, value: Binding) -> None: ... - def getNodeHandler(self, node_class: type[ast.AST]): ... + def getNodeHandler(self, node_class: type[ast.AST]) -> Callable[[ast.AST], None]: ... def handleNodeLoad(self, node: ast.AST, parent: ast.AST) -> None: ... def handleNodeStore(self, node: ast.AST) -> None: ... def handleNodeDelete(self, node: ast.AST) -> None: ... @@ -318,6 +332,11 @@ class Checker: def IMPORT(self, node: ast.Import) -> None: ... def IMPORTFROM(self, node: ast.ImportFrom) -> None: ... def TRY(self, node: ast.Try) -> None: ... + if sys.version_info >= (3, 11): + def TRYSTAR(self, node: ast.TryStar) -> None: ... + else: + def TRYSTAR(self, node: ast.Try) -> None: ... + def EXCEPTHANDLER(self, node: ast.ExceptHandler) -> None: ... def ANNASSIGN(self, node: ast.AnnAssign) -> None: ... def COMPARE(self, node: ast.Compare) -> None: ... @@ -332,4 +351,6 @@ class Checker: def MATCHMAPPING(self, node: _MatchMapping) -> None: ... def MATCHSTAR(self, node: _MatchStar) -> None: ... def TYPEVAR(self, node: _TypeVar) -> None: ... + def PARAMSPEC(self, node: _ParamSpec) -> None: ... + def TYPEVARTUPLE(self, node: _TypeVarTuple) -> None: ... def TYPEALIAS(self, node: _TypeAlias) -> None: ... diff --git a/stubs/pyflakes/pyflakes/messages.pyi b/stubs/pyflakes/pyflakes/messages.pyi index 1338e037b354..8848c0563b1b 100644 --- a/stubs/pyflakes/pyflakes/messages.pyi +++ b/stubs/pyflakes/pyflakes/messages.pyi @@ -11,40 +11,40 @@ class Message: def __init__(self, filename: str, loc: ast.AST) -> None: ... class UnusedImport(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, name) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, name: str) -> None: ... class RedefinedWhileUnused(Message): - message_args: tuple[Incomplete, int] - def __init__(self, filename: str, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... + message_args: tuple[str, int] + def __init__(self, filename: str, loc: ast.AST, name: str, orig_loc: ast.AST) -> None: ... class ImportShadowedByLoopVar(Message): - message_args: tuple[Incomplete, int] - def __init__(self, filename: str, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... + message_args: tuple[str, int] + def __init__(self, filename: str, loc: ast.AST, name: str, orig_loc: ast.AST) -> None: ... class ImportStarNotPermitted(Message): - message_args: Incomplete - def __init__(self, filename: str, loc, modname) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, modname: str) -> None: ... class ImportStarUsed(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, modname) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, modname: str) -> None: ... class ImportStarUsage(Message): message_args: tuple[Incomplete, Incomplete] def __init__(self, filename: str, loc: ast.AST, name, from_list) -> None: ... class UndefinedName(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, name) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, name: str) -> None: ... class DoctestSyntaxError(Message): message_args: tuple[()] def __init__(self, filename: str, loc: ast.AST, position: tuple[int, int] | None = None) -> None: ... class UndefinedExport(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, name) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, name: str) -> None: ... class UndefinedLocal(Message): default: ClassVar[str] @@ -104,44 +104,44 @@ class IsLiteral(Message): ... class FStringMissingPlaceholders(Message): ... class StringDotFormatExtraPositionalArguments(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, extra_positions) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, extra_positions: str) -> None: ... class StringDotFormatExtraNamedArguments(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, extra_keywords) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, extra_keywords: str) -> None: ... class StringDotFormatMissingArgument(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, missing_arguments) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, missing_arguments: str) -> None: ... class StringDotFormatMixingAutomatic(Message): ... class StringDotFormatInvalidFormat(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, error) -> None: ... + message_args: tuple[str] | tuple[Exception] + def __init__(self, filename: str, loc: ast.AST, error: str | Exception) -> None: ... class PercentFormatInvalidFormat(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, error) -> None: ... + message_args: tuple[str] | tuple[Exception] + def __init__(self, filename: str, loc: ast.AST, error: str | Exception) -> None: ... class PercentFormatMixedPositionalAndNamed(Message): ... class PercentFormatUnsupportedFormatCharacter(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, c) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, c: str) -> None: ... class PercentFormatPositionalCountMismatch(Message): message_args: tuple[int, int] def __init__(self, filename: str, loc: ast.AST, n_placeholders: int, n_substitutions: int) -> None: ... class PercentFormatExtraNamedArguments(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, extra_keywords) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, extra_keywords: str) -> None: ... class PercentFormatMissingArgument(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, missing_arguments) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, missing_arguments: str) -> None: ... class PercentFormatExpectedMapping(Message): ... class PercentFormatExpectedSequence(Message): ... diff --git a/stubs/pyflakes/pyflakes/reporter.pyi b/stubs/pyflakes/pyflakes/reporter.pyi index 5b15ee962578..31dc8398c145 100644 --- a/stubs/pyflakes/pyflakes/reporter.pyi +++ b/stubs/pyflakes/pyflakes/reporter.pyi @@ -1,5 +1,9 @@ +from typing import TextIO + +from .messages import Message + class Reporter: - def __init__(self, warningStream, errorStream) -> None: ... - def unexpectedError(self, filename, msg) -> None: ... - def syntaxError(self, filename, msg, lineno, offset, text) -> None: ... - def flake(self, message) -> None: ... + def __init__(self, warningStream: TextIO, errorStream: TextIO) -> None: ... + def unexpectedError(self, filename: str, msg: str) -> None: ... + def syntaxError(self, filename: str, msg: str, lineno: int, offset: int | None, text: str | None) -> None: ... + def flake(self, message: Message) -> None: ... From 7e8db300b9f8436883bde2a8a8eaf66d7acffc96 Mon Sep 17 00:00:00 2001 From: donBarbos Date: Thu, 17 Apr 2025 23:38:27 +0400 Subject: [PATCH 2/5] Complete stubs --- pyrightconfig.stricter.json | 1 - stubs/pyflakes/pyflakes/checker.pyi | 14 +++++------ stubs/pyflakes/pyflakes/messages.pyi | 37 ++++++++++++++-------------- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index 54d64e5f1529..a29499974fa2 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -73,7 +73,6 @@ "stubs/psycopg2", "stubs/pyasn1", "stubs/pycurl", - "stubs/pyflakes", "stubs/Pygments", "stubs/PyMySQL", "stubs/python-crontab", diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 7d12470abd4a..1f85b7a9112c 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -1,7 +1,7 @@ import ast import sys from _typeshed import Incomplete, StrOrLiteralStr -from collections.abc import Callable, Generator, Iterable, Iterator +from collections.abc import Callable, Generator, Iterable, Iterator, Sequence from contextlib import contextmanager from re import Pattern from typing import Any, ClassVar, Final, Literal, TypeVar, overload @@ -94,8 +94,8 @@ class StarImportation(Importation): def __init__(self, name: str, source: ast.AST) -> None: ... class FutureImportation(ImportationFrom): - used: tuple[Incomplete, ast.AST] - def __init__(self, name: str, source: ast.AST, scope) -> None: ... + used: tuple[Scope, ast.AST] + def __init__(self, name: str, source: ast.AST, scope: Scope) -> None: ... class Argument(Binding): ... class Assignment(Binding): ... @@ -139,7 +139,7 @@ def getNodeName(node: ast.AST) -> str: ... TYPING_MODULES: frozenset[Literal["typing", "typing_extensions"]] -def is_typing_overload(value: Binding, scope_stack) -> bool: ... +def is_typing_overload(value: Binding, scope_stack: Sequence[Scope]) -> bool: ... class AnnotationState: NONE: ClassVar[Literal[0]] @@ -226,14 +226,14 @@ class Checker: def differentForks(self, lnode: ast.AST, rnode: ast.AST) -> bool: ... def addBinding(self, node: ast.AST, value: Binding) -> None: ... def getNodeHandler(self, node_class: type[ast.AST]) -> Callable[[ast.AST], None]: ... - def handleNodeLoad(self, node: ast.AST, parent: ast.AST) -> None: ... + def handleNodeLoad(self, node: ast.AST, parent: ast.AST | None) -> None: ... def handleNodeStore(self, node: ast.AST) -> None: ... def handleNodeDelete(self, node: ast.AST) -> None: ... def handleChildren(self, tree: ast.AST, omit: _OmitType = None) -> None: ... def isLiteralTupleUnpacking(self, node: ast.AST) -> bool | None: ... def isDocstring(self, node: ast.AST) -> bool: ... def getDocstring(self, node: ast.AST) -> tuple[str, int] | tuple[None, None]: ... - def handleNode(self, node: ast.AST | None, parent) -> None: ... + def handleNode(self, node: ast.AST | None, parent: ast.AST | None) -> None: ... def handleDoctests(self, node: ast.AST) -> None: ... def handleStringAnnotation(self, s: str, node: ast.AST, ref_lineno: int, ref_col_offset: int, err: type[Message]) -> None: ... def handle_annotation_always_deferred(self, annotation: ast.AST, parent: ast.AST) -> None: ... @@ -325,7 +325,7 @@ class Checker: def LAMBDA(self, node: ast.Lambda) -> None: ... def ARGUMENTS(self, node: ast.arguments) -> None: ... def ARG(self, node: ast.arg) -> None: ... - def CLASSDEF(self, node: ast.ClassDef): ... + def CLASSDEF(self, node: ast.ClassDef) -> None: ... def AUGASSIGN(self, node: ast.AugAssign) -> None: ... def TUPLE(self, node: ast.Tuple) -> None: ... def LIST(self, node: ast.List) -> None: ... diff --git a/stubs/pyflakes/pyflakes/messages.pyi b/stubs/pyflakes/pyflakes/messages.pyi index 8848c0563b1b..cb7c3833a8d1 100644 --- a/stubs/pyflakes/pyflakes/messages.pyi +++ b/stubs/pyflakes/pyflakes/messages.pyi @@ -1,5 +1,4 @@ import ast -from _typeshed import Incomplete from typing import Any, ClassVar class Message: @@ -31,8 +30,8 @@ class ImportStarUsed(Message): def __init__(self, filename: str, loc: ast.AST, modname: str) -> None: ... class ImportStarUsage(Message): - message_args: tuple[Incomplete, Incomplete] - def __init__(self, filename: str, loc: ast.AST, name, from_list) -> None: ... + message_args: tuple[str, str] + def __init__(self, filename: str, loc: ast.AST, name: str, from_list: str) -> None: ... class UndefinedName(Message): message_args: tuple[str] @@ -49,36 +48,36 @@ class UndefinedExport(Message): class UndefinedLocal(Message): default: ClassVar[str] builtin: ClassVar[str] - message_args: tuple[Incomplete, int] - def __init__(self, filename: str, loc: ast.AST, name, orig_loc: ast.AST) -> None: ... + message_args: tuple[str, int] + def __init__(self, filename: str, loc: ast.AST, name: str, orig_loc: ast.AST) -> None: ... class DuplicateArgument(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, name) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, name: str) -> None: ... class MultiValueRepeatedKeyLiteral(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, key) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, key: str) -> None: ... class MultiValueRepeatedKeyVariable(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, key) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, key: str) -> None: ... class LateFutureImport(Message): message_args: tuple[()] def __init__(self, filename: str, loc: ast.AST) -> None: ... class FutureFeatureNotDefined(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, name) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, name: str) -> None: ... class UnusedVariable(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, names) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, names: str) -> None: ... class UnusedAnnotation(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, names) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, names: str) -> None: ... class UnusedIndirectAssignment(Message): message_args: tuple[str, str] @@ -95,8 +94,8 @@ class IfTuple(Message): ... class AssertTuple(Message): ... class ForwardAnnotationSyntaxError(Message): - message_args: tuple[Incomplete] - def __init__(self, filename: str, loc: ast.AST, annotation) -> None: ... + message_args: tuple[str] + def __init__(self, filename: str, loc: ast.AST, annotation: str) -> None: ... class RaiseNotImplemented(Message): ... class InvalidPrintSyntax(Message): ... From 6294fa8a1b573be02aa2c85a2ce93b1002e34dca Mon Sep 17 00:00:00 2001 From: donBarbos Date: Fri, 18 Apr 2025 00:07:21 +0400 Subject: [PATCH 3/5] Get rid of Incomplete --- stubs/pyflakes/pyflakes/checker.pyi | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/stubs/pyflakes/pyflakes/checker.pyi b/stubs/pyflakes/pyflakes/checker.pyi index 1f85b7a9112c..3f6dbc726b3f 100644 --- a/stubs/pyflakes/pyflakes/checker.pyi +++ b/stubs/pyflakes/pyflakes/checker.pyi @@ -1,6 +1,6 @@ import ast import sys -from _typeshed import Incomplete, StrOrLiteralStr +from _typeshed import StrOrLiteralStr, Unused from collections.abc import Callable, Generator, Iterable, Iterator, Sequence from contextlib import contextmanager from re import Pattern @@ -58,7 +58,7 @@ def is_notimplemented_name_node(node: ast.AST) -> bool: ... class Binding: name: str source: ast.AST | None - used: Literal[False] | tuple[Incomplete, ast.AST] + used: Literal[False] | tuple[Scope, ast.AST] def __init__(self, name: str, source: ast.AST | None) -> None: ... def redefines(self, other: Binding) -> bool: ... @@ -77,7 +77,7 @@ class VariableKey: class Importation(Definition): fullName: str - redefined: list[Incomplete] + redefined: list[ast.AST] def __init__(self, name: str, source: ast.AST | None, full_name: str | None = None) -> None: ... @property def source_statement(self) -> str: ... @@ -121,7 +121,7 @@ class FunctionScope(Scope): usesLocals: bool alwaysUsed: ClassVar[set[str]] globals: set[str] - returnValue: Incomplete + returnValue: ast.expr | None isGenerator: bool def __init__(self) -> None: ... def unused_assignments(self) -> Iterator[tuple[str, Binding]]: ... @@ -194,7 +194,7 @@ class Checker: filename: str withDoctest: bool scopeStack: list[Scope] - exceptHandlers: list[Incomplete] + exceptHandlers: list[tuple[()] | str] root: ast.AST def __init__( self, @@ -202,7 +202,7 @@ class Checker: filename: str = "(none)", builtins: Iterable[str] | None = None, withDoctest: bool = False, - file_tokens: tuple[Incomplete, ...] = (), + file_tokens: Unused = (), ) -> None: ... def deferFunction(self, callable: _AnyFunction) -> None: ... @property From d943de927c1f511f11dccbafbceb7c3cf5868c8d Mon Sep 17 00:00:00 2001 From: Semyon Moroz Date: Mon, 28 Apr 2025 12:26:54 +0000 Subject: [PATCH 4/5] Apply suggestions from code review Co-authored-by: Sebastian Rittau --- stubs/pyflakes/pyflakes/reporter.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stubs/pyflakes/pyflakes/reporter.pyi b/stubs/pyflakes/pyflakes/reporter.pyi index 31dc8398c145..df38a03bac07 100644 --- a/stubs/pyflakes/pyflakes/reporter.pyi +++ b/stubs/pyflakes/pyflakes/reporter.pyi @@ -1,9 +1,10 @@ +from _typeshed import SupportsWrite from typing import TextIO from .messages import Message class Reporter: - def __init__(self, warningStream: TextIO, errorStream: TextIO) -> None: ... + def __init__(self, warningStream: SupportsWrite[str], errorStream: SupportsWrite[str]) -> None: ... def unexpectedError(self, filename: str, msg: str) -> None: ... def syntaxError(self, filename: str, msg: str, lineno: int, offset: int | None, text: str | None) -> None: ... def flake(self, message: Message) -> None: ... From 2540385d2d3245f3d3f4117a269e6684de0be25b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 12:28:34 +0000 Subject: [PATCH 5/5] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/pyflakes/pyflakes/reporter.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stubs/pyflakes/pyflakes/reporter.pyi b/stubs/pyflakes/pyflakes/reporter.pyi index df38a03bac07..f6470e8c298e 100644 --- a/stubs/pyflakes/pyflakes/reporter.pyi +++ b/stubs/pyflakes/pyflakes/reporter.pyi @@ -1,5 +1,4 @@ from _typeshed import SupportsWrite -from typing import TextIO from .messages import Message