8a55137e57
Interface cleanup so the report_* family matches the typo-safe ethos of eq.names instead of leaking raw protobuf errors on a misspelled value. - Milestone / ModuleState / JobState: importable str-enums (member == its wire name, so plain strings still work) — autocomplete + a typo-checked happy path. The clean rule: equipment-specific *names* live on eq.names; fixed protocol *value-sets* are enums. - _enum_value(): resolves an enum-or-string arg client-side and, on a bad value, raises ValueError with a close-match hint *before* the wire. Wired into report_job / report_substrate / report_module / request_control_state (all previously raised a raw protobuf ValueError). - Equipment is now a context manager (with Equipment(...) as eq: ...). - examples/wafer_tool.py: a cluster tool tracking one wafer through one module end-to-end (E90 + E157), showing the enums + context manager. - tests/test_enums.py: asserts the enums stay in lockstep with the proto and that the typo path is helpful. Wired into run_interop.sh (pyclient step). - Interop drives both the enum and string forms on the wire + the ValueError typo path. Docs (ch16/ch42) updated; names-vs-enums rule documented. All Python unit tests + 25 pyclient interop checks pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
17 lines
601 B
Python
17 lines
601 B
Python
"""secsgem_client — drive a SECS/GEM equipment daemon from plain Python.
|
|
|
|
The secs_gemd daemon speaks SEMI (HSMS, GEM state machines, SECS-II) to the
|
|
fab host; this client speaks plain Python to the daemon. You never touch a
|
|
stream/function, a format code, or a numeric id — just the names from your
|
|
equipment.yaml.
|
|
"""
|
|
|
|
from ._client import Command, Equipment, Health, ProcessJob, SecsGemError
|
|
from ._enums import JobState, Milestone, ModuleState
|
|
|
|
__all__ = [
|
|
"Equipment", "Command", "Health", "ProcessJob", "SecsGemError",
|
|
"Milestone", "ModuleState", "JobState",
|
|
]
|
|
__version__ = "0.1.0"
|