From eddd9ddb66e6a3b74d7d2f3187fd246c955e00b7 Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Sat, 23 Sep 2023 09:10:13 -0700 Subject: [PATCH] Enable mypy's strict equality checks (#12209) This makes mypy check more behaviours within the codebase. Co-authored-by: Pradyun Gedam --- news/E2B261CA-A0CF-4309-B808-1210C0B54632.trivial.rst | 0 setup.cfg | 11 +++++++---- src/pip/_internal/utils/temp_dir.py | 4 ++-- tests/functional/test_list.py | 3 +-- tests/lib/__init__.py | 4 +++- tests/unit/test_network_auth.py | 2 +- tests/unit/test_options.py | 4 ++-- tests/unit/test_target_python.py | 10 +++++----- 8 files changed, 21 insertions(+), 17 deletions(-) create mode 100644 news/E2B261CA-A0CF-4309-B808-1210C0B54632.trivial.rst diff --git a/news/E2B261CA-A0CF-4309-B808-1210C0B54632.trivial.rst b/news/E2B261CA-A0CF-4309-B808-1210C0B54632.trivial.rst new file mode 100644 index 000000000..e69de29bb diff --git a/setup.cfg b/setup.cfg index 2e35be30d..08a1795eb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,11 +36,14 @@ per-file-ignores = [mypy] mypy_path = $MYPY_CONFIG_FILE_DIR/src + +strict = True + +no_implicit_reexport = False +allow_subclassing_any = True +allow_untyped_calls = True +warn_return_any = False ignore_missing_imports = True -disallow_untyped_defs = True -disallow_any_generics = True -warn_unused_ignores = True -no_implicit_optional = True [mypy-pip._internal.utils._jaraco_text] ignore_errors = True diff --git a/src/pip/_internal/utils/temp_dir.py b/src/pip/_internal/utils/temp_dir.py index 38c5f7c7c..4eec5f37f 100644 --- a/src/pip/_internal/utils/temp_dir.py +++ b/src/pip/_internal/utils/temp_dir.py @@ -6,9 +6,9 @@ import tempfile import traceback from contextlib import ExitStack, contextmanager from pathlib import Path -from types import FunctionType from typing import ( Any, + Callable, Dict, Generator, List, @@ -187,7 +187,7 @@ class TempDirectory: errors: List[BaseException] = [] def onerror( - func: FunctionType, + func: Callable[..., Any], path: Path, exc_val: BaseException, ) -> None: diff --git a/tests/functional/test_list.py b/tests/functional/test_list.py index cf8900a32..03dce41e7 100644 --- a/tests/functional/test_list.py +++ b/tests/functional/test_list.py @@ -595,8 +595,7 @@ def test_outdated_formats(script: PipTestEnvironment, data: TestData) -> None: "--outdated", "--format=json", ) - data = json.loads(result.stdout) - assert data == [ + assert json.loads(result.stdout) == [ { "name": "simple", "version": "1.0", diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py index a48423570..2e8b239ac 100644 --- a/tests/lib/__init__.py +++ b/tests/lib/__init__.py @@ -46,7 +46,9 @@ if TYPE_CHECKING: # Literal was introduced in Python 3.8. from typing import Literal - ResolverVariant = Literal["resolvelib", "legacy"] + ResolverVariant = Literal[ + "resolvelib", "legacy", "2020-resolver", "legacy-resolver" + ] else: ResolverVariant = str diff --git a/tests/unit/test_network_auth.py b/tests/unit/test_network_auth.py index e3cb772bb..5bd85f8cd 100644 --- a/tests/unit/test_network_auth.py +++ b/tests/unit/test_network_auth.py @@ -352,7 +352,7 @@ class KeyringModuleV2: ), ) def test_keyring_get_credential( - monkeypatch: pytest.MonkeyPatch, url: str, expect: str + monkeypatch: pytest.MonkeyPatch, url: str, expect: Tuple[str, str] ) -> None: monkeypatch.setitem(sys.modules, "keyring", KeyringModuleV2()) auth = MultiDomainBasicAuth( diff --git a/tests/unit/test_options.py b/tests/unit/test_options.py index 43d5fdd3d..22ff7f721 100644 --- a/tests/unit/test_options.py +++ b/tests/unit/test_options.py @@ -2,7 +2,7 @@ import os from contextlib import contextmanager from optparse import Values from tempfile import NamedTemporaryFile -from typing import Any, Dict, Iterator, List, Tuple, Union, cast +from typing import Any, Dict, Iterator, List, Tuple, Type, Union, cast import pytest @@ -605,7 +605,7 @@ class TestOptionsConfigFiles: self, monkeypatch: pytest.MonkeyPatch, args: List[str], - expect: Union[None, str, PipError], + expect: Union[None, str, Type[PipError]], ) -> None: cmd = cast(ConfigurationCommand, create_command("config")) # Replace a handler with a no-op to avoid side effects diff --git a/tests/unit/test_target_python.py b/tests/unit/test_target_python.py index bc1713769..31df5935e 100644 --- a/tests/unit/test_target_python.py +++ b/tests/unit/test_target_python.py @@ -99,17 +99,17 @@ class TestTargetPython: py_version_info: Optional[Tuple[int, ...]], expected_version: Optional[str], ) -> None: - mock_get_supported.return_value = ["tag-1", "tag-2"] + dummy_tags = [Tag("py4", "none", "any"), Tag("py5", "none", "any")] + mock_get_supported.return_value = dummy_tags target_python = TargetPython(py_version_info=py_version_info) actual = target_python.get_sorted_tags() - assert actual == ["tag-1", "tag-2"] + assert actual == dummy_tags - actual = mock_get_supported.call_args[1]["version"] - assert actual == expected_version + assert mock_get_supported.call_args[1]["version"] == expected_version # Check that the value was cached. - assert target_python._valid_tags == ["tag-1", "tag-2"] + assert target_python._valid_tags == dummy_tags def test_get_unsorted_tags__uses_cached_value(self) -> None: """