Skip to content

Commit a6b5e90

Browse files
authored
Merge pull request #9700 from uranusjr/mypy-follow-imports
2 parents 9624d0d + e289235 commit a6b5e90

File tree

17 files changed

+108
-81
lines changed

17 files changed

+108
-81
lines changed

setup.cfg

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,23 @@ disallow_untyped_defs = True
3636
disallow_any_generics = True
3737
warn_unused_ignores = True
3838

39-
[mypy-pip/_vendor/*]
40-
follow_imports = skip
39+
[mypy-pip._vendor.*]
4140
ignore_errors = True
4241

42+
# These vendored libraries use runtime magic to populate things and don't sit
43+
# well with static typing out of the box. Eventually we should provide correct
44+
# typing information for their public interface and remove these configs.
45+
[mypy-pip._vendor.colorama]
46+
follow_imports = skip
47+
[mypy-pip._vendor.pkg_resources]
48+
follow_imports = skip
49+
[mypy-pip._vendor.progress.*]
50+
follow_imports = skip
51+
[mypy-pip._vendor.requests.*]
52+
follow_imports = skip
53+
[mypy-pip._vendor.retrying]
54+
follow_imports = skip
55+
4356
[tool:pytest]
4457
addopts = --ignore src/pip/_vendor --ignore tests/tests_cache -r aR
4558
markers =

src/pip/_internal/commands/debug.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import sys
55
from optparse import Values
66
from types import ModuleType
7-
from typing import Dict, List, Optional
7+
from typing import Any, Dict, List, Optional
88

99
import pip._vendor
1010
from pip._vendor.certifi import where
@@ -24,7 +24,7 @@
2424

2525

2626
def show_value(name, value):
27-
# type: (str, Optional[str]) -> None
27+
# type: (str, Any) -> None
2828
logger.info('%s: %s', name, value)
2929

3030

src/pip/_internal/commands/install.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def get_check_binary_allowed(format_control):
4949
# type: (FormatControl) -> BinaryAllowedPredicate
5050
def check_binary_allowed(req):
5151
# type: (InstallRequirement) -> bool
52-
canonical_name = canonicalize_name(req.name)
52+
canonical_name = canonicalize_name(req.name or "")
5353
allowed_formats = format_control.get_allowed_formats(canonical_name)
5454
return "binary" in allowed_formats
5555

src/pip/_internal/metadata/base.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import logging
22
import re
3-
from typing import Container, Iterator, List, Optional
3+
from typing import Container, Iterator, List, Optional, Union
44

5-
from pip._vendor.packaging.version import _BaseVersion
5+
from pip._vendor.packaging.version import LegacyVersion, Version
66

77
from pip._internal.utils.misc import stdlib_pkgs # TODO: Move definition here.
88

9+
DistributionVersion = Union[LegacyVersion, Version]
10+
911
logger = logging.getLogger(__name__)
1012

1113

@@ -34,7 +36,7 @@ def canonical_name(self):
3436

3537
@property
3638
def version(self):
37-
# type: () -> _BaseVersion
39+
# type: () -> DistributionVersion
3840
raise NotImplementedError()
3941

4042
@property

src/pip/_internal/metadata/pkg_resources.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33

44
from pip._vendor import pkg_resources
55
from pip._vendor.packaging.utils import canonicalize_name
6-
from pip._vendor.packaging.version import _BaseVersion
76
from pip._vendor.packaging.version import parse as parse_version
87

98
from pip._internal.utils import misc # TODO: Move definition here.
109
from pip._internal.utils.packaging import get_installer
1110
from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
1211

13-
from .base import BaseDistribution, BaseEnvironment
12+
from .base import BaseDistribution, BaseEnvironment, DistributionVersion
1413

1514

1615
class Distribution(BaseDistribution):
@@ -45,7 +44,7 @@ def canonical_name(self):
4544

4645
@property
4746
def version(self):
48-
# type: () -> _BaseVersion
47+
# type: () -> DistributionVersion
4948
return parse_version(self._dist.version)
5049

5150
@property

src/pip/_internal/models/candidate.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from pip._vendor.packaging.version import _BaseVersion
21
from pip._vendor.packaging.version import parse as parse_version
32

43
from pip._internal.models.link import Link
@@ -14,7 +13,7 @@ class InstallationCandidate(KeyBasedCompareMixin):
1413
def __init__(self, name, version, link):
1514
# type: (str, str, Link) -> None
1615
self.name = name
17-
self.version = parse_version(version) # type: _BaseVersion
16+
self.version = parse_version(version)
1817
self.link = link
1918

2019
super().__init__(

src/pip/_internal/network/session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ def __init__(
295295
# Add a small amount of back off between failed requests in
296296
# order to prevent hammering the service.
297297
backoff_factor=0.25,
298-
)
298+
) # type: ignore
299299

300300
# Our Insecure HTTPAdapter disables HTTPS validation. It does not
301301
# support caching so we'll use it for all http:// URLs.

src/pip/_internal/operations/check.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import logging
55
from collections import namedtuple
6-
from typing import Any, Callable, Dict, List, Optional, Set, Tuple
6+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Set, Tuple
77

88
from pip._vendor.packaging.utils import canonicalize_name
99
from pip._vendor.pkg_resources import RequirementParseError
@@ -12,23 +12,25 @@
1212
from pip._internal.req.req_install import InstallRequirement
1313
from pip._internal.utils.misc import get_installed_distributions
1414

15+
if TYPE_CHECKING:
16+
from pip._vendor.packaging.utils import NormalizedName
17+
1518
logger = logging.getLogger(__name__)
1619

1720
# Shorthands
18-
PackageSet = Dict[str, 'PackageDetails']
21+
PackageSet = Dict['NormalizedName', 'PackageDetails']
1922
Missing = Tuple[str, Any]
2023
Conflicting = Tuple[str, str, Any]
2124

22-
MissingDict = Dict[str, List[Missing]]
23-
ConflictingDict = Dict[str, List[Conflicting]]
25+
MissingDict = Dict['NormalizedName', List[Missing]]
26+
ConflictingDict = Dict['NormalizedName', List[Conflicting]]
2427
CheckResult = Tuple[MissingDict, ConflictingDict]
2528
ConflictDetails = Tuple[PackageSet, CheckResult]
2629

2730
PackageDetails = namedtuple('PackageDetails', ['version', 'requires'])
2831

2932

30-
def create_package_set_from_installed(**kwargs):
31-
# type: (**Any) -> Tuple[PackageSet, bool]
33+
def create_package_set_from_installed(**kwargs: Any) -> Tuple["PackageSet", bool]:
3234
"""Converts a list of distributions into a PackageSet.
3335
"""
3436
# Default to using all packages installed on the system
@@ -59,16 +61,16 @@ def check_package_set(package_set, should_ignore=None):
5961
missing = {}
6062
conflicting = {}
6163

62-
for package_name in package_set:
64+
for package_name, package_detail in package_set.items():
6365
# Info about dependencies of package_name
6466
missing_deps = set() # type: Set[Missing]
6567
conflicting_deps = set() # type: Set[Conflicting]
6668

6769
if should_ignore and should_ignore(package_name):
6870
continue
6971

70-
for req in package_set[package_name].requires:
71-
name = canonicalize_name(req.project_name) # type: str
72+
for req in package_detail.requires:
73+
name = canonicalize_name(req.project_name)
7274

7375
# Check if it's missing
7476
if name not in package_set:
@@ -114,7 +116,7 @@ def check_install_conflicts(to_install):
114116

115117

116118
def _simulate_installation_of(to_install, package_set):
117-
# type: (List[InstallRequirement], PackageSet) -> Set[str]
119+
# type: (List[InstallRequirement], PackageSet) -> Set[NormalizedName]
118120
"""Computes the version of packages after installing to_install.
119121
"""
120122

@@ -136,7 +138,7 @@ def _simulate_installation_of(to_install, package_set):
136138

137139

138140
def _create_whitelist(would_be_installed, package_set):
139-
# type: (Set[str], PackageSet) -> Set[str]
141+
# type: (Set[NormalizedName], PackageSet) -> Set[NormalizedName]
140142
packages_affected = set(would_be_installed)
141143

142144
for package_name in package_set:

src/pip/_internal/req/constructors.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def parse_req_from_editable(editable_req):
182182

183183
if name is not None:
184184
try:
185-
req = Requirement(name)
185+
req = Requirement(name) # type: Optional[Requirement]
186186
except InvalidRequirement:
187187
raise InstallationError(f"Invalid requirement: '{name}'")
188188
else:
@@ -335,7 +335,7 @@ def with_source(text):
335335
return text
336336
return f'{text} (from {line_source})'
337337

338-
if req_as_string is not None:
338+
def _parse_req_string(req_as_string: str) -> Requirement:
339339
try:
340340
req = Requirement(req_as_string)
341341
except InvalidRequirement:
@@ -363,6 +363,10 @@ def with_source(text):
363363
if spec_str.endswith(']'):
364364
msg = f"Extras after version '{spec_str}'."
365365
raise InstallationError(msg)
366+
return req
367+
368+
if req_as_string is not None:
369+
req = _parse_req_string(req_as_string) # type: Optional[Requirement]
366370
else:
367371
req = None
368372

src/pip/_internal/req/req_install.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ def ensure_build_location(self, build_dir, autodelete, parallel_builds):
349349

350350
# When parallel builds are enabled, add a UUID to the build directory
351351
# name so multiple builds do not interfere with each other.
352-
dir_name = canonicalize_name(self.name)
352+
dir_name = canonicalize_name(self.name) # type: str
353353
if parallel_builds:
354354
dir_name = f"{dir_name}_{uuid.uuid4().hex}"
355355

0 commit comments

Comments
 (0)