labnotes 0.0.82__tar.gz → 0.0.83__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 (147) hide show
  1. {labnotes-0.0.82 → labnotes-0.0.83}/PKG-INFO +1 -1
  2. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/context.md +2 -2
  3. labnotes-0.0.83/src/labnotes/modes.py +2 -0
  4. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/read_config.py +1 -1
  5. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/read_experiment_config.py +1 -1
  6. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/run_experiment.py +1 -1
  7. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/summarize_config.py +2 -2
  8. {labnotes-0.0.82 → labnotes-0.0.83}/testing-conventions.toml +2 -2
  9. {labnotes-0.0.82 → labnotes-0.0.83}/tests/integration/conftest.py +1 -1
  10. labnotes-0.0.82/src/labnotes/modes.py +0 -2
  11. {labnotes-0.0.82 → labnotes-0.0.83}/.gitignore +0 -0
  12. {labnotes-0.0.82 → labnotes-0.0.83}/CHANGELOG.md +0 -0
  13. {labnotes-0.0.82 → labnotes-0.0.83}/MIGRATIONS.md +0 -0
  14. {labnotes-0.0.82 → labnotes-0.0.83}/README.md +0 -0
  15. {labnotes-0.0.82 → labnotes-0.0.83}/pyproject.toml +0 -0
  16. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/__init__.py +0 -0
  17. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/__main__.py +0 -0
  18. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/asset_url.py +0 -0
  19. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/check_counts.py +0 -0
  20. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/cli.py +0 -0
  21. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/context_guide.py +0 -0
  22. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/count_groups.py +0 -0
  23. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/count_runs.py +0 -0
  24. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/create_app.py +0 -0
  25. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/create_experiment.py +0 -0
  26. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/create_note.py +0 -0
  27. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/__init__.py +0 -0
  28. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/control_run.py +0 -0
  29. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/daemon_app.py +0 -0
  30. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/daemon_client.py +0 -0
  31. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/daemon_running.py +0 -0
  32. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/daemon_server.py +0 -0
  33. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/describe_status.py +0 -0
  34. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/ensure_daemon.py +0 -0
  35. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/exit_when_idle.py +0 -0
  36. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/remote_start.py +0 -0
  37. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/run_daemon.py +0 -0
  38. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/run_logs.py +0 -0
  39. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/serve_daemon.py +0 -0
  40. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/socket_path.py +0 -0
  41. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/stop_runs.py +0 -0
  42. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/watch_daemon.py +0 -0
  43. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon/watch_status.py +0 -0
  44. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/daemon_command.py +0 -0
  45. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/data_html.py +0 -0
  46. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/default_config_text.py +0 -0
  47. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/default_counts.py +0 -0
  48. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/drain_watch.py +0 -0
  49. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/experiment_notes.py +0 -0
  50. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/experiment_runs.py +0 -0
  51. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/experiments.py +0 -0
  52. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/file_changes.py +0 -0
  53. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/format_duration.py +0 -0
  54. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/format_started.py +0 -0
  55. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/format_value.py +0 -0
  56. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/group_runs.py +0 -0
  57. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/init.py +0 -0
  58. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/invocation_started.py +0 -0
  59. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/is_positive_int.py +0 -0
  60. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/list_experiments.py +0 -0
  61. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/list_runs.py +0 -0
  62. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/load_config.py +0 -0
  63. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/load_experiment.py +0 -0
  64. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/load_run.py +0 -0
  65. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/models.py +0 -0
  66. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/nests_runs.py +0 -0
  67. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/note_path.py +0 -0
  68. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/notebook_kernel.py +0 -0
  69. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/output_html.py +0 -0
  70. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/parse_run_view.py +0 -0
  71. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/print_rows.py +0 -0
  72. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/python_blocks.py +0 -0
  73. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/read_path.py +0 -0
  74. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/render_markdown.py +0 -0
  75. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/run_command.py +0 -0
  76. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/run_control.py +0 -0
  77. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/run_output.py +0 -0
  78. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/run_status.py +0 -0
  79. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/__init__.py +0 -0
  80. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/describe_event.py +0 -0
  81. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/execute_run.py +0 -0
  82. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/hold_folder.py +0 -0
  83. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/new_param_run_id.py +0 -0
  84. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/new_run_id.py +0 -0
  85. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/new_stamped_run_id.py +0 -0
  86. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/param_args.py +0 -0
  87. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/param_grid.py +0 -0
  88. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/param_run_name.py +0 -0
  89. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/plan_runs.py +0 -0
  90. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/prepare_experiment.py +0 -0
  91. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/run_folder.py +0 -0
  92. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/run_headless.py +0 -0
  93. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/runs_parent.py +0 -0
  94. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/shell_command.py +0 -0
  95. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/signal_tree.py +0 -0
  96. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/stop_then_kill.py +0 -0
  97. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/wait_for_tree.py +0 -0
  98. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/runner/write_run_json.py +0 -0
  99. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/save_conflict_copy.py +0 -0
  100. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/save_note.py +0 -0
  101. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/saved_outputs.py +0 -0
  102. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/serve_app.py +0 -0
  103. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/server.py +0 -0
  104. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/shared_params.py +0 -0
  105. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/sort_href.py +0 -0
  106. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/sql_quote.py +0 -0
  107. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/elapsed.js +0 -0
  108. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/experiment.js +0 -0
  109. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/labnotes.css +0 -0
  110. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/local-time.js +0 -0
  111. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/new-note.js +0 -0
  112. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/note-edit.js +0 -0
  113. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/note-editor.js +0 -0
  114. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/row-link.js +0 -0
  115. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/run-cell.js +0 -0
  116. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/run-output.js +0 -0
  117. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/static/view-toggle.js +0 -0
  118. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/__init__.py +0 -0
  119. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/experiment_rows.py +0 -0
  120. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/experiment_run_ids.py +0 -0
  121. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/file_prefix.py +0 -0
  122. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/file_text.py +0 -0
  123. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/iso_time.py +0 -0
  124. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/list_experiment_runs.py +0 -0
  125. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/note_text.py +0 -0
  126. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/open_tables.py +0 -0
  127. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/path_glob.py +0 -0
  128. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/path_pattern.py +0 -0
  129. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/read_experiment.py +0 -0
  130. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/read_file.py +0 -0
  131. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/read_log.py +0 -0
  132. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/read_run.py +0 -0
  133. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tables/summarize_experiments.py +0 -0
  134. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/templates/base.html +0 -0
  135. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/templates/editor_imports.html +0 -0
  136. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/templates/experiment.html +0 -0
  137. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/templates/index.html +0 -0
  138. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/templates/note.html +0 -0
  139. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/templates/run.html +0 -0
  140. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tui/__init__.py +0 -0
  141. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tui/dim.py +0 -0
  142. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tui/format_elapsed.py +0 -0
  143. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tui/run_app.py +0 -0
  144. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tui/run_tui.py +0 -0
  145. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/tui/runs_table.py +0 -0
  146. {labnotes-0.0.82 → labnotes-0.0.83}/src/labnotes/wait_for_note.py +0 -0
  147. {labnotes-0.0.82 → labnotes-0.0.83}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: labnotes
