2323from typing import MutableMapping
2424from typing import NoReturn
2525from typing import Optional
26+ from typing import OrderedDict
2627from typing import overload
2728from typing import Sequence
2829from typing import Set
7576
7677
7778if TYPE_CHECKING :
78- from typing import Deque
79-
8079 from _pytest .main import Session
8180 from _pytest .python import CallSpec2
8281 from _pytest .python import Function
@@ -207,16 +206,18 @@ def get_parametrized_fixture_keys(
207206
208207def reorder_items (items : Sequence [nodes .Item ]) -> List [nodes .Item ]:
209208 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+ ] = {}
211212 for scope in HIGH_SCOPES :
212213 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 )
214215 for item in items :
215216 keys = dict .fromkeys (get_parametrized_fixture_keys (item , scope ), None )
216217 if keys :
217218 scoped_argkeys_cache [item ] = keys
218219 for key in keys :
219- scoped_items_by_argkey [key ]. append ( item )
220+ scoped_items_by_argkey [key ][ item ] = None
220221 items_dict = dict .fromkeys (items , None )
221222 return list (
222223 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]:
226227def fix_cache_order (
227228 item : nodes .Item ,
228229 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 ] ]],
230231) -> None :
231232 for scope in HIGH_SCOPES :
233+ scoped_items_by_argkey = items_by_argkey [scope ]
232234 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 )
234237
235238
236239def reorder_items_atscope (
237240 items : Dict [nodes .Item , None ],
238241 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 ] ]],
240243 scope : Scope ,
241244) -> Dict [nodes .Item , None ]:
242245 if scope is Scope .Function or len (items ) < 3 :
0 commit comments