bec-widgets 0.71.0__tar.gz → 0.72.0__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 (213) hide show
  1. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/CHANGELOG.md +16 -18
  2. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/PKG-INFO +1 -1
  3. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/client_utils.py +4 -0
  4. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/bec_connector.py +65 -2
  5. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/pyproject.toml +1 -1
  6. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_bec_connector.py +23 -0
  7. bec_widgets-0.72.0/tests/unit_tests/test_bec_status_box.py +152 -0
  8. bec_widgets-0.71.0/tests/unit_tests/test_bec_status_box.py +0 -152
  9. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.git_hooks/pre-commit +0 -0
  10. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.gitignore +0 -0
  11. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.gitlab/issue_templates/bug_report_template.md +0 -0
  12. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  13. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.gitlab/issue_templates/feature_request_template.md +0 -0
  14. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.gitlab/merge_request_templates/default.md +0 -0
  15. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.gitlab-ci.yml +0 -0
  16. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.pylintrc +0 -0
  17. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/.readthedocs.yaml +0 -0
  18. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/LICENSE +0 -0
  19. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/README.md +0 -0
  20. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/__init__.py +0 -0
  21. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/assets/bec_widgets_icon.png +0 -0
  22. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/assets/terminal_icon.png +0 -0
  23. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/__init__.py +0 -0
  24. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/auto_updates.py +0 -0
  25. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/client.py +0 -0
  26. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/generate_cli.py +0 -0
  27. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/rpc_register.py +0 -0
  28. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
  29. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/cli/server.py +0 -0
  30. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/__init__.py +0 -0
  31. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  32. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +0 -0
  33. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/jupyter_console/jupyter_console_window.ui +0 -0
  34. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/motor_movement/__init__.py +0 -0
  35. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/motor_movement/motor_control_compilations.py +0 -0
  36. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/motor_movement/motor_controller.ui +0 -0
  37. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/plugin_example_pyside/__init__.py +0 -0
  38. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/plugin_example_pyside/main.py +0 -0
  39. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/plugin_example_pyside/registertictactoe.py +0 -0
  40. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/plugin_example_pyside/taskmenuextension.pyproject +0 -0
  41. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/plugin_example_pyside/tictactoe.py +0 -0
  42. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py +0 -0
  43. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py +0 -0
  44. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/__init__.py +0 -0
  45. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/bec_designer.py +0 -0
  46. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/bec_dispatcher.py +0 -0
  47. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/bec_table.py +0 -0
  48. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/colors.py +0 -0
  49. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/container_utils.py +0 -0
  50. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/crosshair.py +0 -0
  51. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/entry_validator.py +0 -0
  52. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/layout_manager.py +0 -0
  53. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/plugin_utils.py +0 -0
  54. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/rpc_decorator.py +0 -0
  55. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/thread_checker.py +0 -0
  56. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/ui_loader.py +0 -0
  57. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/validator_delegate.py +0 -0
  58. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/widget_io.py +0 -0
  59. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/utils/yaml_dialog.py +0 -0
  60. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/__init__.py +0 -0
  61. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/bec_status_box/__init__.py +0 -0
  62. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/bec_status_box/bec_status_box.py +0 -0
  63. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/bec_status_box/status_item.py +0 -0
  64. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/buttons/__init__.py +0 -0
  65. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/buttons/stop_button/__init__.py +0 -0
  66. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/buttons/stop_button/stop_button.py +0 -0
  67. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/__init__.py +0 -0
  68. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_combobox/__init__.py +0 -0
  69. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_combobox/device_combobox.py +0 -0
  70. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_combobox/device_combobox.pyproject +0 -0
  71. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_combobox/device_combobox_plugin.py +0 -0
  72. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_combobox/launch_device_combobox.py +0 -0
  73. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_combobox/register_device_combobox.py +0 -0
  74. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_input_base.py +0 -0
  75. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_line_edit/__init__.py +0 -0
  76. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit.py +0 -0
  77. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit.pyproject +0 -0
  78. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_line_edit/device_line_edit_plugin.py +0 -0
  79. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_line_edit/launch_device_line_edit.py +0 -0
  80. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/device_inputs/device_line_edit/register_device_line_edit.py +0 -0
  81. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/dock/__init__.py +0 -0
  82. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/dock/dock.py +0 -0
  83. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/dock/dock_area.py +0 -0
  84. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/__init__.py +0 -0
  85. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/figure.py +0 -0
  86. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/__init__.py +0 -0
  87. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/image/__init__.py +0 -0
  88. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
  89. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
  90. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
  91. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/motor_map/__init__.py +0 -0
  92. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +0 -0
  93. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/plot_base.py +0 -0
  94. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/waveform/__init__.py +0 -0
  95. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/waveform/waveform.py +0 -0
  96. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
  97. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/jupyter_console/__init__.py +0 -0
  98. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/jupyter_console/jupyter_console.py +0 -0
  99. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/__init__.py +0 -0
  100. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/motor_control.py +0 -0
  101. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/motor_table/__init__.py +0 -0
  102. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/motor_table/motor_table.py +0 -0
  103. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/motor_table/motor_table.ui +0 -0
  104. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/movement_absolute/__init__.py +0 -0
  105. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.py +0 -0
  106. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.ui +0 -0
  107. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/movement_relative/__init__.py +0 -0
  108. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.py +0 -0
  109. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.ui +0 -0
  110. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/selection/__init__.py +0 -0
  111. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/selection/selection.py +0 -0
  112. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/motor_control/selection/selection.ui +0 -0
  113. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/scan_control/__init__.py +0 -0
  114. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/scan_control/scan_control.py +0 -0
  115. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/scan_control/scan_group_box.py +0 -0
  116. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/spiral_progress_bar/__init__.py +0 -0
  117. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/spiral_progress_bar/ring.py +0 -0
  118. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/spiral_progress_bar/spiral_progress_bar.py +0 -0
  119. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/text_box/__init__.py +0 -0
  120. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/text_box/text_box.py +0 -0
  121. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/toolbar/__init__.py +0 -0
  122. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/toolbar/toolbar.py +0 -0
  123. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/vscode/__init__.py +0 -0
  124. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/vscode/vscode.py +0 -0
  125. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/website/__init__.py +0 -0
  126. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/bec_widgets/widgets/website/website.py +0 -0
  127. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/Makefile +0 -0
  128. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/_static/custom.css +0 -0
  129. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/_templates/custom-class-template.rst +0 -0
  130. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/_templates/custom-module-template.rst +0 -0
  131. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/api_reference/api_reference.md +0 -0
  132. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/assets/apps_48dp.svg +0 -0
  133. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/assets/display_settings_48dp.svg +0 -0
  134. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/assets/index_api.svg +0 -0
  135. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/assets/index_contribute.svg +0 -0
  136. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/assets/index_getting_started.svg +0 -0
  137. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/assets/index_user_guide.svg +0 -0
  138. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/assets/rocket_launch_48dp.svg +0 -0
  139. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/conf.py +0 -0
  140. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/developer/developer.md +0 -0
  141. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/developer/getting_started/development.md +0 -0
  142. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/developer/getting_started/getting_started.md +0 -0
  143. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/developer/widgets/widgets.md +0 -0
  144. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/index.md +0 -0
  145. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/introduction/introduction.md +0 -0
  146. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/make.bat +0 -0
  147. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/requirements.txt +0 -0
  148. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/api_reference/api_reference.md +0 -0
  149. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/applications/applications.md +0 -0
  150. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/customisation.md +0 -0
  151. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/getting_started/BECDockArea.png +0 -0
  152. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/getting_started/auto_updates.md +0 -0
  153. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/getting_started/getting_started.md +0 -0
  154. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/getting_started/gui_complex_gui.gif +0 -0
  155. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/getting_started/installation.md +0 -0
  156. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/getting_started/quick_start.md +0 -0
  157. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/user.md +0 -0
  158. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/BECFigure.png +0 -0
  159. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/bec_figure.md +0 -0
  160. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/bec_status_box.gif +0 -0
  161. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/bec_status_box.md +0 -0
  162. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/buttons.md +0 -0
  163. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/image_plot.gif +0 -0
  164. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/motor.gif +0 -0
  165. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/progress_bar.gif +0 -0
  166. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/scan_control.gif +0 -0
  167. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/scan_control.md +0 -0
  168. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/scatter_2D.gif +0 -0
  169. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/spiral_progress_bar.md +0 -0
  170. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/text_box.md +0 -0
  171. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/w1D.gif +0 -0
  172. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/website.md +0 -0
  173. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/docs/user/widgets/widgets.md +0 -0
  174. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/__init__.py +0 -0
  175. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/end-2-end/__init__.py +0 -0
  176. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/end-2-end/conftest.py +0 -0
  177. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/end-2-end/test_bec_dock_rpc_e2e.py +0 -0
  178. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/end-2-end/test_bec_figure_rpc_e2e.py +0 -0
  179. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/end-2-end/test_rpc_register_e2e.py +0 -0
  180. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/end-2-end/test_scan_control_e2e.py +0 -0
  181. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/__init__.py +0 -0
  182. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/client_mocks.py +0 -0
  183. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/conftest.py +0 -0
  184. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_bec_dispatcher.py +0 -0
  185. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_bec_dock.py +0 -0
  186. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_bec_figure.py +0 -0
  187. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_bec_motor_map.py +0 -0
  188. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_client_utils.py +0 -0
  189. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_color_validation.py +0 -0
  190. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_configs/config_device.yaml +0 -0
  191. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -0
  192. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_configs/config_scan.yaml +0 -0
  193. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_crosshair.py +0 -0
  194. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_device_input_base.py +0 -0
  195. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_device_input_widgets.py +0 -0
  196. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_generate_cli_client.py +0 -0
  197. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_motor_control.py +0 -0
  198. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_msgs/__init__.py +0 -0
  199. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_msgs/available_scans_message.py +0 -0
  200. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_plot_base.py +0 -0
  201. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_plugin_utils.py +0 -0
  202. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_rpc_register.py +0 -0
  203. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_rpc_widget_handler.py +0 -0
  204. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_scan_control.py +0 -0
  205. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_scan_control_group_box.py +0 -0
  206. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_spiral_progress_bar.py +0 -0
  207. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_stop_button.py +0 -0
  208. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_text_box_widget.py +0 -0
  209. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_vscode_widget.py +0 -0
  210. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_waveform1d.py +0 -0
  211. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_website_widget.py +0 -0
  212. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_widget_io.py +0 -0
  213. {bec_widgets-0.71.0 → bec_widgets-0.72.0}/tests/unit_tests/test_yaml_dialog.py +0 -0
