labcode 0.10.1__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.
Files changed (113) hide show
  1. {labcode-0.10.1 → labcode-0.10.2}/CHANGELOG.md +23 -0
  2. {labcode-0.10.1 → labcode-0.10.2}/PKG-INFO +4 -4
  3. {labcode-0.10.1 → labcode-0.10.2}/labcode.egg-info/PKG-INFO +4 -4
  4. {labcode-0.10.1 → labcode-0.10.2}/labcode.egg-info/requires.txt +3 -3
  5. labcode-0.10.2/labcode.egg-info/scm_version.json +8 -0
  6. {labcode-0.10.1 → labcode-0.10.2}/pyproject.toml +14 -6
  7. labcode-0.10.1/labcode.egg-info/scm_version.json +0 -8
  8. {labcode-0.10.1 → labcode-0.10.2}/.github/workflows/ci.yml +0 -0
  9. {labcode-0.10.1 → labcode-0.10.2}/.github/workflows/publish.yml +0 -0
  10. {labcode-0.10.1 → labcode-0.10.2}/.gitignore +0 -0
  11. {labcode-0.10.1 → labcode-0.10.2}/LICENSE +0 -0
  12. {labcode-0.10.1 → labcode-0.10.2}/MANIFEST.in +0 -0
  13. {labcode-0.10.1 → labcode-0.10.2}/README.md +0 -0
  14. {labcode-0.10.1 → labcode-0.10.2}/docs/SPECIFICATIONS.md +0 -0
  15. {labcode-0.10.1 → labcode-0.10.2}/examples/README.md +0 -0
  16. {labcode-0.10.1 → labcode-0.10.2}/examples/lads_plate_cycle.env.yaml +0 -0
  17. {labcode-0.10.1 → labcode-0.10.2}/examples/lads_seal.env.yaml +0 -0
  18. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/plate_line.boundary.yaml +0 -0
  19. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/plate_line.observation.yaml +0 -0
  20. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/plate_line.plan.yaml +0 -0
  21. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/plate_line.svg +0 -0
  22. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/shared_bench.boundary.yaml +0 -0
  23. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/shared_bench.observation.yaml +0 -0
  24. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/shared_bench.plan.yaml +0 -0
  25. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/shared_bench.svg +0 -0
  26. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.boundary.yaml +0 -0
  27. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.observation.yaml +0 -0
  28. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.plan.yaml +0 -0
  29. {labcode-0.10.1 → labcode-0.10.2}/examples/outputs/sila2_plate_cycle.svg +0 -0
  30. {labcode-0.10.1 → labcode-0.10.2}/examples/plate_line.boundary.yaml +0 -0
  31. {labcode-0.10.1 → labcode-0.10.2}/examples/plate_line.env.yaml +0 -0
  32. {labcode-0.10.1 → labcode-0.10.2}/examples/plate_line.workflow.yaml +0 -0
  33. {labcode-0.10.1 → labcode-0.10.2}/examples/preflight_sila2_env.py +0 -0
  34. {labcode-0.10.1 → labcode-0.10.2}/examples/render_plate_line.py +0 -0
  35. {labcode-0.10.1 → labcode-0.10.2}/examples/render_shared_bench.py +0 -0
  36. {labcode-0.10.1 → labcode-0.10.2}/examples/render_sila2_plate_cycle.py +0 -0
  37. {labcode-0.10.1 → labcode-0.10.2}/examples/run_all_lads_examples.py +0 -0
  38. {labcode-0.10.1 → labcode-0.10.2}/examples/run_all_sila2_examples.py +0 -0
  39. {labcode-0.10.1 → labcode-0.10.2}/examples/run_sila2_plate_cycle.py +0 -0
  40. {labcode-0.10.1 → labcode-0.10.2}/examples/run_sila2_plate_cycle_no_atc.py +0 -0
  41. {labcode-0.10.1 → labcode-0.10.2}/examples/run_sila2_seal.py +0 -0
  42. {labcode-0.10.1 → labcode-0.10.2}/examples/shared_bench.afternoon.boundary.yaml +0 -0
  43. {labcode-0.10.1 → labcode-0.10.2}/examples/shared_bench.env.yaml +0 -0
  44. {labcode-0.10.1 → labcode-0.10.2}/examples/shared_bench.morning.boundary.yaml +0 -0
  45. {labcode-0.10.1 → labcode-0.10.2}/examples/shared_bench.run.yaml +0 -0
  46. {labcode-0.10.1 → labcode-0.10.2}/examples/shared_bench.workflow.yaml +0 -0
  47. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_plate_cycle.boundary.yaml +0 -0
  48. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_plate_cycle.workflow.yaml +0 -0
  49. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_plate_cycle.wrapped.env.yaml +0 -0
  50. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_plate_cycle_no_atc.boundary.yaml +0 -0
  51. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_plate_cycle_no_atc.workflow.yaml +0 -0
  52. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_plate_cycle_no_atc.wrapped.env.yaml +0 -0
  53. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_seal.boundary.yaml +0 -0
  54. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_seal.env.yaml +0 -0
  55. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_seal.workflow.yaml +0 -0
  56. {labcode-0.10.1 → labcode-0.10.2}/examples/sila2_seal.wrapped.env.yaml +0 -0
  57. {labcode-0.10.1 → labcode-0.10.2}/labcode/__init__.py +0 -0
  58. {labcode-0.10.1 → labcode-0.10.2}/labcode/__main__.py +0 -0
  59. {labcode-0.10.1 → labcode-0.10.2}/labcode/_child.py +0 -0
  60. {labcode-0.10.1 → labcode-0.10.2}/labcode/backend.py +0 -0
  61. {labcode-0.10.1 → labcode-0.10.2}/labcode/cli.py +0 -0
  62. {labcode-0.10.1 → labcode-0.10.2}/labcode/connections.py +0 -0
  63. {labcode-0.10.1 → labcode-0.10.2}/labcode/dialect.py +0 -0
  64. {labcode-0.10.1 → labcode-0.10.2}/labcode/extension.py +0 -0
  65. {labcode-0.10.1 → labcode-0.10.2}/labcode/idgen.py +0 -0
  66. {labcode-0.10.1 → labcode-0.10.2}/labcode/lads.py +0 -0
  67. {labcode-0.10.1 → labcode-0.10.2}/labcode/lads_commands.py +0 -0
  68. {labcode-0.10.1 → labcode-0.10.2}/labcode/lads_unit.py +0 -0
  69. {labcode-0.10.1 → labcode-0.10.2}/labcode/objectid.py +0 -0
  70. {labcode-0.10.1 → labcode-0.10.2}/labcode/otel.py +0 -0
  71. {labcode-0.10.1 → labcode-0.10.2}/labcode/otel_sila2.py +0 -0
  72. {labcode-0.10.1 → labcode-0.10.2}/labcode/probe.py +0 -0
  73. {labcode-0.10.1 → labcode-0.10.2}/labcode/py.typed +0 -0
  74. {labcode-0.10.1 → labcode-0.10.2}/labcode/record.py +0 -0
  75. {labcode-0.10.1 → labcode-0.10.2}/labcode/run_cli.py +0 -0
  76. {labcode-0.10.1 → labcode-0.10.2}/labcode/runner.py +0 -0
  77. {labcode-0.10.1 → labcode-0.10.2}/labcode/sila2.py +0 -0
  78. {labcode-0.10.1 → labcode-0.10.2}/labcode/sila2_commands.py +0 -0
  79. {labcode-0.10.1 → labcode-0.10.2}/labcode/sila2_instrument.py +0 -0
  80. {labcode-0.10.1 → labcode-0.10.2}/labcode.egg-info/SOURCES.txt +0 -0
  81. {labcode-0.10.1 → labcode-0.10.2}/labcode.egg-info/dependency_links.txt +0 -0
  82. {labcode-0.10.1 → labcode-0.10.2}/labcode.egg-info/entry_points.txt +0 -0
  83. {labcode-0.10.1 → labcode-0.10.2}/labcode.egg-info/scm_file_list.json +0 -0
  84. {labcode-0.10.1 → labcode-0.10.2}/labcode.egg-info/top_level.txt +0 -0
  85. {labcode-0.10.1 → labcode-0.10.2}/setup.cfg +0 -0
  86. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/device_script.env.yaml +0 -0
  87. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/device_script.workflow.yaml +0 -0
  88. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/dispense_read.workflow.yaml +0 -0
  89. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/joint.run.yaml +0 -0
  90. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/replenishment.env.yaml +0 -0
  91. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/reroute_device.env.yaml +0 -0
  92. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/reroute_transporter.env.yaml +0 -0
  93. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/transport.env.yaml +0 -0
  94. {labcode-0.10.1 → labcode-0.10.2}/tests/fixtures/transport.workflow.yaml +0 -0
  95. {labcode-0.10.1 → labcode-0.10.2}/tests/test_backend.py +0 -0
  96. {labcode-0.10.1 → labcode-0.10.2}/tests/test_cli.py +0 -0
  97. {labcode-0.10.1 → labcode-0.10.2}/tests/test_dialect.py +0 -0
  98. {labcode-0.10.1 → labcode-0.10.2}/tests/test_joint.py +0 -0
  99. {labcode-0.10.1 → labcode-0.10.2}/tests/test_lads.py +0 -0
  100. {labcode-0.10.1 → labcode-0.10.2}/tests/test_lads_unit.py +0 -0
  101. {labcode-0.10.1 → labcode-0.10.2}/tests/test_objectid.py +0 -0
  102. {labcode-0.10.1 → labcode-0.10.2}/tests/test_otel.py +0 -0
  103. {labcode-0.10.1 → labcode-0.10.2}/tests/test_otel_child.py +0 -0
  104. {labcode-0.10.1 → labcode-0.10.2}/tests/test_otel_grpc.py +0 -0
  105. {labcode-0.10.1 → labcode-0.10.2}/tests/test_otel_sila2.py +0 -0
  106. {labcode-0.10.1 → labcode-0.10.2}/tests/test_probe.py +0 -0
  107. {labcode-0.10.1 → labcode-0.10.2}/tests/test_record.py +0 -0
  108. {labcode-0.10.1 → labcode-0.10.2}/tests/test_recording.py +0 -0
  109. {labcode-0.10.1 → labcode-0.10.2}/tests/test_run_cli.py +0 -0
  110. {labcode-0.10.1 → labcode-0.10.2}/tests/test_sila2.py +0 -0
  111. {labcode-0.10.1 → labcode-0.10.2}/tests/test_sila2_commands.py +0 -0
  112. {labcode-0.10.1 → labcode-0.10.2}/tests/test_sila2_instrument.py +0 -0
  113. {labcode-0.10.1 → labcode-0.10.2}/tests/test_structured_labcode.py +0 -0
