SeanWang0027's picture
Vendor slime @ 26525f9, the trainer reopd_ref builds on (part 2)
af66a85 verified
Raw History Blame Contribute Delete
3.31 kB
from __future__ import annotations
import os
import sys
import types
from argparse import ArgumentParser
from collections.abc import Sequence
from pathlib import Path
import pytest
ENV_PREFIX = "SLIME_CONTRACT_"
def install_paths() -> None:
current = Path(__file__).resolve()
sys.path.insert(0, str(current.parent))
sys.path.insert(0, str(current.parents[1]))
sys.path.insert(0, str(current.parents[2]))
def install_stubs(*, with_sglang_router: bool = False, with_transformers: bool = False) -> None:
if "ray" not in sys.modules:
ray_mod = types.ModuleType("ray")
ray_mod._private = types.SimpleNamespace(
services=types.SimpleNamespace(get_node_ip_address=lambda: "127.0.0.1")
)
sys.modules["ray"] = ray_mod
if with_sglang_router and "sglang_router" not in sys.modules:
mod = types.ModuleType("sglang_router")
mod.__version__ = "0.2.3"
sys.modules["sglang_router"] = mod
if with_transformers and "transformers" not in sys.modules:
mod = types.ModuleType("transformers")
mod.AutoTokenizer = type(
"AutoTokenizer", (), {"from_pretrained": staticmethod(lambda *args, **kwargs: object())}
)
mod.AutoProcessor = type(
"AutoProcessor",
(),
{"from_pretrained": staticmethod(lambda *args, **kwargs: (_ for _ in ()).throw(OSError()))},
)
mod.PreTrainedTokenizerBase = type("PreTrainedTokenizerBase", (), {})
mod.ProcessorMixin = type("ProcessorMixin", (), {})
sys.modules["transformers"] = mod
def contract_env_name(key: str) -> str:
return f"{ENV_PREFIX}{key}"
def get_contract_path(key: str, default: str | None = None) -> str | None:
return os.environ.get(contract_env_name(key), default)
def run_contract_test_for_file(
file: str,
path_args: Sequence[str] = (),
extra_args: Sequence[tuple[str, dict]] = (),
extra_setup=None,
) -> None:
"""Parse ``--xxx-path`` CLI arguments, store as ``SLIME_CONTRACT_XXX_PATH``
env vars, then call pytest on *file*.
Args:
file: ``__file__`` of the calling contract test module.
path_args: Argument names **without** the leading ``--``, e.g.
``["rollout-function-path"]``. Each is exposed as a
positional env var ``FOO_BAR_PATH`` automatically.
extra_args: Additional ``(flag, kwargs)`` pairs forwarded verbatim to
``parser.add_argument``. Useful for boolean flags like
``("--group-rm", {"action": "store_true", "default": False})``.
extra_setup: Optional callable ``fn(parsed_args)`` invoked after env
vars are set, for any file-specific side-effects.
"""
parser = ArgumentParser()
for arg in path_args:
parser.add_argument(f"--{arg}", default=None)
for flag, kwargs in extra_args:
parser.add_argument(flag, **kwargs)
parsed, remaining = parser.parse_known_args()
for key, value in vars(parsed).items():
if value and isinstance(value, str):
os.environ[contract_env_name(key.upper())] = value
if extra_setup is not None:
extra_setup(parsed)
raise SystemExit(pytest.main([file, *remaining]))