Skip to content

Commit f981fac

Browse files
authored
Merge pull request #7845 from uranusjr/resolver-flag
Add --unstable-feature=resolver
2 parents e15ef59 + fc810d7 commit f981fac

File tree

6 files changed

+95
-8
lines changed

6 files changed

+95
-8
lines changed

src/pip/_internal/cli/cmdoptions.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,19 @@ def check_list_path_option(options):
915915
) # type: Callable[..., Option]
916916

917917

918+
unstable_feature = partial(
919+
Option,
920+
'--unstable-feature',
921+
dest='unstable_features',
922+
metavar='feature',
923+
action='append',
924+
default=[],
925+
choices=['resolver'],
926+
help=SUPPRESS_HELP, # TODO: Enable this when the resolver actually works.
927+
# help='Enable unstable feature(s) that may be backward incompatible.',
928+
) # type: Callable[..., Option]
929+
930+
918931
##########
919932
# groups #
920933
##########
@@ -943,6 +956,7 @@ def check_list_path_option(options):
943956
disable_pip_version_check,
944957
no_color,
945958
no_python_version_warning,
959+
unstable_feature,
946960
]
947961
} # type: Dict[str, Any]
948962

src/pip/_internal/cli/req_command.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
)
2727
from pip._internal.req.req_file import parse_requirements
2828
from pip._internal.req.req_set import RequirementSet
29-
from pip._internal.resolution.legacy.resolver import Resolver
3029
from pip._internal.self_outdated_check import (
3130
make_link_collector,
3231
pip_self_version_check,
@@ -42,6 +41,7 @@
4241
from pip._internal.models.target_python import TargetPython
4342
from pip._internal.req.req_install import InstallRequirement
4443
from pip._internal.req.req_tracker import RequirementTracker
44+
from pip._internal.resolution.base import BaseResolver
4545
from pip._internal.utils.temp_dir import (
4646
TempDirectory,
4747
TempDirectoryTypeRegistry,
@@ -248,7 +248,7 @@ def make_resolver(
248248
use_pep517=None, # type: Optional[bool]
249249
py_version_info=None # type: Optional[Tuple[int, ...]]
250250
):
251-
# type: (...) -> Resolver
251+
# type: (...) -> BaseResolver
252252
"""
253253
Create a Resolver instance for the given parameters.
254254
"""
@@ -258,7 +258,25 @@ def make_resolver(
258258
wheel_cache=wheel_cache,
259259
use_pep517=use_pep517,
260260
)
261-
return Resolver(
261+
# The long import name and duplicated invocation is needed to convince
262+
# Mypy into correctly typechecking. Otherwise it would complain the
263+
# "Resolver" class being redefined.
264+
if 'resolver' in options.unstable_features:
265+
import pip._internal.resolution.resolvelib.resolver
266+
return pip._internal.resolution.resolvelib.resolver.Resolver(
267+
preparer=preparer,
268+
finder=finder,
269+
make_install_req=make_install_req,
270+
use_user_site=use_user_site,
271+
ignore_dependencies=options.ignore_dependencies,
272+
ignore_installed=ignore_installed,
273+
ignore_requires_python=ignore_requires_python,
274+
force_reinstall=force_reinstall,
275+
upgrade_strategy=upgrade_strategy,
276+
py_version_info=py_version_info,
277+
)
278+
import pip._internal.resolution.legacy.resolver
279+
return pip._internal.resolution.legacy.resolver.Resolver(
262280
preparer=preparer,
263281
finder=finder,
264282
make_install_req=make_install_req,

src/pip/_internal/resolution/base.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
2+
3+
if MYPY_CHECK_RUNNING:
4+
from typing import Callable, List
5+
from pip._internal.req.req_install import InstallRequirement
6+
from pip._internal.req.req_set import RequirementSet
7+
8+
InstallRequirementProvider = Callable[
9+
[str, InstallRequirement], InstallRequirement
10+
]
11+
12+
13+
class BaseResolver(object):
14+
def resolve(self, root_reqs, check_supported_wheels):
15+
# type: (List[InstallRequirement], bool) -> RequirementSet
16+
raise NotImplementedError()
17+
18+
def get_installation_order(self, req_set):
19+
# type: (RequirementSet) -> List[InstallRequirement]
20+
raise NotImplementedError()

src/pip/_internal/resolution/legacy/resolver.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
UnsupportedPythonVersion,
3030
)
3131
from pip._internal.req.req_set import RequirementSet
32+
from pip._internal.resolution.base import BaseResolver
3233
from pip._internal.utils.logging import indent_log
3334
from pip._internal.utils.misc import dist_in_usersite, normalize_version_info
3435
from pip._internal.utils.packaging import (
@@ -38,17 +39,15 @@
3839
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
3940

4041
if MYPY_CHECK_RUNNING:
41-
from typing import Callable, DefaultDict, List, Optional, Set, Tuple
42+
from typing import DefaultDict, List, Optional, Set, Tuple
4243
from pip._vendor import pkg_resources
4344

4445
from pip._internal.distributions import AbstractDistribution
4546
from pip._internal.index.package_finder import PackageFinder
4647
from pip._internal.operations.prepare import RequirementPreparer
4748
from pip._internal.req.req_install import InstallRequirement
49+
from pip._internal.resolution.base import InstallRequirementProvider
4850

49-
InstallRequirementProvider = Callable[
50-
[str, InstallRequirement], InstallRequirement
51-
]
5251
DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]]
5352

5453
logger = logging.getLogger(__name__)
@@ -102,7 +101,7 @@ def _check_dist_requires_python(
102101
))
103102

104103

105-
class Resolver(object):
104+
class Resolver(BaseResolver):
106105
"""Resolves which packages need to be installed/uninstalled to perform \
107106
the requested operation without breaking the requirements of any package.
108107
"""

src/pip/_internal/resolution/resolvelib/__init__.py

Whitespace-only changes.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from pip._internal.resolution.base import BaseResolver
2+
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
3+
4+
if MYPY_CHECK_RUNNING:
5+
from typing import List, Optional, Tuple
6+
7+
from pip._internal.index.package_finder import PackageFinder
8+
from pip._internal.operations.prepare import RequirementPreparer
9+
from pip._internal.req.req_install import InstallRequirement
10+
from pip._internal.req.req_set import RequirementSet
11+
from pip._internal.resolution.base import InstallRequirementProvider
12+
13+
14+
class Resolver(BaseResolver):
15+
def __init__(
16+
self,
17+
preparer, # type: RequirementPreparer
18+
finder, # type: PackageFinder
19+
make_install_req, # type: InstallRequirementProvider
20+
use_user_site, # type: bool
21+
ignore_dependencies, # type: bool
22+
ignore_installed, # type: bool
23+
ignore_requires_python, # type: bool
24+
force_reinstall, # type: bool
25+
upgrade_strategy, # type: str
26+
py_version_info=None, # type: Optional[Tuple[int, ...]]
27+
):
28+
super(Resolver, self).__init__()
29+
30+
def resolve(self, root_reqs, check_supported_wheels):
31+
# type: (List[InstallRequirement], bool) -> RequirementSet
32+
raise NotImplementedError()
33+
34+
def get_installation_order(self, req_set):
35+
# type: (RequirementSet) -> List[InstallRequirement]
36+
raise NotImplementedError()

0 commit comments

Comments
 (0)