From 024e488127b443c8be4d33a037135fffaf6a21c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Thu, 14 Apr 2022 19:47:25 +0200 Subject: [PATCH] Use ``python-typing-update`` on second half of the ``tests`` directory --- tests/checkers/base/unittest_name_preset.py | 13 +++++++------ tests/checkers/unittest_deprecated.py | 14 ++++++-------- tests/checkers/unittest_non_ascii_name.py | 6 ++++-- tests/checkers/unittest_stdlib.py | 11 +++++++---- .../unittest_unicode/unittest_bad_chars.py | 10 +++++++--- .../unittest_unicode/unittest_functions.py | 5 +++-- .../unittest_unicode/unittest_invalid_encoding.py | 6 ++++-- tests/checkers/unittest_utils.py | 10 +++------- tests/config/test_config.py | 5 +++-- tests/config/test_find_default_config_files.py | 4 +++- tests/config/unittest_config.py | 7 ++++--- tests/lint/unittest_expand_modules.py | 7 ++++--- tests/lint/unittest_lint.py | 8 +++++--- tests/message/conftest.py | 7 ++++--- tests/message/unittest_message.py | 4 +++- tests/message/unittest_message_id_store.py | 8 +++++--- tests/primer/test_primer_external.py | 9 ++++----- 17 files changed, 76 insertions(+), 58 deletions(-) diff --git a/tests/checkers/base/unittest_name_preset.py b/tests/checkers/base/unittest_name_preset.py index 9d4b748c65..49a81deff1 100644 --- a/tests/checkers/base/unittest_name_preset.py +++ b/tests/checkers/base/unittest_name_preset.py @@ -4,8 +4,9 @@ """Unittest for the NameChecker.""" +from __future__ import annotations + import unittest -from typing import Type from pylint.checkers import base @@ -20,18 +21,18 @@ class TestNamePresets(unittest.TestCase): ) def _test_name_is_correct_for_all_name_types( - self, naming_style: Type[base.NamingStyle], name: str + self, naming_style: type[base.NamingStyle], name: str ) -> None: for name_type in base.KNOWN_NAME_TYPES_WITH_STYLE: self._test_is_correct(naming_style, name, name_type) def _test_name_is_incorrect_for_all_name_types( - self, naming_style: Type[base.NamingStyle], name: str + self, naming_style: type[base.NamingStyle], name: str ) -> None: for name_type in base.KNOWN_NAME_TYPES_WITH_STYLE: self._test_is_incorrect(naming_style, name, name_type) - def _test_should_always_pass(self, naming_style: Type[base.NamingStyle]) -> None: + def _test_should_always_pass(self, naming_style: type[base.NamingStyle]) -> None: always_pass_data = [ ("__add__", "method"), ("__set_name__", "method"), @@ -43,7 +44,7 @@ def _test_should_always_pass(self, naming_style: Type[base.NamingStyle]) -> None @staticmethod def _test_is_correct( - naming_style: Type[base.NamingStyle], name: str, name_type: str + naming_style: type[base.NamingStyle], name: str, name_type: str ) -> None: rgx = naming_style.get_regex(name_type) fail = f"{name!r} does not match pattern {rgx!r} (style: {naming_style}, type: {name_type})" @@ -51,7 +52,7 @@ def _test_is_correct( @staticmethod def _test_is_incorrect( - naming_style: Type[base.NamingStyle], name: str, name_type: str + naming_style: type[base.NamingStyle], name: str, name_type: str ) -> None: rgx = naming_style.get_regex(name_type) fail = f"{name!r} not match pattern {rgx!r} (style: {naming_style}, type: {name_type})" diff --git a/tests/checkers/unittest_deprecated.py b/tests/checkers/unittest_deprecated.py index 0b35b297aa..0cd71dda92 100644 --- a/tests/checkers/unittest_deprecated.py +++ b/tests/checkers/unittest_deprecated.py @@ -2,7 +2,7 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt -from typing import List, Optional, Set, Tuple, Union +from __future__ import annotations import astroid @@ -15,20 +15,18 @@ class _DeprecatedChecker(DeprecatedMixin, BaseChecker): __implements__ = (IAstroidChecker,) name = "deprecated" - def deprecated_methods(self) -> Set[str]: + def deprecated_methods(self) -> set[str]: return {"deprecated_func", ".Deprecated.deprecated_method"} - def deprecated_modules(self) -> Set[str]: + def deprecated_modules(self) -> set[str]: return {"deprecated_module"} - def deprecated_classes(self, module: str) -> List[str]: + def deprecated_classes(self, module: str) -> list[str]: return ["DeprecatedClass"] if module == "deprecated" else [] def deprecated_arguments( self, method: str - ) -> Union[ - Tuple[Tuple[Optional[int], str], ...], Tuple[Tuple[int, str], Tuple[int, str]] - ]: + ) -> (tuple[tuple[int | None, str], ...] | tuple[tuple[int, str], tuple[int, str]]): if method == "myfunction1": # def myfunction1(arg1, deprecated_arg1='spam') return ((1, "deprecated_arg1"),) @@ -52,7 +50,7 @@ def deprecated_arguments( return ((0, "deprecated_arg"),) return () - def deprecated_decorators(self) -> Set[str]: + def deprecated_decorators(self) -> set[str]: return {".deprecated_decorator"} diff --git a/tests/checkers/unittest_non_ascii_name.py b/tests/checkers/unittest_non_ascii_name.py index f6c9abcdbd..1830dd7ec8 100644 --- a/tests/checkers/unittest_non_ascii_name.py +++ b/tests/checkers/unittest_non_ascii_name.py @@ -2,8 +2,10 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import sys -from typing import Iterable, Optional +from collections.abc import Iterable import astroid import pytest @@ -259,7 +261,7 @@ def test_assignname( ), ], ) - def test_check_import(self, import_statement: str, wrong_name: Optional[str]): + def test_check_import(self, import_statement: str, wrong_name: str | None): """We expect that for everything that user can change there is a message.""" node = astroid.extract_node(f"{import_statement} #@") diff --git a/tests/checkers/unittest_stdlib.py b/tests/checkers/unittest_stdlib.py index cdd61e6bad..f8de2f00df 100644 --- a/tests/checkers/unittest_stdlib.py +++ b/tests/checkers/unittest_stdlib.py @@ -2,8 +2,11 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import contextlib -from typing import Any, Callable, Iterator, Optional, Union +from collections.abc import Callable, Iterator +from typing import Any import astroid from astroid import nodes @@ -19,7 +22,7 @@ def _add_transform( manager: AstroidManager, node: type, transform: Callable, - predicate: Optional[Any] = None, + predicate: Any | None = None, ) -> Iterator: manager.register_transform(node, transform, predicate) try: @@ -40,8 +43,8 @@ def test_deprecated_no_qname_on_unexpected_nodes(self) -> None: """ def infer_func( - node: Name, context: Optional[Any] = None # pylint: disable=unused-argument - ) -> Iterator[Union[Iterator, Iterator[AssignAttr]]]: + node: Name, context: Any | None = None # pylint: disable=unused-argument + ) -> Iterator[Iterator | Iterator[AssignAttr]]: new_node = nodes.AssignAttr(attrname="alpha", parent=node) yield new_node diff --git a/tests/checkers/unittest_unicode/unittest_bad_chars.py b/tests/checkers/unittest_unicode/unittest_bad_chars.py index 154faad5a0..7933597f7d 100644 --- a/tests/checkers/unittest_unicode/unittest_bad_chars.py +++ b/tests/checkers/unittest_unicode/unittest_bad_chars.py @@ -3,9 +3,13 @@ # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt # pylint: disable=redefined-outer-name + +from __future__ import annotations + import itertools +from collections.abc import Callable from pathlib import Path -from typing import Callable, Tuple, cast +from typing import cast import astroid import pytest @@ -113,7 +117,7 @@ class TestBadCharsChecker(pylint.testutils.CheckerTestCase): def test_find_bad_chars( self, bad_char_file_generator: Callable[[str, bool, str], Path], - codec_and_msg: Tuple[str, Tuple[pylint.testutils.MessageTest]], + codec_and_msg: tuple[str, tuple[pylint.testutils.MessageTest]], line_ending: str, add_invalid_bytes: bool, ): @@ -210,7 +214,7 @@ def test_bad_chars_that_would_currently_crash_python( self, char: str, msg_id: str, - codec_and_msg: Tuple[str, Tuple[pylint.testutils.MessageTest]], + codec_and_msg: tuple[str, tuple[pylint.testutils.MessageTest]], ): """Special test for a file containing chars that lead to Python or Astroid crashes (which causes Pylint to exit early) diff --git a/tests/checkers/unittest_unicode/unittest_functions.py b/tests/checkers/unittest_unicode/unittest_functions.py index bf42df996c..c2fef93574 100644 --- a/tests/checkers/unittest_unicode/unittest_functions.py +++ b/tests/checkers/unittest_unicode/unittest_functions.py @@ -2,9 +2,10 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import itertools from pathlib import Path -from typing import Dict import pytest @@ -103,7 +104,7 @@ ) def test_map_positions_to_result( line: pylint.checkers.unicode._StrLike, - expected: Dict[int, pylint.checkers.unicode._BadChar], + expected: dict[int, pylint.checkers.unicode._BadChar], search_dict, ): """Test all possible outcomes for map position function in UTF-8 and ASCII.""" diff --git a/tests/checkers/unittest_unicode/unittest_invalid_encoding.py b/tests/checkers/unittest_unicode/unittest_invalid_encoding.py index ff46539e46..ac12af8565 100644 --- a/tests/checkers/unittest_unicode/unittest_invalid_encoding.py +++ b/tests/checkers/unittest_unicode/unittest_invalid_encoding.py @@ -2,11 +2,13 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import codecs import io import shutil from pathlib import Path -from typing import Tuple, cast +from typing import cast import pytest from astroid import nodes @@ -137,6 +139,6 @@ def test__determine_codec_raises_syntax_error_on_invalid_input(self): "codec, msg", (pytest.param(codec, msg, id=codec) for codec, msg in CODEC_AND_MSG), ) - def test___check_codec(self, codec: str, msg: Tuple[pylint.testutils.MessageTest]): + def test___check_codec(self, codec: str, msg: tuple[pylint.testutils.MessageTest]): with self.assertAddsMessages(*msg): self.checker._check_codec(codec, 1) diff --git a/tests/checkers/unittest_utils.py b/tests/checkers/unittest_utils.py index 121bcef2e9..1ac4611412 100644 --- a/tests/checkers/unittest_utils.py +++ b/tests/checkers/unittest_utils.py @@ -4,7 +4,7 @@ """Tests for the pylint.checkers.utils module.""" -from typing import Dict, Union +from __future__ import annotations import astroid import pytest @@ -32,9 +32,7 @@ def testIsBuiltin(name, expected): "fn,kw", [("foo(3)", {"keyword": "bar"}), ("foo(one=a, two=b, three=c)", {"position": 1})], ) -def testGetArgumentFromCallError( - fn: str, kw: Union[Dict[str, int], Dict[str, str]] -) -> None: +def testGetArgumentFromCallError(fn: str, kw: dict[str, int] | dict[str, str]) -> None: with pytest.raises(utils.NoSuchArgumentError): node = astroid.extract_node(fn) utils.get_argument_from_call(node, **kw) @@ -43,9 +41,7 @@ def testGetArgumentFromCallError( @pytest.mark.parametrize( "fn,kw", [("foo(bar=3)", {"keyword": "bar"}), ("foo(a, b, c)", {"position": 1})] ) -def testGetArgumentFromCallExists( - fn: str, kw: Union[Dict[str, int], Dict[str, str]] -) -> None: +def testGetArgumentFromCallExists(fn: str, kw: dict[str, int] | dict[str, str]) -> None: node = astroid.extract_node(fn) assert utils.get_argument_from_call(node, **kw) is not None diff --git a/tests/config/test_config.py b/tests/config/test_config.py index 701d24a822..d8b6191153 100644 --- a/tests/config/test_config.py +++ b/tests/config/test_config.py @@ -2,9 +2,10 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import os from pathlib import Path -from typing import Optional, Set from pylint.lint.run import Run from pylint.testutils.configuration_test import run_using_a_configuration_file @@ -12,7 +13,7 @@ def check_configuration_file_reader( runner: Run, - expected_disabled: Optional[Set[str]] = None, + expected_disabled: set[str] | None = None, expected_jobs: int = 10, expected_reports_truthey: bool = True, ) -> None: diff --git a/tests/config/test_find_default_config_files.py b/tests/config/test_find_default_config_files.py index ca1461bad4..c1d99e5320 100644 --- a/tests/config/test_find_default_config_files.py +++ b/tests/config/test_find_default_config_files.py @@ -2,14 +2,16 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import contextlib import importlib import os import shutil import sys import tempfile +from collections.abc import Iterator from pathlib import Path -from typing import Iterator import pytest diff --git a/tests/config/unittest_config.py b/tests/config/unittest_config.py index 9b6ff70d9e..c282ebe38a 100644 --- a/tests/config/unittest_config.py +++ b/tests/config/unittest_config.py @@ -4,9 +4,10 @@ """Unit tests for the config module.""" +from __future__ import annotations + import re import sre_constants -from typing import Dict, Tuple, Type import pytest @@ -66,10 +67,10 @@ class TestPyLinterOptionSetters(CheckerTestCase): class Checker(BaseChecker): name = "checker" - msgs: Dict[str, Tuple[str, ...]] = {} + msgs: dict[str, tuple[str, ...]] = {} options = (("test-opt", {"action": "store_true", "help": "help message"}),) - CHECKER_CLASS: Type = Checker + CHECKER_CLASS: type = Checker @set_config(ignore_paths=".*/tests/.*,.*\\ignore\\.*") def test_ignore_paths_with_value(self) -> None: diff --git a/tests/lint/unittest_expand_modules.py b/tests/lint/unittest_expand_modules.py index b231c9ace9..ac98529385 100644 --- a/tests/lint/unittest_expand_modules.py +++ b/tests/lint/unittest_expand_modules.py @@ -2,9 +2,10 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import re from pathlib import Path -from typing import Dict, Tuple, Type import pytest @@ -84,10 +85,10 @@ class Checker(BaseChecker): """This dummy checker is needed to allow options to be set.""" name = "checker" - msgs: Dict[str, Tuple[str, ...]] = {} + msgs: dict[str, tuple[str, ...]] = {} options = (("test-opt", {"action": "store_true", "help": "help message"}),) - CHECKER_CLASS: Type = Checker + CHECKER_CLASS: type = Checker @pytest.mark.parametrize( "files_or_modules,expected", diff --git a/tests/lint/unittest_lint.py b/tests/lint/unittest_lint.py index b39b30b388..82ed9d3d56 100644 --- a/tests/lint/unittest_lint.py +++ b/tests/lint/unittest_lint.py @@ -4,18 +4,20 @@ # pylint: disable=redefined-outer-name +from __future__ import annotations + import argparse import os import re import sys import tempfile +from collections.abc import Iterable, Iterator from contextlib import contextmanager from importlib import reload from io import StringIO from os import chdir, getcwd from os.path import abspath, dirname, join, sep from shutil import rmtree -from typing import Iterable, Iterator, List import platformdirs import pytest @@ -106,7 +108,7 @@ def fake_path() -> Iterator[Iterable[str]]: sys.path[:] = orig -def test_no_args(fake_path: List[int]) -> None: +def test_no_args(fake_path: list[int]) -> None: with lint.fix_import_path([]): assert sys.path == fake_path assert sys.path == fake_path @@ -115,7 +117,7 @@ def test_no_args(fake_path: List[int]) -> None: @pytest.mark.parametrize( "case", [["a/b/"], ["a/b"], ["a/b/__init__.py"], ["a/"], ["a"]] ) -def test_one_arg(fake_path: List[str], case: List[str]) -> None: +def test_one_arg(fake_path: list[str], case: list[str]) -> None: with tempdir() as chroot: create_files(["a/b/__init__.py"]) expected = [join(chroot, "a")] + fake_path diff --git a/tests/message/conftest.py b/tests/message/conftest.py index 76a18c0371..e410578350 100644 --- a/tests/message/conftest.py +++ b/tests/message/conftest.py @@ -4,8 +4,9 @@ # pylint: disable=redefined-outer-name +from __future__ import annotations -from typing import Dict, ValuesView +from collections.abc import ValuesView import pytest @@ -63,7 +64,7 @@ def message_definitions(store: MessageDefinitionStore) -> ValuesView[MessageDefi @pytest.fixture -def msgids() -> Dict[str, str]: +def msgids() -> dict[str, str]: return { "W1234": "warning-symbol", "W1235": "warning-symbol-two", @@ -78,7 +79,7 @@ def empty_msgid_store() -> MessageIdStore: @pytest.fixture -def msgid_store(msgids: Dict[str, str]) -> MessageIdStore: +def msgid_store(msgids: dict[str, str]) -> MessageIdStore: msgid_store = MessageIdStore() for msgid, symbol in msgids.items(): msgid_store.add_msgid_and_symbol(msgid, symbol) diff --git a/tests/message/unittest_message.py b/tests/message/unittest_message.py index ef560a6499..d0805e337d 100644 --- a/tests/message/unittest_message.py +++ b/tests/message/unittest_message.py @@ -2,7 +2,9 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt -from typing import ValuesView +from __future__ import annotations + +from collections.abc import ValuesView from pylint.interfaces import HIGH from pylint.message import Message diff --git a/tests/message/unittest_message_id_store.py b/tests/message/unittest_message_id_store.py index 150ec8d698..69ff5f50b8 100644 --- a/tests/message/unittest_message_id_store.py +++ b/tests/message/unittest_message_id_store.py @@ -2,8 +2,10 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + +from collections.abc import ValuesView from pathlib import Path -from typing import Dict, ValuesView import pytest @@ -15,7 +17,7 @@ EMPTY_FILE = str(Path(__file__).parent.parent.resolve() / "regrtest_data" / "empty.py") -def test_len_str(msgid_store: MessageIdStore, msgids: Dict[str, str]) -> None: +def test_len_str(msgid_store: MessageIdStore, msgids: dict[str, str]) -> None: assert len(msgid_store) == len(msgids) str_result = str(msgid_store) assert "MessageIdStore: [" in str_result @@ -26,7 +28,7 @@ def test_len_str(msgid_store: MessageIdStore, msgids: Dict[str, str]) -> None: assert "]" in str_result -def test_get_message_ids(msgid_store: MessageIdStore, msgids: Dict[str, str]) -> None: +def test_get_message_ids(msgid_store: MessageIdStore, msgids: dict[str, str]) -> None: """We can get message id even with capitalization problem.""" msgid = list(msgids.keys())[0] msgids_result = msgid_store.get_active_msgids(msgid.lower()) diff --git a/tests/primer/test_primer_external.py b/tests/primer/test_primer_external.py index 4a43259621..aedc55c8be 100644 --- a/tests/primer/test_primer_external.py +++ b/tests/primer/test_primer_external.py @@ -2,11 +2,12 @@ # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt +from __future__ import annotations + import json import logging import subprocess from pathlib import Path -from typing import Dict, Union import pytest from pytest import LogCaptureFixture @@ -16,10 +17,8 @@ PRIMER_DIRECTORY = Path(".pylint_primer_tests/").resolve() -def get_packages_to_lint_from_json( - json_path: Union[Path, str] -) -> Dict[str, PackageToLint]: - result: Dict[str, PackageToLint] = {} +def get_packages_to_lint_from_json(json_path: Path | str) -> dict[str, PackageToLint]: + result: dict[str, PackageToLint] = {} with open(json_path, encoding="utf8") as f: for name, package_data in json.load(f).items(): result[name] = PackageToLint(**package_data)