23
23
from typing import MutableMapping
24
24
from typing import NoReturn
25
25
from typing import Optional
26
+ from typing import OrderedDict
26
27
from typing import overload
27
28
from typing import Sequence
28
29
from typing import Set
75
76
76
77
77
78
if TYPE_CHECKING :
78
- from typing import Deque
79
-
80
79
from _pytest .main import Session
81
80
from _pytest .python import CallSpec2
82
81
from _pytest .python import Function
@@ -207,16 +206,18 @@ def get_parametrized_fixture_keys(
207
206
208
207
def reorder_items (items : Sequence [nodes .Item ]) -> List [nodes .Item ]:
209
208
argkeys_cache : Dict [Scope , Dict [nodes .Item , Dict [FixtureArgKey , None ]]] = {}
210
- items_by_argkey : Dict [Scope , Dict [FixtureArgKey , Deque [nodes .Item ]]] = {}
209
+ items_by_argkey : Dict [
210
+ Scope , Dict [FixtureArgKey , OrderedDict [nodes .Item , None ]]
211
+ ] = {}
211
212
for scope in HIGH_SCOPES :
212
213
scoped_argkeys_cache = argkeys_cache [scope ] = {}
213
- scoped_items_by_argkey = items_by_argkey [scope ] = defaultdict (deque )
214
+ scoped_items_by_argkey = items_by_argkey [scope ] = defaultdict (OrderedDict )
214
215
for item in items :
215
216
keys = dict .fromkeys (get_parametrized_fixture_keys (item , scope ), None )
216
217
if keys :
217
218
scoped_argkeys_cache [item ] = keys
218
219
for key in keys :
219
- scoped_items_by_argkey [key ]. append ( item )
220
+ scoped_items_by_argkey [key ][ item ] = None
220
221
items_dict = dict .fromkeys (items , None )
221
222
return list (
222
223
reorder_items_atscope (items_dict , argkeys_cache , items_by_argkey , Scope .Session )
@@ -226,17 +227,19 @@ def reorder_items(items: Sequence[nodes.Item]) -> List[nodes.Item]:
226
227
def fix_cache_order (
227
228
item : nodes .Item ,
228
229
argkeys_cache : Dict [Scope , Dict [nodes .Item , Dict [FixtureArgKey , None ]]],
229
- items_by_argkey : Dict [Scope , Dict [FixtureArgKey , "Deque [nodes.Item]" ]],
230
+ items_by_argkey : Dict [Scope , Dict [FixtureArgKey , OrderedDict [nodes .Item , None ] ]],
230
231
) -> None :
231
232
for scope in HIGH_SCOPES :
233
+ scoped_items_by_argkey = items_by_argkey [scope ]
232
234
for key in argkeys_cache [scope ].get (item , []):
233
- items_by_argkey [scope ][key ].appendleft (item )
235
+ scoped_items_by_argkey [key ][item ] = None
236
+ scoped_items_by_argkey [key ].move_to_end (item , last = False )
234
237
235
238
236
239
def reorder_items_atscope (
237
240
items : Dict [nodes .Item , None ],
238
241
argkeys_cache : Dict [Scope , Dict [nodes .Item , Dict [FixtureArgKey , None ]]],
239
- items_by_argkey : Dict [Scope , Dict [FixtureArgKey , "Deque [nodes.Item]" ]],
242
+ items_by_argkey : Dict [Scope , Dict [FixtureArgKey , OrderedDict [nodes .Item , None ] ]],
240
243
scope : Scope ,
241
244
) -> Dict [nodes .Item , None ]:
242
245
if scope is Scope .Function or len (items ) < 3 :
0 commit comments