3
- Version: 0.0.82
3
+ Version: 0.0.83
4
4
  Summary: Browse experiment designs, notes, and run data from a folder.
5
5
  Project-URL: Repository, https://github.com/thekevinscott/labnotes
6
6
  Author-email: Kevin Scott <me@thekevinscott.com>
@@ -58,11 +58,11 @@ and as `display_name` in `experiments`. The folder name stays the key, so
58
58
  renaming the experiment means editing `name`.
59
59
  Each combination of `[params]` runs `repeats` times (1 if omitted), round-robin, on every
60
60
  `run`, whatever is already on disk. That is `mode = "adhoc"`, the default.
61
- `mode = "fill"` counts what is there: only runs that count fill a combination,
61
+ `mode = "matrix"` counts what is there: only runs that count fill a combination,
62
62
  so running again fills in what failed or never ran. `mode` under
63
63
  `[experiments]` in `.labnotes.toml` sets it for every experiment that doesn't
64
64
  set its own.
65
- Each run gets a new run folder. In `fill` mode it is named for the UTC time it was planned
65
+ Each run gets a new run folder. In `matrix` mode it is named for the UTC time it was planned
66
66
  (`runs/20261020-000429-brave-fox`). In `adhoc` mode a `run` command that plans one run names
67
67
  its folder the same way. One that plans more gets one folder named that way, and its runs nest
68
68
  inside it (`runs/20261020-000429-brave-fox/quiet-river`); the run id is that path under `runs/`. Either way, folder listings sort by start. `command` runs in a shell from the root, with
