From e7ad3e64d36e450a9133c64e804c921d0fd0f204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Sun, 26 Feb 2023 21:47:30 +0100 Subject: Add ``invalid-name`` check for ``TypeAlias`` names (#7116) --- .../ext/typing/typing_broken_callable.py | 2 +- .../typing_broken_callable_deprecated_alias.py | 2 +- .../typing/typing_broken_callable_future_import.py | 2 +- .../ext/typing/typing_broken_noreturn.py | 6 +++++- .../ext/typing/typing_broken_noreturn.txt | 8 ++++---- .../typing/typing_broken_noreturn_future_import.py | 8 ++++++-- .../typing_broken_noreturn_future_import.txt | 2 +- .../ext/typing/typing_broken_noreturn_py372.py | 8 ++++++-- .../functional/r/regression_02/regression_3979.py | 2 +- .../functional/t/typealias_naming_style_default.py | 23 ++++++++++++++++++++++ .../functional/t/typealias_naming_style_default.rc | 2 ++ .../t/typealias_naming_style_default.txt | 10 ++++++++++ tests/functional/t/typealias_naming_style_rgx.py | 10 ++++++++++ tests/functional/t/typealias_naming_style_rgx.rc | 5 +++++ tests/functional/t/typealias_naming_style_rgx.txt | 2 ++ tests/lint/test_caching.py | 1 + 16 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 tests/functional/t/typealias_naming_style_default.py create mode 100644 tests/functional/t/typealias_naming_style_default.rc create mode 100644 tests/functional/t/typealias_naming_style_default.txt create mode 100644 tests/functional/t/typealias_naming_style_rgx.py create mode 100644 tests/functional/t/typealias_naming_style_rgx.rc create mode 100644 tests/functional/t/typealias_naming_style_rgx.txt (limited to 'tests') diff --git a/tests/functional/ext/typing/typing_broken_callable.py b/tests/functional/ext/typing/typing_broken_callable.py index 0713e17c8..f251e0e80 100644 --- a/tests/functional/ext/typing/typing_broken_callable.py +++ b/tests/functional/ext/typing/typing_broken_callable.py @@ -4,7 +4,7 @@ https://bugs.python.org/issue42965 Use 'typing.Callable' instead. """ -# pylint: disable=missing-docstring,unsubscriptable-object +# pylint: disable=missing-docstring,unsubscriptable-object,invalid-name import collections.abc from collections.abc import Callable from typing import TYPE_CHECKING, Optional, Union diff --git a/tests/functional/ext/typing/typing_broken_callable_deprecated_alias.py b/tests/functional/ext/typing/typing_broken_callable_deprecated_alias.py index f01592a59..5aab5b468 100644 --- a/tests/functional/ext/typing/typing_broken_callable_deprecated_alias.py +++ b/tests/functional/ext/typing/typing_broken_callable_deprecated_alias.py @@ -7,7 +7,7 @@ Use 'typing.Callable' instead. Don't emit 'deprecated-typing-alias' for 'Callable' if at least one replacement would create broken instances. """ -# pylint: disable=missing-docstring,unsubscriptable-object +# pylint: disable=missing-docstring,unsubscriptable-object,invalid-name from typing import Callable, Optional, Union Alias1 = Optional[Callable[[int], None]] diff --git a/tests/functional/ext/typing/typing_broken_callable_future_import.py b/tests/functional/ext/typing/typing_broken_callable_future_import.py index 947e060b9..8411168a5 100644 --- a/tests/functional/ext/typing/typing_broken_callable_future_import.py +++ b/tests/functional/ext/typing/typing_broken_callable_future_import.py @@ -4,7 +4,7 @@ https://bugs.python.org/issue42965 Use 'typing.Callable' instead. """ -# pylint: disable=missing-docstring,unsubscriptable-object +# pylint: disable=missing-docstring,unsubscriptable-object,invalid-name from __future__ import annotations import collections.abc diff --git a/tests/functional/ext/typing/typing_broken_noreturn.py b/tests/functional/ext/typing/typing_broken_noreturn.py index e7b5643ae..595e34cfd 100644 --- a/tests/functional/ext/typing/typing_broken_noreturn.py +++ b/tests/functional/ext/typing/typing_broken_noreturn.py @@ -4,7 +4,7 @@ https://bugs.python.org/issue34921 If no runtime introspection is required, use string annotations instead. """ -# pylint: disable=missing-docstring, broad-exception-raised +# pylint: disable=missing-docstring,broad-exception-raised,invalid-name import typing from typing import TYPE_CHECKING, Callable, NoReturn, Union @@ -14,15 +14,19 @@ import typing_extensions def func1() -> NoReturn: raise Exception + def func2() -> Union[None, NoReturn]: # [broken-noreturn] pass + def func3() -> Union[None, "NoReturn"]: pass + def func4() -> Union[None, typing.NoReturn]: # [broken-noreturn] pass + def func5() -> Union[None, typing_extensions.NoReturn]: # [broken-noreturn] pass diff --git a/tests/functional/ext/typing/typing_broken_noreturn.txt b/tests/functional/ext/typing/typing_broken_noreturn.txt index ce4503341..4e08844b2 100644 --- a/tests/functional/ext/typing/typing_broken_noreturn.txt +++ b/tests/functional/ext/typing/typing_broken_noreturn.txt @@ -1,4 +1,4 @@ -broken-noreturn:17:27:17:35:func2:'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE -broken-noreturn:23:27:23:42:func4:'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE -broken-noreturn:26:27:26:53:func5:'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE -broken-noreturn:31:23:31:31::'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE +broken-noreturn:18:27:18:35:func2:'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE +broken-noreturn:26:27:26:42:func4:'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE +broken-noreturn:30:27:30:53:func5:'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE +broken-noreturn:35:23:35:31::'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE diff --git a/tests/functional/ext/typing/typing_broken_noreturn_future_import.py b/tests/functional/ext/typing/typing_broken_noreturn_future_import.py index e0ea7761b..c58ed9c39 100644 --- a/tests/functional/ext/typing/typing_broken_noreturn_future_import.py +++ b/tests/functional/ext/typing/typing_broken_noreturn_future_import.py @@ -1,5 +1,5 @@ """ -'typing.NoReturn' is broken inside compond types for Python 3.7.0 +'typing.NoReturn' is broken inside compound types for Python 3.7.0 https://bugs.python.org/issue34921 If no runtime introspection is required, use string annotations instead. @@ -7,7 +7,7 @@ If no runtime introspection is required, use string annotations instead. With 'from __future__ import annotations', only emit errors for nodes not in a type annotation context. """ -# pylint: disable=missing-docstring, broad-exception-raised +# pylint: disable=missing-docstring,broad-exception-raised,invalid-name from __future__ import annotations import typing @@ -19,15 +19,19 @@ import typing_extensions def func1() -> NoReturn: raise Exception + def func2() -> Union[None, NoReturn]: pass + def func3() -> Union[None, "NoReturn"]: pass + def func4() -> Union[None, typing.NoReturn]: pass + def func5() -> Union[None, typing_extensions.NoReturn]: pass diff --git a/tests/functional/ext/typing/typing_broken_noreturn_future_import.txt b/tests/functional/ext/typing/typing_broken_noreturn_future_import.txt index 891a3a4d8..10a9eea8a 100644 --- a/tests/functional/ext/typing/typing_broken_noreturn_future_import.txt +++ b/tests/functional/ext/typing/typing_broken_noreturn_future_import.txt @@ -1 +1 @@ -broken-noreturn:36:23:36:31::'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE +broken-noreturn:40:23:40:31::'NoReturn' inside compound types is broken in 3.7.0 / 3.7.1:INFERENCE diff --git a/tests/functional/ext/typing/typing_broken_noreturn_py372.py b/tests/functional/ext/typing/typing_broken_noreturn_py372.py index 6bd31f069..2d07edd7a 100644 --- a/tests/functional/ext/typing/typing_broken_noreturn_py372.py +++ b/tests/functional/ext/typing/typing_broken_noreturn_py372.py @@ -1,12 +1,12 @@ """ -'typing.NoReturn' is broken inside compond types for Python 3.7.0 +'typing.NoReturn' is broken inside compound types for Python 3.7.0 https://bugs.python.org/issue34921 If no runtime introspection is required, use string annotations instead. Don't emit errors if py-version set to >= 3.7.2. """ -# pylint: disable=missing-docstring, broad-exception-raised +# pylint: disable=missing-docstring,broad-exception-raised,invalid-name import typing from typing import TYPE_CHECKING, Callable, NoReturn, Union @@ -16,15 +16,19 @@ import typing_extensions def func1() -> NoReturn: raise Exception + def func2() -> Union[None, NoReturn]: pass + def func3() -> Union[None, "NoReturn"]: pass + def func4() -> Union[None, typing.NoReturn]: pass + def func5() -> Union[None, typing_extensions.NoReturn]: pass diff --git a/tests/functional/r/regression_02/regression_3979.py b/tests/functional/r/regression_02/regression_3979.py index 4fb0c5a05..7cc74a4f5 100644 --- a/tests/functional/r/regression_02/regression_3979.py +++ b/tests/functional/r/regression_02/regression_3979.py @@ -10,4 +10,4 @@ if TYPE_CHECKING: else: BasePathLike = os.PathLike -foo: Union[str, BasePathLike] = "bar" +Foo: Union[str, BasePathLike] = "bar" diff --git a/tests/functional/t/typealias_naming_style_default.py b/tests/functional/t/typealias_naming_style_default.py new file mode 100644 index 000000000..45f801521 --- /dev/null +++ b/tests/functional/t/typealias_naming_style_default.py @@ -0,0 +1,23 @@ +"""Test cases for invalid-name for TypeAlias and related classes with default settings.""" +from typing import TypeAlias, Union + +# PascalCase names +GoodName: TypeAlias = int +_GoodName: TypeAlias = int +__GoodName: TypeAlias = int +AnotherGoodName = Union[int, str] +GOODName: TypeAlias = int +GOODNAMEType: TypeAlias = int +TodoType: TypeAlias = int + +# Non-PascalCase names +BadNAME: TypeAlias = int # [invalid-name] +badName: TypeAlias = int # [invalid-name] +AlsoBADName: TypeAlias = int # [invalid-name] +TBadName: TypeAlias = int # [invalid-name] +TypeTodo: TypeAlias = int # [invalid-name] +BadNameT: TypeAlias = int # [invalid-name] +BAD_NAME = Union[int, str] # [invalid-name] +_BAD_NAME = Union[int, str] # [invalid-name] +__BAD_NAME = Union[int, str] # [invalid-name] +ANOTHERBADNAME = Union[int, str] # [invalid-name] diff --git a/tests/functional/t/typealias_naming_style_default.rc b/tests/functional/t/typealias_naming_style_default.rc new file mode 100644 index 000000000..68a8c8ef1 --- /dev/null +++ b/tests/functional/t/typealias_naming_style_default.rc @@ -0,0 +1,2 @@ +[testoptions] +min_pyver=3.10 diff --git a/tests/functional/t/typealias_naming_style_default.txt b/tests/functional/t/typealias_naming_style_default.txt new file mode 100644 index 000000000..237dac076 --- /dev/null +++ b/tests/functional/t/typealias_naming_style_default.txt @@ -0,0 +1,10 @@ +invalid-name:14:0:14:7::"Type alias name ""BadNAME"" doesn't conform to predefined naming style":HIGH +invalid-name:15:0:15:7::"Type alias name ""badName"" doesn't conform to predefined naming style":HIGH +invalid-name:16:0:16:11::"Type alias name ""AlsoBADName"" doesn't conform to predefined naming style":HIGH +invalid-name:17:0:17:8::"Type alias name ""TBadName"" doesn't conform to predefined naming style":HIGH +invalid-name:18:0:18:8::"Type alias name ""TypeTodo"" doesn't conform to predefined naming style":HIGH +invalid-name:19:0:19:8::"Type alias name ""BadNameT"" doesn't conform to predefined naming style":HIGH +invalid-name:20:0:20:8::"Type alias name ""BAD_NAME"" doesn't conform to predefined naming style":HIGH +invalid-name:21:0:21:9::"Type alias name ""_BAD_NAME"" doesn't conform to predefined naming style":HIGH +invalid-name:22:0:22:10::"Type alias name ""__BAD_NAME"" doesn't conform to predefined naming style":HIGH +invalid-name:23:0:23:14::"Type alias name ""ANOTHERBADNAME"" doesn't conform to predefined naming style":HIGH diff --git a/tests/functional/t/typealias_naming_style_rgx.py b/tests/functional/t/typealias_naming_style_rgx.py new file mode 100644 index 000000000..0910644da --- /dev/null +++ b/tests/functional/t/typealias_naming_style_rgx.py @@ -0,0 +1,10 @@ +"""Test cases for invalid-name for TypeAlias and related classes with non-default settings.""" +from typing import TypeAlias, Union + +# Valid +TypeAliasShouldBeLikeThis: TypeAlias = int +_TypeAliasShouldBeLikeThis: Union[str, int] + +# Invalid +TypeAliasShouldntBeLikeThis: TypeAlias = int # [invalid-name] +_TypeAliasShouldntBeLikeThis: Union[str, int] # [invalid-name] diff --git a/tests/functional/t/typealias_naming_style_rgx.rc b/tests/functional/t/typealias_naming_style_rgx.rc new file mode 100644 index 000000000..2521a50b3 --- /dev/null +++ b/tests/functional/t/typealias_naming_style_rgx.rc @@ -0,0 +1,5 @@ +[BASIC] +typealias-rgx=_{0,2}TypeAliasShouldBeLikeThis + +[testoptions] +min_pyver=3.10 diff --git a/tests/functional/t/typealias_naming_style_rgx.txt b/tests/functional/t/typealias_naming_style_rgx.txt new file mode 100644 index 000000000..0a1bc6c4a --- /dev/null +++ b/tests/functional/t/typealias_naming_style_rgx.txt @@ -0,0 +1,2 @@ +invalid-name:9:0:9:27::"Type alias name ""TypeAliasShouldntBeLikeThis"" doesn't conform to '_{0,2}TypeAliasShouldBeLikeThis' pattern":HIGH +invalid-name:10:0:10:28::"Type alias name ""_TypeAliasShouldntBeLikeThis"" doesn't conform to '_{0,2}TypeAliasShouldBeLikeThis' pattern":HIGH diff --git a/tests/lint/test_caching.py b/tests/lint/test_caching.py index fe6ccc234..55c2b54dd 100644 --- a/tests/lint/test_caching.py +++ b/tests/lint/test_caching.py @@ -98,6 +98,7 @@ def linter_stats() -> LinterStats: module=10, variable=11, typevar=12, + typealias=13, ) ) -- cgit v1.2.1