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/@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..3f6dbc726b3f 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 collections.abc import Callable, Generator, Iterable, Iterator +from _typeshed import StrOrLiteralStr, Unused +from collections.abc import Callable, Generator, Iterable, Iterator, Sequence 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,12 +53,12 @@ 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 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: ... @@ -68,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: ... @@ -85,11 +94,12 @@ 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): ... +class NamedExprAssignment(Assignment): ... class Annotation(Binding): def redefines(self, other: Binding) -> Literal[False]: ... @@ -111,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]]: ... @@ -129,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]] @@ -165,22 +175,26 @@ 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] - exceptHandlers: list[Incomplete] + exceptHandlers: list[tuple[()] | str] root: ast.AST def __init__( self, @@ -188,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 @@ -211,15 +225,15 @@ 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 handleNodeLoad(self, node: ast.AST, parent: ast.AST) -> None: ... + def getNodeHandler(self, node_class: type[ast.AST]) -> Callable[[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: ... @@ -311,13 +325,18 @@ 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: ... 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..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: @@ -11,74 +10,74 @@ 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: ... + 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[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] 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): ... @@ -104,44 +103,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..f6470e8c298e 100644 --- a/stubs/pyflakes/pyflakes/reporter.pyi +++ b/stubs/pyflakes/pyflakes/reporter.pyi @@ -1,5 +1,9 @@ +from _typeshed import SupportsWrite + +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: 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: ...