diff --git a/news/2454.bugfix b/news/2454.bugfix new file mode 100644 index 00000000..d60b047f --- /dev/null +++ b/news/2454.bugfix @@ -0,0 +1 @@ +Pipenv will now always use ``pathlib2`` for ``Path`` based filesystem interactions by default on ``python<3.5``. diff --git a/pipenv/_compat.py b/pipenv/_compat.py index 68d8069d..07e75072 100644 --- a/pipenv/_compat.py +++ b/pipenv/_compat.py @@ -29,10 +29,13 @@ except ImportError: _types.add(type(arg)) return _types.pop() -try: - from pathlib import Path -except ImportError: - from pathlib2 import Path +if sys.version_info[:2] >= (3, 5): + try: + from pathlib import Path + except ImportError: + from .vendor.pathlib2 import Path +else: + from .vendor.pathlib2 import Path try: diff --git a/pipenv/project.py b/pipenv/project.py index d13f6491..9c8901e8 100644 --- a/pipenv/project.py +++ b/pipenv/project.py @@ -14,10 +14,7 @@ import six import toml import json as simplejson -try: - from pathlib import Path -except ImportError: - from pathlib2 import Path +from ._compat import Path from .cmdparse import Script from .vendor.requirementslib import Requirement diff --git a/pipenv/utils.py b/pipenv/utils.py index a19f7ed0..2068a227 100644 --- a/pipenv/utils.py +++ b/pipenv/utils.py @@ -14,7 +14,6 @@ import warnings from click import echo as click_echo from first import first - try: from weakref import finalize except ImportError: @@ -36,13 +35,7 @@ try: from urllib.parse import urlparse except ImportError: from urlparse import urlparse -try: - from pathlib import Path -except ImportError: - try: - from .vendor.pathlib2 import Path - except ImportError: - pass + from distutils.spawn import find_executable from contextlib import contextmanager from .pep508checker import lookup @@ -609,6 +602,7 @@ def is_installable_file(path): from .patched.notpip._internal.utils.misc import is_installable_dir from .patched.notpip._internal.utils.packaging import specifiers from .patched.notpip._internal.download import is_archive_file + from ._compat import Path if hasattr(path, 'keys') and any( key for key in path.keys() if key in ['file', 'path'] @@ -853,6 +847,7 @@ def find_windows_executable(bin_path, exe_name): def path_to_url(path): + from ._compat import Path return Path(normalize_drive(os.path.abspath(path))).as_uri() @@ -1158,7 +1153,7 @@ def get_vcs_deps( pypi_mirror=None, ): from .patched.notpip._internal.vcs import VcsSupport - from ._compat import TemporaryDirectory + from ._compat import TemporaryDirectory, Path section = "vcs_dev_packages" if dev else "vcs_packages" reqs = [] diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 6141eeac..d71f0f89 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -4,18 +4,12 @@ import warnings import pytest -from pipenv._compat import TemporaryDirectory +from pipenv._compat import TemporaryDirectory, Path from pipenv.vendor import delegator from pipenv.vendor import requests from pipenv.vendor import six from pipenv.vendor import toml -try: - from pathlib import Path -except ImportError: - from pipenv.vendor.pathlib2 import Path - - if six.PY2: class ResourceWarning(Warning): pass diff --git a/tests/integration/test_install_basic.py b/tests/integration/test_install_basic.py index 71e3ed5d..d4e967d4 100644 --- a/tests/integration/test_install_basic.py +++ b/tests/integration/test_install_basic.py @@ -2,13 +2,9 @@ import contextlib import os from pipenv.utils import temp_environ -from pipenv._compat import TemporaryDirectory +from pipenv._compat import TemporaryDirectory, Path from pipenv.vendor import delegator from pipenv.project import Project -try: - from pathlib import Path -except ImportError: - from pipenv.vendor.pathlib2 import Path import pytest diff --git a/tests/integration/test_install_twists.py b/tests/integration/test_install_twists.py index 8750d463..95d67daf 100644 --- a/tests/integration/test_install_twists.py +++ b/tests/integration/test_install_twists.py @@ -1,10 +1,7 @@ import os import shutil from pipenv.project import Project -try: - import pathlib -except ImportError: - import pathlib2 as pathlib +from pipenv._compat import Path from pipenv.utils import mkdir_p, temp_environ @@ -223,7 +220,7 @@ def test_relative_paths(PipenvInstance, pypi, testsroot): dep = p.pipfile['packages'][key] assert 'path' in dep - assert pathlib.Path('.', artifact_dir, file_name) == pathlib.Path(dep['path']) + assert Path('.', artifact_dir, file_name) == Path(dep['path']) assert c.return_code == 0 diff --git a/tests/integration/test_install_uri.py b/tests/integration/test_install_uri.py index 709ba8eb..df2d44d8 100644 --- a/tests/integration/test_install_uri.py +++ b/tests/integration/test_install_uri.py @@ -2,10 +2,7 @@ import pytest import os from flaky import flaky import delegator -try: - from pathlib import Path -except ImportError: - from pathlib2 import Path +from pipenv._compat import Path @pytest.mark.vcs diff --git a/tests/integration/test_pipenv.py b/tests/integration/test_pipenv.py index 7077d6e7..89ee793e 100644 --- a/tests/integration/test_pipenv.py +++ b/tests/integration/test_pipenv.py @@ -11,11 +11,7 @@ import pytest from pipenv.core import activate_virtualenv from pipenv.project import Project from pipenv.vendor import delegator - -try: - from pathlib import Path -except ImportError: - from pipenv.vendor.pathlib2 import Path +from pipenv._compat import Path @pytest.mark.code @@ -123,4 +119,4 @@ def test_directory_with_leading_dash(PipenvInstance): assert os.path.isdir(venv_path) # Manually clean up environment, since PipenvInstance assumes that # the virutalenv is in the project directory. - p.pipenv('--rm') \ No newline at end of file + p.pipenv('--rm') diff --git a/tests/integration/test_windows.py b/tests/integration/test_windows.py index 91b4f995..bd6eaf19 100644 --- a/tests/integration/test_windows.py +++ b/tests/integration/test_windows.py @@ -1,7 +1,7 @@ import os from pipenv.project import Project -from pipenv.vendor import pathlib2 as pathlib +from pipenv._compat import Path import pytest @@ -33,7 +33,7 @@ def test_case_changes_windows(PipenvInstance, pypi): @pytest.mark.files def test_local_path_windows(PipenvInstance, pypi): whl = ( - pathlib.Path(__file__).parent.parent + Path(__file__).parent.parent .joinpath('pypi', 'six', 'six-1.11.0-py2.py3-none-any.whl') ) try: @@ -48,7 +48,7 @@ def test_local_path_windows(PipenvInstance, pypi): @pytest.mark.files def test_local_path_windows_forward_slash(PipenvInstance, pypi): whl = ( - pathlib.Path(__file__).parent.parent + Path(__file__).parent.parent .joinpath('pypi', 'six', 'six-1.11.0-py2.py3-none-any.whl') ) try: