Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update and provide fixes for mypy pre-commit #12389

Merged
merged 16 commits into from
Nov 7, 2023
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,20 @@ repos:
- id: ruff

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.961
rev: v1.6.1
hooks:
- id: mypy
exclude: tests/data
args: ["--pretty", "--show-error-codes"]
additional_dependencies: [
'keyring==23.0.1',
'nox==2021.6.12',
'keyring==24.2.0',
'nox==2023.4.22',
'pytest',
'types-docutils==0.18.3',
'types-setuptools==57.4.14',
'types-freezegun==1.1.9',
'types-six==1.16.15',
'types-pyyaml==6.0.12.2',
'types-docutils==0.20.0.3',
'types-setuptools==68.2.0.0',
'types-freezegun==1.1.10',
'types-six==1.16.21.9',
'types-pyyaml==6.0.12.12',
]

- repo: https://github.com/pre-commit/pygrep-hooks
Expand Down
1 change: 1 addition & 0 deletions news/12389.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Update to using mypy 1.6.1 and fix appropriatew types
3 changes: 1 addition & 2 deletions src/pip/_internal/locations/_distutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,7 @@ def distutils_scheme(
try:
d.parse_config_files()
except UnicodeDecodeError:
# Typeshed does not include find_config_files() for some reason.
paths = d.find_config_files() # type: ignore
paths = d.find_config_files()
logger.warning(
"Ignore distutils configs in %s due to encoding errors.",
", ".join(os.path.basename(p) for p in paths),
Expand Down
4 changes: 2 additions & 2 deletions src/pip/_internal/metadata/_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ def sanitise_header(h: Union[Header, str]) -> str:
key = json_name(field)
if multi:
value: Union[str, List[str]] = [
sanitise_header(v) for v in msg.get_all(field)
sanitise_header(v) for v in msg.get_all(field) # type: ignore
]
else:
value = sanitise_header(msg.get(field))
value = sanitise_header(msg.get(field)) # type: ignore
if key == "keywords":
# Accept both comma-separated and space-separated
# forms, for better compatibility with old data.
Expand Down
4 changes: 3 additions & 1 deletion src/pip/_internal/network/xmlrpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
if TYPE_CHECKING:
from xmlrpc.client import _HostType, _Marshallable

from _typeshed import SizedBuffer

logger = logging.getLogger(__name__)


Expand All @@ -33,7 +35,7 @@ def request(
self,
host: "_HostType",
handler: str,
request_body: bytes,
request_body: "SizedBuffer",
verbose: bool = False,
) -> Tuple["_Marshallable", ...]:
assert isinstance(host, str)
Expand Down
4 changes: 2 additions & 2 deletions src/pip/_internal/utils/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,9 @@ def rmtree(
)
if sys.version_info >= (3, 12):
# See https://docs.python.org/3.12/whatsnew/3.12.html#shutil.
shutil.rmtree(dir, onexc=handler)
shutil.rmtree(dir, onexc=handler) # type: ignore
else:
shutil.rmtree(dir, onerror=handler)
shutil.rmtree(dir, onerror=handler) # type: ignore


def _onerror_ignore(*_args: Any) -> None:
Expand Down
6 changes: 5 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from pathlib import Path
from textwrap import dedent
from typing import (
TYPE_CHECKING,
Any,
AnyStr,
Callable,
Expand Down Expand Up @@ -58,6 +59,9 @@
from tests.lib.server import MockServer, make_mock_server
from tests.lib.venv import VirtualEnvironment, VirtualEnvironmentType

if TYPE_CHECKING:
from pip._vendor.typing_extensions import Self


def pytest_addoption(parser: Parser) -> None:
parser.addoption(
Expand Down Expand Up @@ -941,7 +945,7 @@ def html_index_with_onetime_server(
"""

class InDirectoryServer(http.server.ThreadingHTTPServer):
def finish_request(self, request: Any, client_address: Any) -> None:
def finish_request(self: "Self", request: Any, client_address: Any) -> None:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why Mypy requires this change I don’t understand

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without it the call below it:

self.RequestHandlerClass(
    request,
    client_address,
    self,
    directory=str(html_index_for_packages),  # type: ignore[call-arg]
)

Causes the mypy error:

tests/conftest.py:952: error: Argument 3 has incompatible type
"InDirectoryServer"; expected "Self"  [arg-type]
                    self,
                    ^~~~

I did not investigate why mypy now requires self in this case to be type hinted.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I kind of understand the reason Mypy needs it, but it really shouldn’t need it. It could be a bug.

self.RequestHandlerClass(
request,
client_address,
Expand Down
2 changes: 1 addition & 1 deletion tests/lib/configuration_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def overridden() -> None:
old()

# https://github.com/python/mypy/issues/2427
self.configuration._load_config_files = overridden # type: ignore[assignment]
self.configuration._load_config_files = overridden # type: ignore[method-assign]

@contextlib.contextmanager
def tmpfile(self, contents: str) -> Iterator[str]:
Expand Down
10 changes: 5 additions & 5 deletions tests/lib/test_wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@

def test_message_from_dict_one_value() -> None:
message = message_from_dict({"a": "1"})
assert set(message.get_all("a")) == {"1"}
assert set(message.get_all("a")) == {"1"} # type: ignore


def test_message_from_dict_multiple_values() -> None:
message = message_from_dict({"a": ["1", "2"]})
assert set(message.get_all("a")) == {"1", "2"}
assert set(message.get_all("a")) == {"1", "2"} # type: ignore


def message_from_bytes(contents: bytes) -> Message:
Expand Down Expand Up @@ -67,7 +67,7 @@ def test_make_metadata_file_custom_value_list() -> None:
f = default_make_metadata(updates={"a": ["1", "2"]})
assert f is not None
message = default_metadata_checks(f)
assert set(message.get_all("a")) == {"1", "2"}
assert set(message.get_all("a")) == {"1", "2"} # type: ignore


def test_make_metadata_file_custom_value_overrides() -> None:
Expand Down Expand Up @@ -101,7 +101,7 @@ def default_wheel_metadata_checks(f: File) -> Message:
assert message.get_all("Wheel-Version") == ["1.0"]
assert message.get_all("Generator") == ["pip-test-suite"]
assert message.get_all("Root-Is-Purelib") == ["true"]
assert set(message.get_all("Tag")) == {"py2-none-any", "py3-none-any"}
assert set(message.get_all("Tag")) == {"py2-none-any", "py3-none-any"} # type: ignore
return message


Expand All @@ -122,7 +122,7 @@ def test_make_wheel_metadata_file_custom_value_list() -> None:
f = default_make_wheel_metadata(updates={"a": ["1", "2"]})
assert f is not None
message = default_wheel_metadata_checks(f)
assert set(message.get_all("a")) == {"1", "2"}
assert set(message.get_all("a")) == {"1", "2"} # type: ignore


def test_make_wheel_metadata_file_custom_value_override() -> None:
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/metadata/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def test_dist_get_direct_url_no_metadata(mock_read_text: mock.Mock) -> None:
class FakeDistribution(BaseDistribution):
pass

dist = FakeDistribution()
dist = FakeDistribution() # type: ignore
assert dist.direct_url is None
mock_read_text.assert_called_once_with(DIRECT_URL_METADATA_NAME)

Expand All @@ -35,7 +35,7 @@ def test_dist_get_direct_url_invalid_json(
class FakeDistribution(BaseDistribution):
canonical_name = cast(NormalizedName, "whatever") # Needed for error logging.

dist = FakeDistribution()
dist = FakeDistribution() # type: ignore
with caplog.at_level(logging.WARNING):
assert dist.direct_url is None

Expand Down Expand Up @@ -84,7 +84,7 @@ def test_dist_get_direct_url_valid_metadata(mock_read_text: mock.Mock) -> None:
class FakeDistribution(BaseDistribution):
pass

dist = FakeDistribution()
dist = FakeDistribution() # type: ignore
direct_url = dist.direct_url
assert direct_url is not None
mock_read_text.assert_called_once_with(DIRECT_URL_METADATA_NAME)
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/test_base_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ def assert_helpers_set(options: Values, args: List[str]) -> int:

c = Command("fake", "fake")
# https://github.com/python/mypy/issues/2427
c.run = Mock(side_effect=assert_helpers_set) # type: ignore[assignment]
c.run = Mock(side_effect=assert_helpers_set) # type: ignore[method-assign]
assert c.main(["fake"]) == SUCCESS
c.run.assert_called_once()

Expand All @@ -176,7 +176,7 @@ def create_temp_dirs(options: Values, args: List[str]) -> int:

c = Command("fake", "fake")
# https://github.com/python/mypy/issues/2427
c.run = Mock(side_effect=create_temp_dirs) # type: ignore[assignment]
c.run = Mock(side_effect=create_temp_dirs) # type: ignore[method-assign]
assert c.main(["fake"]) == SUCCESS
c.run.assert_called_once()
assert os.path.exists(Holder.value) == exists
Expand All @@ -200,6 +200,6 @@ def create_temp_dirs(options: Values, args: List[str]) -> int:

c = Command("fake", "fake")
# https://github.com/python/mypy/issues/2427
c.run = Mock(side_effect=create_temp_dirs) # type: ignore[assignment]
c.run = Mock(side_effect=create_temp_dirs) # type: ignore[method-assign]
assert c.main(["fake"]) == SUCCESS
c.run.assert_called_once()
6 changes: 3 additions & 3 deletions tests/unit/test_configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ def test_site_modification(self) -> None:
# Mock out the method
mymock = MagicMock(spec=self.configuration._mark_as_modified)
# https://github.com/python/mypy/issues/2427
self.configuration._mark_as_modified = mymock # type: ignore[assignment]
self.configuration._mark_as_modified = mymock # type: ignore[method-assign]

self.configuration.set_value("test.hello", "10")

Expand All @@ -231,7 +231,7 @@ def test_user_modification(self) -> None:
# Mock out the method
mymock = MagicMock(spec=self.configuration._mark_as_modified)
# https://github.com/python/mypy/issues/2427
self.configuration._mark_as_modified = mymock # type: ignore[assignment]
self.configuration._mark_as_modified = mymock # type: ignore[method-assign]

self.configuration.set_value("test.hello", "10")

Expand All @@ -250,7 +250,7 @@ def test_global_modification(self) -> None:
# Mock out the method
mymock = MagicMock(spec=self.configuration._mark_as_modified)
# https://github.com/python/mypy/issues/2427
self.configuration._mark_as_modified = mymock # type: ignore[assignment]
self.configuration._mark_as_modified = mymock # type: ignore[method-assign]

self.configuration.set_value("test.hello", "10")

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/test_resolution_legacy_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ class NotWorkingFakeDist(FakeDist):
def metadata(self) -> email.message.Message:
raise FileNotFoundError(metadata_name)

dist = make_fake_dist(klass=NotWorkingFakeDist)
dist = make_fake_dist(klass=NotWorkingFakeDist) # type: ignore

with pytest.raises(NoneMetadataError) as exc:
_check_dist_requires_python(
Expand Down
Empty file added tools/__init__.py
Empty file.