1
1
from __future__ import absolute_import , division , print_function
2
2
import sys
3
3
4
+ from collections import OrderedDict
4
5
from py ._code .code import FormattedExcinfo
5
6
6
7
import py
@@ -136,10 +137,10 @@ def get_parametrized_fixture_keys(item, scopenum):
136
137
except AttributeError :
137
138
pass
138
139
else :
139
- # cs.indictes .items() is random order of argnames but
140
- # then again different functions (items) can change order of
141
- # arguments so it doesn't matter much probably
142
- for argname , param_index in cs .indices .items ():
140
+ # cs.indices .items() is random order of argnames. Need to
141
+ # sort this so that different calls to
142
+ # get_parametrized_fixture_keys will be deterministic.
143
+ for argname , param_index in sorted ( cs .indices .items () ):
143
144
if cs ._arg2scopenum [argname ] != scopenum :
144
145
continue
145
146
if scopenum == 0 : # session
@@ -161,7 +162,7 @@ def reorder_items(items):
161
162
for scopenum in range (0 , scopenum_function ):
162
163
argkeys_cache [scopenum ] = d = {}
163
164
for item in items :
164
- keys = set (get_parametrized_fixture_keys (item , scopenum ))
165
+ keys = OrderedDict . fromkeys (get_parametrized_fixture_keys (item , scopenum ))
165
166
if keys :
166
167
d [item ] = keys
167
168
return reorder_items_atscope (items , set (), argkeys_cache , 0 )
@@ -196,9 +197,9 @@ def slice_items(items, ignore, scoped_argkeys_cache):
196
197
for i , item in enumerate (it ):
197
198
argkeys = scoped_argkeys_cache .get (item )
198
199
if argkeys is not None :
199
- argkeys = argkeys . difference ( ignore )
200
- if argkeys : # found a slicing key
201
- slicing_argkey = argkeys . pop ()
200
+ newargkeys = OrderedDict . fromkeys ( k for k in argkeys if k not in ignore )
201
+ if newargkeys : # found a slicing key
202
+ slicing_argkey , _ = newargkeys . popitem ()
202
203
items_before = items [:i ]
203
204
items_same = [item ]
204
205
items_other = []
0 commit comments