Skip to content

Commit

Permalink
Replace some usages of config.{rootdir,inifile} with config.{rootpath…
Browse files Browse the repository at this point in the history
…,inipath}
  • Loading branch information
bluetech committed Sep 4, 2020
1 parent 52f4335 commit fe8949f
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 100 deletions.
6 changes: 3 additions & 3 deletions src/_pytest/cacheprovider.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def clear_cache(cls, cachedir: Path) -> None:

@staticmethod
def cache_dir_from_config(config: Config) -> Path:
return resolve_from_str(config.getini("cache_dir"), config.rootdir)
return resolve_from_str(config.getini("cache_dir"), config.rootpath)

def warn(self, fmt: str, **args: object) -> None:
import warnings
Expand Down Expand Up @@ -264,7 +264,7 @@ def __init__(self, config: Config) -> None:

def get_last_failed_paths(self) -> Set[Path]:
"""Return a set with all Paths()s of the previously failed nodeids."""
rootpath = Path(str(self.config.rootdir))
rootpath = self.config.rootpath
result = {rootpath / nodeid.split("::")[0] for nodeid in self.lastfailed}
return {x for x in result if x.exists()}

Expand Down Expand Up @@ -495,7 +495,7 @@ def pytest_report_header(config: Config) -> Optional[str]:
# starting with .., ../.. if sensible

