8
8
9
9
import pytest
10
10
11
- from .. import util
12
- from ..info import ParentInfo
11
+ from .. import util , discovery
13
12
from ._pytest_item import parse_item
14
13
15
14
@@ -63,7 +62,7 @@ class TestCollector(object):
63
62
64
63
def __init__ (self , tests = None ):
65
64
if tests is None :
66
- tests = DiscoveredTests ()
65
+ tests = discovery . DiscoveredTests ()
67
66
self ._tests = tests
68
67
self ._started = False
69
68
@@ -74,8 +73,8 @@ def pytest_collection_modifyitems(self, session, config, items):
74
73
self ._started = True
75
74
self ._tests .reset ()
76
75
for item in items :
77
- test , suiteids = parse_item (item , self .NORMCASE , self .PATHSEP )
78
- self ._tests .add_test (test , suiteids )
76
+ test , parents = parse_item (item , self .NORMCASE , self .PATHSEP )
77
+ self ._tests .add_test (test , parents )
79
78
80
79
# This hook is not specified in the docs, so we also provide
81
80
# the "modifyitems" hook just in case.
@@ -88,111 +87,5 @@ def pytest_collection_finish(self, session):
88
87
return
89
88
self ._tests .reset ()
90
89
for item in items :
91
- test , suiteids = parse_item (item , self .NORMCASE , self .PATHSEP )
92
- self ._tests .add_test (test , suiteids )
93
-
94
-
95
- class DiscoveredTests (object ):
96
- """A container for the discovered tests and their parents."""
97
-
98
- def __init__ (self ):
99
- self .reset ()
100
-
101
- def __len__ (self ):
102
- return len (self ._tests )
103
-
104
- def __getitem__ (self , index ):
105
- return self ._tests [index ]
106
-
107
- @property
108
- def parents (self ):
109
- return sorted (self ._parents .values (), key = lambda v : (v .root or v .name , v .id ))
110
-
111
- def reset (self ):
112
- """Clear out any previously discovered tests."""
113
- self ._parents = {}
114
- self ._tests = []
115
-
116
- def add_test (self , test , suiteids ):
117
- """Add the given test and its parents."""
118
- parentid = self ._ensure_parent (test .path , test .parentid , suiteids )
119
- test = test ._replace (parentid = parentid )
120
- if not test .id .startswith ('.' + os .path .sep ):
121
- test = test ._replace (id = os .path .join ('.' , test .id ))
122
- self ._tests .append (test )
123
-
124
- def _ensure_parent (self , path , parentid , suiteids ):
125
- if not parentid .startswith ('.' + os .path .sep ):
126
- parentid = os .path .join ('.' , parentid )
127
- fileid = self ._ensure_file (path .root , path .relfile )
128
- rootdir = path .root
129
-
130
- if not path .func :
131
- return parentid
132
-
133
- fullsuite , _ , funcname = path .func .rpartition ('.' )
134
- suiteid = self ._ensure_suites (fullsuite , rootdir , fileid , suiteids )
135
- parent = suiteid if suiteid else fileid
136
-
137
- if path .sub :
138
- if (rootdir , parentid ) not in self ._parents :
139
- funcinfo = ParentInfo (parentid , 'function' , funcname ,
140
- rootdir , parent )
141
- self ._parents [(rootdir , parentid )] = funcinfo
142
- elif parent != parentid :
143
- print (parent , parentid )
144
- # TODO: What to do?
145
- raise NotImplementedError
146
- return parentid
147
-
148
- def _ensure_file (self , rootdir , relfile ):
149
- if (rootdir , '.' ) not in self ._parents :
150
- self ._parents [(rootdir , '.' )] = ParentInfo ('.' , 'folder' , rootdir )
151
- if relfile .startswith ('.' + os .path .sep ):
152
- fileid = relfile
153
- else :
154
- fileid = relfile = os .path .join ('.' , relfile )
155
-
156
- if (rootdir , fileid ) not in self ._parents :
157
- folderid , filebase = os .path .split (fileid )
158
- fileinfo = ParentInfo (fileid , 'file' , filebase , rootdir , folderid )
159
- self ._parents [(rootdir , fileid )] = fileinfo
160
-
161
- while folderid != '.' and (rootdir , folderid ) not in self ._parents :
162
- parentid , name = os .path .split (folderid )
163
- folderinfo = ParentInfo (folderid , 'folder' , name , rootdir , parentid )
164
- self ._parents [(rootdir , folderid )] = folderinfo
165
- folderid = parentid
166
- return relfile
167
-
168
- def _ensure_suites (self , fullsuite , rootdir , fileid , suiteids ):
169
- if not fullsuite :
170
- if suiteids :
171
- print (suiteids )
172
- # TODO: What to do?
173
- raise NotImplementedError
174
- return None
175
- if len (suiteids ) != fullsuite .count ('.' ) + 1 :
176
- print (suiteids )
177
- # TODO: What to do?
178
- raise NotImplementedError
179
-
180
- suiteid = suiteids .pop ()
181
- if not suiteid .startswith ('.' + os .path .sep ):
182
- suiteid = os .path .join ('.' , suiteid )
183
- final = suiteid
184
- while '.' in fullsuite and (rootdir , suiteid ) not in self ._parents :
185
- parentid = suiteids .pop ()
186
- if not parentid .startswith ('.' + os .path .sep ):
187
- parentid = os .path .join ('.' , parentid )
188
- fullsuite , _ , name = fullsuite .rpartition ('.' )
189
- suiteinfo = ParentInfo (suiteid , 'suite' , name , rootdir , parentid )
190
- self ._parents [(rootdir , suiteid )] = suiteinfo
191
-
192
- suiteid = parentid
193
- else :
194
- name = fullsuite
195
- suiteinfo = ParentInfo (suiteid , 'suite' , name , rootdir , fileid )
196
- if (rootdir , suiteid ) not in self ._parents :
197
- self ._parents [(rootdir , suiteid )] = suiteinfo
198
- return final
90
+ test , parents = parse_item (item , self .NORMCASE , self .PATHSEP )
91
+ self ._tests .add_test (test , parents )
0 commit comments