@@ -1,5 +1,21 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.72.0 (2024-06-24)
4
+
5
+ ### Feature
6
+
7
+ * feat(connector): added threadpool wrapper ([`4ca1efe`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/4ca1efeeb8955604069f7b98374c7f82e1a8da67))
8
+
9
+ ### Unknown
10
+
11
+ * tests(status_box_test): temporary disabled tests for status_box due to high rate of failures ([`aa7ce2e`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/aa7ce2ea27bb9564d4f5104bbff30725b8656453))
12
+
13
+ ## v0.71.1 (2024-06-23)
14
+
15
+ ### Fix
16
+
17
+ * fix: don't print exception if the auto-update module cannot be found in plugins ([`860517a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/860517a3211075d1f6e2af7fa6a567b9e0cd77f3))
18
+
3
19
  ## v0.71.0 (2024-06-23)
4
20
 
5
21
  ### Feature
@@ -135,21 +151,3 @@ in their parent process ([`ce37416`](https://gitlab.psi.ch/bec/bec_widgets/-/com
135
151
  * fix(pyqt): webengine must be imported before qcoreapplication ([`cbbd23a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/cbbd23aa33095141e4c265719d176c4aa8c25996))
136
152
 
137
153
  ## v0.65.1 (2024-06-20)
138
-
139
- ### Fix
140
-
141
- * fix: prevent segfault by closing the QCoreApplication, if any ([`fa344a5`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/fa344a5799b07a2d8ace63cc7010b69bc4ed6f1d))
142
-
143
- ## v0.65.0 (2024-06-20)
144
-
145
- ### Feature
146
-
147
- * feat(device_input): DeviceLineEdit with QCompleter added ([`50e41ff`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/50e41ff26160ec26d77feb6d519e4dad902a9b9b))
148
-
149
- ### Fix
150
-
151
- * fix(device_input_base): bug with setting config and overwriting default device and filter ([`d79f7e9`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/d79f7e9ccde03dc77819ca556c79736d30f7821a))
152
-
153
- ### Test
154
-
155
- * test(device_input): tests added ([`1a0a98a`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/1a0a98a45367db414bed813bbd346b3e1ae8d550))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.71.0
3
+ Version: 0.72.0
4
4
  Summary: BEC Widgets
5
5
  Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec_widgets/issues
6
6
  Project-URL: Homepage, https://gitlab.psi.ch/bec/bec_widgets
@@ -141,6 +141,10 @@ class BECGuiClientMixin:
141
141
  for ep in eps:
142
142
  if ep.name == "plugin_widgets_update":
143
143
  try:
144
+ spec = importlib.util.find_spec(ep.module)
145
+ # if the module is not found, we skip it
146
+ if spec is None:
147
+ continue
144
148
  return ep.load()(gui=self)
145
149
  except Exception as e:
146
150
  print(f"Error loading auto update script from plugin: {str(e)}")
@@ -2,10 +2,11 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  import time
5
- from typing import Optional, Type
5
+ from typing import Optional
6
6
 
7
- from bec_lib.utils.import_utils import lazy_import, lazy_import_from
7
+ from bec_lib.utils.import_utils import lazy_import_from
8
8
  from pydantic import BaseModel, Field, field_validator
9
+ from qtpy.QtCore import QObject, QRunnable, QThreadPool, Signal
9
10
  from qtpy.QtCore import Slot as pyqtSlot
10
11
 
11
12
  from bec_widgets.cli.rpc_register import RPCRegister
@@ -33,6 +34,31 @@ class ConnectionConfig(BaseModel):
33
34
  return v
34
35
 
35
36
 
37
+ class WorkerSignals(QObject):
38
+ progress = Signal(dict)
39
+ completed = Signal()
40
+
41
+
42
+ class Worker(QRunnable):
43
+ """
44
+ Worker class to run a function in a separate thread.
45
+ """
46
+
47
+ def __init__(self, func, *args, **kwargs):
48
+ super().__init__()
49
+ self.signals = WorkerSignals()
50
+ self.func = func
51
+ self.args = args
52
+ self.kwargs = kwargs
53
+
54
+ def run(self):
55
+ """
56
+ Run the specified function in the thread.
57
+ """
58
+ self.func(*self.args, **self.kwargs)
59
+ self.signals.completed.emit()
60
+
61
+
36
62
  class BECConnector:
37
63
  """Connection mixin class for all BEC widgets, to handle BEC client and device manager"""
38
64
 
@@ -63,6 +89,43 @@ class BECConnector:
63
89
  self.rpc_register = RPCRegister()
64
90
  self.rpc_register.add_rpc(self)
65
91
 
92
+ self._thread_pool = QThreadPool.globalInstance()
93
+
94
+ def submit_task(self, fn, *args, on_complete: pyqtSlot = None, **kwargs) -> Worker:
95
+ """
96
+ Submit a task to run in a separate thread. The task will run the specified
97
+ function with the provided arguments and emit the completed signal when done.
98
+
99
+ Use this method if you want to wait for a task to complete without blocking the
100
+ main thread.
101
+
102
+ Args:
103
+ fn: Function to run in a separate thread.
104
+ *args: Arguments for the function.
105
+ on_complete: Slot to run when the task is complete.
106
+ **kwargs: Keyword arguments for the function.
107
+
108
+ Returns:
109
+ worker: The worker object that will run the task.
110
+
111
+ Examples:
112
+ >>> def my_function(a, b):
113
+ >>> print(a + b)
114
+ >>> self.submit_task(my_function, 1, 2)
115
+
116
+ >>> def my_function(a, b):
117
+ >>> print(a + b)
118
+ >>> def on_complete():
119
+ >>> print("Task complete")
120
+ >>> self.submit_task(my_function, 1, 2, on_complete=on_complete)
121
+
122
+ """
123
+ worker = Worker(fn, *args, **kwargs)
124
+ if on_complete:
125
+ worker.signals.completed.connect(on_complete)
126
+ self._thread_pool.start(worker)
127
+ return worker
128
+
66
129
  def get_all_rpc(self) -> dict:
67
130
  """Get all registered RPC objects."""
68
131
  all_connections = self.rpc_register.list_all_connections()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_widgets"
7
- version = "0.71.0"
7
+ version = "0.72.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -1,5 +1,9 @@
1
1
  # pylint: disable = no-name-in-module,missing-class-docstring, missing-module-docstring
2
+ import time
3
+
2
4
  import pytest
5
+ from qtpy.QtCore import Slot
6
+ from qtpy.QtWidgets import QApplication
3
7
 
4
8
  from bec_widgets.utils import BECConnector, ConnectionConfig
5
9
 
@@ -55,3 +59,22 @@ def test_bec_connector_update_client(bec_connector, mocked_client):
55
59
  def test_bec_connector_get_config(bec_connector):
56
60
  assert bec_connector.get_config(dict_output=False) == bec_connector.config
57
61
  assert bec_connector.get_config() == bec_connector.config.model_dump()
62
+
63
+
64
+ def test_bec_connector_submit_task(bec_connector):
65
+ def test_func():
66
+ time.sleep(2)
67
+ print("done")
68
+
69
+ completed = False
70
+
71
+ @Slot()
72
+ def complete_func():
73
+ nonlocal completed
74
+ completed = True
75
+
76
+ bec_connector.submit_task(test_func, on_complete=complete_func)
77
+ assert not completed
78
+ while not completed:
79
+ QApplication.processEvents()
80
+ time.sleep(0.1)
@@ -0,0 +1,152 @@
1
+ # import re
2
+ # from unittest import mock
3
+ #
4
+ # import pytest
5
+ # from bec_lib.messages import BECStatus, ServiceMetricMessage, StatusMessage
6
+ # from qtpy.QtCore import QMetaMethod
7
+ #
8
+ # from bec_widgets.widgets.bec_status_box.bec_status_box import BECServiceInfoContainer, BECStatusBox
9
+ #
10
+ # from .client_mocks import mocked_client
11
+ #
12
+ #
13
+ # @pytest.fixture
14
+ # def status_box(qtbot, mocked_client):
15
+ # with mock.patch(
16
+ # "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
17
+ # ) as mock_service_status_mixin:
18
+ # widget = BECStatusBox(client=mocked_client)
19
+ # qtbot.addWidget(widget)
20
+ # qtbot.waitExposed(widget)
21
+ # yield widget
22
+ #
23
+ #
24
+ # def test_status_box_init(qtbot, mocked_client):
25
+ # with mock.patch(
26
+ # "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
27
+ # ) as mock_service_status_mixin:
28
+ # name = "my test"
29
+ # widget = BECStatusBox(parent=None, service_name=name, client=mocked_client)
30
+ # qtbot.addWidget(widget)
31
+ # qtbot.waitExposed(widget)
32
+ # assert widget.headerItem().DontShowIndicator.value == 1
33
+ # assert widget.children()[0].children()[0].config.service_name == name
34
+ #
35
+ #
36
+ # def test_update_top_item(qtbot, mocked_client):
37
+ # with (
38
+ # mock.patch(
39
+ # "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
40
+ # ) as mock_service_status_mixin,
41
+ # mock.patch(
42
+ # "bec_widgets.widgets.bec_status_box.status_item.StatusItem.update_config"
43
+ # ) as mock_update,
44
+ # ):
45
+ # name = "my test"
46
+ # widget = BECStatusBox(parent=None, service_name=name, client=mocked_client)
47
+ # qtbot.addWidget(widget)
48
+ # qtbot.waitExposed(widget)
49
+ # widget.update_top_item_status(status="RUNNING")
50
+ # assert widget.bec_service_info_container[name].status == "RUNNING"
51
+ # assert mock_update.call_args == mock.call(widget.bec_service_info_container[name].dict())
52
+ #
53
+ #
54
+ # def test_create_status_widget(status_box):
55
+ # name = "test_service"
56
+ # status = BECStatus.IDLE
57
+ # info = {"test": "test"}
58
+ # metrics = {"metric": "test_metric"}
59
+ # item = status_box._create_status_widget(name, status, info, metrics)
60
+ # assert item.config.service_name == name
61
+ # assert item.config.status == status.name
62
+ # assert item.config.info == info
63
+ # assert item.config.metrics == metrics
64
+ #
65
+ #
66
+ # def test_bec_service_container(status_box):
67
+ # name = "test_service"
68
+ # status = BECStatus.IDLE
69
+ # info = {"test": "test"}
70
+ # metrics = {"metric": "test_metric"}
71
+ # expected_return = BECServiceInfoContainer(
72
+ # service_name=name, status=status, info=info, metrics=metrics
73
+ # )
74
+ # assert status_box.service_name in status_box.bec_service_info_container
75
+ # assert len(status_box.bec_service_info_container) == 1
76
+ # status_box._update_bec_service_container(name, status, info, metrics)
77
+ # assert len(status_box.bec_service_info_container) == 2
78
+ # assert status_box.bec_service_info_container[name] == expected_return
79
+ #
80
+ #
81
+ # def test_add_tree_item(status_box):
82
+ # name = "test_service"
83
+ # status = BECStatus.IDLE
84
+ # info = {"test": "test"}
85
+ # metrics = {"metric": "test_metric"}
86
+ # assert len(status_box.children()[0].children()) == 1
87
+ # status_box.add_tree_item(name, status, info, metrics)
88
+ # assert len(status_box.children()[0].children()) == 2
89
+ # assert name in status_box.tree_items
90
+ #
91
+ #
92
+ # def test_update_service_status(status_box):
93
+ # """Also checks check redundant tree items"""
94
+ # name = "test_service"
95
+ # status = BECStatus.IDLE
96
+ # info = {"test": "test"}
97
+ # metrics = {"metric": "test_metric"}
98
+ # status_box.add_tree_item(name, status, info, {})
99
+ # not_connected_name = "invalid_service"
100
+ # status_box.add_tree_item(not_connected_name, status, info, metrics)
101
+ #
102
+ # services_status = {name: StatusMessage(name=name, status=status, info=info)}
103
+ # services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
104
+ #
105
+ # with mock.patch.object(status_box, "update_core_services", return_value=services_status):
106
+ # assert not_connected_name in status_box.tree_items
107
+ # status_box.update_service_status(services_status, services_metrics)
108
+ # assert status_box.tree_items[name][1].config.metrics == metrics
109
+ # assert not_connected_name not in status_box.tree_items
110
+ #
111
+ #
112
+ # def test_update_core_services(qtbot, mocked_client):
113
+ # with (
114
+ # mock.patch(
115
+ # "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
116
+ # ) as mock_service_status_mixin,
117
+ # mock.patch(
118
+ # "bec_widgets.widgets.bec_status_box.bec_status_box.BECStatusBox.update_top_item_status"
119
+ # ) as mock_update,
120
+ # ):
121
+ # name = "my test"
122
+ # status_box = BECStatusBox(parent=None, service_name=name, client=mocked_client)
123
+ # qtbot.addWidget(status_box)
124
+ # qtbot.waitExposed(status_box)
125
+ # status_box.CORE_SERVICES = ["test_service"]
126
+ # name = "test_service"
127
+ # status = BECStatus.RUNNING
128
+ # info = {"test": "test"}
129
+ # metrics = {"metric": "test_metric"}
130
+ # services_status = {name: StatusMessage(name=name, status=status, info=info)}
131
+ # services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
132
+ #
133
+ # status_box.update_core_services(services_status, services_metrics)
134
+ # assert mock_update.call_args == mock.call(status.name)
135
+ #
136
+ # status = BECStatus.IDLE
137
+ # services_status = {name: StatusMessage(name=name, status=status, info=info)}
138
+ # services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
139
+ # status_box.update_core_services(services_status, services_metrics)
140
+ # assert mock_update.call_args == mock.call("ERROR")
141
+ #
142
+ #
143
+ # def test_double_click_item(status_box):
144
+ # name = "test_service"
145
+ # status = BECStatus.IDLE
146
+ # info = {"test": "test"}
147
+ # metrics = {"MyData": "This should be shown nicely"}
148
+ # status_box.add_tree_item(name, status, info, metrics)
149
+ # item, status_item = status_box.tree_items[name]
150
+ # with mock.patch.object(status_item, "show_popup") as mock_show_popup:
151
+ # status_box.itemDoubleClicked.emit(item, 0)
152
+ # assert mock_show_popup.call_count == 1
@@ -1,152 +0,0 @@
1
- import re
2
- from unittest import mock
3
-
4
- import pytest
5
- from bec_lib.messages import BECStatus, ServiceMetricMessage, StatusMessage
6
- from qtpy.QtCore import QMetaMethod
7
-
8
- from bec_widgets.widgets.bec_status_box.bec_status_box import BECServiceInfoContainer, BECStatusBox
9
-
10
- from .client_mocks import mocked_client
11
-
12
-
13
- @pytest.fixture
14
- def status_box(qtbot, mocked_client):
15
- with mock.patch(
16
- "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
17
- ) as mock_service_status_mixin:
18
- widget = BECStatusBox(client=mocked_client)
19
- qtbot.addWidget(widget)
20
- qtbot.waitExposed(widget)
21
- yield widget
22
-
23
-
24
- def test_status_box_init(qtbot, mocked_client):
25
- with mock.patch(
26
- "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
27
- ) as mock_service_status_mixin:
28
- name = "my test"
29
- widget = BECStatusBox(parent=None, service_name=name, client=mocked_client)
30
- qtbot.addWidget(widget)
31
- qtbot.waitExposed(widget)
32
- assert widget.headerItem().DontShowIndicator.value == 1
33
- assert widget.children()[0].children()[0].config.service_name == name
34
-
35
-
36
- def test_update_top_item(qtbot, mocked_client):
37
- with (
38
- mock.patch(
39
- "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
40
- ) as mock_service_status_mixin,
41
- mock.patch(
42
- "bec_widgets.widgets.bec_status_box.status_item.StatusItem.update_config"
43
- ) as mock_update,
44
- ):
45
- name = "my test"
46
- widget = BECStatusBox(parent=None, service_name=name, client=mocked_client)
47
- qtbot.addWidget(widget)
48
- qtbot.waitExposed(widget)
49
- widget.update_top_item_status(status="RUNNING")
50
- assert widget.bec_service_info_container[name].status == "RUNNING"
51
- assert mock_update.call_args == mock.call(widget.bec_service_info_container[name].dict())
52
-
53
-
54
- def test_create_status_widget(status_box):
55
- name = "test_service"
56
- status = BECStatus.IDLE
57
- info = {"test": "test"}
58
- metrics = {"metric": "test_metric"}
59
- item = status_box._create_status_widget(name, status, info, metrics)
60
- assert item.config.service_name == name
61
- assert item.config.status == status.name
62
- assert item.config.info == info
63
- assert item.config.metrics == metrics
64
-
65
-
66
- def test_bec_service_container(status_box):
67
- name = "test_service"
68
- status = BECStatus.IDLE
69
- info = {"test": "test"}
70
- metrics = {"metric": "test_metric"}
71
- expected_return = BECServiceInfoContainer(
72
- service_name=name, status=status, info=info, metrics=metrics
73
- )
74
- assert status_box.service_name in status_box.bec_service_info_container
75
- assert len(status_box.bec_service_info_container) == 1
76
- status_box._update_bec_service_container(name, status, info, metrics)
77
- assert len(status_box.bec_service_info_container) == 2
78
- assert status_box.bec_service_info_container[name] == expected_return
79
-
80
-
81
- def test_add_tree_item(status_box):
82
- name = "test_service"
83
- status = BECStatus.IDLE
84
- info = {"test": "test"}
85
- metrics = {"metric": "test_metric"}
86
- assert len(status_box.children()[0].children()) == 1
87
- status_box.add_tree_item(name, status, info, metrics)
88
- assert len(status_box.children()[0].children()) == 2
89
- assert name in status_box.tree_items
90
-
91
-
92
- def test_update_service_status(status_box):
93
- """Also checks check redundant tree items"""
94
- name = "test_service"
95
- status = BECStatus.IDLE
96
- info = {"test": "test"}
97
- metrics = {"metric": "test_metric"}
98
- status_box.add_tree_item(name, status, info, {})
99
- not_connected_name = "invalid_service"
100
- status_box.add_tree_item(not_connected_name, status, info, metrics)
101
-
102
- services_status = {name: StatusMessage(name=name, status=status, info=info)}
103
- services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
104
-
105
- with mock.patch.object(status_box, "update_core_services", return_value=services_status):
106
- assert not_connected_name in status_box.tree_items
107
- status_box.update_service_status(services_status, services_metrics)
108
- assert status_box.tree_items[name][1].config.metrics == metrics
109
- assert not_connected_name not in status_box.tree_items
110
-
111
-
112
- def test_update_core_services(qtbot, mocked_client):
113
- with (
114
- mock.patch(
115
- "bec_widgets.widgets.bec_status_box.bec_status_box.BECServiceStatusMixin"
116
- ) as mock_service_status_mixin,
117
- mock.patch(
118
- "bec_widgets.widgets.bec_status_box.bec_status_box.BECStatusBox.update_top_item_status"
119
- ) as mock_update,
120
- ):
121
- name = "my test"
122
- status_box = BECStatusBox(parent=None, service_name=name, client=mocked_client)
123
- qtbot.addWidget(status_box)
124
- qtbot.waitExposed(status_box)
125
- status_box.CORE_SERVICES = ["test_service"]
126
- name = "test_service"
127
- status = BECStatus.RUNNING
128
- info = {"test": "test"}
129
- metrics = {"metric": "test_metric"}
130
- services_status = {name: StatusMessage(name=name, status=status, info=info)}
131
- services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
132
-
133
- status_box.update_core_services(services_status, services_metrics)
134
- assert mock_update.call_args == mock.call(status.name)
135
-
136
- status = BECStatus.IDLE
137
- services_status = {name: StatusMessage(name=name, status=status, info=info)}
138
- services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
139
- status_box.update_core_services(services_status, services_metrics)
140
- assert mock_update.call_args == mock.call("ERROR")
141
-
142
-
143
- def test_double_click_item(status_box):
144
- name = "test_service"
145
- status = BECStatus.IDLE
146
- info = {"test": "test"}
147
- metrics = {"MyData": "This should be shown nicely"}
148
- status_box.add_tree_item(name, status, info, metrics)
149
- item, status_item = status_box.tree_items[name]
150
- with mock.patch.object(status_item, "show_popup") as mock_show_popup:
151
- status_box.itemDoubleClicked.emit(item, 0)
152
- assert mock_show_popup.call_count == 1
File without changes
File without changes
File without changes
File without changes