labcode 0.10.0__tar.gz → 0.10.2__tar.gz
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.
- {labcode-0.10.0 → labcode-0.10.2}/CHANGELOG.md +42 -0
- {labcode-0.10.0 → labcode-0.10.2}/PKG-INFO +4 -4
- {labcode-0.10.0 → labcode-0.10.2}/labcode.egg-info/PKG-INFO +4 -4
- {labcode-0.10.0 → labcode-0.10.2}/labcode.egg-info/requires.txt +3 -3
- labcode-0.10.2/labcode.egg-info/scm_version.json +8 -0
- {labcode-0.10.0 → labcode-0.10.2}/pyproject.toml +21 -6
- labcode-0.10.0/labcode.egg-info/scm_version.json +0 -8
- {labcode-0.10.0 → labcode-0.10.2}/.github/workflows/ci.yml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/.github/workflows/publish.yml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/.gitignore +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/LICENSE +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/MANIFEST.in +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/README.md +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/docs/SPECIFICATIONS.md +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/README.md +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/lads_plate_cycle.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/lads_seal.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/plate_line.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/plate_line.observation.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/plate_line.plan.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/plate_line.svg +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/shared_bench.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/shared_bench.observation.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/shared_bench.plan.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/shared_bench.svg +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.observation.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.plan.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.svg +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/plate_line.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/plate_line.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/plate_line.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/preflight_sila2_env.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/render_plate_line.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/render_shared_bench.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/render_sila2_plate_cycle.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/run_all_lads_examples.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/run_all_sila2_examples.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/run_sila2_plate_cycle.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/run_sila2_plate_cycle_no_atc.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/run_sila2_seal.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/shared_bench.afternoon.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/shared_bench.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/shared_bench.morning.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/shared_bench.run.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/shared_bench.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_plate_cycle.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_plate_cycle.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_plate_cycle.wrapped.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_plate_cycle_no_atc.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_plate_cycle_no_atc.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_plate_cycle_no_atc.wrapped.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_seal.boundary.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_seal.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_seal.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/examples/sila2_seal.wrapped.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/__init__.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/__main__.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/_child.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/backend.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/cli.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/connections.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/dialect.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/extension.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/idgen.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/lads.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/lads_commands.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/lads_unit.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/objectid.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/otel.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/otel_sila2.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/probe.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/py.typed +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/record.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/run_cli.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/runner.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/sila2.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/sila2_commands.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode/sila2_instrument.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode.egg-info/SOURCES.txt +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode.egg-info/dependency_links.txt +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode.egg-info/entry_points.txt +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode.egg-info/scm_file_list.json +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/labcode.egg-info/top_level.txt +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/setup.cfg +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/device_script.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/device_script.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/dispense_read.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/joint.run.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/replenishment.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/reroute_device.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/reroute_transporter.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/transport.env.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/fixtures/transport.workflow.yaml +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_backend.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_cli.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_dialect.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_joint.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_lads.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_lads_unit.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_objectid.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_otel.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_otel_child.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_otel_grpc.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_otel_sila2.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_probe.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_record.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_recording.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_run_cli.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_sila2.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_sila2_commands.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_sila2_instrument.py +0 -0
- {labcode-0.10.0 → labcode-0.10.2}/tests/test_structured_labcode.py +0 -0
|
@@ -6,6 +6,48 @@ specification the section numbers refer to is [`docs/SPECIFICATIONS.md`](docs/SP
|
|
|
6
6
|
Releases before 0.9.0 are described in the messages of their `Release vX.Y.Z` commits
|
|
7
7
|
(`git log --grep '^Release v'`).
|
|
8
8
|
|
|
9
|
+
## 0.10.2 — 2026-10-07
|
|
10
|
+
|
|
11
|
+
No code changes; the siblings move.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **A `map` / `fold` over a list of values runs.** `lc run` is given a list of labels,
|
|
16
|
+
volumes or the like and makes one invocation per element: the runner counts each
|
|
17
|
+
list and states its length in the document's `expansion` (ofplang-schedule SPEC
|
|
18
|
+
§6.13), and the scheduler expands by it (ofplang-schedule 0.14, ofplang-run 0.14).
|
|
19
|
+
Until now such a workflow was refused (`array_length_unknown`).
|
|
20
|
+
|
|
21
|
+
### Changed — may need your attention
|
|
22
|
+
|
|
23
|
+
- **A list zipped with an Array of plates of another length is refused before the run
|
|
24
|
+
starts** (`each_length_mismatch`), where it used to stop that job at its first check.
|
|
25
|
+
- **A structured node's `outputs` is checked as the specification says** (ofplang-validate
|
|
26
|
+
0.4.1). An entry with no `mode` is `missing_required_key`, and a reference to an output
|
|
27
|
+
the node does not expose -- one its `outputs` drops, or one dropped by default -- is
|
|
28
|
+
`output_not_exposed`. Both passed validation before.
|
|
29
|
+
|
|
30
|
+
Requires ofplang-validate 0.4.1, ofplang-schedule 0.14.1 and ofplang-run 0.14.1.
|
|
31
|
+
|
|
32
|
+
## 0.10.1 — 2026-10-07
|
|
33
|
+
|
|
34
|
+
labcode follows specification revision 0.5. No code changes; the siblings move.
|
|
35
|
+
|
|
36
|
+
### Changed — may need your attention
|
|
37
|
+
|
|
38
|
+
- **A composite returns every output it declares.** An output port with no `returns`
|
|
39
|
+
entry is now `output_not_returned`, and a `returns` entry naming no output port is
|
|
40
|
+
`return_port_not_found` (ofplang-validate 0.4). Until now a Pure Data output could go
|
|
41
|
+
unreturned.
|
|
42
|
+
- **The `scheduling` section is gone from the language.** It is now an unknown key, and
|
|
43
|
+
`scheduling_policies` in `features` an unknown feature. Delete the section and the
|
|
44
|
+
feature name; nothing else depended on them, and no plan used them.
|
|
45
|
+
- An Object that comes in at the boundary and is returned as it came is now planned and
|
|
46
|
+
run, moved to the spot its output is bound to (ofplang-schedule 0.13.1, ofplang-run
|
|
47
|
+
0.13.1).
|
|
48
|
+
|
|
49
|
+
Requires ofplang-validate 0.4, ofplang-schedule 0.13.1 and ofplang-run 0.13.1.
|
|
50
|
+
|
|
9
51
|
## 0.10.0 — 2026-10-05
|
|
10
52
|
|
|
11
53
|
labcode runs a protocol repeated over every plate (`map` / `fold`), and stops making up
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: labcode
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.2
|
|
4
4
|
Summary: labcode -- a dialect wrapper over the Object-Flow Programming Language toolchain
|
|
5
5
|
Author-email: Kazunari Kaizu <kwaizu@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -20,9 +20,9 @@ Classifier: Typing :: Typed
|
|
|
20
20
|
Requires-Python: >=3.10
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
|
-
Requires-Dist: ofplang-validate<0.
|
|
24
|
-
Requires-Dist: ofplang-schedule<0.
|
|
25
|
-
Requires-Dist: ofplang-run<0.
|
|
23
|
+
Requires-Dist: ofplang-validate<0.5,>=0.4.1
|
|
24
|
+
Requires-Dist: ofplang-schedule<0.15,>=0.14.1
|
|
25
|
+
Requires-Dist: ofplang-run<0.15,>=0.14.1
|
|
26
26
|
Provides-Extra: test
|
|
27
27
|
Requires-Dist: pytest>=7.0; extra == "test"
|
|
28
28
|
Requires-Dist: opentelemetry-sdk>=1.20; extra == "test"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: labcode
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.2
|
|
4
4
|
Summary: labcode -- a dialect wrapper over the Object-Flow Programming Language toolchain
|
|
5
5
|
Author-email: Kazunari Kaizu <kwaizu@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -20,9 +20,9 @@ Classifier: Typing :: Typed
|
|
|
20
20
|
Requires-Python: >=3.10
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
|
-
Requires-Dist: ofplang-validate<0.
|
|
24
|
-
Requires-Dist: ofplang-schedule<0.
|
|
25
|
-
Requires-Dist: ofplang-run<0.
|
|
23
|
+
Requires-Dist: ofplang-validate<0.5,>=0.4.1
|
|
24
|
+
Requires-Dist: ofplang-schedule<0.15,>=0.14.1
|
|
25
|
+
Requires-Dist: ofplang-run<0.15,>=0.14.1
|
|
26
26
|
Provides-Extra: test
|
|
27
27
|
Requires-Dist: pytest>=7.0; extra == "test"
|
|
28
28
|
Requires-Dist: opentelemetry-sdk>=1.20; extra == "test"
|
|
@@ -62,14 +62,29 @@ classifiers = [
|
|
|
62
62
|
# every real-lab example already happens on it, and run's own floor requires it anyway
|
|
63
63
|
# (an older scheduler reports a running refill free before it is).
|
|
64
64
|
#
|
|
65
|
-
# `ofplang-
|
|
66
|
-
# together
|
|
65
|
+
# `ofplang-validate>=0.4.1`, `ofplang-schedule>=0.14.1` and `ofplang-run>=0.14.1` are
|
|
66
|
+
# required together. A `map` / `fold` over a list of values is planned and run from
|
|
67
|
+
# these (the run states each list's length as the document's `expansion`, the scheduler
|
|
68
|
+
# expands by it), and the front door and the scheduler's reader agree again on what a
|
|
69
|
+
# structured node's `outputs` may say: an entry with no mode, and a reference to an
|
|
70
|
+
# output the node does not expose, are refused by both (validate 0.4.1), where before
|
|
71
|
+
# validate passed what the reader refused.
|
|
72
|
+
#
|
|
73
|
+
# The `ofplang-validate>=0.4`, `ofplang-schedule>=0.13.1` and `ofplang-run>=0.13.1`
|
|
74
|
+
# floors they replace were required together: they implement specification revision 0.5, and `lc` validates at its
|
|
75
|
+
# front door with the one validate and plans and runs with the others, so the three have
|
|
76
|
+
# to agree on what is valid. Under validate 0.3 a composite could leave an output
|
|
77
|
+
# unreturned that the scheduler's reader now refuses, and a `scheduling` section passed
|
|
78
|
+
# that 0.4 calls an unknown key.
|
|
79
|
+
#
|
|
80
|
+
# The `ofplang-schedule>=0.13`, `ofplang-run>=0.13` and `ofplang-validate>=0.3` floors they
|
|
81
|
+
# replace were required together: a `map` / `fold` over an Array of plates runs from these (the scheduler expands
|
|
67
82
|
# it, the runner reads the expansion and takes an Array of Objects at the boundary one
|
|
68
83
|
# element per spot, and specification revision 0.4 is what they validate against), and
|
|
69
84
|
# labcode keys each plate's `_id` by its element. `RunResult.run_warnings`, which `lc run`
|
|
70
85
|
# fills with what labcode defaulted, is new in run 0.13 too.
|
|
71
86
|
#
|
|
72
|
-
# 🔴 The schedule
|
|
87
|
+
# 🔴 The schedule upper bound is a bound, not a floor: 0.10 refuses two jobs binding one
|
|
73
88
|
# boundary spot where it used to warn, and 0.12 refuses a plan it can show has no
|
|
74
89
|
# schedule before the solve instead of returning `unknown`. Both change what happens to
|
|
75
90
|
# a document this package hands over rather than anything it calls.
|
|
@@ -88,9 +103,9 @@ dependencies = [
|
|
|
88
103
|
# would pick up the next such sibling and start refusing its own examples. The
|
|
89
104
|
# bounds cannot protect what is already on PyPI without one, which is why they go
|
|
90
105
|
# in now rather than at the first breakage.
|
|
91
|
-
"ofplang-validate>=0.
|
|
92
|
-
"ofplang-schedule>=0.
|
|
93
|
-
"ofplang-run>=0.
|
|
106
|
+
"ofplang-validate>=0.4.1,<0.5",
|
|
107
|
+
"ofplang-schedule>=0.14.1,<0.15",
|
|
108
|
+
"ofplang-run>=0.14.1,<0.15",
|
|
94
109
|
]
|
|
95
110
|
|
|
96
111
|
[project.urls]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|