pycontrol-gui 3.0.0b2__tar.gz → 3.0.0b3__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 (182) hide show
  1. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/PKG-INFO +2 -2
  2. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/pyproject.toml +2 -2
  3. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/session_controller.py +13 -0
  4. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_session_controller.py +10 -4
  5. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/uv.lock +1 -1
  6. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/.gitignore +0 -0
  7. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/.python-version +0 -0
  8. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/CONTRIBUTING.md +0 -0
  9. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/LICENSE.txt +0 -0
  10. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/README.md +0 -0
  11. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/docs/addons.md +0 -0
  12. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/docs/architecture.md +0 -0
  13. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/docs/changelog.md +0 -0
  14. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/docs/maintainability.md +0 -0
  15. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/docs/plot-addons.md +0 -0
  16. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/docs/task-controls.md +0 -0
  17. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/docs/task-sharing.md +0 -0
  18. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/__init__.py +0 -0
  19. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/__main__.py +0 -0
  20. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/app.py +0 -0
  21. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/app_settings.py +0 -0
  22. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/bus_adapter.py +0 -0
  23. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/error_logging.py +0 -0
  24. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/experiment_handlers.py +0 -0
  25. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/gui_gc.py +0 -0
  26. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/main_window.py +0 -0
  27. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/persistent_variables.py +0 -0
  28. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/__init__.py +0 -0
  29. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/base.py +0 -0
  30. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/default_plotter.py +0 -0
  31. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/host.py +0 -0
  32. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/loader.py +0 -0
  33. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/profiling.py +0 -0
  34. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/widgets/__init__.py +0 -0
  35. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/widgets/analog_plot.py +0 -0
  36. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/widgets/events_plot.py +0 -0
  37. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/plotting/widgets/states_plot.py +0 -0
  38. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/__init__.py +0 -0
  39. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/add.svg +0 -0
  40. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/bar-graph.svg +0 -0
  41. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/book.svg +0 -0
  42. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/circle-arrow-up_white.svg +0 -0
  43. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/close.svg +0 -0
  44. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/close_white.svg +0 -0
  45. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/collapse.svg +0 -0
  46. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/connect.svg +0 -0
  47. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/delete.svg +0 -0
  48. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/detach.svg +0 -0
  49. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/disconnect.svg +0 -0
  50. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/down.svg +0 -0
  51. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/edit.svg +0 -0
  52. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/enable.svg +0 -0
  53. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/expand.svg +0 -0
  54. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/filter.svg +0 -0
  55. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/folder.svg +0 -0
  56. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/funnel.svg +0 -0
  57. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/github.svg +0 -0
  58. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/help.svg +0 -0
  59. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/info.svg +0 -0
  60. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/keyboard.svg +0 -0
  61. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/left.svg +0 -0
  62. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/logo.svg +0 -0
  63. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/mount.svg +0 -0
  64. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/pause.svg +0 -0
  65. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/play.svg +0 -0
  66. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/play_white.svg +0 -0
  67. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/record_white.svg +0 -0
  68. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/refresh.svg +0 -0
  69. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/remove.svg +0 -0
  70. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/right.svg +0 -0
  71. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/run_white.svg +0 -0
  72. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/save.svg +0 -0
  73. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/save_as.svg +0 -0
  74. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/settings.svg +0 -0
  75. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/share.svg +0 -0
  76. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/stop_white.svg +0 -0
  77. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/trash.svg +0 -0
  78. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/up.svg +0 -0
  79. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/warning.svg +0 -0
  80. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/resources/icons/wrench.svg +0 -0
  81. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/sandbox_session.py +0 -0
  82. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/session_helpers.py +0 -0
  83. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/session_runtime.py +0 -0
  84. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/setup_maintenance.py +0 -0
  85. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/task_variables.py +0 -0
  86. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/update_check.py +0 -0
  87. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/__init__.py +0 -0
  88. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/about_dialog.py +0 -0
  89. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/controls_dialog.py +0 -0
  90. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/controls_dialog_editor.py +0 -0
  91. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/controls_host.py +0 -0
  92. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/controls_mount_controller.py +0 -0
  93. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/controls_spec.py +0 -0
  94. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/error_log_dialog.py +0 -0
  95. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_editor_rows.py +0 -0
  96. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_editor_state.py +0 -0
  97. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_editor_table.py +0 -0
  98. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_run_actions.py +0 -0
  99. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_run_models.py +0 -0
  100. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_run_outcomes.py +0 -0
  101. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_run_plots.py +0 -0
  102. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_run_preflight.py +0 -0
  103. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_run_summary.py +0 -0
  104. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_run_view.py +0 -0
  105. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_subject_table.py +0 -0
  106. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_variable_values.py +0 -0
  107. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiment_variables_table.py +0 -0
  108. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/experiments_tab.py +0 -0
  109. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/file_tree.py +0 -0
  110. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/hwdef_selector.py +0 -0
  111. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/keyboard_shortcuts_dialog.py +0 -0
  112. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/log_filter_controller.py +0 -0
  113. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/log_view.py +0 -0
  114. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/run_task_tab.py +0 -0
  115. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/sandbox_dialog.py +0 -0
  116. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/session_controls_shell.py +0 -0
  117. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/session_event_ui.py +0 -0
  118. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/session_panel.py +0 -0
  119. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/session_shutdown_ui.py +0 -0
  120. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/session_task_binding.py +0 -0
  121. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/settings_dialog.py +0 -0
  122. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/setup_variables_dialog.py +0 -0
  123. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/setups_tab.py +0 -0
  124. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/setups_table.py +0 -0
  125. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/share_dialog.py +0 -0
  126. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/style.py +0 -0
  127. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/subject_run_panel.py +0 -0
  128. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/task_selector_widgets.py +0 -0
  129. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/task_status.py +0 -0
  130. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/widgets/welcome_dialog.py +0 -0
  131. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/workspace_model.py +0 -0
  132. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/src/pycontrol_gui/workspace_snapshot.py +0 -0
  133. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/CLASSIFICATION.md +0 -0
  134. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/__init__.py +0 -0
  135. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/conftest.py +0 -0
  136. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/fixtures/controls/LED_controls.json +0 -0
  137. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/fixtures/controls/LED_controlz.json +0 -0
  138. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/fixtures/controls/blinker_gui.json +0 -0
  139. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/fixtures/controls/wheel_controls.json +0 -0
  140. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/support/__init__.py +0 -0
  141. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/support/core_events.py +0 -0
  142. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_app.py +0 -0
  143. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_bus_adapter.py +0 -0
  144. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_controls_dialog.py +0 -0
  145. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_controls_editor_round_trip.py +0 -0
  146. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_core_import_surface.py +0 -0
  147. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_error_log_dialog.py +0 -0
  148. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_error_logging.py +0 -0
  149. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_editor_state.py +0 -0
  150. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_run_actions.py +0 -0
  151. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_run_end_to_end.py +0 -0
  152. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_run_plots.py +0 -0
  153. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_run_preflight.py +0 -0
  154. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_run_view.py +0 -0
  155. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_subject_hwdef.py +0 -0
  156. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiment_variable_values.py +0 -0
  157. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_experiments_tab.py +0 -0
  158. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_gui_gc.py +0 -0
  159. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_log_view.py +0 -0
  160. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_main_window_shortcuts.py +0 -0
  161. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_model_view_widgets.py +0 -0
  162. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_persistent_variables.py +0 -0
  163. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_plotting_loader.py +0 -0
  164. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_plotting_widgets.py +0 -0
  165. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_run_task_tab.py +0 -0
  166. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_session_event_ui.py +0 -0
  167. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_session_helpers.py +0 -0
  168. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_session_runtime.py +0 -0
  169. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_settings_dialog.py +0 -0
  170. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_setup_maintenance.py +0 -0
  171. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_setups_tab.py +0 -0
  172. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_share_dialog.py +0 -0
  173. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_smoke.py +0 -0
  174. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_task_status_widget.py +0 -0
  175. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_task_variables.py +0 -0
  176. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_update_check.py +0 -0
  177. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_welcome_dialog.py +0 -0
  178. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_workspace_model.py +0 -0
  179. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tests/test_workspace_snapshot.py +0 -0
  180. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tools/check_wheels.py +0 -0
  181. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tools/run_tests.py +0 -0
  182. {pycontrol_gui-3.0.0b2 → pycontrol_gui-3.0.0b3}/tools/smoke_installed.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pycontrol-gui
