Move _uniquepath to pathlib as unique_path.

Co-authored-by: Bruno Oliveira <nicoddemus@gmail.com>
This commit is contained in:
Christian Neumüller 2019-08-28 09:21:03 +02:00
parent a98270eac0
commit 29bb0eda27
3 changed files with 19 additions and 12 deletions

View File

@ -30,16 +30,13 @@ from _pytest._code import filter_traceback
from _pytest.compat import importlib_metadata from _pytest.compat import importlib_metadata
from _pytest.outcomes import fail from _pytest.outcomes import fail
from _pytest.outcomes import Skipped from _pytest.outcomes import Skipped
from _pytest.pathlib import unique_path
from _pytest.warning_types import PytestConfigWarning from _pytest.warning_types import PytestConfigWarning
hookimpl = HookimplMarker("pytest") hookimpl = HookimplMarker("pytest")
hookspec = HookspecMarker("pytest") hookspec = HookspecMarker("pytest")
def _uniquepath(path):
return type(path)(os.path.normcase(str(path.realpath())))
class ConftestImportFailure(Exception): class ConftestImportFailure(Exception):
def __init__(self, path, excinfo): def __init__(self, path, excinfo):
Exception.__init__(self, path, excinfo) Exception.__init__(self, path, excinfo)
@ -370,7 +367,7 @@ class PytestPluginManager(PluginManager):
""" """
current = py.path.local() current = py.path.local()
self._confcutdir = ( self._confcutdir = (
_uniquepath(current.join(namespace.confcutdir, abs=True)) unique_path(current.join(namespace.confcutdir, abs=True))
if namespace.confcutdir if namespace.confcutdir
else None else None
) )
@ -409,7 +406,7 @@ class PytestPluginManager(PluginManager):
else: else:
directory = path directory = path
directory = _uniquepath(directory) directory = unique_path(directory)
# XXX these days we may rather want to use config.rootdir # XXX these days we may rather want to use config.rootdir
# and allow users to opt into looking into the rootdir parent # and allow users to opt into looking into the rootdir parent
@ -438,7 +435,7 @@ class PytestPluginManager(PluginManager):
# Use realpath to avoid loading the same conftest twice # Use realpath to avoid loading the same conftest twice
# with build systems that create build directories containing # with build systems that create build directories containing
# symlinks to actual files. # symlinks to actual files.
conftestpath = _uniquepath(conftestpath) conftestpath = unique_path(conftestpath)
try: try:
return self._conftestpath2mod[conftestpath] return self._conftestpath2mod[conftestpath]
except KeyError: except KeyError:

View File

@ -11,6 +11,7 @@ from functools import partial
from os.path import expanduser from os.path import expanduser
from os.path import expandvars from os.path import expandvars
from os.path import isabs from os.path import isabs
from os.path import normcase
from os.path import sep from os.path import sep
from posixpath import sep as posix_sep from posixpath import sep as posix_sep
@ -334,3 +335,12 @@ def fnmatch_ex(pattern, path):
def parts(s): def parts(s):
parts = s.split(sep) parts = s.split(sep)
return {sep.join(parts[: i + 1]) or sep for i in range(len(parts))} return {sep.join(parts[: i + 1]) or sep for i in range(len(parts))}
def unique_path(path):
"""Returns a unique path in case-insensitive (but case-preserving) file
systems such as Windows.
This is needed only for ``py.path.local``; ``pathlib.Path`` handles this
natively with ``resolve()``."""
return type(path)(normcase(str(path.realpath())))

View File

@ -4,9 +4,9 @@ import textwrap
import py import py
import pytest import pytest
from _pytest.config import _uniquepath
from _pytest.config import PytestPluginManager from _pytest.config import PytestPluginManager
from _pytest.main import ExitCode from _pytest.main import ExitCode
from _pytest.pathlib import unique_path
def ConftestWithSetinitial(path): def ConftestWithSetinitial(path):
@ -143,11 +143,11 @@ def test_conftestcutdir(testdir):
# but we can still import a conftest directly # but we can still import a conftest directly
conftest._importconftest(conf) conftest._importconftest(conf)
values = conftest._getconftestmodules(conf.dirpath()) values = conftest._getconftestmodules(conf.dirpath())
assert values[0].__file__.startswith(str(_uniquepath(conf))) assert values[0].__file__.startswith(str(unique_path(conf)))
# and all sub paths get updated properly # and all sub paths get updated properly
values = conftest._getconftestmodules(p) values = conftest._getconftestmodules(p)
assert len(values) == 1 assert len(values) == 1
assert values[0].__file__.startswith(str(_uniquepath(conf))) assert values[0].__file__.startswith(str(unique_path(conf)))
def test_conftestcutdir_inplace_considered(testdir): def test_conftestcutdir_inplace_considered(testdir):
@ -156,7 +156,7 @@ def test_conftestcutdir_inplace_considered(testdir):
conftest_setinitial(conftest, [conf.dirpath()], confcutdir=conf.dirpath()) conftest_setinitial(conftest, [conf.dirpath()], confcutdir=conf.dirpath())
values = conftest._getconftestmodules(conf.dirpath()) values = conftest._getconftestmodules(conf.dirpath())
assert len(values) == 1 assert len(values) == 1
assert values[0].__file__.startswith(str(_uniquepath(conf))) assert values[0].__file__.startswith(str(unique_path(conf)))
@pytest.mark.parametrize("name", "test tests whatever .dotdir".split()) @pytest.mark.parametrize("name", "test tests whatever .dotdir".split())
@ -166,7 +166,7 @@ def test_setinitial_conftest_subdirs(testdir, name):
conftest = PytestPluginManager() conftest = PytestPluginManager()
conftest_setinitial(conftest, [sub.dirpath()], confcutdir=testdir.tmpdir) conftest_setinitial(conftest, [sub.dirpath()], confcutdir=testdir.tmpdir)
if name not in ("whatever", ".dotdir"): if name not in ("whatever", ".dotdir"):
assert _uniquepath(subconftest) in conftest._conftestpath2mod assert unique_path(subconftest) in conftest._conftestpath2mod
assert len(conftest._conftestpath2mod) == 1 assert len(conftest._conftestpath2mod) == 1
else: else:
assert subconftest not in conftest._conftestpath2mod assert subconftest not in conftest._conftestpath2mod