46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
import tomllib
|
|
from pathlib import Path
|
|
|
|
def _load_order_map(registry_path: Path) -> dict[str, dict[str, int]]:
|
|
if not registry_path.exists():
|
|
return {}
|
|
with registry_path.open("rb") as f:
|
|
data = tomllib.load(f)
|
|
files = data.get("files", {})
|
|
out: dict[str, dict[str, int]] = {}
|
|
for fname, entry in files.items():
|
|
order_list = entry.get("test_order", [])
|
|
if isinstance(order_list, list):
|
|
out[fname] = {item["test_id"]: int(item["order"]) for item in order_list}
|
|
elif isinstance(order_list, dict):
|
|
out[fname] = {k: int(v) for k, v in order_list.items()}
|
|
return out
|
|
|
|
def sort_items_by_order(items: list, registry_path: Path) -> list:
|
|
order_map = _load_order_map(registry_path)
|
|
if not order_map:
|
|
return list(items)
|
|
by_file: dict[str, list] = {}
|
|
for it in items:
|
|
nodeid = getattr(it, "nodeid", "")
|
|
fname = nodeid.split("::", 1)[0] if "::" in nodeid else ""
|
|
by_file.setdefault(fname, []).append(it)
|
|
out: list = []
|
|
for fname, group in by_file.items():
|
|
fmap = order_map.get(fname)
|
|
if not fmap:
|
|
out.extend(group)
|
|
continue
|
|
def _key(it, fmap=fmap, group=group) -> tuple[int, int]:
|
|
nid = getattr(it, "nodeid", "")
|
|
idx = fmap.get(nid, 1 << 30)
|
|
return (idx, group.index(it))
|
|
out.extend(sorted(group, key=_key))
|
|
return out
|
|
|
|
def pytest_collection_modifyitems(config, items) -> None:
|
|
tests_dir = Path(getattr(config, "rootdir", Path.cwd()))
|
|
registry_path = tests_dir / "test_categories.toml"
|
|
new_items = sort_items_by_order(list(items), registry_path=registry_path)
|
|
items[:] = new_items
|