rocket-engine 0.0.2b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rocket_engine/__init__.py +8 -0
- rocket_engine/__main__.py +12 -0
- rocket_engine/adapters/README.md +54 -0
- rocket_engine/adapters/__init__.py +7 -0
- rocket_engine/adapters/api.py +39 -0
- rocket_engine/adapters/base.py +46 -0
- rocket_engine/adapters/cace/__init__.py +163 -0
- rocket_engine/adapters/circulax/README.md +10 -0
- rocket_engine/adapters/circulax/__init__.py +112 -0
- rocket_engine/adapters/circulax/_driver.py +190 -0
- rocket_engine/adapters/circulax/adapter.py +538 -0
- rocket_engine/adapters/circulax/results.py +291 -0
- rocket_engine/adapters/cli/README.md +34 -0
- rocket_engine/adapters/cli/__init__.py +305 -0
- rocket_engine/adapters/connectivity/__init__.py +196 -0
- rocket_engine/adapters/connectivity/results.py +214 -0
- rocket_engine/adapters/cosim/README.md +9 -0
- rocket_engine/adapters/cosim/__init__.py +1390 -0
- rocket_engine/adapters/cosim/results.py +214 -0
- rocket_engine/adapters/devsim/__init__.py +171 -0
- rocket_engine/adapters/digital_flow/README.md +9 -0
- rocket_engine/adapters/digital_flow/__init__.py +1121 -0
- rocket_engine/adapters/digital_flow/results.py +227 -0
- rocket_engine/adapters/digital_flow/state.py +462 -0
- rocket_engine/adapters/drc/README.klayout.md +7 -0
- rocket_engine/adapters/drc/README.md +7 -0
- rocket_engine/adapters/drc/__init__.py +1 -0
- rocket_engine/adapters/drc/klayout.py +952 -0
- rocket_engine/adapters/drc/magic.py +287 -0
- rocket_engine/adapters/drc/results.py +184 -0
- rocket_engine/adapters/drc/results_kl.py +188 -0
- rocket_engine/adapters/elmer/__init__.py +163 -0
- rocket_engine/adapters/envelope.py +120 -0
- rocket_engine/adapters/equivalence/__init__.py +156 -0
- rocket_engine/adapters/errors.py +181 -0
- rocket_engine/adapters/extract_magic/README.md +15 -0
- rocket_engine/adapters/extract_magic/__init__.py +425 -0
- rocket_engine/adapters/extract_magic/results.py +209 -0
- rocket_engine/adapters/formal_sby/README.md +7 -0
- rocket_engine/adapters/formal_sby/__init__.py +773 -0
- rocket_engine/adapters/formal_sby/formal_edge.py +195 -0
- rocket_engine/adapters/formal_sby/results.py +185 -0
- rocket_engine/adapters/gdsfactory/__init__.py +194 -0
- rocket_engine/adapters/gdsfactory/_driver.py +459 -0
- rocket_engine/adapters/gdsfactory/adapter.py +609 -0
- rocket_engine/adapters/gdsfactory/results.py +181 -0
- rocket_engine/adapters/hdl_sim/README.md +7 -0
- rocket_engine/adapters/hdl_sim/__init__.py +369 -0
- rocket_engine/adapters/hdl_sim/ghdl.py +155 -0
- rocket_engine/adapters/hdl_sim/results.py +178 -0
- rocket_engine/adapters/hdl_sim/verilator.py +167 -0
- rocket_engine/adapters/http/README.md +15 -0
- rocket_engine/adapters/http/__init__.py +458 -0
- rocket_engine/adapters/http/events.py +63 -0
- rocket_engine/adapters/ipc/README.md +9 -0
- rocket_engine/adapters/ipc/__init__.py +111 -0
- rocket_engine/adapters/lvs_netgen/README.md +20 -0
- rocket_engine/adapters/lvs_netgen/__init__.py +889 -0
- rocket_engine/adapters/lvs_netgen/results.py +168 -0
- rocket_engine/adapters/mcp/README.md +19 -0
- rocket_engine/adapters/mcp/__init__.py +85 -0
- rocket_engine/adapters/mcp/api-schema.json +6107 -0
- rocket_engine/adapters/mcp/pull.py +246 -0
- rocket_engine/adapters/mcp/server.py +794 -0
- rocket_engine/adapters/meep/__init__.py +167 -0
- rocket_engine/adapters/meow/README.md +7 -0
- rocket_engine/adapters/meow/__init__.py +190 -0
- rocket_engine/adapters/meow/_driver.py +227 -0
- rocket_engine/adapters/meow/_envelope.py +108 -0
- rocket_engine/adapters/meow/adapter.py +491 -0
- rocket_engine/adapters/meow/results.py +218 -0
- rocket_engine/adapters/mutation/__init__.py +192 -0
- rocket_engine/adapters/ngspice/README.md +28 -0
- rocket_engine/adapters/ngspice/__init__.py +627 -0
- rocket_engine/adapters/ngspice/results.py +215 -0
- rocket_engine/adapters/postlayout/README.md +28 -0
- rocket_engine/adapters/postlayout/__init__.py +17 -0
- rocket_engine/adapters/postlayout/adapter.py +1062 -0
- rocket_engine/adapters/postlayout/results.py +330 -0
- rocket_engine/adapters/postlayout/translate.py +71 -0
- rocket_engine/adapters/profile.py +220 -0
- rocket_engine/adapters/sax/README.md +23 -0
- rocket_engine/adapters/sax/__init__.py +516 -0
- rocket_engine/adapters/sax/_driver.py +148 -0
- rocket_engine/adapters/sax/results.py +291 -0
- rocket_engine/adapters/stdio_console.py +1151 -0
- rocket_engine/adapters/syntax/README.md +5 -0
- rocket_engine/adapters/syntax/__init__.py +366 -0
- rocket_engine/adapters/syntax/results.py +181 -0
- rocket_engine/adapters/synth_yosys/README.md +7 -0
- rocket_engine/adapters/synth_yosys/__init__.py +655 -0
- rocket_engine/adapters/synth_yosys/amaranth.py +120 -0
- rocket_engine/adapters/synth_yosys/ghdl.py +128 -0
- rocket_engine/adapters/synth_yosys/results.py +173 -0
- rocket_engine/adapters/timing_sta/README.md +9 -0
- rocket_engine/adapters/timing_sta/__init__.py +726 -0
- rocket_engine/adapters/view_sync/__init__.py +185 -0
- rocket_engine/adapters/view_sync/results.py +189 -0
- rocket_engine/adapters/vlsir/__init__.py +142 -0
- rocket_engine/adapters/xschem/__init__.py +440 -0
- rocket_engine/adapters/xschem/deck.py +266 -0
- rocket_engine/clients/__init__.py +5 -0
- rocket_engine/clients/runtime.py +255 -0
- rocket_engine/composition.py +2279 -0
- rocket_engine/execution/README.md +30 -0
- rocket_engine/execution/__init__.py +150 -0
- rocket_engine/execution/apig/__init__.py +1 -0
- rocket_engine/execution/apig/pool.py +463 -0
- rocket_engine/execution/apig/submit.py +124 -0
- rocket_engine/execution/block_runs_scope.py +479 -0
- rocket_engine/execution/coalesce.py +414 -0
- rocket_engine/execution/console/__init__.py +1 -0
- rocket_engine/execution/console/apply_session.py +318 -0
- rocket_engine/execution/console/lifecycle.py +265 -0
- rocket_engine/execution/dispatch.py +205 -0
- rocket_engine/execution/errors.py +31 -0
- rocket_engine/execution/ports.py +797 -0
- rocket_engine/execution/pyexec/__init__.py +1 -0
- rocket_engine/execution/pyexec/apply_context.py +547 -0
- rocket_engine/execution/pyexec/approvals.py +173 -0
- rocket_engine/execution/pyexec/runner.py +404 -0
- rocket_engine/execution/pyexec/support.py +464 -0
- rocket_engine/execution/python_exec.py +897 -0
- rocket_engine/execution/queue.py +85 -0
- rocket_engine/execution/replay_safe.py +601 -0
- rocket_engine/execution/routing/__init__.py +1 -0
- rocket_engine/execution/routing/calls.py +364 -0
- rocket_engine/execution/routing/namespace.py +785 -0
- rocket_engine/execution/routing/ports.py +102 -0
- rocket_engine/execution/routing/tools.py +346 -0
- rocket_engine/execution/runner.py +311 -0
- rocket_engine/execution/runtime.py +1149 -0
- rocket_engine/execution/service.py +279 -0
- rocket_engine/execution/worker.py +464 -0
- rocket_engine/interfaces/README.md +26 -0
- rocket_engine/interfaces/__init__.py +58 -0
- rocket_engine/interfaces/apig_assets.py +407 -0
- rocket_engine/interfaces/celllink.py +461 -0
- rocket_engine/interfaces/documents.py +92 -0
- rocket_engine/interfaces/envelopes.py +131 -0
- rocket_engine/interfaces/errors.py +16 -0
- rocket_engine/interfaces/layout.py +410 -0
- rocket_engine/interfaces/layout_schema.yaml +278 -0
- rocket_engine/interfaces/paths.py +223 -0
- rocket_engine/interfaces/pdks.py +550 -0
- rocket_engine/interfaces/ports.py +72 -0
- rocket_engine/interfaces/references.py +115 -0
- rocket_engine/interfaces/refs.py +85 -0
- rocket_engine/interfaces/runparams.py +304 -0
- rocket_engine/interfaces/setup.py +552 -0
- rocket_engine/interfaces/setup_catalogue.yaml +243 -0
- rocket_engine/interfaces/setup_probes.py +66 -0
- rocket_engine/interfaces/vocabulary.py +58 -0
- rocket_engine/interfaces/yaml_dump.py +31 -0
- rocket_engine/library/README.md +22 -0
- rocket_engine/library/__init__.py +13 -0
- rocket_engine/library/apig_catalog.py +371 -0
- rocket_engine/library/catalog.py +185 -0
- rocket_engine/library/errors.py +16 -0
- rocket_engine/mutate/__init__.py +776 -0
- rocket_engine/mutate/operators.py +700 -0
- rocket_engine/ops/__init__.py +1 -0
- rocket_engine/ops/deferred.py +279 -0
- rocket_engine/ops/editors.py +404 -0
- rocket_engine/ops/evidence.py +194 -0
- rocket_engine/ops/gates.py +262 -0
- rocket_engine/ops/ports.py +76 -0
- rocket_engine/ops/queries.py +417 -0
- rocket_engine/ops/runs.py +553 -0
- rocket_engine/ops/submit.py +614 -0
- rocket_engine/project/README.md +27 -0
- rocket_engine/project/__init__.py +6 -0
- rocket_engine/project/canvas/__init__.py +55 -0
- rocket_engine/project/canvas/compile.py +109 -0
- rocket_engine/project/canvas/integrate.py +48 -0
- rocket_engine/project/canvas/schema.py +241 -0
- rocket_engine/project/canvas/templates.py +46 -0
- rocket_engine/project/canvas/validate.py +603 -0
- rocket_engine/project/edit/__init__.py +5 -0
- rocket_engine/project/edit/cas.py +87 -0
- rocket_engine/project/edit/transactions.py +282 -0
- rocket_engine/project/errors.py +16 -0
- rocket_engine/project/frontend13.py +685 -0
- rocket_engine/project/geometry/__init__.py +23 -0
- rocket_engine/project/geometry/ops.py +451 -0
- rocket_engine/project/geometry/snap.py +103 -0
- rocket_engine/project/ip/__init__.py +1 -0
- rocket_engine/project/ip/blocks.py +195 -0
- rocket_engine/project/ip/entry.schema.json +78 -0
- rocket_engine/project/ip/lifecycle.py +402 -0
- rocket_engine/project/ip/verbs.py +123 -0
- rocket_engine/project/layers/__init__.py +6 -0
- rocket_engine/project/layers/bindings.py +115 -0
- rocket_engine/project/layers/catalog.py +228 -0
- rocket_engine/project/layers/presets.py +43 -0
- rocket_engine/project/ledger/__init__.py +1 -0
- rocket_engine/project/ledger/docs.py +167 -0
- rocket_engine/project/ledger/entities.py +176 -0
- rocket_engine/project/ledger/events.py +29 -0
- rocket_engine/project/ledger/runs.py +257 -0
- rocket_engine/project/ledger/shared.py +174 -0
- rocket_engine/project/ledger/snapshots.py +385 -0
- rocket_engine/project/ledger/wires.py +552 -0
- rocket_engine/project/process/__init__.py +14 -0
- rocket_engine/project/process/model.py +193 -0
- rocket_engine/project/process/recipes.py +121 -0
- rocket_engine/project/schematic/__init__.py +1 -0
- rocket_engine/project/schematic/hierarchy.py +312 -0
- rocket_engine/project/schematic/instances.py +393 -0
- rocket_engine/project/schematic/sheets.py +198 -0
- rocket_engine/project/service.py +2941 -0
- rocket_engine/project/symbols/__init__.py +1 -0
- rocket_engine/project/symbols/cells.py +324 -0
- rocket_engine/project/symbols/linkage.py +356 -0
- rocket_engine/project/symbols/symbols.py +352 -0
- rocket_engine/project/templates/__init__.py +303 -0
- rocket_engine/project/templates/errors.py +25 -0
- rocket_engine/project/testbench/__init__.py +49 -0
- rocket_engine/project/testbench/blocks.py +619 -0
- rocket_engine/project/testbench/templates.py +134 -0
- rocket_engine/stores/README.md +12 -0
- rocket_engine/stores/__init__.py +6 -0
- rocket_engine/stores/ecs.py +1508 -0
- rocket_engine/stores/layers.py +1023 -0
- rocket_engine/stores/settings.py +1188 -0
- rocket_engine/stores/wireplace.py +1324 -0
- rocket_engine/workflows/README.md +18 -0
- rocket_engine/workflows/__init__.py +53 -0
- rocket_engine/workflows/capability_plan.py +102 -0
- rocket_engine/workflows/completion.py +228 -0
- rocket_engine/workflows/connectgraph.py +734 -0
- rocket_engine/workflows/connectgraph_emit.py +336 -0
- rocket_engine/workflows/gates.py +144 -0
- rocket_engine/workflows/photonic_wire.py +76 -0
- rocket_engine/workflows/stages.py +324 -0
- rocket_engine/workflows/viewsync.py +399 -0
- rocket_engine-0.0.2b1.dist-info/METADATA +200 -0
- rocket_engine-0.0.2b1.dist-info/RECORD +241 -0
- rocket_engine-0.0.2b1.dist-info/WHEEL +4 -0
- rocket_engine-0.0.2b1.dist-info/entry_points.txt +2 -0
- rocket_engine-0.0.2b1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"""Op dispatch: the inbound port shared by CLI, console, and MCP.
|
|
2
|
+
|
|
3
|
+
One catalog (`interfaces.vocabulary`), one parser of record. Op-call
|
|
4
|
+
text — `run_drc tech=scmos timeout_s=30` — parses here into a
|
|
5
|
+
validated (operation, arguments) pair; the CLI adapter, batch files,
|
|
6
|
+
the REPL, and console-history replay all compile through
|
|
7
|
+
`parse_op_call`/`parse_op_tokens` and `OpDispatcher`, so one syntax
|
|
8
|
+
is tested once. MCP validates names against the same catalog for
|
|
9
|
+
its structured calls. Names in OPERATIONS execute via `engine.run`;
|
|
10
|
+
names in QUERIES read via `engine.submit`. Unknown names and
|
|
11
|
+
malformed args raise UsageError (the caller maps it to a usage
|
|
12
|
+
exit); engine failures propagate untouched so callers report them
|
|
13
|
+
honestly. This module imports no adapter and no engine: the engine
|
|
14
|
+
arrives as a duck-typed port (`run`/`submit`).
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import shlex
|
|
18
|
+
|
|
19
|
+
from ruamel.yaml import YAML
|
|
20
|
+
|
|
21
|
+
from ..adapters import api
|
|
22
|
+
from ..interfaces.vocabulary import OPERATIONS, QUERIES
|
|
23
|
+
from .errors import UsageError
|
|
24
|
+
|
|
25
|
+
__all__ = ["OpDispatcher", "parse_op_call", "parse_op_tokens"]
|
|
26
|
+
|
|
27
|
+
_yaml = YAML(typ="safe")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _parse_value(text):
|
|
31
|
+
try:
|
|
32
|
+
return _yaml.load(text)
|
|
33
|
+
except Exception:
|
|
34
|
+
return text
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _check_name(name):
|
|
38
|
+
if name not in OPERATIONS and name not in QUERIES:
|
|
39
|
+
raise UsageError("unsupported_operation", f"Unknown operation: {name}.")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def parse_op_tokens(tokens):
|
|
43
|
+
"""Validate pre-split op-call tokens (argv path, no re-splitting).
|
|
44
|
+
|
|
45
|
+
First token is the operation, the rest are `key=value` pairs with
|
|
46
|
+
YAML-scalar values (`benches=[ac,tran]`, `deck={tool: klayout}`).
|
|
47
|
+
Unparseable values pass through as raw strings: the CLI owns
|
|
48
|
+
lexical shape, the engine owns semantic validation.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
tokens: Pre-split op call; first token is the operation,
|
|
52
|
+
the rest are `key=value` pairs.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
(operation, arguments) pair with YAML-scalar values.
|
|
56
|
+
|
|
57
|
+
Raises:
|
|
58
|
+
UsageError: invalid_command for an empty call or a
|
|
59
|
+
malformed argument, unsupported_operation for an
|
|
60
|
+
unknown operation.
|
|
61
|
+
"""
|
|
62
|
+
tokens = list(tokens)
|
|
63
|
+
if not tokens:
|
|
64
|
+
raise UsageError("invalid_command", "Empty op call.")
|
|
65
|
+
name = tokens[0]
|
|
66
|
+
_check_name(name)
|
|
67
|
+
arguments = {}
|
|
68
|
+
for token in tokens[1:]:
|
|
69
|
+
key, sep, value_text = token.partition("=")
|
|
70
|
+
if not sep or not key or not value_text:
|
|
71
|
+
raise UsageError(
|
|
72
|
+
"invalid_command",
|
|
73
|
+
f"Malformed argument (want key=value): {token}.",
|
|
74
|
+
)
|
|
75
|
+
arguments[key] = _parse_value(value_text)
|
|
76
|
+
return name, arguments
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def parse_op_call(text):
|
|
80
|
+
"""Parse one op-call line (batch/REPL path) via `parse_op_tokens`.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
text: One op-call line, shell-split before validation.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
(operation, arguments) pair with YAML-scalar values.
|
|
87
|
+
|
|
88
|
+
Raises:
|
|
89
|
+
UsageError: invalid_command when the line cannot be split
|
|
90
|
+
or an argument is malformed, unsupported_operation
|
|
91
|
+
for an unknown operation.
|
|
92
|
+
"""
|
|
93
|
+
try:
|
|
94
|
+
tokens = shlex.split(text)
|
|
95
|
+
except ValueError as exc:
|
|
96
|
+
raise UsageError(
|
|
97
|
+
"invalid_command", f"Cannot parse op call: {exc}."
|
|
98
|
+
) from exc
|
|
99
|
+
return parse_op_tokens(tokens)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class OpDispatcher:
|
|
103
|
+
"""Route validated op calls to the engine port.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
engine: Duck-typed engine port (`run`/`submit`).
|
|
107
|
+
project_id: Project id stamped on every command.
|
|
108
|
+
actor: Actor stamped on every command.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
def __init__(self, engine, project_id="default", actor="cli"):
|
|
112
|
+
self._engine = engine
|
|
113
|
+
self._project_id = project_id
|
|
114
|
+
self._actor = actor
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def project_id(self):
|
|
118
|
+
"""Project id stamped on every dispatched command.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Bound project id.
|
|
122
|
+
"""
|
|
123
|
+
return self._project_id
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def actor(self):
|
|
127
|
+
"""Actor stamped on every dispatched command.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Bound actor name.
|
|
131
|
+
"""
|
|
132
|
+
return self._actor
|
|
133
|
+
|
|
134
|
+
def execute(self, operation, arguments, request_id=None):
|
|
135
|
+
"""Route one validated op call to the engine port.
|
|
136
|
+
|
|
137
|
+
Every call — operations and queries alike — goes through
|
|
138
|
+
the api contract (`adapters.api.submit`), the one admission
|
|
139
|
+
path (ledger, revision gate, idempotency). Like the MCP
|
|
140
|
+
server's project binding,
|
|
141
|
+
an operation missing expected_revision is filled from the
|
|
142
|
+
bound engine's current head, so interactive callers admit
|
|
143
|
+
against what they see; an explicit revision always wins,
|
|
144
|
+
and read queries pass through untouched (tier-1 reads never
|
|
145
|
+
carry admission data). Engine failures propagate untouched
|
|
146
|
+
so callers report them honestly.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
operation: Cataloged operation or query name.
|
|
150
|
+
arguments: Operation arguments (deck.tool selects the
|
|
151
|
+
solver for runs).
|
|
152
|
+
request_id: Envelope id; generated when omitted.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Engine result for the operation or query.
|
|
156
|
+
|
|
157
|
+
Raises:
|
|
158
|
+
UsageError: unsupported_operation for an unknown name.
|
|
159
|
+
"""
|
|
160
|
+
_check_name(operation)
|
|
161
|
+
stamped = dict(arguments)
|
|
162
|
+
if operation not in QUERIES and "expected_revision" not in stamped:
|
|
163
|
+
head = self._current_head()
|
|
164
|
+
if head is not None:
|
|
165
|
+
stamped["expected_revision"] = head
|
|
166
|
+
return api.submit(
|
|
167
|
+
self._engine, self._project_id, operation, stamped,
|
|
168
|
+
request_id=request_id,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
def _current_head(self):
|
|
172
|
+
"""Bound engine's head revision, or None when unknowable.
|
|
173
|
+
|
|
174
|
+
Duck-typed engines without a snapshot read simply leave
|
|
175
|
+
the call unstamped — the engine then enforces its own gate.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Current revision string, or None.
|
|
179
|
+
"""
|
|
180
|
+
snapshot = getattr(self._engine, "snapshot", None)
|
|
181
|
+
if not callable(snapshot):
|
|
182
|
+
return None
|
|
183
|
+
try:
|
|
184
|
+
return snapshot().get("current_revision")
|
|
185
|
+
except Exception:
|
|
186
|
+
return None
|
|
187
|
+
|
|
188
|
+
def execute_line(self, line, request_id=None):
|
|
189
|
+
"""Parse one op-call line and route it to the engine port.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
line: One op-call line (`operation [key=value ...]`).
|
|
193
|
+
request_id: Envelope id; generated when omitted.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
(operation, result) pair for the routed call.
|
|
197
|
+
|
|
198
|
+
Raises:
|
|
199
|
+
UsageError: invalid_command for a malformed line,
|
|
200
|
+
unsupported_operation for an unknown name.
|
|
201
|
+
"""
|
|
202
|
+
operation, arguments = parse_op_call(line)
|
|
203
|
+
return operation, self.execute(
|
|
204
|
+
operation, arguments, request_id=request_id
|
|
205
|
+
)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Error type for execution violations. Carries a stable machine code."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ExecutionError(Exception):
|
|
5
|
+
"""Execution violation with a stable machine code.
|
|
6
|
+
|
|
7
|
+
Args:
|
|
8
|
+
code: Stable machine-readable error code.
|
|
9
|
+
message: Human-readable detail.
|
|
10
|
+
fields: Itemized fields, when the error names any.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(self, code, message, fields=None):
|
|
14
|
+
super().__init__(message)
|
|
15
|
+
self.code = code
|
|
16
|
+
self.fields = fields or []
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class UsageError(Exception):
|
|
20
|
+
"""Op-call validation failure: unknown op or malformed args.
|
|
21
|
+
|
|
22
|
+
Raised by the dispatch port; inbound adapters map it to a usage
|
|
23
|
+
exit (CLI: exit 2). Codes reuse the stable engine vocabulary:
|
|
24
|
+
`unsupported_operation` for unknown names, `invalid_command`
|
|
25
|
+
for malformed calls.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, code, message, fields=None):
|
|
29
|
+
super().__init__(message)
|
|
30
|
+
self.code = code
|
|
31
|
+
self.fields = fields or []
|