File size: 3,086 Bytes
20c251e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from __future__ import annotations

import sys
import types
from collections import deque
from pathlib import Path

from dovla_cil.eval.smolvla_runtime import (
    ensure_lazy_policies_namespace,
    ensure_policy_utils_shim,
    ensure_train_config_type_shim,
)


def test_lazy_smolvla_namespace_points_to_installed_policy_directory(
    tmp_path: Path,
    monkeypatch,
) -> None:
    package_dir = tmp_path / "lerobot"
    policies_dir = package_dir / "policies"
    policies_dir.mkdir(parents=True)
    module = types.ModuleType("lerobot")
    module.__file__ = str(package_dir / "__init__.py")
    monkeypatch.delitem(sys.modules, "lerobot.policies", raising=False)

    namespace = ensure_lazy_policies_namespace(module)

    assert namespace.__path__ == [str(policies_dir)]
    assert namespace.__spec__ is not None
    assert namespace.__spec__.submodule_search_locations == [str(policies_dir)]
    assert sys.modules["lerobot.policies"] is namespace


def test_lazy_smolvla_namespace_is_idempotent(tmp_path: Path, monkeypatch) -> None:
    package_dir = tmp_path / "lerobot"
    (package_dir / "policies").mkdir(parents=True)
    module = types.ModuleType("lerobot")
    module.__file__ = str(package_dir / "__init__.py")
    monkeypatch.delitem(sys.modules, "lerobot.policies", raising=False)

    first = ensure_lazy_policies_namespace(module)
    second = ensure_lazy_policies_namespace(module)

    assert first is second


def test_train_config_shim_exposes_only_required_type(monkeypatch) -> None:
    configs = types.ModuleType("lerobot.configs")
    configs.__path__ = []
    monkeypatch.setitem(sys.modules, "lerobot.configs", configs)
    monkeypatch.delitem(sys.modules, "lerobot.configs.train", raising=False)

    module = ensure_train_config_type_shim()

    assert module.__dovla_type_only_shim__ is True
    assert module.TrainPipelineConfig.__module__ == "lerobot.configs.train"
    assert configs.train is module


def test_train_config_shim_preserves_real_import(monkeypatch) -> None:
    real_module = types.ModuleType("lerobot.configs.train")
    monkeypatch.setitem(sys.modules, "lerobot.configs.train", real_module)

    assert ensure_train_config_type_shim() is real_module


def test_policy_utils_shim_populates_and_advances_queues(monkeypatch) -> None:
    monkeypatch.delitem(sys.modules, "lerobot.policies.utils", raising=False)
    module = ensure_policy_utils_shim()
    queues = {"observation": deque(maxlen=2), "action": deque(maxlen=2)}

    result = module.populate_queues(
        queues,
        {"observation": "first", "action": "excluded"},
        exclude_keys=["action"],
    )
    module.populate_queues(queues, {"observation": "second"})

    assert result is queues
    assert list(queues["observation"]) == ["first", "second"]
    assert list(queues["action"]) == []


def test_policy_utils_shim_preserves_real_import(monkeypatch) -> None:
    real_module = types.ModuleType("lerobot.policies.utils")
    monkeypatch.setitem(sys.modules, "lerobot.policies.utils", real_module)

    assert ensure_policy_utils_shim() is real_module