labnotes 0.0.90__tar.gz → 0.0.92__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 (160) hide show
  1. {labnotes-0.0.90 → labnotes-0.0.92}/PKG-INFO +1 -1
  2. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/experiment_screen.py +7 -1
  3. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/experiments_screen.py +5 -1
  4. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/reload_on_change.py +7 -2
  5. labnotes-0.0.92/src/labnotes/tui/stopped_title.py +3 -0
  6. {labnotes-0.0.90 → labnotes-0.0.92}/.gitignore +0 -0
  7. {labnotes-0.0.90 → labnotes-0.0.92}/CHANGELOG.md +0 -0
  8. {labnotes-0.0.90 → labnotes-0.0.92}/MIGRATIONS.md +0 -0
  9. {labnotes-0.0.90 → labnotes-0.0.92}/README.md +0 -0
  10. {labnotes-0.0.90 → labnotes-0.0.92}/pyproject.toml +0 -0
  11. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/__init__.py +0 -0
  12. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/__main__.py +0 -0
  13. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/asset_url.py +0 -0
  14. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/check_counts.py +0 -0
  15. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/cli.py +0 -0
  16. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/context.md +0 -0
  17. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/context_guide.py +0 -0
  18. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/count_groups.py +0 -0
  19. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/count_runs.py +0 -0
  20. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/create_app.py +0 -0
  21. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/create_experiment.py +0 -0
  22. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/create_note.py +0 -0
  23. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/__init__.py +0 -0
  24. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/control_run.py +0 -0
  25. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/daemon_app.py +0 -0
  26. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/daemon_client.py +0 -0
  27. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/daemon_running.py +0 -0
  28. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/daemon_server.py +0 -0
  29. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/describe_status.py +0 -0
  30. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/ensure_daemon.py +0 -0
  31. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/exit_when_idle.py +0 -0
  32. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/remote_start.py +0 -0
  33. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/run_daemon.py +0 -0
  34. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/run_logs.py +0 -0
  35. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/serve_daemon.py +0 -0
  36. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/socket_path.py +0 -0
  37. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/stop_runs.py +0 -0
  38. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/watch_daemon.py +0 -0
  39. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon/watch_status.py +0 -0
  40. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/daemon_command.py +0 -0
  41. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/data_html.py +0 -0
  42. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/default_config_text.py +0 -0
  43. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/default_counts.py +0 -0
  44. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/drain_watch.py +0 -0
  45. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/experiment_notes.py +0 -0
  46. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/experiment_runs.py +0 -0
  47. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/experiments.py +0 -0
  48. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/file_changes.py +0 -0
  49. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/format_duration.py +0 -0
  50. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/format_started.py +0 -0
  51. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/format_value.py +0 -0
  52. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/group_runs.py +0 -0
  53. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/init.py +0 -0
  54. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/invocation_started.py +0 -0
  55. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/is_positive_int.py +0 -0
  56. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/list_experiments.py +0 -0
  57. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/list_runs.py +0 -0
  58. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/load_config.py +0 -0
  59. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/load_experiment.py +0 -0
  60. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/load_run.py +0 -0
  61. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/models.py +0 -0
  62. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/modes.py +0 -0
  63. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/nests_runs.py +0 -0
  64. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/note_path.py +0 -0
  65. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/notebook_kernel.py +0 -0
  66. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/output_html.py +0 -0
  67. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/parse_run_view.py +0 -0
  68. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/print_rows.py +0 -0
  69. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/python_blocks.py +0 -0
  70. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/read_config.py +0 -0
  71. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/read_path.py +0 -0
  72. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/render_markdown.py +0 -0
  73. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/run_command.py +0 -0
  74. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/run_control.py +0 -0
  75. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/run_output.py +0 -0
  76. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/run_status.py +0 -0
  77. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/__init__.py +0 -0
  78. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/describe_event.py +0 -0
  79. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/execute_run.py +0 -0
  80. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/hold_folder.py +0 -0
  81. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/new_param_run_id.py +0 -0
  82. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/new_run_id.py +0 -0
  83. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/new_stamped_run_id.py +0 -0
  84. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/param_args.py +0 -0
  85. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/param_grid.py +0 -0
  86. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/param_run_name.py +0 -0
  87. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/plan_runs.py +0 -0
  88. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/prepare_experiment.py +0 -0
  89. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/read_experiment_config.py +0 -0
  90. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/run_experiment.py +0 -0
  91. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/run_folder.py +0 -0
  92. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/run_headless.py +0 -0
  93. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/runs_parent.py +0 -0
  94. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/shell_command.py +0 -0
  95. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/signal_tree.py +0 -0
  96. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/stop_then_kill.py +0 -0
  97. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/wait_for_tree.py +0 -0
  98. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/runner/write_run_json.py +0 -0
  99. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/save_conflict_copy.py +0 -0
  100. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/save_note.py +0 -0
  101. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/saved_outputs.py +0 -0
  102. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/serve_app.py +0 -0
  103. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/server.py +0 -0
  104. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/shared_params.py +0 -0
  105. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/sort_href.py +0 -0
  106. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/sql_quote.py +0 -0
  107. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/elapsed.js +0 -0
  108. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/experiment.js +0 -0
  109. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/labnotes.css +0 -0
  110. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/local-time.js +0 -0
  111. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/new-note.js +0 -0
  112. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/note-edit.js +0 -0
  113. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/note-editor.js +0 -0
  114. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/row-link.js +0 -0
  115. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/run-cell.js +0 -0
  116. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/run-output.js +0 -0
  117. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/static/view-toggle.js +0 -0
  118. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/summarize_config.py +0 -0
  119. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/__init__.py +0 -0
  120. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/experiment_rows.py +0 -0
  121. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/experiment_run_ids.py +0 -0
  122. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/file_prefix.py +0 -0
  123. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/file_text.py +0 -0
  124. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/iso_time.py +0 -0
  125. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/list_experiment_runs.py +0 -0
  126. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/note_text.py +0 -0
  127. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/open_tables.py +0 -0
  128. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/path_glob.py +0 -0
  129. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/path_pattern.py +0 -0
  130. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/read_experiment.py +0 -0
  131. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/read_file.py +0 -0
  132. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/read_log.py +0 -0
  133. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/read_run.py +0 -0
  134. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tables/summarize_experiments.py +0 -0
  135. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/templates/base.html +0 -0
  136. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/templates/editor_imports.html +0 -0
  137. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/templates/experiment.html +0 -0
  138. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/templates/index.html +0 -0
  139. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/templates/note.html +0 -0
  140. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/templates/run.html +0 -0
  141. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/__init__.py +0 -0
  142. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/browse_app.py +0 -0
  143. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/browse_tui.py +0 -0
  144. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/dim.py +0 -0
  145. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/fill_table.py +0 -0
  146. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/format_elapsed.py +0 -0
  147. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/group_cells.py +0 -0
  148. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/invocation_columns.py +0 -0
  149. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/invocation_rows.py +0 -0
  150. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/run_app.py +0 -0
  151. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/run_cells.py +0 -0
  152. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/run_output.py +0 -0
  153. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/run_screen.py +0 -0
  154. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/run_tui.py +0 -0
  155. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/tui/runs_table.py +0 -0
  156. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/wait_for_note.py +0 -0
  157. {labnotes-0.0.90 → labnotes-0.0.92}/src/labnotes/watch_rows.py +0 -0
  158. {labnotes-0.0.90 → labnotes-0.0.92}/testing-conventions.toml +0 -0
  159. {labnotes-0.0.90 → labnotes-0.0.92}/tests/integration/conftest.py +0 -0
  160. {labnotes-0.0.90 → labnotes-0.0.92}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: labnotes
