labnotes 0.2.23__tar.gz → 0.2.25__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.2.23 → labnotes-0.2.25}/PKG-INFO +1 -1
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/server.py +1 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiments.py +14 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/models.py +3 -1
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/read_config.py +6 -1
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/read_path.py +1 -1
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/prepare_experiment.py +4 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/read_experiment_config.py +7 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_experiment.py +2 -3
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/start_experiment.py +2 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/note-edit.js +1 -1
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/run-output.js +1 -1
- labnotes-0.2.25/src/labnotes/static/vendor/THIRD_PARTY_NOTICES +648 -0
- labnotes-0.2.25/src/labnotes/static/vendor/ansi_up.js +433 -0
- labnotes-0.2.25/src/labnotes/static/vendor/atomic-editor-editor-inline-preview.js +810 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-3VL5A6CI.js +78 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-DDFT2RE5.js +111 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-GRK3PUFM.js +1796 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-HETKD2IB.js +2066 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-JSBRDJBE.js +30 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-KGFOUVBD.js +761 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-LAFDP4SS.js +2002 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-LFGFNL4F.js +2242 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-LRGARZ6Y.js +349 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-LZVVMIXK.js +10907 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-SVHN5VMN.js +139 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-YFJJZMCS.js +3447 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-YONOI2RA.js +174 -0
- labnotes-0.2.25/src/labnotes/static/vendor/chunk-ZO3BUX3P.js +32 -0
- labnotes-0.2.25/src/labnotes/static/vendor/codemirror-autocomplete.js +75 -0
- labnotes-0.2.25/src/labnotes/static/vendor/codemirror-commands.js +1460 -0
- labnotes-0.2.25/src/labnotes/static/vendor/codemirror-lang-python.js +457 -0
- labnotes-0.2.25/src/labnotes/static/vendor/codemirror-language.js +123 -0
- labnotes-0.2.25/src/labnotes/static/vendor/codemirror-state.js +64 -0
- labnotes-0.2.25/src/labnotes/static/vendor/codemirror-streamparser.js +7 -0
- labnotes-0.2.25/src/labnotes/static/vendor/codemirror-view.js +112 -0
- labnotes-0.2.25/src/labnotes/static/vendor/crelt.js +7 -0
- labnotes-0.2.25/src/labnotes/static/vendor/diff-match-patch.js +1475 -0
- labnotes-0.2.25/src/labnotes/static/vendor/lezer-common.js +31 -0
- labnotes-0.2.25/src/labnotes/static/vendor/lezer-highlight.js +22 -0
- labnotes-0.2.25/src/labnotes/static/vendor/lezer-lr.js +18 -0
- labnotes-0.2.25/src/labnotes/static/vendor/lezer-markdown.js +2121 -0
- labnotes-0.2.25/src/labnotes/static/vendor/lezer-python.js +10 -0
- labnotes-0.2.25/src/labnotes/static/vendor/marijn-find-cluster-break.js +9 -0
- labnotes-0.2.25/src/labnotes/static/vendor/style-mod.js +7 -0
- labnotes-0.2.25/src/labnotes/static/vendor/w3c-keyname.js +11 -0
- labnotes-0.2.25/src/labnotes/templates/editor_imports.html +25 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/tests/integration/conftest.py +32 -2
- labnotes-0.2.23/src/labnotes/templates/editor_imports.html +0 -25
- {labnotes-0.2.23 → labnotes-0.2.25}/.gitignore +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/CHANGELOG.md +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/MIGRATIONS.md +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/README.md +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/conftest.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/pyproject.toml +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/__init__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/__main__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/asset_url.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/check_counts.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/cli.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/command_line_group.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/compose_experiment.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/config_migration.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/context.md +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/context_guide.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/copy_experiment.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/count_groups.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/count_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/create_app.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/create_experiment.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/create_note.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/__init__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/client.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/command.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/ensure.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/marker.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon/socket_path.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/daemon_command.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/data_html.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/default_config_text.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/default_counts.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/drain_watch.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiment_definition.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiment_notes.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/experiment_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/file_changes.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/format_duration.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/format_started.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/format_value.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/get_state.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/grid_cell.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/group_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/init.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/invocation_started.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/is_non_negative_int.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/is_non_negative_number.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/is_positive_int.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/latest_log.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/list_experiments.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/list_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/load_config.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/load_experiment.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/load_run.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/log.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/log_path.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/memory_interval.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/nests_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/note_path.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/notebook_kernel.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/output_html.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/param_names.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_param_value.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_params.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_run_view.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/parse_subset.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/pivot_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/print_rows.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/python_blocks.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/render_markdown.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/retries.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/run_columns.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/run_output.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/__init__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/cgroup_memory.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/check_args.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/check_hook_placeholders.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/check_subset.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/claim_run.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/command_flags.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/container_cgroup.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/container_memory.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/continue_run.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/describe_event.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/docker_output.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/execute_run.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/exit_signal.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/fill_dirs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/fill_experiment_env.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/finalize_lost_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/first_invocation.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/flag_name.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/group_args.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/hold_experiment.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/in_subset.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/invocation_hook.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/invocation_meta.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/new_run_id.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/new_stamped_run_id.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/override_flags.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/param_args.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/param_grid.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/placeholders.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/plan_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/project_snapshot.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/record_memory.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_folder.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_git.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_headless.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_locked.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/run_state.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/runs_parent.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/shell_command.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/signal_tree.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/stop_then_kill.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/untracked_diff.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/wait_for_tree.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runner/write_run_json.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/runs_view_command.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/save_conflict_copy.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/save_note.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/saved_outputs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/serve_app.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/server.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/set_state.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/shared_params.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/sort_href.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/sql_quote.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/state_path.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/elapsed.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/experiment.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/labnotes.css +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/local-time.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/new-note.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/note-editor.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/row-link.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/run-cell.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/static/view-toggle.js +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/summarize_config.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/__init__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiment_rows.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiment_run_ids.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiment_toml.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/experiments_ddl.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/file_prefix.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/file_text.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/iso_time.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/list_experiment_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/list_resumable_runs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/note_text.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/open_tables.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/path_glob.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/path_pattern.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_blocks.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_experiment.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_file.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_log.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_memory.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_run.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/read_run_file.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/runs_columns.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tables/summarize_experiments.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/base.html +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/experiment.html +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/index.html +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/note.html +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/templates/run.html +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/__init__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/browse_app.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/browse_tui.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/check_view_response.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/config.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/dim.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/experiment_screen.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/experiments_screen.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/fill_table.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/format_cell.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/format_elapsed.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/guard_view.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/leave_prompt.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/load_view.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/log_block.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/log_blocks.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/native_rows.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/reload_on_change.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_app.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_cells.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_output.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_panel.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/run_tui.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/runs_browser.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/runs_table.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/runs_view.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/stopped_title.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/table_columns.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/table_rows.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_column.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_pane.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_process.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/tui/view_switcher.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/__init__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/format_bytes.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/process_alive.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/run_usage.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/tree_rss.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/utils/tree_usage.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/__init__.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/answer.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/build.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/changed.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/experiment.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/respond.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view/serve.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/view_specs.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/wait_for_note.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/src/labnotes/watch_rows.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/testing-conventions.toml +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/tests/conftest.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/tests/e2e/conftest.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/tests/perf/conftest.py +0 -0
- {labnotes-0.2.23 → labnotes-0.2.25}/uv.lock +0 -0
|
@@ -62,6 +62,7 @@ class ExperimentDaemon:
|
|
|
62
62
|
cast(str | None, options.get("command_line")),
|
|
63
63
|
cast(str | None, options.get("run_id")),
|
|
64
64
|
cast(int | None, options.get("retries")),
|
|
65
|
+
cast(float | None, options.get("retry_wait")),
|
|
65
66
|
bool(options.get("replace_capped")),
|
|
66
67
|
)
|
|
67
68
|
path = str(selected.run_state.path)
|
|
@@ -71,6 +71,14 @@ class PassthroughCommand(click.Command):
|
|
|
71
71
|
" with continues, by a later run. Overrides experiment.toml and"
|
|
72
72
|
" .labnotes.toml; 3 if none sets it.",
|
|
73
73
|
)
|
|
74
|
+
@click.option(
|
|
75
|
+
"--retry-wait",
|
|
76
|
+
type=click.FloatRange(min=0),
|
|
77
|
+
metavar="SECONDS",
|
|
78
|
+
help="With run: seconds before the first retry of an exit 75; each later"
|
|
79
|
+
" retry waits twice as long. Overrides experiment.toml and .labnotes.toml;"
|
|
80
|
+
" 30 if none sets it.",
|
|
81
|
+
)
|
|
74
82
|
@click.option(
|
|
75
83
|
"--replace-capped",
|
|
76
84
|
is_flag=True,
|
|
@@ -141,6 +149,7 @@ def experiments(
|
|
|
141
149
|
concurrency: int | None,
|
|
142
150
|
run_id: str | None,
|
|
143
151
|
retries: int | None,
|
|
152
|
+
retry_wait: float | None,
|
|
144
153
|
replace_capped: bool,
|
|
145
154
|
headless: bool,
|
|
146
155
|
experiment_config: Path | None,
|
|
@@ -210,6 +219,7 @@ def experiments(
|
|
|
210
219
|
"command_line": ctx.meta.get(COMMAND_LINE),
|
|
211
220
|
"run_id": run_id,
|
|
212
221
|
"retries": retries,
|
|
222
|
+
"retry_wait": retry_wait,
|
|
213
223
|
"replace_capped": replace_capped,
|
|
214
224
|
},
|
|
215
225
|
},
|
|
@@ -241,6 +251,7 @@ def experiments(
|
|
|
241
251
|
ctx.meta.get(COMMAND_LINE),
|
|
242
252
|
run_id,
|
|
243
253
|
retries,
|
|
254
|
+
retry_wait,
|
|
244
255
|
replace_capped,
|
|
245
256
|
)
|
|
246
257
|
)
|
|
@@ -262,6 +273,7 @@ def experiments(
|
|
|
262
273
|
or concurrency is not None
|
|
263
274
|
or run_id is not None
|
|
264
275
|
or retries is not None
|
|
276
|
+
or retry_wait is not None
|
|
265
277
|
or replace_capped
|
|
266
278
|
or experiment_config is not None
|
|
267
279
|
or timeout is not None
|
|
@@ -287,6 +299,8 @@ def experiments(
|
|
|
287
299
|
raise click.UsageError("--run-id needs run.")
|
|
288
300
|
if retries is not None:
|
|
289
301
|
raise click.UsageError("--retries needs run.")
|
|
302
|
+
if retry_wait is not None:
|
|
303
|
+
raise click.UsageError("--retry-wait needs run.")
|
|
290
304
|
if replace_capped:
|
|
291
305
|
raise click.UsageError("--replace-capped needs run.")
|
|
292
306
|
if ctx.args:
|
|
@@ -5,7 +5,7 @@ from typing import Any, Protocol
|
|
|
5
5
|
|
|
6
6
|
from labnotes.default_counts import DEFAULT_COUNTS
|
|
7
7
|
from labnotes.memory_interval import DEFAULT_MEMORY_INTERVAL
|
|
8
|
-
from labnotes.retries import DEFAULT_RETRIES
|
|
8
|
+
from labnotes.retries import DEFAULT_RETRIES, RETRY_SECONDS
|
|
9
9
|
|
|
10
10
|
Report = Callable[[dict[str, object]], None]
|
|
11
11
|
|
|
@@ -44,6 +44,7 @@ class LabnotesConfig:
|
|
|
44
44
|
runs: str
|
|
45
45
|
concurrency: int = 1
|
|
46
46
|
retries: int = DEFAULT_RETRIES
|
|
47
|
+
retry_wait: float = RETRY_SECONDS
|
|
47
48
|
# Set when the config's folder is itself the one experiment.
|
|
48
49
|
experiment: str | None = None
|
|
49
50
|
# [experiment] in .labnotes.toml, under each experiment.toml.
|
|
@@ -59,6 +60,7 @@ class ExperimentConfig:
|
|
|
59
60
|
counts: str = DEFAULT_COUNTS
|
|
60
61
|
concurrency: int = 1
|
|
61
62
|
retries: int = DEFAULT_RETRIES
|
|
63
|
+
retry_wait: float = RETRY_SECONDS
|
|
62
64
|
meta: str | None = None
|
|
63
65
|
memory_interval: float = DEFAULT_MEMORY_INTERVAL
|
|
64
66
|
setup: str | None = None
|
|
@@ -3,11 +3,12 @@ from pathlib import Path
|
|
|
3
3
|
|
|
4
4
|
from labnotes.models import LabnotesConfig
|
|
5
5
|
from labnotes.is_non_negative_int import is_non_negative_int
|
|
6
|
+
from labnotes.is_non_negative_number import is_non_negative_number
|
|
6
7
|
from labnotes.is_positive_int import is_positive_int
|
|
7
8
|
from labnotes.config_migration import REMOVED_MODE
|
|
8
9
|
from labnotes.runner.read_experiment_config import SETTINGS
|
|
9
10
|
from labnotes.read_path import DEFAULT_PATHS, read_path
|
|
10
|
-
from labnotes.retries import DEFAULT_RETRIES
|
|
11
|
+
from labnotes.retries import DEFAULT_RETRIES, RETRY_SECONDS
|
|
11
12
|
|
|
12
13
|
CONFIG_FILE = ".labnotes.toml"
|
|
13
14
|
|
|
@@ -51,12 +52,16 @@ def read_config(path: Path) -> LabnotesConfig:
|
|
|
51
52
|
retries = experiments.get("retries", DEFAULT_RETRIES)
|
|
52
53
|
if not is_non_negative_int(retries):
|
|
53
54
|
raise ValueError(f"{path}: [experiments] retries must be 0 or more")
|
|
55
|
+
retry_wait = experiments.get("retry_wait", RETRY_SECONDS)
|
|
56
|
+
if not is_non_negative_number(retry_wait):
|
|
57
|
+
raise ValueError(f"{path}: [experiments] retry_wait must be 0 or more seconds")
|
|
54
58
|
return LabnotesConfig(
|
|
55
59
|
path.resolve(),
|
|
56
60
|
root,
|
|
57
61
|
**paths,
|
|
58
62
|
concurrency=concurrency,
|
|
59
63
|
retries=retries,
|
|
64
|
+
retry_wait=retry_wait,
|
|
60
65
|
experiment=root.name if single else None,
|
|
61
66
|
defaults=defaults,
|
|
62
67
|
)
|
|
@@ -16,7 +16,7 @@ PLACEHOLDERS = {
|
|
|
16
16
|
# experiments is missing: one experiment has no folder to point at.
|
|
17
17
|
SINGLE_PLACEHOLDERS: dict[str, set[str]] = {"files": set(), "runs": {"run"}}
|
|
18
18
|
# Keys other readers own, so the path check lets them through.
|
|
19
|
-
OTHER_KEYS = {"experiments": {"mode", "concurrency", "retries"}}
|
|
19
|
+
OTHER_KEYS = {"experiments": {"mode", "concurrency", "retries", "retry_wait"}}
|
|
20
20
|
PLACEHOLDER = re.compile(r"\{([^}]*)\}")
|
|
21
21
|
SINGLE = "experiment.toml sits next to .labnotes.toml, so this folder is the experiment"
|
|
22
22
|
|
|
@@ -18,6 +18,7 @@ async def prepare_experiment(
|
|
|
18
18
|
setup: str | None = None,
|
|
19
19
|
teardown: str | None = None,
|
|
20
20
|
retries: int | None = None,
|
|
21
|
+
retry_wait: float | None = None,
|
|
21
22
|
replace_capped: bool = False,
|
|
22
23
|
) -> tuple[ExperimentConfig, int]:
|
|
23
24
|
if config.experiment not in (None, name):
|
|
@@ -36,6 +37,7 @@ async def prepare_experiment(
|
|
|
36
37
|
config.concurrency,
|
|
37
38
|
config.retries,
|
|
38
39
|
config.defaults,
|
|
40
|
+
config.retry_wait,
|
|
39
41
|
)
|
|
40
42
|
if setup is not None:
|
|
41
43
|
experiment = dataclasses.replace(experiment, setup=setup)
|
|
@@ -43,6 +45,8 @@ async def prepare_experiment(
|
|
|
43
45
|
experiment = dataclasses.replace(experiment, teardown=teardown)
|
|
44
46
|
if retries is not None:
|
|
45
47
|
experiment = dataclasses.replace(experiment, retries=retries)
|
|
48
|
+
if retry_wait is not None:
|
|
49
|
+
experiment = dataclasses.replace(experiment, retry_wait=retry_wait)
|
|
46
50
|
if replace_capped:
|
|
47
51
|
experiment = dataclasses.replace(experiment, replace_capped=True)
|
|
48
52
|
if only:
|
|
@@ -11,6 +11,7 @@ from labnotes.is_non_negative_number import is_non_negative_number
|
|
|
11
11
|
from labnotes.memory_interval import DEFAULT_MEMORY_INTERVAL
|
|
12
12
|
from labnotes.is_positive_int import is_positive_int
|
|
13
13
|
from labnotes.config_migration import MISSING_CONTINUES, REMOVED_MODE
|
|
14
|
+
from labnotes.retries import RETRY_SECONDS
|
|
14
15
|
|
|
15
16
|
SETTINGS = {
|
|
16
17
|
"name",
|
|
@@ -20,6 +21,7 @@ SETTINGS = {
|
|
|
20
21
|
"counts",
|
|
21
22
|
"concurrency",
|
|
22
23
|
"retries",
|
|
24
|
+
"retry_wait",
|
|
23
25
|
"meta",
|
|
24
26
|
"memory_interval",
|
|
25
27
|
"views",
|
|
@@ -39,6 +41,7 @@ def read_experiment_config(
|
|
|
39
41
|
concurrency: int,
|
|
40
42
|
retries: int,
|
|
41
43
|
defaults: dict[str, object] | None = None,
|
|
44
|
+
retry_wait: float = RETRY_SECONDS,
|
|
42
45
|
) -> ExperimentConfig:
|
|
43
46
|
try:
|
|
44
47
|
layer = tomllib.loads(source)
|
|
@@ -78,6 +81,9 @@ def read_experiment_config(
|
|
|
78
81
|
retries = values.get("retries", retries)
|
|
79
82
|
if not is_non_negative_int(retries):
|
|
80
83
|
raise ValueError(f"{path}: retries must be 0 or more")
|
|
84
|
+
retry_wait = values.get("retry_wait", retry_wait)
|
|
85
|
+
if not is_non_negative_number(retry_wait):
|
|
86
|
+
raise ValueError(f"{path}: retry_wait must be 0 or more seconds")
|
|
81
87
|
meta = values.get("meta")
|
|
82
88
|
if meta is not None and (not isinstance(meta, str) or not meta.strip()):
|
|
83
89
|
raise ValueError(f"{path}: meta must be a string")
|
|
@@ -127,6 +133,7 @@ def read_experiment_config(
|
|
|
127
133
|
counts,
|
|
128
134
|
concurrency,
|
|
129
135
|
retries,
|
|
136
|
+
retry_wait,
|
|
130
137
|
meta,
|
|
131
138
|
memory_interval,
|
|
132
139
|
values.get("setup"),
|
|
@@ -14,7 +14,7 @@ from labnotes.models import (
|
|
|
14
14
|
Listen,
|
|
15
15
|
Report,
|
|
16
16
|
)
|
|
17
|
-
from labnotes.retries import RETRY_EXIT_CODE
|
|
17
|
+
from labnotes.retries import RETRY_EXIT_CODE
|
|
18
18
|
from labnotes.runner.check_hook_placeholders import check_hook_placeholders
|
|
19
19
|
from labnotes.runner.claim_run import LOCK_FILE, claim_run
|
|
20
20
|
from labnotes.runner.execute_run import execute_run
|
|
@@ -49,7 +49,6 @@ async def run_experiment(
|
|
|
49
49
|
report: Report,
|
|
50
50
|
listen: Listen,
|
|
51
51
|
timeout: float | None = None,
|
|
52
|
-
retry_seconds: float = RETRY_SECONDS,
|
|
53
52
|
only: dict[str, list[str]] | None = None,
|
|
54
53
|
args: list[str] | None = None,
|
|
55
54
|
environment: dict[str, str] | None = None,
|
|
@@ -254,7 +253,7 @@ async def run_experiment(
|
|
|
254
253
|
if tried >= experiment.retries:
|
|
255
254
|
emit({"event": "gave up", "run": run, "retries": tried})
|
|
256
255
|
return
|
|
257
|
-
seconds =
|
|
256
|
+
seconds = experiment.retry_wait * 2 ** (tried - earlier.get(run, 0))
|
|
258
257
|
|
|
259
258
|
def due() -> None:
|
|
260
259
|
del waiting[run]
|
|
@@ -33,6 +33,7 @@ def start_experiment(
|
|
|
33
33
|
command_line: str | None = None,
|
|
34
34
|
run_id: str | None = None,
|
|
35
35
|
retries: int | None = None,
|
|
36
|
+
retry_wait: float | None = None,
|
|
36
37
|
replace_capped: bool = False,
|
|
37
38
|
) -> ExperimentStart:
|
|
38
39
|
state = RunState.create(config, name)
|
|
@@ -48,6 +49,7 @@ def start_experiment(
|
|
|
48
49
|
setup,
|
|
49
50
|
teardown,
|
|
50
51
|
retries,
|
|
52
|
+
retry_wait,
|
|
51
53
|
replace_capped,
|
|
52
54
|
)
|
|
53
55
|
await finalize_lost_runs(config)
|
|
@@ -14,7 +14,7 @@ export function attach(note, focus) {
|
|
|
14
14
|
editing = edit(note, prose, status);
|
|
15
15
|
if (focus) editing.view.focus();
|
|
16
16
|
},
|
|
17
|
-
() =>
|
|
17
|
+
(error) => console.error("Editor import failed:", error),
|
|
18
18
|
);
|
|
19
19
|
|
|
20
20
|
const changes = new EventSource(note.dataset.changesUrl);
|