@@ -6,6 +6,29 @@ 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
+
9
32
  ## 0.10.1 — 2026-10-07
10
33
 
11
34
  labcode follows specification revision 0.5. No code changes; the siblings move.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: labcode
3
- Version: 0.10.1
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.5,>=0.4
24
- Requires-Dist: ofplang-schedule<0.14,>=0.13.1
25
- Requires-Dist: ofplang-run<0.14,>=0.13.1
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.1
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.5,>=0.4
24
- Requires-Dist: ofplang-schedule<0.14,>=0.13.1
25
- Requires-Dist: ofplang-run<0.14,>=0.13.1
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
- ofplang-validate<0.5,>=0.4
2
- ofplang-schedule<0.14,>=0.13.1
3
- ofplang-run<0.14,>=0.13.1
1
+ ofplang-validate<0.5,>=0.4.1
2
+ ofplang-schedule<0.15,>=0.14.1
3
+ ofplang-run<0.15,>=0.14.1
4
4
 
5
5
  [dev]
6
6
  pytest>=7.0
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.10.2",
3
+ "distance": 0,
4
+ "node": "g702546d47fa25fa78a8e2b3246f173db95c1ecf3",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-07"
8
+ }
@@ -62,8 +62,16 @@ 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-validate>=0.4`, `ofplang-schedule>=0.13.1` and `ofplang-run>=0.13.1` are
66
- # required together: they implement specification revision 0.5, and `lc` validates at its
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
67
75
  # front door with the one validate and plans and runs with the others, so the three have
68
76
  # to agree on what is valid. Under validate 0.3 a composite could leave an output
69
77
  # unreturned that the scheduler's reader now refuses, and a `scheduling` section passed
@@ -76,7 +84,7 @@ classifiers = [
76
84
  # labcode keys each plate's `_id` by its element. `RunResult.run_warnings`, which `lc run`
77
85
  # fills with what labcode defaulted, is new in run 0.13 too.
78
86
  #
79
- # 🔴 The schedule `<0.14` bound is a bound, not a floor: 0.10 refuses two jobs binding one
87
+ # 🔴 The schedule upper bound is a bound, not a floor: 0.10 refuses two jobs binding one
80
88
  # boundary spot where it used to warn, and 0.12 refuses a plan it can show has no
81
89
  # schedule before the solve instead of returning `unknown`. Both change what happens to
82
90
  # a document this package hands over rather than anything it calls.
@@ -95,9 +103,9 @@ dependencies = [
95
103
  # would pick up the next such sibling and start refusing its own examples. The
96
104
  # bounds cannot protect what is already on PyPI without one, which is why they go
97
105
  # in now rather than at the first breakage.
98
- "ofplang-validate>=0.4,<0.5",
99
- "ofplang-schedule>=0.13.1,<0.14",
100
- "ofplang-run>=0.13.1,<0.14",
106
+ "ofplang-validate>=0.4.1,<0.5",
107
+ "ofplang-schedule>=0.14.1,<0.15",
108
+ "ofplang-run>=0.14.1,<0.15",
101
109
  ]
102
110
 
103
111
  [project.urls]
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.10.1",
3
- "distance": 0,
4
- "node": "g1787216e03cd07ec2fe1ed38539ba7006be08494",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-06"
8
- }
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