Files
secs-gem/clients/python/secsgem_client/__init__.py
T
raphael 8a55137e57 feat(client): typo-safe protocol enums + context manager; add wafer_tool example
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>
2026-06-26 22:09:48 +02:00

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"