@@ -73,8 +73,14 @@ def __init__(self, config, items):
73
73
self .settings = Settings (config )
74
74
self .items = [Item (item ) for item in items ]
75
75
self .node_ids = OrderedDict ()
76
+ self .node_id_last = {}
76
77
for item in self .items :
77
78
self .node_ids [item .node_id ] = item
79
+ last_parts = item .node_id .split ("/" )[- 1 ].split ("::" )
80
+ # save last nodeid component to avoid to iterate over all
81
+ # items for each label
82
+ self .node_id_last .setdefault (
83
+ last_parts [- 1 ], []).append (item .node_id )
78
84
self .rel_marks = []
79
85
self .dep_marks = []
80
86
@@ -154,8 +160,8 @@ def handle_order_mark(self, item):
154
160
else :
155
161
warn ("Unknown order attribute:'{}'" .format (order ))
156
162
order = None
157
- self .handle_relative_mark (item , mark )
158
163
item .order = order
164
+ self .handle_relative_mark (item , mark )
159
165
if order is not None :
160
166
item .nr_rel_items = 0
161
167
return order
@@ -164,13 +170,18 @@ def item_from_label(self, label, item, is_cls_mark):
164
170
label = self .node_id_from_label (label )
165
171
item_id = item .node_id
166
172
label_len = len (label )
167
- for node_id in self .node_ids :
168
- if node_id .endswith (label ):
169
- id_start = node_id [:- label_len ]
170
- if is_cls_mark and id_start .count ("::" ) == 2 :
171
- continue
172
- if item_id .startswith (id_start ):
173
- return self .node_ids [node_id ]
173
+ last_comp = label .split ("/" )[- 1 ].split ("::" )[- 1 ]
174
+ try :
175
+ node_ids = self .node_id_last [last_comp ]
176
+ for node_id in node_ids :
177
+ if node_id .endswith (label ):
178
+ id_start = node_id [:- label_len ]
179
+ if is_cls_mark and id_start .count ("::" ) == 2 :
180
+ continue
181
+ if item_id .startswith (id_start ):
182
+ return self .node_ids [node_id ]
183
+ except KeyError :
184
+ return
174
185
175
186
def items_from_class_label (self , label , item ):
176
187
items = []
@@ -190,7 +201,7 @@ def items_from_class_label(self, label, item):
190
201
def node_id_from_label (label ):
191
202
if "." in label :
192
203
label_comp = label .split ("." )
193
- label = "/" .join (label_comp [:- 1 ]) + ".py::" + label_comp [- 1 ]
204
+ label = ".py::" . join ([ " /" .join (label_comp [:- 1 ]), label_comp [- 1 ]])
194
205
return label
195
206
196
207
def handle_before_or_after_mark (self , item , mark , marker_name , is_after ):
@@ -217,16 +228,15 @@ def is_mark_for_class():
217
228
else :
218
229
if is_mark_for_class ():
219
230
items = self .items_from_class_label (marker_name , item )
220
- if items :
221
- for item_for_label in items :
222
- rel_mark = RelativeMark (item_for_label ,
223
- item , move_after = is_after )
224
- if is_after :
225
- self .rel_marks .append (rel_mark )
226
- else :
227
- self .rel_marks .insert (0 , rel_mark )
228
- item .inc_rel_marks ()
229
- return True
231
+ for item_for_label in items :
232
+ rel_mark = RelativeMark (item_for_label ,
233
+ item , move_after = is_after )
234
+ if is_after :
235
+ self .rel_marks .append (rel_mark )
236
+ else :
237
+ self .rel_marks .insert (0 , rel_mark )
238
+ item .inc_rel_marks ()
239
+ return items
230
240
return False
231
241
232
242
def handle_relative_mark (self , item , mark ):
@@ -261,7 +271,7 @@ def resolve_dependency_markers(self, dep_marks, aliases):
261
271
self .dep_marks .append (RelativeMark (aliases [name ], item ,
262
272
move_after = True ))
263
273
else :
264
- label = prefix + "::" + name
274
+ label = "::" . join ([ prefix , name ])
265
275
if label in aliases :
266
276
for item in items :
267
277
self .dep_marks .append (
@@ -514,9 +524,7 @@ def __init__(self, item):
514
524
self .item = item
515
525
self .nr_rel_items = 0
516
526
self .order = None
517
- # cache properties that are called often for the same item
518
527
self ._node_id = None
519
- self ._label = None
520
528
521
529
def inc_rel_marks (self ):
522
530
if self .order is None :
@@ -542,9 +550,7 @@ def node_id(self):
542
550
543
551
@property
544
552
def label (self ):
545
- if self ._label is None :
546
- self ._label = self .node_id .replace (".py::" , "." ).replace ("/" , "." )
547
- return self ._label
553
+ return self .node_id .replace (".py::" , "." ).replace ("/" , "." )
548
554
549
555
550
556
class ItemList :
@@ -601,9 +607,8 @@ def sort_numbered_items(self):
601
607
return sorted_list
602
608
603
609
def print_unhandled_items (self ):
604
- msg = ""
605
- msg += " " .join ([mark .item .label for mark in self .rel_marks ])
606
- msg += " " .join ([mark .item .label for mark in self .dep_marks ])
610
+ msg = " " .join ([mark .item .label for mark in self .rel_marks ] +
611
+ [mark .item .label for mark in self .dep_marks ])
607
612
if msg :
608
613
sys .stdout .write (
609
614
"\n WARNING: cannot execute test relative to others: " )
0 commit comments