Skip to content

Commit 931757b

Browse files
author
Eric Snow
authored
Send "relpath" back for all test files/folders. (#6877)
(for #6758) The key changes: * leave node IDs alone (do not normcase) * preserve the "relpath" of each file/folder * send that relpath back in the results * generate "TestFile.fullPath" (in discovery parser) using relpath instead of ID
1 parent ec79b3f commit 931757b

13 files changed

Lines changed: 2074 additions & 1025 deletions

File tree

pythonFiles/testing_tools/adapter/discovery.py

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,42 @@
33

44
from __future__ import absolute_import, print_function
55

6-
import os.path
6+
import re
77

8+
from .util import fix_fileid, DIRNAME, NORMCASE
89
from .info import ParentInfo
910

1011

12+
FILE_ID_RE = re.compile(r"""
13+
^
14+
(?:
15+
( .* [.] (?: py | txt ) \b ) # .txt for doctest files
16+
( [^.] .* )?
17+
)
18+
$
19+
""", re.VERBOSE)
20+
21+
22+
def fix_nodeid(nodeid, kind, rootdir=None, #*,
23+
_fix_fileid=fix_fileid,
24+
):
25+
if not nodeid:
26+
raise ValueError('missing nodeid')
27+
if nodeid == '.':
28+
return nodeid
29+
30+
fileid = nodeid
31+
remainder = ''
32+
if kind not in ('folder', 'file'):
33+
m = FILE_ID_RE.match(nodeid)
34+
if m:
35+
fileid, remainder = m.groups()
36+
elif len(nodeid) > 1:
37+
fileid = nodeid[:2]
38+
remainder = nodeid[2:]
39+
fileid = _fix_fileid(fileid, rootdir)
40+
return fileid + (remainder or '')
41+
1142

1243
class DiscoveredTests(object):
1344
"""A container for the discovered tests and their parents."""
@@ -23,7 +54,10 @@ def __getitem__(self, index):
2354

2455
@property
2556
def parents(self):
26-
return sorted(self._parents.values(), key=lambda v: (v.root or v.name, v.id))
57+
return sorted(self._parents.values(),
58+
key=lambda p: (NORMCASE(p.root or p.name),
59+
p.id),
60+
)
2761

2862
def reset(self):
2963
"""Clear out any previously discovered tests."""
@@ -36,25 +70,31 @@ def add_test(self, test, parents):
3670
# Updating the parent ID and the test ID aren't necessary if the
3771
# provided test and parents (from the test collector) are
3872
# properly generated. However, we play it safe here.
39-
test = test._replace(parentid=parentid)
40-
if not test.id.startswith('.' + os.path.sep):
41-
test = test._replace(id=os.path.join('.', test.id))
73+
test = test._replace(
74+
id=fix_nodeid(test.id, 'test', test.path.root),
75+
parentid=parentid,
76+
)
4277
self._tests.append(test)
4378

44-
def _ensure_parent(self, path, parents):
79+
def _ensure_parent(self, path, parents, #*,
80+
_dirname=DIRNAME,
81+
):
4582
rootdir = path.root
83+
relpath = path.relfile
4684

4785
_parents = iter(parents)
4886
nodeid, name, kind = next(_parents)
4987
# As in add_test(), the node ID *should* already be correct.
50-
if nodeid != '.' and not nodeid.startswith('.' + os.path.sep):
51-
nodeid = os.path.join('.', nodeid)
88+
nodeid = fix_nodeid(nodeid, kind, rootdir)
5289
_parentid = nodeid
5390
for parentid, parentname, parentkind in _parents:
5491
# As in add_test(), the parent ID *should* already be correct.
55-
if parentid != '.' and not parentid.startswith('.' + os.path.sep):
56-
parentid = os.path.join('.', parentid)
57-
info = ParentInfo(nodeid, kind, name, rootdir, parentid)
92+
parentid = fix_nodeid(parentid, kind, rootdir)
93+
if kind in ('folder', 'file'):
94+
info = ParentInfo(nodeid, kind, name, rootdir, relpath, parentid)
95+
relpath = _dirname(relpath)
96+
else:
97+
info = ParentInfo(nodeid, kind, name, rootdir, None, parentid)
5898
self._parents[(rootdir, nodeid)] = info
5999
nodeid, name, kind = parentid, parentname, parentkind
60100
assert nodeid == '.'

pythonFiles/testing_tools/adapter/info.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,19 @@ def __init__(self, *args, **kwargs):
2626
# self.sub may be None.
2727

2828

29-
class ParentInfo(namedtuple('ParentInfo', 'id kind name root parentid')):
29+
class ParentInfo(namedtuple('ParentInfo', 'id kind name root relpath parentid')):
3030

3131
KINDS = ('folder', 'file', 'suite', 'function', 'subtest')
3232

33-
def __new__(cls, id, kind, name, root=None, parentid=None):
33+
def __new__(cls, id, kind, name, root=None, relpath=None, parentid=None):
3434
self = super(ParentInfo, cls).__new__(
3535
cls,
36-
str(id) if id else None,
37-
str(kind) if kind else None,
38-
str(name) if name else None,
39-
str(root) if root else None,
40-
str(parentid) if parentid else None,
36+
id=str(id) if id else None,
37+
kind=str(kind) if kind else None,
38+
name=str(name) if name else None,
39+
root=str(root) if root else None,
40+
relpath=str(relpath) if relpath else None,
41+
parentid=str(parentid) if parentid else None,
4142
)
4243
return self
4344

@@ -53,8 +54,12 @@ def __init__(self, *args, **kwargs):
5354
if self.root is None:
5455
if self.parentid is not None or self.kind != 'folder':
5556
raise TypeError('missing root')
57+
if self.relpath is not None:
58+
raise TypeError('unexpected relpath {}'.format(self.relpath))
5659
elif self.parentid is None:
5760
raise TypeError('missing parentid')
61+
elif self.relpath is None and self.kind in ('folder', 'file'):
62+
raise TypeError('missing relpath')
5863

5964

6065
class TestInfo(namedtuple('TestInfo', 'id name path source markers parentid kind')):

pythonFiles/testing_tools/adapter/pytest/_discovery.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from __future__ import absolute_import, print_function
55

6-
import os.path
76
import sys
87

98
import pytest
@@ -61,8 +60,9 @@ def _adjust_pytest_args(pytestargs):
6160
class TestCollector(object):
6261
"""This is a pytest plugin that collects the discovered tests."""
6362

64-
NORMCASE = staticmethod(os.path.normcase)
65-
PATHSEP = os.path.sep
63+
@classmethod
64+
def parse_item(cls, item):
65+
return parse_item(item)
6666

6767
def __init__(self, tests=None):
6868
if tests is None:
@@ -77,7 +77,7 @@ def pytest_collection_modifyitems(self, session, config, items):
7777
self._started = True
7878
self._tests.reset()
7979
for item in items:
80-
test, parents = parse_item(item, self.NORMCASE, self.PATHSEP)
80+
test, parents = self.parse_item(item)
8181
self._tests.add_test(test, parents)
8282

8383
# This hook is not specified in the docs, so we also provide
@@ -91,5 +91,5 @@ def pytest_collection_finish(self, session):
9191
return
9292
self._tests.reset()
9393
for item in items:
94-
test, parents = parse_item(item, self.NORMCASE, self.PATHSEP)
94+
test, parents = self.parse_item(item)
9595
self._tests.add_test(test, parents)

0 commit comments

Comments
 (0)