Tags: DiamondLightSource/fastcs
Tags
index.bob: separate title logic from per-controller screens - Per-controller screens always use their own PV prefix as title - index.bob title uses EpicsGUIOptions.title if set, otherwise falls back to the first root controller's PV prefix or 'FastCS Devices' - Setting title='' suppresses the title widget entirely (via pvi's new without_title() path when Device.label is empty) - Document the ~30-character truncation limit in EpicsGUIOptions.title
test: Add coverage tests for BaseController group_layout and launch n… …o-options path Add two targeted tests to improve code coverage: 1. test_controller_with_group_layout() - Tests that the group_layout parameter is properly initialized in BaseController.__init__() when explicitly passed and that it defaults to GroupLayout.SUBSCREEN. Covers line 57 in base_controller.py. 2. test_launch_single_arg_no_options() - Tests the launch system's handling of controllers that take no configuration options. Exercises the code path where registered.cls() is called with only path=[entry.id]. Covers line 236 in launch.py. These tests address CodeCov patch coverage report gaps.
test(controllers): drop stale path-mismatch assertion The path pre-validation in `add_sub_controller` was removed in 63ffd94 to decouple sub-controller path assignment from registration; the `does not match parent path` ValueError no longer fires. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
feat(launch): restore pre-#360 path flow with launcher-seeded root id Restores the path-propagation flow to its pre-#360 shape: same `set_path` / `add_sub_controller(name).set_path(parent.path + [name])` / `_build_api(self._path)` machinery, with the single addition that the launcher seeds each root Controller's path via `set_path([entry.id])` once before `serve`. The "root of the path" moved from transport-config (`pv_prefix`, gone after #360) to controller-config (the YAML `id:`, seeded into `_path`). Drops `id` from Python entirely. `Controller._id`, `set_id()`, the `id` property and the `_id` repr branch are removed. `id` is now a YAML-label-only concept; `path` is the real Controller concept and the launcher is the only place that translates one to the other. User `Controller.__init__` is unchanged. YAML schema flip (consistent with the multi-controller direction of PR #360): `controllers:` becomes a list of entries, each carrying `id:` as a sibling of the existing `type:` discriminator. Duplicate ids are rejected at run time by `_instantiate_controllers` (replaces the dict mapping-key safety net that no longer exists). controllers: - id: MAIN type: TemperatureController ip_settings: { ip: localhost, port: 25565 } num_ramp_controllers: 4 The transport-side change made by #360 stays — `EpicsCATransport.connect` reads `pv_prefix_from_path(api.path)` instead of a configured `pv_prefix`. Multi-controller cardinality (also #360 territory) stays. `FastCS._context_key` and direct-construction call sites read `controller.path[0]` (with `IndexError` falling back to the class name); tests, examples and snippets call `set_path([id])` instead of `set_id(id)`. Migration guide, launch-framework guide, multiple-transports guide, demo, all docs snippets, and the YAML fixtures are updated to the list form. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Fail fast on punctuation-only controller ids in EPICS GUI emission The EPICS CA id validator accepts `[A-Za-z0-9_-]+`, so ids like `"___"` and `"-"` pass validation and reach `_coerce_pascal_name` in the GUI emission path. That helper delegates to `pvi.device.enforce_pascal_case`, which strips non-Pascal characters and unconditionally indexes `s[0]` on the result. When every character is stripped the index raises `IndexError`, blowing up GUI emission at `connect()` time with an opaque traceback. Pre-strip the id with the same regex pvi uses (`NON_PASCAL_CHARS_RE`) and raise `ValueError` with a message that names the offending id when the strip yields the empty string. Choosing fail-fast over an `"X"` fallback keeps the failure traceable: a silent fallback would generate nonsense GUI names that the user would have to reverse-engineer back to the bad id. Fixes #369 Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
PreviousNext