3
- Version: 3.0.0b2
3
+ Version: 3.0.0b3
4
4
  Summary: Qt desktop frontend for pycontrol-core.
5
5
  Author: Karpova Lab contributors
6
6
  License: GPL-3.0-or-later
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Topic :: Scientific/Engineering
14
14
  Requires-Python: >=3.12
15
15
  Requires-Dist: packaging>=24
16
- Requires-Dist: pycontrol-core<3.1,>=3.0.0b1
16
+ Requires-Dist: pycontrol-core<3.1,>=3.0.0b2
17
17
  Requires-Dist: pyqtgraph>=0.13.7
18
18
  Requires-Dist: pyside6>=6.8
19
19
  Provides-Extra: test
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pycontrol-gui"
7
- version = "3.0.0b2"
7
+ version = "3.0.0b3"
8
8
  description = "Qt desktop frontend for pycontrol-core."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -20,7 +20,7 @@ classifiers = [
20
20
  ]
21
21
  dependencies = [
22
22
  "packaging>=24",
23
- "pycontrol-core>=3.0.0b1,<3.1",
23
+ "pycontrol-core>=3.0.0b2,<3.1",
24
24
  "PySide6>=6.8",
25
25
  "pyqtgraph>=0.13.7",
26
26
  ]
@@ -520,6 +520,7 @@ class SessionController(QObject):
520
520
  self._pending_end = None
521
521
  self._end_poll.stop()
522
522
  self._handled_session_end_signature = signature
523
+ self._log_run_error(ended)
523
524
  self._finish_active_run(ended)
524
525
  self.state_changed.emit(session.state)
525
526
  self.run_stopped.emit(ended)
@@ -641,6 +642,18 @@ class SessionController(QObject):
641
642
  if session.state in (SessionState.CONNECTED, SessionState.READY):
642
643
  self._pending_notes.append((note, 0))
643
644
 
645
+ def _log_run_error(self, ended: SessionEnded) -> None:
646
+ """Persist a board traceback or lost connection to the error log, not just the run's log view."""
647
+ if not ended.error_message:
648
+ return
649
+ run = self._active_run
650
+ if run is not None:
651
+ where = f"setup {run.plan.setup_name}, subject {run.plan.subject_id}, port {run.plan.port}"
652
+ else:
653
+ where = f"port {self._connected_port}"
654
+ message = ended.error_message.replace("\r\n", "\n").strip()
655
+ logger.error("Run on %s (task %s) ended with an error:\n%s", where, self._last_task_name, message)
656
+
644
657
  def _finish_active_run(self, ended: SessionEnded | None = None) -> None:
645
658
  """Close and package the run in flight, if any.
646
659
 
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ import logging
4
5
  import types
5
6
  import zipfile
6
7
  from dataclasses import replace
@@ -403,7 +404,7 @@ def test_session_controller_hardware_test_does_not_save_data(qtbot, tmp_path: Pa
403
404
  assert len(bundles) == 1
404
405
 
405
406
 
406
- def test_session_controller_finalizes_run_when_board_reports_error(qtbot, tmp_path: Path) -> None:
407
+ def test_session_controller_finalizes_run_when_board_reports_error(qtbot, tmp_path: Path, caplog) -> None:
407
408
  task_path = tmp_path / "task_error.py"
408
409
  task_path.write_text("# task fixture\n", encoding="utf-8")
409
410
 
@@ -425,13 +426,18 @@ def test_session_controller_finalizes_run_when_board_reports_error(qtbot, tmp_pa
425
426
 
426
427
  controller.connect_to("BoxA", "/dev/mock0", None)
427
428
  controller.upload_task(str(task_path), "task_error")
428
- controller.start_run("mouse42", "BoxA", "run_task", "")
429
-
430
- _assert_state_seen(qtbot, seen_states, SessionState.STOPPED)
429
+ with caplog.at_level(logging.ERROR, logger="pycontrol_gui.session_controller"):
430
+ controller.start_run("mouse42", "BoxA", "run_task", "")
431
+ _assert_state_seen(qtbot, seen_states, SessionState.STOPPED)
431
432
 
432
433
  assert errors == []
433
434
  assert len(run_stopped) == 1
434
435
  assert run_stopped[0].error_message == "Traceback: boom"
436
+ # The board traceback also reaches the error log, once, with where it happened.
437
+ [record] = [r for r in caplog.records if "ended with an error" in r.getMessage()]
438
+ assert record.levelno == logging.ERROR
439
+ assert "setup BoxA, subject mouse42" in record.getMessage()
440
+ assert record.getMessage().endswith("Traceback: boom")
435
441
  assert "Run stopped" in infos
436
442
  # A task error ends the run; the serial link is fine, so the board stays connected.
437
443
  assert controller.session is not None
@@ -141,7 +141,7 @@ provides-extras = ["analysis", "integrations", "lint", "notion", "s3", "slack",
141
141
 
142
142
  [[package]]
143
143
  name = "pycontrol-gui"
144
- version = "3.0.0b1"
144
+ version = "3.0.0b2"
145
145
  source = { editable = "." }
146
146
  dependencies = [
147
147
  { name = "packaging" },