From f498abbafb96725b0eefb3e0ce5a8cd730ea02dd Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Thu, 17 Mar 2022 01:50:36 -0400 Subject: [PATCH] Sorting out remaining import errors with new utils module --- pipenv/cli/command.py | 4 +- pipenv/cli/options.py | 2 +- pipenv/core.py | 22 +++++--- pipenv/environment.py | 7 +-- pipenv/installers.py | 3 +- pipenv/project.py | 23 +++++--- pipenv/resolver.py | 7 +-- pipenv/utils/__init__.py | 11 ---- pipenv/utils/constants.py | 4 -- pipenv/utils/dependencies.py | 1 + pipenv/utils/indexes.py | 18 ++++--- pipenv/utils/internet.py | 26 ++------- pipenv/utils/locking.py | 2 +- pipenv/utils/processes.py | 9 +++- pipenv/utils/resolver.py | 57 +++++++++++--------- pipenv/utils/shell.py | 33 ++++++++++-- tests/integration/conftest.py | 2 +- tests/integration/test_cli.py | 3 +- tests/integration/test_dot_venv.py | 2 +- tests/integration/test_install_basic.py | 3 +- tests/integration/test_install_markers.py | 2 +- tests/integration/test_install_twists.py | 2 +- tests/integration/test_install_uri.py | 2 +- tests/integration/test_lock.py | 4 +- tests/integration/test_pipenv.py | 3 +- tests/integration/test_project.py | 2 +- tests/integration/test_run.py | 2 +- tests/integration/test_sync.py | 2 +- tests/integration/test_uninstall.py | 2 +- tests/integration/test_windows.py | 2 +- tests/unit/test_core.py | 2 +- tests/unit/test_environments.py | 2 +- tests/unit/test_utils.py | 59 ++++++++++----------- tests/unit/test_utils_windows_executable.py | 7 ++- 34 files changed, 178 insertions(+), 154 deletions(-) diff --git a/pipenv/cli/command.py b/pipenv/cli/command.py index e98ac76515..0b4da8bc07 100644 --- a/pipenv/cli/command.py +++ b/pipenv/cli/command.py @@ -12,7 +12,7 @@ ) from pipenv.exceptions import PipenvOptionsError from pipenv.patched import crayons -from pipenv.utils import subprocess_run +from pipenv.utils.processes import subprocess_run from pipenv.vendor.click import ( Choice, argument, echo, edit, group, option, pass_context, secho, types, version_option @@ -64,7 +64,7 @@ def cli( cleanup_virtualenv, do_clear, do_py, do_where, ensure_project, format_help, system_which, warn_in_virtualenv ) - from ..utils import create_spinner + from pipenv.utils.spinner import create_spinner if man: if system_which("man"): diff --git a/pipenv/cli/options.py b/pipenv/cli/options.py index 02aeb03b71..a9af3fb5fa 100644 --- a/pipenv/cli/options.py +++ b/pipenv/cli/options.py @@ -1,7 +1,7 @@ import os from pipenv.project import Project -from pipenv.utils import is_valid_url +from pipenv.utils.internet import is_valid_url from pipenv.vendor.click import ( BadArgumentUsage, BadParameter, Group, Option, argument, echo, make_pass_decorator, option diff --git a/pipenv/core.py b/pipenv/core.py index de298a4c64..131aa59b0a 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -15,14 +15,22 @@ from pipenv import environments, exceptions, pep508checker, progress from pipenv._compat import decode_for_output, fix_utf8 from pipenv.patched import crayons -from pipenv.utils import ( - cmd_list_to_shell, convert_deps_to_pip, create_spinner, download_file, - find_python, get_canonical_names, get_host_and_port, get_source_list, is_pinned, - is_python_command, is_required_version, is_star, is_valid_url, - parse_indexes, pep423_name, prepare_pip_source_args, proper_case, - python_version, run_command, subprocess_run, venv_resolve_deps -) +from pipenv.utils.dependencies import ( + convert_deps_to_pip, + get_canonical_names, + is_pinned, + is_required_version, + is_star, + pep423_name, + python_version +) +from pipenv.utils.internet import download_file, get_host_and_port, is_valid_url, proper_case +from pipenv.utils.indexes import get_source_list, parse_indexes, prepare_pip_source_args +from pipenv.utils.resolver import venv_resolve_deps +from pipenv.utils.shell import cmd_list_to_shell, find_python, is_python_command, subprocess_run +from pipenv.utils.spinner import create_spinner +from pipenv.utils.processes import run_command if environments.is_type_checking(): from typing import Dict, List, Optional, Union diff --git a/pipenv/environment.py b/pipenv/environment.py index 4a2c48cfaf..76b0c90fc3 100644 --- a/pipenv/environment.py +++ b/pipenv/environment.py @@ -12,10 +12,11 @@ import pkg_resources import pipenv -import utils.indexes from pipenv.environments import is_type_checking -from pipenv.utils import make_posix, normalize_path, subprocess_run +from pipenv.utils.shell import make_posix, normalize_path +from pipenv.utils.processes import subprocess_run +from pipenv.utils.indexes import prepare_pip_source_args from pipenv.vendor import vistir from pipenv.vendor.cached_property import cached_property from pipenv.vendor.packaging.utils import canonicalize_name @@ -599,7 +600,7 @@ def get_finder(self, pre=False): from .vendor.pip_shims.shims import InstallCommand, get_package_finder pip_command = InstallCommand() - pip_args = utils.indexes.prepare_pip_source_args(self.sources) + pip_args = prepare_pip_source_args(self.sources) pip_options, _ = pip_command.parser.parse_args(pip_args) pip_options.cache_dir = self.project.s.PIPENV_CACHE_DIR pip_options.pre = self.pipfile.get("pre", pre) diff --git a/pipenv/installers.py b/pipenv/installers.py index ba156a0ca4..5928b19884 100644 --- a/pipenv/installers.py +++ b/pipenv/installers.py @@ -5,7 +5,8 @@ from abc import ABCMeta, abstractmethod from pipenv.vendor import attr -from pipenv.utils import find_windows_executable, subprocess_run +from pipenv.utils.processes import subprocess_run +from pipenv.utils.shell import find_windows_executable @attr.s diff --git a/pipenv/project.py b/pipenv/project.py index 386b784d7a..a63306ff48 100644 --- a/pipenv/project.py +++ b/pipenv/project.py @@ -21,13 +21,20 @@ from pipenv.core import system_which from pipenv.environment import Environment from pipenv.environments import Setting, is_type_checking, is_in_virtualenv, normalize_pipfile_path -from pipenv.utils import ( - cleanup_toml, convert_toml_outline_tables, find_requirements, - find_windows_executable, get_canonical_names, get_pipenv_dist, get_url_name, - get_workon_home, is_editable, is_installable_file, is_star, is_valid_url, - is_virtual_environment, looks_like_dir, pep423_name, - proper_case, python_version, safe_expandvars +from pipenv.utils.dependencies import get_canonical_names, is_editable, is_installable_file, is_star, python_version +from pipenv.utils.internet import get_url_name, is_valid_url, proper_case +from pipenv.utils.resolver import pep423_name +from pipenv.utils.toml import cleanup_toml, convert_toml_outline_tables +from pipenv.utils.shell import ( + find_requirements, + find_windows_executable, + get_pipenv_dist, + get_workon_home, + is_virtual_environment, + looks_like_dir, + safe_expandvars ) + from pipenv.vendor.cached_property import cached_property from pipenv.vendor.requirementslib.models.utils import ( get_default_pyproject_backend @@ -285,7 +292,7 @@ def get_location_for_virtualenv(self): @property def working_set(self): # type: () -> pkg_resources.WorkingSet - from .utils import load_path + from pipenv.utils.shell import load_path sys_path = load_path(self.which("python")) import pkg_resources return pkg_resources.WorkingSet(sys_path) @@ -902,7 +909,7 @@ def find_source(self, source): return source def get_source(self, name=None, url=None, refresh=False): - from .utils import is_url_equal + from pipenv.utils.internet import is_url_equal def find_source(sources, name=None, url=None): source = None diff --git a/pipenv/resolver.py b/pipenv/resolver.py index b4c01ad404..4b4b9c0f7b 100644 --- a/pipenv/resolver.py +++ b/pipenv/resolver.py @@ -585,7 +585,7 @@ def __getattribute__(self, key): def clean_results(results, resolver, project, dev=False): - from pipenv.utils import translate_markers + from pipenv.utils.dependencies import translate_markers if not project.lockfile_exists: return results lockfile = project.lockfile_content @@ -646,7 +646,7 @@ def clean_outdated(results, resolver, project, dev=False): def parse_packages(packages, pre, clear, system, requirements_dir=None): from pipenv.vendor.requirementslib.models.requirements import Requirement from pipenv.vendor.vistir.contextmanagers import cd, temp_path - from pipenv.utils import parse_indexes + from pipenv.utils.indexes import parse_indexes parsed_packages = [] for package in packages: *_, line = parse_indexes(package) @@ -674,7 +674,8 @@ def parse_packages(packages, pre, clear, system, requirements_dir=None): def resolve_packages(pre, clear, verbose, system, write, requirements_dir, packages, dev): - from pipenv.utils import create_mirror_source, resolve_deps, replace_pypi_sources + from pipenv.utils.internet import create_mirror_source, replace_pypi_sources + from pipenv.utils.resolver import resolve_deps pypi_mirror_source = ( create_mirror_source(os.environ["PIPENV_PYPI_MIRROR"]) if "PIPENV_PYPI_MIRROR" in os.environ diff --git a/pipenv/utils/__init__.py b/pipenv/utils/__init__.py index b3b74e726a..719d371041 100644 --- a/pipenv/utils/__init__.py +++ b/pipenv/utils/__init__.py @@ -1,13 +1,2 @@ import logging -from .constants import * -from .dependencies import * -from .indexes import * -from .internet import * -from .locking import * -from .processes import * -from .resolver import * -from .shell import * -from .spinner import * -from .toml import * - logging.basicConfig(level=logging.ERROR) diff --git a/pipenv/utils/constants.py b/pipenv/utils/constants.py index b071dc3eec..766a44f728 100644 --- a/pipenv/utils/constants.py +++ b/pipenv/utils/constants.py @@ -1,7 +1,3 @@ -from pipenv.pep508checker import lookup - -specifiers = [k for k in lookup.keys()] # TODO Is this used? - # List of version control systems we support. VCS_LIST = ("git", "svn", "hg", "bzr") SCHEME_LIST = ("http://", "https://", "ftp://", "ftps://", "file://") diff --git a/pipenv/utils/dependencies.py b/pipenv/utils/dependencies.py index bd0104edee..40a44b79fe 100644 --- a/pipenv/utils/dependencies.py +++ b/pipenv/utils/dependencies.py @@ -2,6 +2,7 @@ import re from contextlib import contextmanager from pathlib import Path + from typing import Sequence, Mapping from urllib.parse import urlparse diff --git a/pipenv/utils/indexes.py b/pipenv/utils/indexes.py index 19d6c53cf7..d0806d5bad 100644 --- a/pipenv/utils/indexes.py +++ b/pipenv/utils/indexes.py @@ -1,11 +1,17 @@ import re -from typing import Optional, Union, List, Mapping, Text, Tuple +from pipenv import environments +if environments.MYPY_RUNNING: + from typing import List, Optional, Text, Tuple, Union + + from pipenv.project import Project, TSource + from pipenv.vendor.requirementslib.models.requirements import Requirement -from exceptions import PipenvUsageError -from project import TSource, Project -from requirementslib import Requirement from urllib3 import util as urllib3_util -from utils import create_mirror_source, is_pypi_url +from requirementslib import Requirement + +from pipenv.vendor.vistir.compat import Mapping +from pipenv.exceptions import PipenvUsageError +from .internet import create_mirror_source, is_pypi_url def prepare_pip_source_args(sources, pip_args=None): @@ -43,7 +49,7 @@ def prepare_pip_source_args(sources, pip_args=None): def get_project_index(project, index=None, trusted_hosts=None): # type: (Optional[Union[str, TSource]], Optional[List[str]], Optional[Project]) -> TSource - from .project import SourceNotFound + from pipenv.project import SourceNotFound if trusted_hosts is None: trusted_hosts = [] if isinstance(index, Mapping): diff --git a/pipenv/utils/internet.py b/pipenv/utils/internet.py index ea2bbe7238..d151a628b5 100644 --- a/pipenv/utils/internet.py +++ b/pipenv/utils/internet.py @@ -7,10 +7,10 @@ import warnings from contextlib import contextmanager from urllib.parse import urlparse - -import parse from urllib3 import util as urllib3_util -from vistir.compat import ResourceWarning + +from pipenv.vendor import parse +from pipenv.vendor.vistir.compat import ResourceWarning requests_session = None # type: ignore @@ -73,26 +73,6 @@ def temp_path(): sys.path = [p for p in path] -def normalize_drive(path): - """Normalize drive in path so they stay consistent. - - This currently only affects local drives on Windows, which can be - identified with either upper or lower cased drive names. The case is - always converted to uppercase because it seems to be preferred. - - See: - """ - if os.name != "nt" or not isinstance(path, str): - return path - - drive, tail = os.path.splitdrive(path) - # Only match (lower cased) local drives (e.g. 'c:'), not UNC mounts. - if drive.islower() and len(drive) == 2 and drive[1] == ":": - return f"{drive.upper()}{tail}" - - return path - - def is_readonly_path(fn): """Check if a provided path exists and is readonly. diff --git a/pipenv/utils/locking.py b/pipenv/utils/locking.py index 57f5a17dd2..0db7db66ef 100644 --- a/pipenv/utils/locking.py +++ b/pipenv/utils/locking.py @@ -1,6 +1,6 @@ from typing import Mapping -from utils import pep423_name, translate_markers, clean_resolved_dep +from .dependencies import pep423_name, translate_markers, clean_resolved_dep def format_requirement_for_lockfile(req, markers_lookup, index_lookup, hashes=None): diff --git a/pipenv/utils/processes.py b/pipenv/utils/processes.py index 62cd71cfd3..5b2168f73e 100644 --- a/pipenv/utils/processes.py +++ b/pipenv/utils/processes.py @@ -5,8 +5,13 @@ import crayons from click import echo as click_echo -from exceptions import PipenvCmdError -from vistir import run +from pipenv.vendor.vistir import run + +from pipenv.exceptions import PipenvCmdError +from pipenv import environments + +if environments.MYPY_RUNNING: + from typing import Any, Dict, List, Optional, Text, Tuple, Union def run_command(cmd, *args, is_verbose=False, **kwargs): diff --git a/pipenv/utils/resolver.py b/pipenv/utils/resolver.py index aa52d45897..71ba009b9a 100644 --- a/pipenv/utils/resolver.py +++ b/pipenv/utils/resolver.py @@ -5,24 +5,29 @@ import sys import warnings from functools import lru_cache -from typing import List, Dict, Optional, Tuple, AbstractSet, Union, Any import crayons -import environments -import utils.dependencies +from pipenv import environments from click import echo as click_echo -from exceptions import ResolutionFailure, RequirementError -from project import Project -from requirementslib import Requirement, Pipfile -from requirementslib.models.requirements import Line -from utils import parse_indexes, prepare_pip_source_args, is_pinned_requirement, format_requirement_for_lockfile, \ - _show_warning, subprocess_run, make_posix, temp_environ, get_pipenv_sitedir, create_spinner, convert_deps_to_pip, \ - prepare_lockfile, HackedPythonVersion -from utils.dependencies import get_vcs_deps, pep423_name, translate_markers, clean_pkg_version -from utils.internet import _get_requests_session -from utils.shell import temp_environ -from vistir import open_file, TemporaryDirectory - +from pipenv.exceptions import ResolutionFailure, RequirementError +from pipenv.vendor.requirementslib import Requirement, Pipfile +from pipenv.vendor.vistir import open_file, TemporaryDirectory + +from .dependencies import get_vcs_deps, pep423_name, translate_markers, clean_pkg_version, \ + is_pinned_requirement, convert_deps_to_pip, HackedPythonVersion +from .indexes import parse_indexes, prepare_pip_source_args +from .internet import _get_requests_session +from .locking import format_requirement_for_lockfile, prepare_lockfile +from .shell import temp_environ, subprocess_run, make_posix +from .spinner import create_spinner +if environments.MYPY_RUNNING: + from typing import Any, Dict, List, Optional, Tuple, Union + + from pipenv.project import Project + from pipenv.vendor.requirementslib.models.pipfile import Pipfile + from pipenv.vendor.requirementslib.models.requirements import ( + Line, Requirement + ) class HashCacheMixin: @@ -532,7 +537,7 @@ def resolve(self): with temp_environ(), self.get_resolver() as resolver: try: - results = resolve(self.constraints, check_supported_wheels=False) + results = resolver.resolve(self.constraints, check_supported_wheels=False) except InstallationError as e: raise ResolutionFailure(message=str(e)) else: @@ -604,7 +609,7 @@ def _get_hashes_from_pypi(self, ireq): def collect_hashes(self, ireq): if ireq.link: link = ireq.link - if link.is_vcs or (utils.dependencies.is_file and link.is_existing_dir()): + if link.is_vcs or (link.is_file and link.is_existing_dir()): return set() if ireq.original_link: return {self._get_hash_from_link(ireq.original_link)} @@ -725,9 +730,9 @@ def actually_resolve_deps( def resolve(cmd, sp, project): - from ._compat import decode_output - from .cmdparse import Script - from .vendor.vistir.misc import echo + from pipenv._compat import decode_output + from pipenv.cmdparse import Script + from pipenv.vendor.vistir.misc import echo c = subprocess_run(Script.parse(cmd).cmd_args, block=False, env=os.environ.copy()) is_verbose = project.s.is_verbose() err = "" @@ -801,11 +806,11 @@ def venv_resolve_deps( import json - from . import resolver - from ._compat import decode_for_output - from .vendor.vistir.compat import JSONDecodeError, NamedTemporaryFile, Path - from .vendor.vistir.misc import fs_str - from .vendor.vistir.path import create_tracked_tempdir + from pipenv import resolver + from pipenv._compat import decode_for_output + from pipenv.vendor.vistir.compat import JSONDecodeError, NamedTemporaryFile, Path + from pipenv.vendor.vistir.misc import fs_str + from pipenv.vendor.vistir.path import create_tracked_tempdir results = [] pipfile_section = "dev-packages" if dev else "packages" @@ -916,7 +921,7 @@ def resolve_deps( # First (proper) attempt: req_dir = req_dir if req_dir else os.environ.get("req_dir", None) if not req_dir: - from .vendor.vistir.path import create_tracked_tempdir + from pipenv.vendor.vistir.path import create_tracked_tempdir req_dir = create_tracked_tempdir(prefix="pipenv-", suffix="-requirements") with HackedPythonVersion(python_version=python, python_path=python_path): try: diff --git a/pipenv/utils/shell.py b/pipenv/utils/shell.py index 386528a474..a01ec3bdfc 100644 --- a/pipenv/utils/shell.py +++ b/pipenv/utils/shell.py @@ -8,10 +8,11 @@ import posixpath from pathlib import Path -import utils.dependencies -from utils import normalize_path, mkdir_p -from pipenv.utils import subprocess_run -from utils.internet import normalize_drive +from .dependencies import is_file +from .processes import subprocess_run +from pipenv import environments +if environments.MYPY_RUNNING: + from typing import Text @lru_cache() @@ -220,7 +221,7 @@ def is_virtual_environment(path): for bindir_name in ('bin', 'Scripts'): for python in path.joinpath(bindir_name).glob('python*'): try: - exeness = utils.dependencies.is_file() and os.access(str(python), os.X_OK) + exeness = is_file() and os.access(str(python), os.X_OK) except OSError: exeness = False if exeness: @@ -325,3 +326,25 @@ def is_python_command(line): if line.startswith("py"): return True return False + + +# TODO This code is basically a duplicate of pipenv.vendor.vistir.path.normalize_drive +# Proposal: Try removing this method and replacing usages in separate PR +def normalize_drive(path): + """Normalize drive in path so they stay consistent. + + This currently only affects local drives on Windows, which can be + identified with either upper or lower cased drive names. The case is + always converted to uppercase because it seems to be preferred. + + See: + """ + if os.name != "nt" or not isinstance(path, str): + return path + + drive, tail = os.path.splitdrive(path) + # Only match (lower cased) local drives (e.g. 'c:'), not UNC mounts. + if drive.islower() and len(drive) == 2 and drive[1] == ":": + return f"{drive.upper()}{tail}" + + return path diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 50f0ea80e4..4649b812db 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -20,7 +20,7 @@ from pipenv.cli import cli from pipenv.exceptions import VirtualenvActivationException -from pipenv.utils import subprocess_run +from pipenv.utils.processes import subprocess_run from pipenv.vendor import toml, tomlkit from pipenv.vendor.vistir.compat import fs_encode, fs_str from pipenv.vendor.vistir.contextmanagers import temp_environ diff --git a/tests/integration/test_cli.py b/tests/integration/test_cli.py index 9aef70b119..e5b9b3e866 100644 --- a/tests/integration/test_cli.py +++ b/tests/integration/test_cli.py @@ -8,7 +8,8 @@ from flaky import flaky -from pipenv.utils import normalize_drive, subprocess_run +from pipenv.utils.processes import subprocess_run +from pipenv.utils.shell import normalize_drive @pytest.mark.cli diff --git a/tests/integration/test_dot_venv.py b/tests/integration/test_dot_venv.py index 96ad37a771..922bc49ddf 100644 --- a/tests/integration/test_dot_venv.py +++ b/tests/integration/test_dot_venv.py @@ -7,7 +7,7 @@ import pytest -from pipenv.utils import normalize_drive, temp_environ +from pipenv.utils.shell import normalize_drive, temp_environ @pytest.mark.dotvenv diff --git a/tests/integration/test_install_basic.py b/tests/integration/test_install_basic.py index fb1241422d..c6c6e7d551 100644 --- a/tests/integration/test_install_basic.py +++ b/tests/integration/test_install_basic.py @@ -7,7 +7,8 @@ from flaky import flaky -from pipenv.utils import subprocess_run, temp_environ +from pipenv.utils.processes import subprocess_run +from pipenv.utils.shell import temp_environ @pytest.mark.setup diff --git a/tests/integration/test_install_markers.py b/tests/integration/test_install_markers.py index 1bb28eb1cc..a3ee6456b5 100644 --- a/tests/integration/test_install_markers.py +++ b/tests/integration/test_install_markers.py @@ -6,7 +6,7 @@ from pipenv.patched import pipfile from pipenv.project import Project -from pipenv.utils import temp_environ +from pipenv.utils.shell import temp_environ @flaky diff --git a/tests/integration/test_install_twists.py b/tests/integration/test_install_twists.py index ecb1d143be..ea653e0401 100644 --- a/tests/integration/test_install_twists.py +++ b/tests/integration/test_install_twists.py @@ -6,7 +6,7 @@ import pytest from flaky import flaky -from pipenv.utils import mkdir_p, temp_environ +from pipenv.utils.shell import mkdir_p, temp_environ @pytest.mark.extras diff --git a/tests/integration/test_install_uri.py b/tests/integration/test_install_uri.py index fd143562fc..f21da0f459 100644 --- a/tests/integration/test_install_uri.py +++ b/tests/integration/test_install_uri.py @@ -7,7 +7,7 @@ import pytest from flaky import flaky -from pipenv.utils import subprocess_run +from pipenv.utils.processes import subprocess_run @flaky diff --git a/tests/integration/test_lock.py b/tests/integration/test_lock.py index 2cd6220dbc..decbc2a10b 100644 --- a/tests/integration/test_lock.py +++ b/tests/integration/test_lock.py @@ -7,8 +7,8 @@ import pytest_pypi.app from flaky import flaky -from vistir.misc import to_text -from pipenv.utils import temp_environ +from pipenv.vendor.vistir.misc import to_text +from pipenv.utils.shell import temp_environ @pytest.mark.lock diff --git a/tests/integration/test_pipenv.py b/tests/integration/test_pipenv.py index ea352395b4..39c5853ddd 100644 --- a/tests/integration/test_pipenv.py +++ b/tests/integration/test_pipenv.py @@ -8,7 +8,8 @@ import pytest from pipenv.project import Project -from pipenv.utils import subprocess_run, temp_environ +from pipenv.utils.processes import subprocess_run +from pipenv.utils.shell import temp_environ @pytest.mark.code diff --git a/tests/integration/test_project.py b/tests/integration/test_project.py index f3d634078a..1cc5116c34 100644 --- a/tests/integration/test_project.py +++ b/tests/integration/test_project.py @@ -7,7 +7,7 @@ from pipenv.patched import pipfile from pipenv.project import Project -from pipenv.utils import temp_environ +from pipenv.utils.shell import temp_environ from pipenv.vendor.vistir.path import is_in_path, normalize_path diff --git a/tests/integration/test_run.py b/tests/integration/test_run.py index a665b6a021..340d90c627 100644 --- a/tests/integration/test_run.py +++ b/tests/integration/test_run.py @@ -3,7 +3,7 @@ import pytest from pipenv.project import Project -from pipenv.utils import subprocess_run, temp_environ +from pipenv.utils.shell import subprocess_run, temp_environ @pytest.mark.run diff --git a/tests/integration/test_sync.py b/tests/integration/test_sync.py index 967d3f2e32..87a7cb3f22 100644 --- a/tests/integration/test_sync.py +++ b/tests/integration/test_sync.py @@ -3,7 +3,7 @@ import pytest -from pipenv.utils import temp_environ +from pipenv.utils.shell import temp_environ @pytest.mark.lock diff --git a/tests/integration/test_uninstall.py b/tests/integration/test_uninstall.py index 8ecc56f6d2..4c79af1c04 100644 --- a/tests/integration/test_uninstall.py +++ b/tests/integration/test_uninstall.py @@ -3,7 +3,7 @@ import pytest -from pipenv.utils import temp_environ +from pipenv.utils.shell import temp_environ @pytest.mark.uninstall diff --git a/tests/integration/test_windows.py b/tests/integration/test_windows.py index 07d9a83272..5768312ca2 100644 --- a/tests/integration/test_windows.py +++ b/tests/integration/test_windows.py @@ -3,7 +3,7 @@ import pytest -from pipenv.utils import subprocess_run +from pipenv.utils.processes import subprocess_run # This module is run only on Windows. pytestmark = pytest.mark.skipif(os.name != 'nt', reason="only relevant on windows") diff --git a/tests/unit/test_core.py b/tests/unit/test_core.py index 66e28a1f48..ac5de01012 100644 --- a/tests/unit/test_core.py +++ b/tests/unit/test_core.py @@ -4,7 +4,7 @@ import pytest from pipenv.core import load_dot_env, warn_in_virtualenv -from pipenv.utils import temp_environ +from pipenv.utils.shell import temp_environ @pytest.mark.core diff --git a/tests/unit/test_environments.py b/tests/unit/test_environments.py index efeb2424d6..c818840d1f 100644 --- a/tests/unit/test_environments.py +++ b/tests/unit/test_environments.py @@ -2,7 +2,7 @@ import pytest import os from pipenv import environments -from pipenv.utils import temp_environ +from pipenv.utils.shell import temp_environ @pytest.mark.environments diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index e3f73219a8..ff3ea89c55 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -2,12 +2,12 @@ import pytest -import pipenv.utils -import utils.dependencies -import utils.indexes -import utils.internet -import utils.shell -import utils.toml +import pipenv.utils.shell +from pipenv.utils import dependencies +from pipenv.utils import indexes +from pipenv.utils import internet +from pipenv.utils import shell +from pipenv.utils import toml from pipenv.exceptions import PipenvUsageError @@ -89,7 +89,7 @@ def test_convert_deps_to_pip(monkeypatch, deps, expected): m.setattr(pip_shims.shims, "unpack_url", mock_unpack) if expected.startswith("Django"): expected = expected.lower() - assert utils.dependencies.convert_deps_to_pip(deps, r=False) == [expected] + assert dependencies.convert_deps_to_pip(deps, r=False) == [expected] @pytest.mark.utils @@ -131,14 +131,14 @@ def test_convert_deps_to_pip(monkeypatch, deps, expected): ], ) def test_convert_deps_to_pip_one_way(deps, expected): - assert utils.dependencies.convert_deps_to_pip(deps, r=False) == [expected.lower()] + assert dependencies.convert_deps_to_pip(deps, r=False) == [expected.lower()] @pytest.mark.skipif(isinstance("", str), reason="don't need to test if unicode is str") @pytest.mark.utils def test_convert_deps_to_pip_unicode(): deps = {"django": "==1.10"} - deps = utils.dependencies.convert_deps_to_pip(deps, r=False) + deps = dependencies.convert_deps_to_pip(deps, r=False) assert deps[0] == "django==1.10" @@ -151,7 +151,7 @@ def test_convert_deps_to_pip_unicode(): ]) @pytest.mark.utils def test_parse_indexes(line, result): - assert utils.indexes.parse_indexes(line) == result + assert indexes.parse_indexes(line) == result @pytest.mark.parametrize("line", [ @@ -162,7 +162,7 @@ def test_parse_indexes(line, result): @pytest.mark.utils def test_parse_indexes_individual_lines(line): with pytest.raises(ValueError): - utils.indexes.parse_indexes(line, strict=True) + indexes.parse_indexes(line, strict=True) class TestUtils: @@ -184,7 +184,7 @@ class TestUtils: ], ) def test_is_required_version(self, version, specified_ver, expected): - assert utils.dependencies.is_required_version(version, specified_ver) is expected + assert dependencies.is_required_version(version, specified_ver) is expected @pytest.mark.utils @pytest.mark.parametrize( @@ -207,11 +207,11 @@ def test_is_vcs(self, entry, expected): @pytest.mark.utils def test_python_version_from_bad_path(self): - assert utils.dependencies.python_version("/fake/path") is None + assert dependencies.python_version("/fake/path") is None @pytest.mark.utils def test_python_version_from_non_python(self): - assert utils.dependencies.python_version("/dev/null") is None + assert dependencies.python_version("/dev/null") is None @pytest.mark.utils @pytest.mark.parametrize( @@ -226,28 +226,27 @@ def test_python_version_from_non_python(self): ), ], ) - # @patch(".vendor.pythonfinder.utils.get_python_version") def test_python_version_output_variants( self, monkeypatch, version_output, version ): def mock_version(path): return version_output.split()[1] monkeypatch.setattr("pipenv.vendor.pythonfinder.utils.get_python_version", mock_version) - assert utils.dependencies.python_version("some/path") == version + assert dependencies.python_version("some/path") == version @pytest.mark.utils def test_is_valid_url(self): url = "https://github.com/psf/requests.git" not_url = "something_else" - assert utils.internet.is_valid_url(url) - assert utils.internet.is_valid_url(not_url) is False + assert internet.is_valid_url(url) + assert internet.is_valid_url(not_url) is False @pytest.mark.utils @pytest.mark.needs_internet def test_download_file(self): url = "https://github.com/pypa/pipenv/blob/master/README.md" output = "test_download.md" - utils.internet.download_file(url, output) + internet.download_file(url, output) assert os.path.exists(output) os.remove(output) @@ -272,12 +271,12 @@ def test_download_file(self): ("3", True) ]) def test_is_python_command(self, line, expected): - assert utils.shell.is_python_command(line) == expected + assert shell.is_python_command(line) == expected @pytest.mark.utils def test_new_line_end_of_toml_file(this): # toml file that needs clean up - toml = """ + toml_data = """ [dev-packages] "flake8" = ">=3.3.0,<4" @@ -289,7 +288,7 @@ def test_new_line_end_of_toml_file(this): "sphinx-click" = "*" "pytest-xdist" = "*" """ - new_toml = utils.toml.cleanup_toml(toml) + new_toml = toml.cleanup_toml(toml_data) # testing if the end of the generated file contains a newline assert new_toml[-1] == "\n" @@ -313,7 +312,7 @@ def test_new_line_end_of_toml_file(this): ) @pytest.mark.skipif(os.name != "nt", reason="Windows file paths tested") def test_win_normalize_drive(self, input_path, expected): - assert utils.internet.normalize_drive(input_path) == expected + assert pipenv.utils.shell.normalize_drive(input_path) == expected @pytest.mark.utils @pytest.mark.parametrize( @@ -327,7 +326,7 @@ def test_win_normalize_drive(self, input_path, expected): ) @pytest.mark.skipif(os.name == "nt", reason="*nix file paths tested") def test_nix_normalize_drive(self, input_path, expected): - assert utils.internet.normalize_drive(input_path) == expected + assert pipenv.utils.shell.normalize_drive(input_path) == expected @pytest.mark.utils @pytest.mark.parametrize( @@ -442,7 +441,7 @@ def test_nix_normalize_drive(self, input_path, expected): ) def test_prepare_pip_source_args(self, sources, expected_args): assert ( - utils.indexes.prepare_pip_source_args(sources, pip_args=None) + indexes.prepare_pip_source_args(sources, pip_args=None) == expected_args ) @@ -450,24 +449,24 @@ def test_prepare_pip_source_args(self, sources, expected_args): def test_invalid_prepare_pip_source_args(self): sources = [{}] with pytest.raises(PipenvUsageError): - utils.indexes.prepare_pip_source_args(sources, pip_args=None) + indexes.prepare_pip_source_args(sources, pip_args=None) @pytest.mark.utils def test_parse_python_version(self): - ver = utils.dependencies.parse_python_version("Python 3.6.5\n") + ver = dependencies.parse_python_version("Python 3.6.5\n") assert ver == {"major": "3", "minor": "6", "micro": "5"} @pytest.mark.utils def test_parse_python_version_suffix(self): - ver = utils.dependencies.parse_python_version("Python 3.6.5rc1\n") + ver = dependencies.parse_python_version("Python 3.6.5rc1\n") assert ver == {"major": "3", "minor": "6", "micro": "5"} @pytest.mark.utils def test_parse_python_version_270(self): - ver = utils.dependencies.parse_python_version("Python 2.7\n") + ver = dependencies.parse_python_version("Python 2.7\n") assert ver == {"major": "2", "minor": "7", "micro": "0"} @pytest.mark.utils def test_parse_python_version_270_garbage(self): - ver = utils.dependencies.parse_python_version("Python 2.7+\n") + ver = dependencies.parse_python_version("Python 2.7+\n") assert ver == {"major": "2", "minor": "7", "micro": "0"} diff --git a/tests/unit/test_utils_windows_executable.py b/tests/unit/test_utils_windows_executable.py index ff724dc6fb..b3b340f131 100644 --- a/tests/unit/test_utils_windows_executable.py +++ b/tests/unit/test_utils_windows_executable.py @@ -3,8 +3,7 @@ import mock import pytest -import utils.shell -from pipenv import utils +from pipenv.utils import shell # This module is run only on Windows. @@ -20,7 +19,7 @@ def test_find_windows_executable_when_not_found(mocked_which, mocked_isfile): mocked_isfile.return_value = False mocked_which.return_value = None - found = utils.filesystem.find_windows_executable('fake/path', 'python') + found = shell.find_windows_executable('fake/path', 'python') assert found is None assert mocked_isfile.call_count > 1 @@ -39,7 +38,7 @@ def test_find_windows_executable_when_found(mocked_which, mocked_isfile): mocked_isfile.return_value = False found_path = '/fake/known/system/path/pyenv' mocked_which.return_value = found_path - found = utils.filesystem.find_windows_executable('fake/path', 'pyenv') + found = shell.find_windows_executable('fake/path', 'pyenv') assert found is found_path assert mocked_isfile.call_count > 1