3
- Version: 0.0.90
3
+ Version: 0.0.92
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>
@@ -16,6 +16,7 @@ from labnotes.tui.invocation_rows import invocation_rows
16
16
  from labnotes.tui.reload_on_change import reload_on_change
17
17
  from labnotes.tui.run_screen import RunScreen
18
18
  from labnotes.tui.runs_table import RunsTable
19
+ from labnotes.tui.stopped_title import stopped_title
19
20
  from labnotes.watch_rows import watch_rows
20
21
 
21
22
  WATCHED = {"runs", "experiment_configs"}
@@ -44,7 +45,9 @@ class ExperimentScreen(Screen[None]):
44
45
  self.sub_title = self.experiment_name
45
46
  self.run_worker(
46
47
  reload_on_change(
47
- watch_rows(self.tables, WATCHED, self.experiment_name), self.load
48
+ watch_rows(self.tables, WATCHED, self.experiment_name),
49
+ self.load,
50
+ self.stopped,
48
51
  ),
49
52
  exit_on_error=False,
50
53
  )
@@ -53,6 +56,9 @@ class ExperimentScreen(Screen[None]):
53
56
  if event.state == WorkerState.ERROR:
54
57
  self.app.exit(event.worker.error)
55
58
 
59
+ def stopped(self, error: BaseException | None) -> None:
60
+ self.sub_title = stopped_title(self.sub_title, error)
61
+
56
62
  async def load(self) -> None:
57
63
  loaded = await load_experiment(
58
64
  self.tables,
@@ -10,6 +10,7 @@ from labnotes.tui.experiment_screen import ExperimentScreen
10
10
  from labnotes.tui.fill_table import fill_table
11
11
  from labnotes.tui.reload_on_change import reload_on_change
12
12
  from labnotes.tui.runs_table import RunsTable
13
+ from labnotes.tui.stopped_title import stopped_title
13
14
  from labnotes.watch_rows import watch_rows
14
15
 
15
16
  WATCHED = {"files", "runs", "experiment_configs"}
@@ -28,7 +29,7 @@ class ExperimentsScreen(Screen[None]):
28
29
 
29
30
  def on_mount(self) -> None:
30
31
  self.run_worker(
31
- reload_on_change(watch_rows(self.tables, WATCHED), self.load),
32
+ reload_on_change(watch_rows(self.tables, WATCHED), self.load, self.stopped),
32
33
  exit_on_error=False,
33
34
  )
34
35
 
@@ -36,6 +37,9 @@ class ExperimentsScreen(Screen[None]):
36
37
  if event.state == WorkerState.ERROR:
37
38
  self.app.exit(event.worker.error)
38
39
 
40
+ def stopped(self, error: BaseException | None) -> None:
41
+ self.sub_title = stopped_title(self.sub_title, error)
42
+
39
43
  async def load(self) -> None:
40
44
  rows = await summarize_experiments(self.tables)
41
45
  self.sub_title = "" if rows else "No experiments."
@@ -3,7 +3,9 @@ from collections.abc import AsyncIterable, Awaitable, Callable
3
3
 
4
4
 
5
5
  async def reload_on_change(
6
- changes: AsyncIterable[object], reload: Callable[[], Awaitable[None]]
6
+ changes: AsyncIterable[object],
7
+ reload: Callable[[], Awaitable[None]],
8
+ stopped: Callable[[BaseException | None], None],
7
9
  ) -> None:
8
10
  # Changes that land during a reload collapse into one more reload.
9
11
  stale = asyncio.Event()
@@ -13,10 +15,13 @@ async def reload_on_change(
13
15
  stale.set()
14
16
 
15
17
  marker = asyncio.create_task(mark())
18
+ marker.add_done_callback(lambda _: stale.set())
16
19
  try:
17
- while True:
20
+ while not marker.done():
18
21
  await reload()
19
22
  await stale.wait()
20
23
  stale.clear()
24
+ await reload()
25
+ stopped(marker.exception())
21
26
  finally:
22
27
  marker.cancel()
@@ -0,0 +1,3 @@
1
+ def stopped_title(title: str | None, error: BaseException | None) -> str:
2
+ reason = f"Live updates stopped: {error}" if error else "Live updates stopped."
3
+ return f"{title} · {reason}" if title else reason
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes