labnotes 0.0.136__tar.gz → 0.0.137__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.
- {labnotes-0.0.136 → labnotes-0.0.137}/PKG-INFO +1 -1
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/context.md +7 -1
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_app.py +4 -2
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/serve_daemon.py +6 -2
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/socket_path.py +3 -1
- {labnotes-0.0.136 → labnotes-0.0.137}/.gitignore +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/CHANGELOG.md +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/MIGRATIONS.md +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/README.md +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/pyproject.toml +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/__init__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/__main__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/asset_url.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/check_counts.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/cli.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/compose_experiment.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/context_guide.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/count_groups.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/count_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/create_app.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/create_experiment.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/create_note.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/__init__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/control_run.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_client.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_running.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/daemon_server.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/describe_status.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/ensure_daemon.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/exit_when_idle.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/finalize_lost_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/last_stderr.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/remote_start.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/run_daemon.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/run_logs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/stop_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/watch_daemon.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon/watch_status.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/daemon_command.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/data_html.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/default_config_text.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/default_counts.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/drain_watch.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/experiment_notes.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/experiment_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/experiments.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/file_changes.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/format_duration.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/format_started.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/format_value.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/get_state.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/grid_cell.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/group_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/init.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/invocation_started.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/is_non_negative_int.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/is_non_negative_number.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/is_positive_int.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/list_experiments.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/list_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/load_config.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/load_experiment.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/load_run.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/log.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/log_path.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/memory_interval.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/models.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/modes.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/nests_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/note_path.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/notebook_kernel.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/output_html.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/parse_run_view.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/parse_subset.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/pivot_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/print_rows.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/python_blocks.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/read_config.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/read_path.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/render_markdown.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/retries.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_command.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_control.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_output.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/run_status.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/__init__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/cgroup_memory.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/check_args.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/check_subset.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/container_cgroup.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/container_memory.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/describe_event.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/docker_output.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/execute_run.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/exit_signal.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/fill_dirs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/fill_experiment_env.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/flag_name.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/hold_folder.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/hook_dirs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/in_subset.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/invocation_hook.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/invocation_meta.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/new_param_run_id.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/new_run_id.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/new_stamped_run_id.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/param_args.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/param_grid.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/param_run_name.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/plan_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/prepare_experiment.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/read_experiment_config.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/record_memory.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_experiment.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_folder.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_git.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/run_headless.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/runs_parent.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/shell_command.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/signal_tree.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/stop_then_kill.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/wait_for_tree.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runner/write_run_json.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/runs_view_command.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/save_conflict_copy.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/save_note.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/saved_outputs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/serve_app.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/server.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/set_state.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/shared_params.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/sort_href.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/sql_quote.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/state_path.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/elapsed.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/experiment.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/labnotes.css +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/local-time.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/new-note.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/note-edit.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/note-editor.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/row-link.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/run-cell.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/run-output.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/static/view-toggle.js +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/summarize_config.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/__init__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiment_rows.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiment_run_ids.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiment_toml.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/experiments_ddl.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/file_prefix.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/file_text.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/iso_time.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/list_experiment_runs.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/note_text.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/open_tables.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/path_glob.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/path_pattern.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_blocks.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_experiment.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_file.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_log.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_memory.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_run.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/read_run_file.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/runs_columns.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tables/summarize_experiments.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/base.html +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/editor_imports.html +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/experiment.html +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/index.html +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/note.html +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/templates/run.html +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/__init__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/browse_app.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/browse_tui.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/check_view_response.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/config.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/dim.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/experiment_screen.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/experiments_screen.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/fill_table.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/format_cell.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/format_elapsed.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/group_cells.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/invocation_columns.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/invocation_rows.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/leave_prompt.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/log_block.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/log_blocks.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/native_rows.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/reload_on_change.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_app.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_cells.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_output.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_screen.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/run_tui.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/runs_table.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/runs_view.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/stopped_title.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/view_column.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/tui/view_process.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/__init__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/format_bytes.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/process_alive.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/run_usage.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/tree_rss.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/utils/tree_usage.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/__init__.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/answer.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/build.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/respond.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/view/serve.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/wait_for_note.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/src/labnotes/watch_rows.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/testing-conventions.toml +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/tests/conftest.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/tests/e2e/conftest.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/tests/integration/conftest.py +0 -0
- {labnotes-0.0.136 → labnotes-0.0.137}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: labnotes
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.137
|
|
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>
|
|
@@ -207,6 +207,11 @@ going. Elsewhere, it prints a line per event instead.
|
|
|
207
207
|
`/tmp/labnotes-<uid>/` and exits once nothing is running and no client has
|
|
208
208
|
been connected for 15 seconds. Runs belong to the daemon, so quitting the
|
|
209
209
|
live view, closing its terminal, or killing `run` outright leaves them going.
|
|
210
|
+
- Each labnotes version starts its own daemon. After an upgrade, new runs go
|
|
211
|
+
to the new version's daemon while an older one finishes its runs and exits.
|
|
212
|
+
`run status`, `run stop` and `run control` reach only the daemon of the
|
|
213
|
+
version you call them with. Each `run` reads `.labnotes.toml` as it is on
|
|
214
|
+
disk, even when the daemon is already up.
|
|
210
215
|
- Ctrl-C stops the running scripts and records their end. A second Ctrl-C
|
|
211
216
|
kills them. SIGTERM stops them the same way, then kills any still going 5
|
|
212
217
|
seconds later. Once the runs are done, either one closes the live view.
|
|
@@ -220,7 +225,8 @@ going. Elsewhere, it prints a line per event instead.
|
|
|
220
225
|
- `labnotes run control NAME ACTION [ARG]` sends one live-view control to a
|
|
221
226
|
running experiment: `kill` a run, `set_concurrency` to a number,
|
|
222
227
|
`interrupt` or `finish`.
|
|
223
|
-
- A second `run` of the same experiment fails while the first is going
|
|
228
|
+
- A second `run` of the same experiment fails while the first is going on
|
|
229
|
+
the same daemon.
|
|
224
230
|
- It exits 0 even if runs fail; the summary line counts failures. A run that
|
|
225
231
|
was retried counts as retried, not failed. If it can't
|
|
226
232
|
start or reach the daemon, it prints the cause on one line and exits 1.
|
|
@@ -11,6 +11,7 @@ from starlette.responses import JSONResponse, Response, StreamingResponse
|
|
|
11
11
|
from starlette.routing import Route
|
|
12
12
|
|
|
13
13
|
from labnotes.models import Controls, LabnotesConfig
|
|
14
|
+
from labnotes.read_config import read_config
|
|
14
15
|
from labnotes.runner.prepare_experiment import prepare_experiment
|
|
15
16
|
from labnotes.runner.run_experiment import run_experiment
|
|
16
17
|
from labnotes.runner.stop_then_kill import GRACE_SECONDS
|
|
@@ -73,8 +74,9 @@ def daemon_app(config: LabnotesConfig) -> Starlette:
|
|
|
73
74
|
async def start(name: str, body: dict[str, object]) -> Response:
|
|
74
75
|
path = body.get("experiment_config")
|
|
75
76
|
try:
|
|
77
|
+
current = read_config(config.path)
|
|
76
78
|
experiment, concurrency = await prepare_experiment(
|
|
77
|
-
|
|
79
|
+
current,
|
|
78
80
|
name,
|
|
79
81
|
None if path is None else Path(str(path)),
|
|
80
82
|
body.get("concurrency"), # type: ignore[arg-type]
|
|
@@ -100,7 +102,7 @@ def daemon_app(config: LabnotesConfig) -> Starlette:
|
|
|
100
102
|
error = None
|
|
101
103
|
try:
|
|
102
104
|
await run_experiment(
|
|
103
|
-
|
|
105
|
+
current,
|
|
104
106
|
name,
|
|
105
107
|
experiment,
|
|
106
108
|
concurrency,
|
|
@@ -2,15 +2,19 @@ import asyncio
|
|
|
2
2
|
import contextlib
|
|
3
3
|
|
|
4
4
|
from labnotes.daemon.run_daemon import run_daemon
|
|
5
|
+
from labnotes.daemon.socket_path import socket_path
|
|
5
6
|
from labnotes.models import LabnotesConfig
|
|
6
7
|
from labnotes.runner.hold_folder import hold_folder
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
def serve_daemon(config: LabnotesConfig) -> None:
|
|
11
|
+
# Labnotes 0.0.136 and older lock the project folder itself.
|
|
12
|
+
path = socket_path(config.root).with_suffix(".lock")
|
|
13
|
+
path.touch()
|
|
10
14
|
lock = contextlib.ExitStack()
|
|
11
15
|
try:
|
|
12
|
-
lock.enter_context(hold_folder(
|
|
16
|
+
lock.enter_context(hold_folder(path))
|
|
13
17
|
except BlockingIOError:
|
|
14
|
-
return # Another daemon already serves this project.
|
|
18
|
+
return # Another daemon of this version already serves this project.
|
|
15
19
|
with lock:
|
|
16
20
|
asyncio.run(run_daemon(config))
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import hashlib
|
|
2
2
|
import os
|
|
3
|
+
from importlib.metadata import version
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
# Unix socket paths cap at 107 bytes, so the socket can't live in a deep project.
|
|
7
8
|
# A fixed folder, not XDG_RUNTIME_DIR or TMPDIR, so every shell finds the daemon.
|
|
9
|
+
# Each version gets its own daemon, so an upgrade never runs on an older one.
|
|
8
10
|
def socket_path(root: Path) -> Path:
|
|
9
11
|
folder = Path("/tmp") / f"labnotes-{os.getuid()}"
|
|
10
12
|
folder.mkdir(exist_ok=True)
|
|
11
13
|
folder.chmod(0o700)
|
|
12
14
|
digest = hashlib.sha256(str(root.resolve()).encode()).hexdigest()[:16]
|
|
13
|
-
return folder / f"{digest}.sock"
|
|
15
|
+
return folder / f"{digest}-{version('labnotes')}.sock"
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|