try:
displaypath = cachedir.relative_to(str(config.rootdir))
displaypath = cachedir.relative_to(config.rootpath)
except ValueError:
displaypath = cachedir
return "cachedir: {}".format(displaypath)
Expand Down
32 changes: 16 additions & 16 deletions src/_pytest/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
from _pytest.compat import TYPE_CHECKING
from _pytest.outcomes import fail
from _pytest.outcomes import Skipped
from _pytest.pathlib import bestrelpath
from _pytest.pathlib import import_path
from _pytest.pathlib import ImportMode
from _pytest.pathlib import Path
Expand Down Expand Up @@ -511,7 +512,7 @@ def _getconftestmodules(
else:
directory = path

# XXX these days we may rather want to use config.rootdir
# XXX these days we may rather want to use config.rootpath
# and allow users to opt into looking into the rootdir parent
# directories instead of requiring to specify confcutdir.
clist = []
Expand Down Expand Up @@ -1033,9 +1034,9 @@ def notify_exception(

def cwd_relative_nodeid(self, nodeid: str) -> str:
# nodeid's are relative to the rootpath, compute relative to cwd.
if self.invocation_dir != self.rootdir:
fullpath = self.rootdir.join(nodeid)
nodeid = self.invocation_dir.bestrelpath(fullpath)
if self.invocation_params.dir != self.rootpath:
fullpath = self.rootpath / nodeid
nodeid = bestrelpath(self.invocation_params.dir, fullpath)
return nodeid

@classmethod
Expand Down Expand Up @@ -1073,8 +1074,8 @@ def _initini(self, args: Sequence[str]) -> None:
self._rootpath = rootpath
self._inipath = inipath
self.inicfg = inicfg
self._parser.extra_info["rootdir"] = self.rootdir
self._parser.extra_info["inifile"] = self.inifile
self._parser.extra_info["rootdir"] = str(self.rootpath)
self._parser.extra_info["inifile"] = str(self.inipath)
self._parser.addini("addopts", "extra command line options", "args")
self._parser.addini("minversion", "minimally required pytest version")
self._parser.addini(
Expand Down Expand Up @@ -1163,9 +1164,8 @@ def _preparse(self, args: List[str], addopts: bool = True) -> None:
args, namespace=copy.copy(self.option)
)
self._validate_plugins()
if self.known_args_namespace.confcutdir is None and self.inifile:
confcutdir = py.path.local(self.inifile).dirname
self.known_args_namespace.confcutdir = confcutdir
if self.known_args_namespace.confcutdir is None and self.inipath:
self.known_args_namespace.confcutdir = str(self.inipath.parent)
try:
self.hook.pytest_load_initial_conftests(
early_config=self, args=args, parser=self._parser
Expand Down Expand Up @@ -1197,13 +1197,13 @@ def _checkversion(self) -> None:

if not isinstance(minver, str):
raise pytest.UsageError(
"%s: 'minversion' must be a single value" % self.inifile
"%s: 'minversion' must be a single value" % self.inipath
)

if Version(minver) > Version(pytest.__version__):
raise pytest.UsageError(
"%s: 'minversion' requires pytest-%s, actual pytest-%s'"
% (self.inifile, minver, pytest.__version__,)
% (self.inipath, minver, pytest.__version__,)
)

def _validate_keys(self) -> None:
Expand Down Expand Up @@ -1273,10 +1273,10 @@ def parse(self, args: List[str], addopts: bool = True) -> None:
args, self.option, namespace=self.option
)
if not args:
if self.invocation_dir == self.rootdir:
if self.invocation_params.dir == self.rootpath:
args = self.getini("testpaths")
if not args:
args = [str(self.invocation_dir)]
args = [str(self.invocation_params.dir)]
self.args = args
except PrintHelp:
pass
Expand Down Expand Up @@ -1336,10 +1336,10 @@ def _getini(self, name: str):
#
if type == "pathlist":
# TODO: This assert is probably not valid in all cases.
assert self.inifile is not None
dp = py.path.local(self.inifile).dirpath()
assert self.inipath is not None
dp = self.inipath.parent
input_values = shlex.split(value) if isinstance(value, str) else value
return [dp.join(x, abs=True) for x in input_values]
return [py.path.local(str(dp / x)) for x in input_values]
elif type == "args":
return shlex.split(value) if isinstance(value, str) else value
elif type == "linelist":
Expand Down
12 changes: 9 additions & 3 deletions src/_pytest/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
from _pytest.mark import ParameterSet
from _pytest.outcomes import fail
from _pytest.outcomes import TEST_OUTCOME
from _pytest.pathlib import absolutepath

if TYPE_CHECKING:
from typing import Deque
Expand Down Expand Up @@ -1443,7 +1444,7 @@ def getfixtureinfo(
def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None:
nodeid = None
try:
p = py.path.local(plugin.__file__) # type: ignore[attr-defined]
p = absolutepath(plugin.__file__) # type: ignore[attr-defined]
except AttributeError:
pass
else:
Expand All @@ -1452,8 +1453,13 @@ def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None:
# Construct the base nodeid which is later used to check
# what fixtures are visible for particular tests (as denoted
# by their test id).
if p.basename.startswith("conftest.py"):
nodeid = p.dirpath().relto(self.config.rootdir)
if p.name.startswith("conftest.py"):
try:
nodeid = str(p.parent.relative_to(self.config.rootpath))
except ValueError:
nodeid = ""
if nodeid == ".":
nodeid = ""
if os.sep != nodes.SEP:
nodeid = nodeid.replace(os.sep, nodes.SEP)

Expand Down
2 changes: 1 addition & 1 deletion src/_pytest/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,7 @@ def set_log_path(self, fname: str) -> None:
fpath = Path(fname)

if not fpath.is_absolute():
fpath = Path(str(self._config.rootdir), fpath)
fpath = self._config.rootpath / fpath

if not fpath.parent.exists():
fpath.parent.mkdir(exist_ok=True, parents=True)
Expand Down
27 changes: 15 additions & 12 deletions src/_pytest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from _pytest.fixtures import FixtureManager
from _pytest.outcomes import exit
from _pytest.pathlib import absolutepath
from _pytest.pathlib import bestrelpath
from _pytest.pathlib import Path
from _pytest.pathlib import visit
from _pytest.reports import CollectReport
Expand Down Expand Up @@ -411,11 +412,11 @@ class Failed(Exception):


@attr.s
class _bestrelpath_cache(Dict[py.path.local, str]):
path = attr.ib(type=py.path.local)
class _bestrelpath_cache(Dict[Path, str]):
path = attr.ib(type=Path)

def __missing__(self, path: py.path.local) -> str:
r = self.path.bestrelpath(path) # type: str
def __missing__(self, path: Path) -> str:
r = bestrelpath(self.path, path)
self[path] = r
return r

Expand All @@ -430,8 +431,8 @@ class Session(nodes.FSCollector):
exitstatus = None # type: Union[int, ExitCode]

def __init__(self, config: Config) -> None:
nodes.FSCollector.__init__(
self, config.rootdir, parent=None, config=config, session=self, nodeid=""
super().__init__(
config.rootdir, parent=None, config=config, session=self, nodeid=""
)
self.testsfailed = 0
self.testscollected = 0
Expand All @@ -442,8 +443,8 @@ def __init__(self, config: Config) -> None:
self._initialpaths = frozenset() # type: FrozenSet[py.path.local]

self._bestrelpathcache = _bestrelpath_cache(
config.rootdir
) # type: Dict[py.path.local, str]
config.rootpath
) # type: Dict[Path, str]

self.config.pluginmanager.register(self, name="session")

Expand All @@ -461,7 +462,7 @@ def __repr__(self) -> str:
self.testscollected,
)

def _node_location_to_relpath(self, node_path: py.path.local) -> str:
def _node_location_to_relpath(self, node_path: Path) -> str:
# bestrelpath is a quite slow function.
return self._bestrelpathcache[node_path]

Expand Down Expand Up @@ -585,7 +586,9 @@ def perform_collect( # noqa: F811
initialpaths = [] # type: List[py.path.local]
for arg in args:
fspath, parts = resolve_collection_argument(
self.config.invocation_dir, arg, as_pypath=self.config.option.pyargs
self.config.invocation_params.dir,
arg,
as_pypath=self.config.option.pyargs,
)
self._initial_parts.append((fspath, parts))
initialpaths.append(fspath)
Expand Down Expand Up @@ -803,7 +806,7 @@ def search_pypath(module_name: str) -> str:


def resolve_collection_argument(
invocation_dir: py.path.local, arg: str, *, as_pypath: bool = False
invocation_path: Path, arg: str, *, as_pypath: bool = False
) -> Tuple[py.path.local, List[str]]:
"""Parse path arguments optionally containing selection parts and return (fspath, names).
Expand All @@ -830,7 +833,7 @@ def resolve_collection_argument(
strpath, *parts = str(arg).split("::")
if as_pypath:
strpath = search_pypath(strpath)
fspath = Path(str(invocation_dir), strpath)
fspath = invocation_path / strpath
fspath = absolutepath(fspath)
if not fspath.exists():
msg = (
Expand Down
8 changes: 3 additions & 5 deletions src/_pytest/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from _pytest.mark.structures import MarkDecorator
from _pytest.mark.structures import NodeKeywords
from _pytest.outcomes import fail
from _pytest.pathlib import absolutepath
from _pytest.pathlib import Path
from _pytest.store import Store

Expand Down Expand Up @@ -401,7 +402,7 @@ def _repr_failure_py(
# It will be better to just always display paths relative to invocation_dir, but
# this requires a lot of plumbing (#6428).
try:
abspath = Path(os.getcwd()) != Path(str(self.config.invocation_dir))
abspath = Path(os.getcwd()) != self.config.invocation_params.dir
except OSError:
abspath = True

Expand Down Expand Up @@ -597,10 +598,7 @@ def reportinfo(self) -> Tuple[Union[py.path.local, str], Optional[int], str]:
@cached_property
def location(self) -> Tuple[str, Optional[int], str]:
location = self.reportinfo()
if isinstance(location[0], py.path.local):
fspath = location[0]
else:
fspath = py.path.local(location[0])
fspath = absolutepath(str(location[0]))
relfspath = self.session._node_location_to_relpath(fspath)
assert type(location[2]) is str
return (relfspath, location[1], location[2])
3 changes: 1 addition & 2 deletions src/_pytest/pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,8 +366,7 @@ def make_numbered_dir_with_cleanup(
raise e


def resolve_from_str(input: str, root: py.path.local) -> Path:
rootpath = Path(root)
def resolve_from_str(input: str, rootpath: Path) -> Path:
input = expanduser(input)
input = expandvars(input)
if isabs(input):
Expand Down

0 comments on commit fe8949f

Please sign in to comment.