@@ -0,0 +1,2 @@
1
+ MODES = ("matrix", "adhoc")
2
+ DEFAULT_MODE = "adhoc"
@@ -24,7 +24,7 @@ def read_config(path: Path) -> LabnotesConfig:
24
24
  experiments = values.get("experiments", {})
25
25
  mode = experiments.get("mode", DEFAULT_MODE)
26
26
  if mode not in MODES:
27
- raise ValueError(f"{path}: [experiments] mode must be fill or adhoc")
27
+ raise ValueError(f"{path}: [experiments] mode must be matrix or adhoc")
28
28
  concurrency = experiments.get("concurrency", 1)
29
29
  if not is_positive_int(concurrency):
30
30
  raise ValueError(
@@ -44,7 +44,7 @@ def read_experiment_config(
44
44
  raise ValueError(f"{path}: counts must be a SQL condition")
45
45
  mode = values.get("mode", mode)
46
46
  if mode not in MODES:
47
- raise ValueError(f"{path}: mode must be fill or adhoc")
47
+ raise ValueError(f"{path}: mode must be matrix or adhoc")
48
48
  concurrency = values.get("concurrency", concurrency)
49
49
  if not is_positive_int(concurrency):
50
50
  raise ValueError(f"{path}: concurrency must be a positive integer")
@@ -37,7 +37,7 @@ async def run_experiment(
37
37
  existing = await experiment_run_ids(tables, name)
38
38
  finished: list[dict[str, object]] = []
39
39
  match experiment.mode:
40
- case "fill":
40
+ case "matrix":
41
41
  counted = await list_experiment_runs(tables, name, experiment.counts)
42
42
  finished = [json.loads(str(r["params"])) for r in counted if r["counted"]]
43
43
  planned: set[str] = set()
@@ -15,13 +15,13 @@ def summarize_config(config: dict[str, object] | None, mode: str) -> dict[str, o
15
15
  cells = prod(len(values) for values in varies.values())
16
16
  command = config.get("command")
17
17
  counts = config.get("counts")
18
- fill = config.get("mode", mode) == "fill"
18
+ matrix = config.get("mode", mode) == "matrix"
19
19
  return {
20
20
  "fixed": {},
21
21
  "varies": varies,
22
22
  "cell_count": cells,
23
23
  "runs_per_cell": repeats,
24
24
  "completed_run": counts if isinstance(counts, str) else DEFAULT_COUNTS,
25
- "mode": "fill" if fill else "adhoc",
25
+ "mode": "matrix" if matrix else "adhoc",
26
26
  "other": {} if command is None else {"command": command},
27
27
  }
@@ -14,13 +14,13 @@ reason = "last_stream is always the same str object taken from STREAMS, so is no
14
14
  path = "src/labnotes/runner/run_experiment.py"
15
15
  rules = ["mutation"]
16
16
  lines = [47]
17
- reason = "mode is validated to fill or adhoc; \"fill\" <= \"adhoc\" is false like ==, and both are interned literals so is equals =="
17
+ reason = "mode is validated to matrix or adhoc; \"matrix\" <= \"adhoc\" is false like ==, and both are interned literals so is equals =="
18
18
 
19
19
  [[python.exempt]]
20
20
  path = "src/labnotes/load_experiment.py"
21
21
  rules = ["mutation"]
22
22
  lines = [59]
23
- reason = "summarize_config returns mode fill or adhoc; \"fill\" <= \"adhoc\" is false like ==, and both are interned literals so is equals =="
23
+ reason = "summarize_config returns mode matrix or adhoc; \"matrix\" <= \"adhoc\" is false like ==, and both are interned literals so is equals =="
24
24
 
25
25
  [[python.exempt]]
26
26
  path = "src/labnotes/daemon/exit_when_idle.py"
@@ -13,7 +13,7 @@ from playwright.async_api import Page, async_playwright
13
13
  from labnotes.daemon.socket_path import socket_path
14
14
 
15
15
  CONFIG = (
16
- 'name = "Alpha study"\ncommand = "go"\nrepeats = 2\nmode = "fill"\n'
16
+ 'name = "Alpha study"\ncommand = "go"\nrepeats = 2\nmode = "matrix"\n'
17
17
  '[params]\nsource-language = ["en", "fr"]\n'
18
18
  )
19
19
 
@@ -1,2 +0,0 @@
1
- MODES = ("fill", "adhoc")
2
- DEFAULT_MODE = "adhoc"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes