From feaa76a1d629ce653452b7670b2fa5a0bee7112b Mon Sep 17 00:00:00 2001 From: Devesh Kumar Singh Date: Thu, 14 May 2020 02:14:07 +0530 Subject: [PATCH 1/3] Update mypy to v0.770 --- .pre-commit-config.yaml | 2 +- news/CDB04414-2228-431F-9F5D-AFF4C5C08D05.trivial | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 news/CDB04414-2228-431F-9F5D-AFF4C5C08D05.trivial diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 89430962c..3e2c0a2ad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: files: \.py$ - repo: https://github.com/pre-commit/mirrors-mypy - rev: v0.760 + rev: v0.770 hooks: - id: mypy exclude: docs|tests diff --git a/news/CDB04414-2228-431F-9F5D-AFF4C5C08D05.trivial b/news/CDB04414-2228-431F-9F5D-AFF4C5C08D05.trivial new file mode 100644 index 000000000..e69de29bb From bd07bfb8db730003ca374d5588a3354b416a9f92 Mon Sep 17 00:00:00 2001 From: Devesh Kumar Singh Date: Thu, 14 May 2020 11:56:06 +0530 Subject: [PATCH 2/3] Cast record_file to io.StringIO for Python 3 to appease mypy --- src/pip/_internal/operations/install/wheel.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/pip/_internal/operations/install/wheel.py b/src/pip/_internal/operations/install/wheel.py index 2fb86b866..2fe138238 100644 --- a/src/pip/_internal/operations/install/wheel.py +++ b/src/pip/_internal/operations/install/wheel.py @@ -10,6 +10,7 @@ import collections import compileall import contextlib import csv +import io import logging import os.path import re @@ -24,7 +25,7 @@ from zipfile import ZipFile from pip._vendor import pkg_resources from pip._vendor.distlib.scripts import ScriptMaker from pip._vendor.distlib.util import get_export_entry -from pip._vendor.six import StringIO +from pip._vendor.six import PY3, StringIO from pip._internal.exceptions import InstallationError from pip._internal.locations import get_major_minor_version @@ -32,7 +33,7 @@ from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl from pip._internal.utils.filesystem import adjacent_tmp_file, replace from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.typing import MYPY_CHECK_RUNNING, cast from pip._internal.utils.unpacking import current_umask, unpack_file from pip._internal.utils.wheel import parse_wheel @@ -600,6 +601,12 @@ def install_unpacked_wheel( generated=generated, lib_dir=lib_dir) with _generate_file(record_path, **csv_io_kwargs('w')) as record_file: + + # For Python 3, we create the file in text mode, hence we + # cast record_file to io.StringIO + if PY3: + record_file = cast(io.StringIO, record_file) + writer = csv.writer(record_file) writer.writerows(sorted_outrows(rows)) # sort to simplify testing From 4d208b02b4d3e9fda028fa37b77e983263f6271b Mon Sep 17 00:00:00 2001 From: Devesh Kumar Singh Date: Fri, 15 May 2020 23:40:51 +0530 Subject: [PATCH 3/3] Cast record file to typing.IO[str] to appease mypy for python 2 --- src/pip/_internal/operations/install/wheel.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/pip/_internal/operations/install/wheel.py b/src/pip/_internal/operations/install/wheel.py index 2fe138238..a0885c48c 100644 --- a/src/pip/_internal/operations/install/wheel.py +++ b/src/pip/_internal/operations/install/wheel.py @@ -10,7 +10,6 @@ import collections import compileall import contextlib import csv -import io import logging import os.path import re @@ -25,7 +24,7 @@ from zipfile import ZipFile from pip._vendor import pkg_resources from pip._vendor.distlib.scripts import ScriptMaker from pip._vendor.distlib.util import get_export_entry -from pip._vendor.six import PY3, StringIO +from pip._vendor.six import StringIO from pip._internal.exceptions import InstallationError from pip._internal.locations import get_major_minor_version @@ -39,6 +38,7 @@ from pip._internal.utils.wheel import parse_wheel if MYPY_CHECK_RUNNING: from email.message import Message + import typing # noqa F401 from typing import ( Dict, List, Optional, Sequence, Tuple, Any, Iterable, Iterator, Callable, Set, @@ -602,12 +602,14 @@ def install_unpacked_wheel( lib_dir=lib_dir) with _generate_file(record_path, **csv_io_kwargs('w')) as record_file: - # For Python 3, we create the file in text mode, hence we - # cast record_file to io.StringIO - if PY3: - record_file = cast(io.StringIO, record_file) + # The type mypy infers for record_file using reveal_type + # is different for Python 3 (typing.IO[Any]) and + # Python 2 (typing.BinaryIO), leading us to explicitly + # cast to typing.IO[str] as a workaround + # for bad Python 2 behaviour + record_file_obj = cast('typing.IO[str]', record_file) - writer = csv.writer(record_file) + writer = csv.writer(record_file_obj) writer.writerows(sorted_outrows(rows)) # sort to simplify testing