diff --git a/docs/html/development/architecture/package-finding.rst b/docs/html/development/architecture/package-finding.rst index dfbf5e7ae88..53ece59f8d9 100644 --- a/docs/html/development/architecture/package-finding.rst +++ b/docs/html/development/architecture/package-finding.rst @@ -1,13 +1,13 @@ -Finding and choosing files (``index.py`` and ``PackageFinder``) +Finding and choosing files (``index`` and ``PackageFinder``) --------------------------------------------------------------- -The ``index.py`` module is a top-level module in pip responsible for deciding +The ``pip._internal.index`` sub-package in pip is responsible for deciding what file to download and from where, given a requirement for a project. The -module's functionality is largely exposed through and coordinated by the -module's ``PackageFinder`` class. +package's functionality is largely exposed through and coordinated by the +package's ``PackageFinder`` class. -.. _index-py-overview: +.. _index-overview: Overview ******** @@ -38,7 +38,7 @@ file to download for a package, given a requirement: ` class). The remainder of this section is organized by documenting some of the -classes inside ``index.py``, in the following order: +classes inside the ``index`` package, in the following order: * the main :ref:`PackageFinder ` class, * the :ref:`LinkCollector ` class, @@ -54,7 +54,7 @@ The ``PackageFinder`` class *************************** The ``PackageFinder`` class is the primary way through which code in pip -interacts with ``index.py``. It is an umbrella class that encapsulates and +interacts with ``index`` package. It is an umbrella class that encapsulates and groups together various package-finding functionality. The ``PackageFinder`` class is responsible for searching the network and file @@ -89,7 +89,7 @@ case, the ``PackageFinder`` instance is created by the ``self_outdated_check.py`` module's ``pip_self_version_check()`` function. The ``PackageFinder`` class is responsible for doing all of the things listed -in the :ref:`Overview ` section like fetching and parsing +in the :ref:`Overview ` section like fetching and parsing `PEP 503`_ simple repository HTML pages, evaluating which links in the simple repository pages are relevant for each requirement, and further filtering and sorting by preference the candidates for install coming from the relevant @@ -105,7 +105,7 @@ One of ``PackageFinder``'s main top-level methods is :ref:`LinkEvaluator ` object to filter out some of those links, and then returns a list of ``InstallationCandidates`` (aka candidates for install). This corresponds to steps 1-3 of the - :ref:`Overview ` above. + :ref:`Overview ` above. 2. Constructs a ``CandidateEvaluator`` object and uses that to determine the best candidate. It does this by calling the ``CandidateEvaluator`` class's ``compute_best_candidate()`` method on the return value of @@ -133,8 +133,8 @@ method is the ``collect_links()`` method. The :ref:`PackageFinder ` class invokes this method as the first step of its ``find_all_candidates()`` method. -The ``LinkCollector`` class is the only class in the ``index.py`` module that -makes network requests and is the only class in the module that depends +The ``LinkCollector`` class is the only class in the ``index`` sub-package that +makes network requests and is the only class in the sub-package that depends directly on ``PipSession``, which stores pip's configuration options and state for making requests. diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 5e6dc4602e0..f55f0e6b8d9 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -23,7 +23,7 @@ if MYPY_CHECK_RUNNING: from typing import Tuple, Set, Iterable, Optional, List - from pip._internal.index import PackageFinder + from pip._internal.index.package_finder import PackageFinder logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/cache.py b/src/pip/_internal/cache.py index 8ebecbbd5a6..c5431e14d14 100644 --- a/src/pip/_internal/cache.py +++ b/src/pip/_internal/cache.py @@ -20,7 +20,7 @@ if MYPY_CHECK_RUNNING: from typing import Optional, Set, List, Any - from pip._internal.index import FormatControl + from pip._internal.models.format_control import FormatControl from pip._internal.pep425tags import Pep425Tag logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py index 203e86a49cc..88088b94894 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -14,7 +14,7 @@ from pip._internal.cli.base_command import Command from pip._internal.cli.command_context import CommandContextMixIn from pip._internal.exceptions import CommandError -from pip._internal.index import PackageFinder +from pip._internal.index.package_finder import PackageFinder from pip._internal.legacy_resolve import Resolver from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.network.session import PipSession diff --git a/src/pip/_internal/commands/list.py b/src/pip/_internal/commands/list.py index 77a245b6d2d..cce470a6051 100644 --- a/src/pip/_internal/commands/list.py +++ b/src/pip/_internal/commands/list.py @@ -12,7 +12,7 @@ from pip._internal.cli import cmdoptions from pip._internal.cli.req_command import IndexGroupCommand from pip._internal.exceptions import CommandError -from pip._internal.index import PackageFinder +from pip._internal.index.package_finder import PackageFinder from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.self_outdated_check import make_link_collector from pip._internal.utils.misc import ( diff --git a/src/pip/_internal/index/__init__.py b/src/pip/_internal/index/__init__.py new file mode 100644 index 00000000000..7a17b7b3b6a --- /dev/null +++ b/src/pip/_internal/index/__init__.py @@ -0,0 +1,2 @@ +"""Index interaction code +""" diff --git a/src/pip/_internal/collector.py b/src/pip/_internal/index/collector.py similarity index 100% rename from src/pip/_internal/collector.py rename to src/pip/_internal/index/collector.py diff --git a/src/pip/_internal/index.py b/src/pip/_internal/index/package_finder.py similarity index 99% rename from src/pip/_internal/index.py rename to src/pip/_internal/index/package_finder.py index 897444aae3f..9b338e693be 100644 --- a/src/pip/_internal/index.py +++ b/src/pip/_internal/index/package_finder.py @@ -38,7 +38,7 @@ FrozenSet, Iterable, List, Optional, Set, Text, Tuple, Union, ) from pip._vendor.packaging.version import _BaseVersion - from pip._internal.collector import LinkCollector + from pip._internal.index.collector import LinkCollector from pip._internal.models.search_scope import SearchScope from pip._internal.req import InstallRequirement from pip._internal.pep425tags import Pep425Tag diff --git a/src/pip/_internal/legacy_resolve.py b/src/pip/_internal/legacy_resolve.py index c24158f4d37..be67bdac1b7 100644 --- a/src/pip/_internal/legacy_resolve.py +++ b/src/pip/_internal/legacy_resolve.py @@ -46,7 +46,7 @@ from pip._internal.distributions import AbstractDistribution from pip._internal.network.session import PipSession - from pip._internal.index import PackageFinder + from pip._internal.index.package_finder import PackageFinder from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.req_install import InstallRequirement from pip._internal.req.req_set import RequirementSet diff --git a/src/pip/_internal/models/link.py b/src/pip/_internal/models/link.py index 2d50d17989f..ff808f5e9e2 100644 --- a/src/pip/_internal/models/link.py +++ b/src/pip/_internal/models/link.py @@ -19,7 +19,7 @@ if MYPY_CHECK_RUNNING: from typing import Optional, Text, Tuple, Union - from pip._internal.collector import HTMLPage + from pip._internal.index.collector import HTMLPage from pip._internal.utils.hashes import Hashes diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 73a20e31999..9993f884186 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -61,7 +61,7 @@ from mypy_extensions import TypedDict from pip._internal.distributions import AbstractDistribution - from pip._internal.index import PackageFinder + from pip._internal.index.package_finder import PackageFinder from pip._internal.models.link import Link from pip._internal.req.req_install import InstallRequirement from pip._internal.req.req_tracker import RequirementTracker diff --git a/src/pip/_internal/req/req_file.py b/src/pip/_internal/req/req_file.py index da75ad62813..47486fa1fbc 100644 --- a/src/pip/_internal/req/req_file.py +++ b/src/pip/_internal/req/req_file.py @@ -36,7 +36,7 @@ ) from pip._internal.req import InstallRequirement from pip._internal.cache import WheelCache - from pip._internal.index import PackageFinder + from pip._internal.index.package_finder import PackageFinder from pip._internal.network.session import PipSession ReqFileLines = Iterator[Tuple[int, Text]] diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 763a2f54415..f3e5234d6ec 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -67,7 +67,7 @@ ) from pip._internal.build_env import BuildEnvironment from pip._internal.cache import WheelCache - from pip._internal.index import PackageFinder + from pip._internal.index.package_finder import PackageFinder from pip._vendor.pkg_resources import Distribution from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.markers import Marker diff --git a/src/pip/_internal/self_outdated_check.py b/src/pip/_internal/self_outdated_check.py index 51ef3439ff1..38f1d815f39 100644 --- a/src/pip/_internal/self_outdated_check.py +++ b/src/pip/_internal/self_outdated_check.py @@ -14,8 +14,8 @@ from pip._vendor.packaging import version as packaging_version from pip._vendor.six import ensure_binary -from pip._internal.collector import LinkCollector -from pip._internal.index import PackageFinder +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder from pip._internal.models.search_scope import SearchScope from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.utils.compat import WINDOWS diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py index 32580739f36..3e3f7e44fc9 100644 --- a/tests/lib/__init__.py +++ b/tests/lib/__init__.py @@ -13,8 +13,8 @@ import pytest from scripttest import FoundDir, TestFileEnvironment -from pip._internal.collector import LinkCollector -from pip._internal.index import PackageFinder +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder from pip._internal.locations import get_major_minor_version from pip._internal.models.search_scope import SearchScope from pip._internal.models.selection_prefs import SelectionPreferences diff --git a/tests/unit/test_build_env.py b/tests/unit/test_build_env.py index bcc241bbedf..9db08a124dd 100644 --- a/tests/unit/test_build_env.py +++ b/tests/unit/test_build_env.py @@ -22,8 +22,8 @@ def run_with_build_env(script, setup_script_contents, import sys from pip._internal.build_env import BuildEnvironment - from pip._internal.collector import LinkCollector - from pip._internal.index import PackageFinder + from pip._internal.index.collector import LinkCollector + from pip._internal.index.package_finder import PackageFinder from pip._internal.models.search_scope import SearchScope from pip._internal.models.selection_prefs import ( SelectionPreferences diff --git a/tests/unit/test_collector.py b/tests/unit/test_collector.py index f602c956a04..cf709c99bcf 100644 --- a/tests/unit/test_collector.py +++ b/tests/unit/test_collector.py @@ -9,7 +9,7 @@ from pip._vendor import html5lib, requests from pip._vendor.six.moves.urllib import request as urllib_request -from pip._internal.collector import ( +from pip._internal.index.collector import ( HTMLPage, _clean_link, _determine_base_url, @@ -334,7 +334,7 @@ def test_get_html_page_invalid_scheme(caplog, url, vcs_scheme): assert page is None assert caplog.record_tuples == [ ( - "pip._internal.collector", + "pip._internal.index.collector", logging.DEBUG, "Cannot look at {} URL {}".format(vcs_scheme, url), ), @@ -367,7 +367,8 @@ def test_get_html_page_directory_append_index(tmpdir): session = mock.Mock(PipSession) fake_response = make_fake_html_response(expected_url) - with mock.patch("pip._internal.collector._get_html_response") as mock_func: + mock_func = mock.patch("pip._internal.index.collector._get_html_response") + with mock_func as mock_func: mock_func.return_value = fake_response actual = _get_html_page(Link(dir_url), session=session) assert mock_func.mock_calls == [ @@ -434,7 +435,7 @@ def check_links_include(links, names): class TestLinkCollector(object): - @patch('pip._internal.collector._get_html_response') + @patch('pip._internal.index.collector._get_html_response') def test_collect_links(self, mock_get_html_response, caplog, data): caplog.set_level(logging.DEBUG) @@ -474,5 +475,5 @@ def test_collect_links(self, mock_get_html_response, caplog, data): 1 location(s) to search for versions of twine: * https://pypi.org/simple/twine/""") assert caplog.record_tuples == [ - ('pip._internal.collector', logging.DEBUG, expected_message), + ('pip._internal.index.collector', logging.DEBUG, expected_message), ] diff --git a/tests/unit/test_finder.py b/tests/unit/test_finder.py index 1295ff0b059..e7bf13e02bb 100644 --- a/tests/unit/test_finder.py +++ b/tests/unit/test_finder.py @@ -12,7 +12,7 @@ BestVersionAlreadyInstalled, DistributionNotFound, ) -from pip._internal.index import ( +from pip._internal.index.package_finder import ( CandidateEvaluator, InstallationCandidate, Link, @@ -62,7 +62,10 @@ def test_no_partial_name_match(data): def test_tilde(): """Finder can accept a path with ~ in it and will normalize it.""" - with patch('pip._internal.collector.os.path.exists', return_value=True): + patched_exists = patch( + 'pip._internal.index.collector.os.path.exists', return_value=True + ) + with patched_exists: finder = make_test_finder(find_links=['~/python-pkgs']) req = install_req_from_line("gmpy") with pytest.raises(DistributionNotFound): diff --git a/tests/unit/test_index.py b/tests/unit/test_index.py index 63eac97b99e..bc86398eecf 100644 --- a/tests/unit/test_index.py +++ b/tests/unit/test_index.py @@ -3,8 +3,8 @@ import pytest from pip._vendor.packaging.specifiers import SpecifierSet -from pip._internal.collector import LinkCollector -from pip._internal.index import ( +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import ( CandidateEvaluator, CandidatePreferences, FormatControl, diff --git a/tests/unit/test_req_file.py b/tests/unit/test_req_file.py index 41e07e60f02..ca86a191b29 100644 --- a/tests/unit/test_req_file.py +++ b/tests/unit/test_req_file.py @@ -7,7 +7,7 @@ from mock import Mock, patch from pretend import stub -import pip._internal.index +import pip._internal.req.req_file # this will be monkeypatched from pip._internal.exceptions import ( InstallationError, RequirementsFileParseError, @@ -272,7 +272,6 @@ def test_yield_editable_constraint(self): def test_nested_requirements_file(self, monkeypatch): line = '-r another_file' req = install_req_from_line('SomeProject') - import pip._internal.req.req_file def stub_parse_requirements(req_url, finder, comes_from, options, session, wheel_cache, constraint): @@ -285,7 +284,6 @@ def stub_parse_requirements(req_url, finder, comes_from, options, def test_nested_constraints_file(self, monkeypatch): line = '-c another_file' req = install_req_from_line('SomeProject') - import pip._internal.req.req_file def stub_parse_requirements(req_url, finder, comes_from, options, session, wheel_cache, constraint): diff --git a/tests/unit/test_self_check_outdated.py b/tests/unit/test_self_check_outdated.py index e8c40224770..72fa6929357 100644 --- a/tests/unit/test_self_check_outdated.py +++ b/tests/unit/test_self_check_outdated.py @@ -10,7 +10,7 @@ from pip._vendor import pkg_resources from pip._internal import self_outdated_check -from pip._internal.index import InstallationCandidate +from pip._internal.models.candidate import InstallationCandidate from pip._internal.network.session import PipSession from pip._internal.self_outdated_check import ( SelfCheckState,