From 09fd200c599de4fadf2ff814a1bef855bc6d77e8 Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Sat, 21 Sep 2019 15:21:23 -0400 Subject: [PATCH 1/3] Move `pip._internal:main` to its own module Moving content out of `__init__` is preferred in general because it avoids conflicts with module names and unnecessary imports. --- setup.py | 6 ++--- src/pip/__main__.py | 2 +- src/pip/_internal/__init__.py | 38 ------------------------------ src/pip/_internal/main.py | 44 +++++++++++++++++++++++++++++++++++ tests/conftest.py | 4 ++-- tests/unit/test_options.py | 2 +- 6 files changed, 51 insertions(+), 45 deletions(-) create mode 100644 src/pip/_internal/main.py diff --git a/setup.py b/setup.py index ed1f0109818..b05c1b8779b 100644 --- a/setup.py +++ b/setup.py @@ -71,9 +71,9 @@ def find_version(*file_paths): }, entry_points={ "console_scripts": [ - "pip=pip._internal:main", - "pip%s=pip._internal:main" % sys.version_info[:1], - "pip%s.%s=pip._internal:main" % sys.version_info[:2], + "pip=pip._internal.main:main", + "pip%s=pip._internal.main:main" % sys.version_info[:1], + "pip%s.%s=pip._internal.main:main" % sys.version_info[:2], ], }, diff --git a/src/pip/__main__.py b/src/pip/__main__.py index 0c223f8c187..49b6fdf71ca 100644 --- a/src/pip/__main__.py +++ b/src/pip/__main__.py @@ -13,7 +13,7 @@ path = os.path.dirname(os.path.dirname(__file__)) sys.path.insert(0, path) -from pip._internal import main as _main # isort:skip # noqa +from pip._internal.main import main as _main # isort:skip # noqa if __name__ == '__main__': sys.exit(_main()) diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py index bb5cbff323c..e30d71ea3d4 100755 --- a/src/pip/_internal/__init__.py +++ b/src/pip/_internal/__init__.py @@ -1,10 +1,6 @@ #!/usr/bin/env python from __future__ import absolute_import -import locale -import logging -import os -import sys import warnings # We ignore certain warnings from urllib3, since they are not relevant to pip's @@ -16,10 +12,6 @@ import pip._internal.utils.inject_securetransport # noqa from pip._internal.cli.autocompletion import autocomplete -from pip._internal.cli.main_parser import parse_command -from pip._internal.commands import create_command -from pip._internal.exceptions import PipError -from pip._internal.utils import deprecation # Raised when using --trusted-host. warnings.filterwarnings("ignore", category=InsecureRequestWarning) @@ -27,33 +19,3 @@ # Barry Warsaw noted (on 2016-06-17) that this should be done before # importing pip.vcs, which has since moved to pip._internal.vcs. warnings.filterwarnings("ignore", category=DependencyWarning) - -logger = logging.getLogger(__name__) - - -def main(args=None): - if args is None: - args = sys.argv[1:] - - # Configure our deprecation warnings to be sent through loggers - deprecation.install_warning_logger() - - autocomplete() - - try: - cmd_name, cmd_args = parse_command(args) - except PipError as exc: - sys.stderr.write("ERROR: %s" % exc) - sys.stderr.write(os.linesep) - sys.exit(1) - - # Needed for locale.getpreferredencoding(False) to work - # in pip._internal.utils.encoding.auto_decode - try: - locale.setlocale(locale.LC_ALL, '') - except locale.Error as e: - # setlocale can apparently crash if locale are uninitialized - logger.debug("Ignoring error %s when setting locale", e) - command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) - - return command.main(cmd_args) diff --git a/src/pip/_internal/main.py b/src/pip/_internal/main.py new file mode 100644 index 00000000000..9b55d0f02de --- /dev/null +++ b/src/pip/_internal/main.py @@ -0,0 +1,44 @@ +"""Primary application entrypoint. +""" +from __future__ import absolute_import + +import locale +import logging +import os +import sys + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import create_command +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation + +logger = logging.getLogger(__name__) + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) + + return command.main(cmd_args) diff --git a/tests/conftest.py b/tests/conftest.py index 5982ebf9014..0e704f874fa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,7 +10,7 @@ import six from setuptools.wheel import Wheel -import pip._internal +import pip._internal.main from tests.lib import DATA_DIR, SRC_DIR, TestData from tests.lib.path import Path from tests.lib.scripttest import PipTestEnvironment @@ -342,7 +342,7 @@ def pip(self, *args): stdout = io.BytesIO() sys.stdout = stdout try: - returncode = pip._internal.main(list(args)) + returncode = pip._internal.main.main(list(args)) except SystemExit as e: returncode = e.code or 0 finally: diff --git a/tests/unit/test_options.py b/tests/unit/test_options.py index 32509209869..c49801d99de 100644 --- a/tests/unit/test_options.py +++ b/tests/unit/test_options.py @@ -4,9 +4,9 @@ import pytest import pip._internal.configuration -from pip._internal import main from pip._internal.commands import create_command from pip._internal.exceptions import PipError +from pip._internal.main import main from tests.lib.options_helpers import AddFakeCommandMixin From b0eed267a62c54abb07b4fa62c6c1196b276b192 Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Sat, 21 Sep 2019 15:27:27 -0400 Subject: [PATCH 2/3] Remove autocomplete import from pip._internal.__init__ --- src/pip/_internal/__init__.py | 1 - tests/functional/test_completion.py | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py index e30d71ea3d4..b88a97c46c8 100755 --- a/src/pip/_internal/__init__.py +++ b/src/pip/_internal/__init__.py @@ -11,7 +11,6 @@ ) import pip._internal.utils.inject_securetransport # noqa -from pip._internal.cli.autocompletion import autocomplete # Raised when using --trusted-host. warnings.filterwarnings("ignore", category=InsecureRequestWarning) diff --git a/tests/functional/test_completion.py b/tests/functional/test_completion.py index 5491ce22d30..9280b5d6a8a 100644 --- a/tests/functional/test_completion.py +++ b/tests/functional/test_completion.py @@ -78,7 +78,9 @@ def setup_completion(script, words, cword, cwd=None): # expect_error is True because autocomplete exists with 1 status code result = script.run( - 'python', '-c', 'import pip._internal;pip._internal.autocomplete()', + 'python', '-c', + 'from pip._internal.cli.autocompletion import autocomplete;' + 'autocomplete()', expect_error=True, cwd=cwd, ) From 3e98ee8464ab7e5b63c602bc315c8dea4a63a554 Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Tue, 24 Sep 2019 21:36:16 -0400 Subject: [PATCH 3/3] Use from ... import ... style --- tests/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 0e704f874fa..134eddd7705 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,7 +10,7 @@ import six from setuptools.wheel import Wheel -import pip._internal.main +from pip._internal.main import main as pip_entry_point from tests.lib import DATA_DIR, SRC_DIR, TestData from tests.lib.path import Path from tests.lib.scripttest import PipTestEnvironment @@ -342,7 +342,7 @@ def pip(self, *args): stdout = io.BytesIO() sys.stdout = stdout try: - returncode = pip._internal.main.main(list(args)) + returncode = pip_entry_point(list(args)) except SystemExit as e: returncode = e.code or 0 finally: