File size: 1,795 Bytes
669597a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e2f048d
 
03c1ae9
669597a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""The public API is a promise: everything advertised is importable, once."""

import importlib
import inspect

import tiny_computer_agent as tca


def test_everything_in_all_is_reachable_from_the_package_root():
    missing = [name for name in tca.__all__ if not hasattr(tca, name)]
    assert missing == [], f"advertised but not exported: {missing}"


def test_all_is_sorted_and_free_of_duplicates():
    assert tca.__all__ == sorted(tca.__all__), "keep __all__ alphabetical"
    assert len(tca.__all__) == len(set(tca.__all__)), "no duplicate exports"


def test_no_public_callable_in_a_module_is_missing_from_all():
    """A capability a user cannot import is a capability they cannot use."""
    modules = ["actions", "act", "observe", "perception", "brain", "models", "loop",
               "safety", "desktop", "demo", "trace",
               # 2.0: the operator layer, all of which must stay importable from the root
               "diff", "gates", "runner", "skills", "watchdog", "audit"]
    unexported = []
    for name in modules:
        module = importlib.import_module(f"tiny_computer_agent.{name}")
        for attr, obj in vars(module).items():
            if attr.startswith("_") or getattr(obj, "__module__", "") != module.__name__:
                continue
            if attr in tca.__all__ or attr.endswith(("Error", "Unavailable", "Violation")):
                continue
            unexported.append(f"{name}.{attr}")
    assert unexported == [], f"public names not exported from the package root: {unexported}"


def test_the_documented_entry_points_are_callable():
    for name in ["doctor", "run_checks", "display_available", "build_agent",
                 "make_detector", "make_model_brain", "benchmark", "score"]:
        assert callable(getattr(tca, name)), name