Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix internal assert failure regression in 5.3.4 #6518

Merged
merged 1 commit into from
Jan 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/_pytest/config/argparsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ def parse(self, args, namespace=None):

self.optparser = self._getparser()
try_argcomplete(self.optparser)
strargs = [str(x) if isinstance(x, py.path.local) else x for x in args]
return self.optparser.parse_args(strargs, namespace=namespace)
args = [str(x) if isinstance(x, py.path.local) else x for x in args]
return self.optparser.parse_args(args, namespace=namespace)

def _getparser(self) -> "MyOptionParser":
from _pytest._argcomplete import filescompleter
Expand Down Expand Up @@ -124,8 +124,8 @@ def parse_known_and_unknown_args(
the remaining arguments unknown at this point.
"""
optparser = self._getparser()
strargs = [str(x) if isinstance(x, py.path.local) else x for x in args]
return optparser.parse_known_args(strargs, namespace=namespace)
args = [str(x) if isinstance(x, py.path.local) else x for x in args]
return optparser.parse_known_args(args, namespace=namespace)

def addini(self, name, help, type=None, default=None):
""" register an ini-file option.
Expand Down
7 changes: 2 additions & 5 deletions src/_pytest/config/findpaths.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import os
from typing import Any
from typing import Iterable
from typing import List
from typing import Optional
from typing import Tuple

import py

Expand Down Expand Up @@ -63,7 +60,7 @@ def getcfg(args, config=None):
return None, None, None


def get_common_ancestor(paths: Iterable[py.path.local]) -> py.path.local:
def get_common_ancestor(paths):
common_ancestor = None
for path in paths:
if not path.exists():
Expand Down Expand Up @@ -116,7 +113,7 @@ def determine_setup(
args: List[str],
rootdir_cmd_arg: Optional[str] = None,
config: Optional["Config"] = None,
) -> Tuple[py.path.local, Optional[str], Any]:
):
dirs = get_dirs_from_args(args)
if inifile:
iniconfig = py.iniconfig.IniConfig(inifile)
Expand Down
2 changes: 1 addition & 1 deletion src/_pytest/doctest.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ def repr_failure(self, excinfo):
else:
return super().repr_failure(excinfo)

def reportinfo(self) -> Tuple[py.path.local, int, str]:
def reportinfo(self) -> Tuple[str, int, str]:
return self.fspath, self.dtest.lineno, "[doctest] %s" % self.name


Expand Down
11 changes: 4 additions & 7 deletions src/_pytest/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ def __init__(self, pyfuncitem):
self.fixturename = None
#: Scope string, one of "function", "class", "module", "session"
self.scope = "function"
self._fixture_defs = {} # type: Dict[str, FixtureDef]
self._fixture_defs = {} # argname -> FixtureDef
fixtureinfo = pyfuncitem._fixtureinfo
self._arg2fixturedefs = fixtureinfo.name2fixturedefs.copy()
self._arg2index = {}
Expand Down Expand Up @@ -426,8 +426,7 @@ def module(self):
@scopeproperty()
def fspath(self) -> py.path.local:
""" the file system path of the test module which collected this test. """
# TODO: Remove ignore once _pyfuncitem is properly typed.
return self._pyfuncitem.fspath # type: ignore
return self._pyfuncitem.fspath

@property
def keywords(self):
Expand Down Expand Up @@ -550,9 +549,7 @@ def _compute_fixture_value(self, fixturedef):
source_lineno = frameinfo.lineno
source_path = py.path.local(source_path)
if source_path.relto(funcitem.config.rootdir):
source_path_str = source_path.relto(funcitem.config.rootdir)
else:
source_path_str = str(source_path)
source_path = source_path.relto(funcitem.config.rootdir)
msg = (
"The requested fixture has no parameter defined for test:\n"
" {}\n\n"
Expand All @@ -561,7 +558,7 @@ def _compute_fixture_value(self, fixturedef):
funcitem.nodeid,
fixturedef.argname,
getlocation(fixturedef.func, funcitem.config.rootdir),
source_path_str,
source_path,
source_lineno,
)
)
Expand Down
8 changes: 4 additions & 4 deletions src/_pytest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -367,9 +367,9 @@ class Failed(Exception):

@attr.s
class _bestrelpath_cache(dict):
path = attr.ib(type=py.path.local)
path = attr.ib()

def __missing__(self, path: py.path.local) -> str:
def __missing__(self, path: str) -> str:
r = self.path.bestrelpath(path) # type: str
self[path] = r
return r
Expand Down Expand Up @@ -399,7 +399,7 @@ def __init__(self, config):
self._node_cache = {}
self._bestrelpathcache = _bestrelpath_cache(
config.rootdir
) # type: Dict[py.path.local, str]
) # type: Dict[str, str]
# Dirnames of pkgs with dunder-init files.
self._pkg_roots = {}

Expand All @@ -414,7 +414,7 @@ def __repr__(self):
self.testscollected,
)

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

Expand Down
1 change: 0 additions & 1 deletion src/_pytest/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,6 @@ 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()
assert isinstance(location[0], py.path.local), location[0]
fspath = self.session._node_location_to_relpath(location[0])
assert type(location[2]) is str
return (fspath, location[1], location[2])
6 changes: 3 additions & 3 deletions testing/python/collect.py
Original file line number Diff line number Diff line change
Expand Up @@ -1018,18 +1018,18 @@ class TestReportInfo:
def test_itemreport_reportinfo(self, testdir):
testdir.makeconftest(
"""
import pytest, py
import pytest
class MyFunction(pytest.Function):
def reportinfo(self):
return py.path.local("foo"), 42, "custom"
return "ABCDE", 42, "custom"
def pytest_pycollect_makeitem(collector, name, obj):
if name == "test_func":
return MyFunction(name, parent=collector)
"""
)
item = testdir.getitem("def test_func(): pass")
item.config.pluginmanager.getplugin("runner")
assert item.location == ("foo", 42, "custom")
assert item.location == ("ABCDE", 42, "custom")

def test_func_reportinfo(self, testdir):
item = testdir.getitem("def test_func(): pass")
Expand Down
14 changes: 14 additions & 0 deletions testing/test_nose.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,3 +375,17 @@ def test_io(self):
)
result = testdir.runpytest()
result.stdout.fnmatch_lines(["* 1 skipped *"])


def test_issue_6517(testdir):
testdir.makepyfile(
"""
from nose.tools import raises

@raises(RuntimeError)
def test_fail_without_tcp():
raise RuntimeError
"""
)
result = testdir.runpytest()
result.stdout.fnmatch_lines(["* 1 passed *"])