bec-widgets 0.57.0__tar.gz → 0.57.2__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 (154) hide show
  1. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/CHANGELOG.md +32 -40
  2. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/PKG-INFO +2 -1
  3. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/auto_updates.py +1 -1
  4. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/client.py +14 -4
  5. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/client_utils.py +48 -49
  6. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +4 -4
  7. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/dock/dock.py +44 -35
  8. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/dock/dock_area.py +18 -5
  9. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +2 -2
  10. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/waveform/waveform.py +0 -1
  11. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/spiral_progress_bar/ring.py +2 -1
  12. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/bec_figure.md +4 -4
  13. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/spiral_progress_bar.md +2 -2
  14. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/pyproject.toml +2 -1
  15. bec_widgets-0.57.2/tests/end-2-end/conftest.py +55 -0
  16. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/end-2-end/test_bec_dock_rpc_e2e.py +72 -94
  17. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/end-2-end/test_bec_figure_rpc_e2e.py +18 -30
  18. bec_widgets-0.57.2/tests/end-2-end/test_rpc_register_e2e.py +40 -0
  19. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_dock.py +1 -1
  20. bec_widgets-0.57.0/tests/end-2-end/conftest.py +0 -40
  21. bec_widgets-0.57.0/tests/end-2-end/test_rpc_register_e2e.py +0 -50
  22. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.git_hooks/pre-commit +0 -0
  23. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitignore +0 -0
  24. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/issue_templates/bug_report_template.md +0 -0
  25. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/issue_templates/documentation_update_template.md +0 -0
  26. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/issue_templates/feature_request_template.md +0 -0
  27. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/merge_request_templates/default.md +0 -0
  28. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab-ci.yml +0 -0
  29. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.pylintrc +0 -0
  30. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.readthedocs.yaml +0 -0
  31. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/LICENSE +0 -0
  32. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/README.md +0 -0
  33. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/__init__.py +0 -0
  34. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/assets/bec_widgets_icon.png +0 -0
  35. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/assets/terminal_icon.png +0 -0
  36. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/__init__.py +0 -0
  37. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/generate_cli.py +0 -0
  38. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/rpc_register.py +0 -0
  39. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
  40. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/server.py +0 -0
  41. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/__init__.py +0 -0
  42. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
  43. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/jupyter_console/jupyter_console_window.ui +0 -0
  44. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/motor_movement/__init__.py +0 -0
  45. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/motor_movement/motor_control_compilations.py +0 -0
  46. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/motor_movement/motor_controller.ui +0 -0
  47. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/__init__.py +0 -0
  48. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/bec_connector.py +0 -0
  49. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/bec_dispatcher.py +0 -0
  50. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/bec_table.py +0 -0
  51. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/colors.py +0 -0
  52. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/container_utils.py +0 -0
  53. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/crosshair.py +0 -0
  54. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/entry_validator.py +0 -0
  55. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/layout_manager.py +0 -0
  56. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/plugin_utils.py +0 -0
  57. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/rpc_decorator.py +0 -0
  58. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/thread_checker.py +0 -0
  59. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/ui_loader.py +0 -0
  60. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/validator_delegate.py +0 -0
  61. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/widget_io.py +0 -0
  62. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/yaml_dialog.py +0 -0
  63. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/__init__.py +0 -0
  64. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/dock/__init__.py +0 -0
  65. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/__init__.py +0 -0
  66. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/figure.py +0 -0
  67. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/__init__.py +0 -0
  68. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/__init__.py +0 -0
  69. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
  70. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
  71. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
  72. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/motor_map/__init__.py +0 -0
  73. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/plot_base.py +0 -0
  74. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/waveform/__init__.py +0 -0
  75. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
  76. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/jupyter_console/__init__.py +0 -0
  77. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/jupyter_console/jupyter_console.py +0 -0
  78. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/__init__.py +0 -0
  79. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_control.py +0 -0
  80. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_table/__init__.py +0 -0
  81. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_table/motor_table.py +0 -0
  82. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_table/motor_table.ui +0 -0
  83. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_absolute/__init__.py +0 -0
  84. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.py +0 -0
  85. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.ui +0 -0
  86. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_relative/__init__.py +0 -0
  87. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.py +0 -0
  88. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.ui +0 -0
  89. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/selection/__init__.py +0 -0
  90. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/selection/selection.py +0 -0
  91. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/selection/selection.ui +0 -0
  92. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/scan_control/__init__.py +0 -0
  93. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/scan_control/scan_control.py +0 -0
  94. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/spiral_progress_bar/__init__.py +0 -0
  95. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/spiral_progress_bar/spiral_progress_bar.py +0 -0
  96. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/toolbar/__init__.py +0 -0
  97. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/toolbar/toolbar.py +0 -0
  98. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/Makefile +0 -0
  99. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/_static/custom.css +0 -0
  100. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/_templates/custom-class-template.rst +0 -0
  101. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/_templates/custom-module-template.rst +0 -0
  102. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/api_reference/api_reference.md +0 -0
  103. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/apps_48dp.svg +0 -0
  104. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/display_settings_48dp.svg +0 -0
  105. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_api.svg +0 -0
  106. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_contribute.svg +0 -0
  107. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_getting_started.svg +0 -0
  108. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_user_guide.svg +0 -0
  109. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/rocket_launch_48dp.svg +0 -0
  110. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/conf.py +0 -0
  111. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/developer/developer.md +0 -0
  112. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/index.md +0 -0
  113. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/introduction/introduction.md +0 -0
  114. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/make.bat +0 -0
  115. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/requirements.txt +0 -0
  116. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/api_reference/api_reference.md +0 -0
  117. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/applications/applications.md +0 -0
  118. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/customisation.md +0 -0
  119. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/command_line_introduction.md +0 -0
  120. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/getting_started.md +0 -0
  121. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/gui_complex_gui.gif +0 -0
  122. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/installation.md +0 -0
  123. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/user.md +0 -0
  124. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/image_plot.gif +0 -0
  125. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/motor.gif +0 -0
  126. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/progress_bar.gif +0 -0
  127. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/scatter_2D.gif +0 -0
  128. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/w1D.gif +0 -0
  129. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/widgets.md +0 -0
  130. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/__init__.py +0 -0
  131. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/end-2-end/__init__.py +0 -0
  132. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/__init__.py +0 -0
  133. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/client_mocks.py +0 -0
  134. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/conftest.py +0 -0
  135. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_connector.py +0 -0
  136. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_dispatcher.py +0 -0
  137. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_figure.py +0 -0
  138. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_motor_map.py +0 -0
  139. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_client_utils.py +0 -0
  140. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_configs/config_device.yaml +0 -0
  141. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -0
  142. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_configs/config_scan.yaml +0 -0
  143. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_crosshair.py +0 -0
  144. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_generate_cli_client.py +0 -0
  145. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_motor_control.py +0 -0
  146. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_msgs/__init__.py +0 -0
  147. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_msgs/available_scans_message.py +0 -0
  148. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_plot_base.py +0 -0
  149. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_rpc_register.py +0 -0
  150. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_scan_control.py +0 -0
  151. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_spiral_progress_bar.py +0 -0
  152. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_waveform1d.py +0 -0
  153. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_widget_io.py +0 -0
  154. {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_yaml_dialog.py +0 -0
@@ -2,6 +2,38 @@
2
2
 
3
3
 
4
4
 
5
+ ## v0.57.2 (2024-06-06)
6
+
7
+ ### Fix
8
+
9
+ * fix(test/e2e): autoupdate e2e rewritten ([`e1af5ca`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/e1af5ca60f0616835f9f41d84412f29dc298c644))
10
+
11
+ * fix(test/e2e): spiral_progress_bar e2e tests rewritten to use config_dict ([`7fb31fc`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/7fb31fc4d762ff4ca839971b3092a084186f81b8))
12
+
13
+ * fix(test/e2e): dockarea and dock e2e tests changed to check asserts against config_dict ([`5c6ba65`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/5c6ba65469863ea1e6fc5abdc742650e20eba9b9))
14
+
15
+ * fix: rpc_server_dock fixture now spawns the server process ([`cd9fc46`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/cd9fc46ff8a947242c8c28adcd73d7de60b11c44))
16
+
17
+ * fix: accept scalars or numpy arrays of 1 element ([`2a88e17`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/2a88e17b23436c55d25b7d3449e4af3a7689661c))
18
+
19
+ ### Refactor
20
+
21
+ * refactor: move _get_output and _start_plot_process at the module level ([`69f4371`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/69f4371007c66aee6b7521a6803054025adf8c92))
22
+
23
+
24
+ ## v0.57.1 (2024-06-06)
25
+
26
+ ### Documentation
27
+
28
+ * docs: docs refactored from add_widget_bec to add_widget ([`c3f4845`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/c3f4845b4f95005ff737fed5542600b0b9a9cc2b))
29
+
30
+ ### Fix
31
+
32
+ * fix: tests references to add_widget_bec refactored ([`f51b25f`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/f51b25f0af4ab8b0a75ee48a40bfbb079c16e9d1))
33
+
34
+ * fix(dock): add_widget and add_widget_bec consolidated ([`8ae323f`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/8ae323f5c3c0d9d0f202d31d5e8374a272a26be2))
35
+
36
+
5
37
  ## v0.57.0 (2024-06-05)
6
38
 
7
39
  ### Documentation
@@ -133,43 +165,3 @@
133
165
 
134
166
 
135
167
  ## v0.53.0 (2024-05-09)
136
-
137
- ### Ci
138
-
139
- * ci: use formatter config of toml file ([`5cc816d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/5cc816d0af73e20c648e044a027c589704ab1625))
140
-
141
- ### Documentation
142
-
143
- * docs: update install instructions ([`57ee735`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/57ee735e5c2436d45a285507cdc939daa20e8e8f))
144
-
145
- ### Feature
146
-
147
- * feat: moved to pyproject.toml; closes #162 ([`c86ce30`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/c86ce302a964d71ee631f0817609ab5aa0e3ab0f))
148
-
149
- ### Fix
150
-
151
- * fix: fixed semver job and upgraded to v9 ([`32e1a9d`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/32e1a9d8472eb1c25d30697d407a8ffecd04e75d))
152
-
153
- ### Refactor
154
-
155
- * refactor: applied formatter ([`4117fd7`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/4117fd7b5b2090ff4fb7ad9e0d92cc87cd13ed5f))
156
-
157
-
158
- ## v0.52.1 (2024-05-08)
159
-
160
- ### Fix
161
-
162
- * fix(docstrings): docstrings formating fixed for sphinx to properly format readdocs ([`7f2f7cd`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/7f2f7cd07a14876617cd83cedde8c281fdc52c3a))
163
-
164
-
165
- ## v0.52.0 (2024-05-07)
166
-
167
- ### Feature
168
-
169
- * feat(utils/layout_manager): added GridLayoutManager to extend functionalities of native QGridLayout ([`fcd6ef0`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/fcd6ef0975dc872f69c9d6fb2b8a1ad04a423aae))
170
-
171
- * feat(widget/dock): BECDock and BECDock area for dockable windows ([`d8ff8af`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/d8ff8afcd474660a6069bbdab05f10a65f221727))
172
-
173
- ### Fix
174
-
175
- * fix(widgets/dock): BECDockArea close overwrites the default pyqtgraph Container close + minor improvements ([`ceae979`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/ceae979f375ecc33c5c97148f197655c1ca57b6c))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.57.0
3
+ Version: 0.57.2
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
@@ -27,6 +27,7 @@ Requires-Dist: pytest; extra == 'dev'
27
27
  Requires-Dist: pytest-qt; extra == 'dev'
28
28
  Requires-Dist: pytest-random-order; extra == 'dev'
29
29
  Requires-Dist: pytest-timeout; extra == 'dev'
30
+ Requires-Dist: pytest-xvfb; extra == 'dev'
30
31
  Provides-Extra: pyqt5
31
32
  Requires-Dist: pyqt5>=5.9; extra == 'pyqt5'
32
33
  Provides-Extra: pyqt6
@@ -30,7 +30,7 @@ class AutoUpdates:
30
30
  Create a default dock for the auto updates.
31
31
  """
32
32
  dock = self.gui.add_dock("default_figure")
33
- dock.add_widget_bec("BECFigure")
33
+ dock.add_widget("BECFigure")
34
34
  self.dock_name = "default_figure"
35
35
 
36
36
  @staticmethod
@@ -1468,20 +1468,20 @@ class BECDock(RPCBase):
1468
1468
  """
1469
1469
 
1470
1470
  @rpc_call
1471
- def add_widget_bec(
1471
+ def add_widget(
1472
1472
  self,
1473
- widget_type: "str",
1473
+ widget: "BECConnector | str",
1474
1474
  row=None,
1475
1475
  col=0,
1476
1476
  rowspan=1,
1477
1477
  colspan=1,
1478
1478
  shift: "Literal['down', 'up', 'left', 'right']" = "down",
1479
- ):
1479
+ ) -> "BECConnector":
1480
1480
  """
1481
1481
  Add a widget to the dock.
1482
1482
 
1483
1483
  Args:
1484
- widget_type(str): The widget to add. Only BEC RPC widgets from RPCWidgetHandler are allowed.
1484
+ widget(QWidget): The widget to add.
1485
1485
  row(int): The row to add the widget to. If None, the widget will be added to the next available row.
1486
1486
  col(int): The column to add the widget to.
1487
1487
  rowspan(int): The number of rows the widget should span.
@@ -1651,6 +1651,16 @@ class BECDockArea(RPCBase, BECGuiClientMixin):
1651
1651
  Get all registered RPC objects.
1652
1652
  """
1653
1653
 
1654
+ @property
1655
+ @rpc_call
1656
+ def temp_areas(self) -> "list":
1657
+ """
1658
+ Get the temporary areas in the dock area.
1659
+
1660
+ Returns:
1661
+ list: The temporary areas in the dock area.
1662
+ """
1663
+
1654
1664
 
1655
1665
  class SpiralProgressBar(RPCBase):
1656
1666
  @rpc_call
@@ -61,10 +61,54 @@ def rpc_call(func):
61
61
  return wrapper
62
62
 
63
63
 
64
+ def _get_output(process) -> None:
65
+ try:
66
+ os.set_blocking(process.stdout.fileno(), False)
67
+ os.set_blocking(process.stderr.fileno(), False)
68
+ while process.poll() is None:
69
+ readylist, _, _ = select.select([process.stdout, process.stderr], [], [], 1)
70
+ if process.stdout in readylist:
71
+ output = process.stdout.read(1024)
72
+ if output:
73
+ print(output, end="")
74
+ if process.stderr in readylist:
75
+ error_output = process.stderr.read(1024)
76
+ if error_output:
77
+ print(error_output, end="", file=sys.stderr)
78
+ except Exception as e:
79
+ print(f"Error reading process output: {str(e)}")
80
+
81
+
82
+ def _start_plot_process(gui_id, gui_class, config) -> None:
83
+ """
84
+ Start the plot in a new process.
85
+ """
86
+ # pylint: disable=subprocess-run-check
87
+ monitor_module = importlib.import_module("bec_widgets.cli.server")
88
+ monitor_path = monitor_module.__file__
89
+
90
+ command = [
91
+ sys.executable,
92
+ "-u",
93
+ monitor_path,
94
+ "--id",
95
+ gui_id,
96
+ "--config",
97
+ config,
98
+ "--gui_class",
99
+ gui_class.__name__,
100
+ ]
101
+ process = subprocess.Popen(command, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
102
+ process_output_processing_thread = threading.Thread(target=_get_output, args=(process,))
103
+ process_output_processing_thread.start()
104
+ return process, process_output_processing_thread
105
+
106
+
64
107
  class BECGuiClientMixin:
65
108
  def __init__(self, **kwargs) -> None:
66
109
  super().__init__(**kwargs)
67
110
  self._process = None
111
+ self._process_output_processing_thread = None
68
112
  self.auto_updates = self._get_update_script()
69
113
  self._target_endpoint = MessageEndpoints.scan_status()
70
114
  self._selected_device = None
@@ -118,7 +162,10 @@ class BECGuiClientMixin:
118
162
  Show the figure.
119
163
  """
120
164
  if self._process is None or self._process.poll() is not None:
121
- self._start_plot_process()
165
+ self._start_update_script()
166
+ self._process, self._process_output_processing_thread = _start_plot_process(
167
+ self._gui_id, self.__class__, self._client._service_config.redis
168
+ )
122
169
  while not self.gui_is_alive():
123
170
  print("Waiting for GUI to start...")
124
171
  time.sleep(1)
@@ -138,34 +185,6 @@ class BECGuiClientMixin:
138
185
  self._process = None
139
186
  self._client.shutdown()
140
187
 
141
- def _start_plot_process(self) -> None:
142
- """
143
- Start the plot in a new process.
144
- """
145
- self._start_update_script()
146
- # pylint: disable=subprocess-run-check
147
- config = self._client._service_config.redis
148
- monitor_module = importlib.import_module("bec_widgets.cli.server")
149
- monitor_path = monitor_module.__file__
150
- gui_class = self.__class__.__name__
151
-
152
- command = [
153
- sys.executable,
154
- "-u",
155
- monitor_path,
156
- "--id",
157
- self._gui_id,
158
- "--config",
159
- config,
160
- "--gui_class",
161
- gui_class,
162
- ]
163
- self._process = subprocess.Popen(
164
- command, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE
165
- )
166
- self._process_output_processing_thread = threading.Thread(target=self._get_output)
167
- self._process_output_processing_thread.start()
168
-
169
188
  def print_log(self) -> None:
170
189
  """
171
190
  Print the log of the plot process.
@@ -176,26 +195,6 @@ class BECGuiClientMixin:
176
195
  # Flush list
177
196
  self.stderr_output.clear()
178
197
 
179
- def _get_output(self) -> str:
180
- try:
181
- os.set_blocking(self._process.stdout.fileno(), False)
182
- os.set_blocking(self._process.stderr.fileno(), False)
183
- while self._process.poll() is None:
184
- readylist, _, _ = select.select(
185
- [self._process.stdout, self._process.stderr], [], [], 1
186
- )
187
- if self._process.stdout in readylist:
188
- output = self._process.stdout.read(1024)
189
- if output:
190
- print(output, end="")
191
- if self._process.stderr in readylist:
192
- error_output = self._process.stderr.read(1024)
193
- if error_output:
194
- print(error_output, end="", file=sys.stderr)
195
- self.stderr_output.append(error_output)
196
- except Exception as e:
197
- print(f"Error reading process output: {str(e)}")
198
-
199
198
 
200
199
  class RPCResponseTimeoutError(Exception):
201
200
  """Exception raised when an RPC response is not received within the expected time."""
@@ -104,19 +104,19 @@ class JupyterConsoleWindow(QWidget): # pragma: no cover:
104
104
  def _init_dock(self):
105
105
 
106
106
  self.d0 = self.dock.add_dock(name="dock_0")
107
- self.fig0 = self.d0.add_widget_bec("BECFigure")
107
+ self.fig0 = self.d0.add_widget("BECFigure")
108
108
  self.fig0.image("eiger", vrange=(0, 100))
109
109
 
110
110
  self.d1 = self.dock.add_dock(name="dock_1", position="right")
111
- self.fig1 = self.d1.add_widget_bec("BECFigure")
111
+ self.fig1 = self.d1.add_widget("BECFigure")
112
112
  self.fig1.plot(x_name="samx", y_name="bpm4i")
113
113
  self.fig1.plot(x_name="samx", y_name="bpm3a")
114
114
 
115
115
  self.d2 = self.dock.add_dock(name="dock_2", position="bottom")
116
- self.fig2 = self.d2.add_widget_bec("BECFigure", row=0, col=0)
116
+ self.fig2 = self.d2.add_widget("BECFigure", row=0, col=0)
117
117
  self.fig2.motor_map(x_name="samx", y_name="samy")
118
118
  self.fig2.plot(x_name="samx", y_name="bpm4i")
119
- self.bar = self.d2.add_widget_bec("SpiralProgressBar", row=0, col=1)
119
+ self.bar = self.d2.add_widget("SpiralProgressBar", row=0, col=1)
120
120
  self.bar.set_diameter(200)
121
121
 
122
122
  self.dock.save_state()
@@ -33,7 +33,7 @@ class BECDock(BECConnector, Dock):
33
33
  "hide_title_bar",
34
34
  "get_widgets_positions",
35
35
  "set_title",
36
- "add_widget_bec",
36
+ "add_widget",
37
37
  "list_eligible_widgets",
38
38
  "move_widget",
39
39
  "remove_widget",
@@ -152,47 +152,47 @@ class BECDock(BECConnector, Dock):
152
152
  """
153
153
  return list(RPCWidgetHandler.widget_classes.keys())
154
154
 
155
- def add_widget_bec(
156
- self,
157
- widget_type: str,
158
- row=None,
159
- col=0,
160
- rowspan=1,
161
- colspan=1,
162
- shift: Literal["down", "up", "left", "right"] = "down",
163
- ):
164
- """
165
- Add a widget to the dock.
166
-
167
- Args:
168
- widget_type(str): The widget to add. Only BEC RPC widgets from RPCWidgetHandler are allowed.
169
- row(int): The row to add the widget to. If None, the widget will be added to the next available row.
170
- col(int): The column to add the widget to.
171
- rowspan(int): The number of rows the widget should span.
172
- colspan(int): The number of columns the widget should span.
173
- shift(Literal["down", "up", "left", "right"]): The direction to shift the widgets if the position is occupied.
174
- """
175
- if row is None:
176
- row = self.layout.rowCount()
177
-
178
- if self.layout_manager.is_position_occupied(row, col):
179
- self.layout_manager.shift_widgets(shift, start_row=row)
180
-
181
- widget = RPCWidgetHandler.create_widget(widget_type)
182
- self.addWidget(widget, row=row, col=col, rowspan=rowspan, colspan=colspan)
183
- self.config.widgets[widget.gui_id] = widget.config
184
-
185
- return widget
155
+ # def add_widget_bec(
156
+ # self,
157
+ # widget_type: str,
158
+ # row=None,
159
+ # col=0,
160
+ # rowspan=1,
161
+ # colspan=1,
162
+ # shift: Literal["down", "up", "left", "right"] = "down",
163
+ # ):
164
+ # """
165
+ # Add a widget to the dock.
166
+ #
167
+ # Args:
168
+ # widget_type(str): The widget to add. Only BEC RPC widgets from RPCWidgetHandler are allowed.
169
+ # row(int): The row to add the widget to. If None, the widget will be added to the next available row.
170
+ # col(int): The column to add the widget to.
171
+ # rowspan(int): The number of rows the widget should span.
172
+ # colspan(int): The number of columns the widget should span.
173
+ # shift(Literal["down", "up", "left", "right"]): The direction to shift the widgets if the position is occupied.
174
+ # """
175
+ # if row is None:
176
+ # row = self.layout.rowCount()
177
+ #
178
+ # if self.layout_manager.is_position_occupied(row, col):
179
+ # self.layout_manager.shift_widgets(shift, start_row=row)
180
+ #
181
+ # widget = RPCWidgetHandler.create_widget(widget_type)
182
+ # self.addWidget(widget, row=row, col=col, rowspan=rowspan, colspan=colspan)
183
+ # self.config.widgets[widget.gui_id] = widget.config
184
+ #
185
+ # return widget
186
186
 
187
187
  def add_widget(
188
188
  self,
189
- widget: QWidget,
189
+ widget: BECConnector | str,
190
190
  row=None,
191
191
  col=0,
192
192
  rowspan=1,
193
193
  colspan=1,
194
194
  shift: Literal["down", "up", "left", "right"] = "down",
195
- ):
195
+ ) -> BECConnector:
196
196
  """
197
197
  Add a widget to the dock.
198
198
 
@@ -210,8 +210,17 @@ class BECDock(BECConnector, Dock):
210
210
  if self.layout_manager.is_position_occupied(row, col):
211
211
  self.layout_manager.shift_widgets(shift, start_row=row)
212
212
 
213
+ if isinstance(widget, str):
214
+ widget = RPCWidgetHandler.create_widget(widget)
215
+ else:
216
+ widget = widget
217
+
213
218
  self.addWidget(widget, row=row, col=col, rowspan=rowspan, colspan=colspan)
214
- self.config.widgets[widget.gui_id] = widget.config
219
+
220
+ if hasattr(widget, "config"):
221
+ self.config.widgets[widget.gui_id] = widget.config
222
+
223
+ return widget
215
224
 
216
225
  def move_widget(self, widget: QWidget, new_row: int, new_col: int):
217
226
  """
@@ -33,6 +33,7 @@ class BECDockArea(BECConnector, DockArea):
33
33
  "detach_dock",
34
34
  "attach_all",
35
35
  "get_all_rpc",
36
+ "temp_areas",
36
37
  ]
37
38
 
38
39
  def __init__(
@@ -70,9 +71,22 @@ class BECDockArea(BECConnector, DockArea):
70
71
 
71
72
  @panels.setter
72
73
  def panels(self, value: dict):
73
-
74
74
  self.docks = WeakValueDictionary(value)
75
75
 
76
+ @property
77
+ def temp_areas(self) -> list:
78
+ """
79
+ Get the temporary areas in the dock area.
80
+
81
+ Returns:
82
+ list: The temporary areas in the dock area.
83
+ """
84
+ return list(map(str, self.tempAreas))
85
+
86
+ @temp_areas.setter
87
+ def temp_areas(self, value: list):
88
+ self.tempAreas = list(map(str, value))
89
+
76
90
  def restore_state(
77
91
  self, state: dict = None, missing: Literal["ignore", "error"] = "ignore", extra="bottom"
78
92
  ):
@@ -107,6 +121,7 @@ class BECDockArea(BECConnector, DockArea):
107
121
  name(str): The name of the dock to remove.
108
122
  """
109
123
  dock = self.docks.pop(name, None)
124
+ self.config.docks.pop(name, None)
110
125
  if dock:
111
126
  dock.close()
112
127
  if len(self.docks) <= 1:
@@ -171,9 +186,7 @@ class BECDockArea(BECConnector, DockArea):
171
186
  dock.show_title_bar()
172
187
 
173
188
  if widget is not None and isinstance(widget, str):
174
- dock.add_widget_bec(
175
- widget_type=widget, row=row, col=col, rowspan=rowspan, colspan=colspan
176
- )
189
+ dock.add_widget(widget=widget, row=row, col=col, rowspan=rowspan, colspan=colspan)
177
190
  elif widget is not None and isinstance(widget, QWidget):
178
191
  dock.addWidget(widget, row=row, col=col, rowspan=rowspan, colspan=colspan)
179
192
  if self._instructions_visible:
@@ -192,7 +205,7 @@ class BECDockArea(BECConnector, DockArea):
192
205
  BECDock: The undocked dock.
193
206
  """
194
207
  dock = self.docks[dock_name]
195
- self.floatDock(dock)
208
+ dock.detach()
196
209
  return dock
197
210
 
198
211
  def attach_all(self):
@@ -317,7 +317,7 @@ class BECMotorMap(BECPlotBase):
317
317
  Returns:
318
318
  float: Motor initial position.
319
319
  """
320
- init_position = round(self.dev[name].read()[entry]["value"], precision)
320
+ init_position = round(float(self.dev[name].read()[entry]["value"]), precision)
321
321
  return init_position
322
322
 
323
323
  def _validate_signal_entries(
@@ -403,7 +403,7 @@ class BECMotorMap(BECPlotBase):
403
403
  # Update plot title
404
404
  precision = self.config.precision
405
405
  self.set_title(
406
- f"Motor position: ({round(current_x,precision)}, {round(current_y,precision)})"
406
+ f"Motor position: ({round(float(current_x),precision)}, {round(float(current_y),precision)})"
407
407
  )
408
408
 
409
409
  @pyqtSlot(dict)
@@ -577,7 +577,6 @@ class BECWaveform(BECPlotBase):
577
577
  Returns:
578
578
  dict | pd.DataFrame: Data of all curves in the specified format.
579
579
  """
580
-
581
580
  data = {}
582
581
  try:
583
582
  import pandas as pd
@@ -115,7 +115,8 @@ class Ring(BECConnector):
115
115
 
116
116
  def set_value(self, value: int | float):
117
117
  self.config.value = round(
118
- max(self.config.min_value, min(self.config.max_value, value)), self.config.precision
118
+ float(max(self.config.min_value, min(self.config.max_value, value))),
119
+ self.config.precision,
119
120
  )
120
121
 
121
122
  def set_color(self, color: str | tuple):
@@ -20,7 +20,7 @@ In the following, we describe 4 different type of widgets thaat are available in
20
20
  The following code snipped demonstrates how to create a 1D waveform plot using BEC Widgets within BEC. More details about BEC Widgets in BEC can be found in the getting started section within the [introduction to the command line.](user.command_line_introduction)
21
21
  ```python
22
22
  # adds a new dock, a new BECFigure and a BECWaveForm to the dock
23
- plt = gui.add_dock().add_widget_bec('BECFigure').plot('samx', 'bpm4i')
23
+ plt = gui.add_dock().add_widget('BECFigure').plot('samx', 'bpm4i')
24
24
  # add a second curve to the same plot
25
25
  plt.add_curve_scan('samx', 'bpm3i')
26
26
  plt.set_title("Gauss plots vs. samx")
@@ -53,7 +53,7 @@ dev.bpm3i.sim.select_sim_model("StepModel")
53
53
  The following code snipped demonstrates how to create a 2D scatter plot using BEC Widgets within BEC.
54
54
  ```python
55
55
  # adds a new dock, a new BECFigure and a BECWaveForm to the dock
56
- plt = gui.add_dock().add_widget_bec('BECFigure').add_plot('samx', 'samy', 'bpm4i')
56
+ plt = gui.add_dock().add_widget('BECFigure').add_plot('samx', 'samy', 'bpm4i')
57
57
  ```
58
58
 
59
59
  (user.widgets.motor_map)=
@@ -72,7 +72,7 @@ plt = gui.add_dock().add_widget_bec('BECFigure').add_plot('samx', 'samy', 'bpm4i
72
72
  The following code snipped demonstrates how to create a motor map using BEC Widgets within BEC.
73
73
  ```python
74
74
  # add a motor map to the gui
75
- mot_map = gui.add_dock().add_widget_bec('BECFigure').motor_map('samx', 'samy')
75
+ mot_map = gui.add_dock().add_widget('BECFigure').motor_map('samx', 'samy')
76
76
  # change the number of points displayed
77
77
  ```
78
78
 
@@ -91,7 +91,7 @@ mot_map = gui.add_dock().add_widget_bec('BECFigure').motor_map('samx', 'samy')
91
91
  The following code snipped demonstrates how to create a motor map using BEC Widgets within BEC.
92
92
  ```python
93
93
  # add a camera view for the eiger camera to the gui
94
- cam_widget = gui.add_dock().add_widget_bec('BECFigure').image('eiger')
94
+ cam_widget = gui.add_dock().add_widget('BECFigure').image('eiger')
95
95
  # set the title of the camera view
96
96
  cam_widget.set_title("Camera Image Eiger")
97
97
  # change the color map range, e.g. from 0 to 100, per default it is autoscaling
@@ -15,7 +15,7 @@
15
15
  The following code snipped demonstrates how to create a 2D scatter plot using BEC Widgets within BEC.
16
16
  ```python
17
17
  # adds a new dock with a spiral progress bar
18
- progress = gui.add_dock().add_widget_bec("SpiralProgressBar")
18
+ progress = gui.add_dock().add_widget("SpiralProgressBar")
19
19
  # customize the size of the ring
20
- progress.set_line_widfth(20)
20
+ progress.set_line_width(20)
21
21
  ```
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_widgets"
7
- version = "0.57.0"
7
+ version = "0.57.2"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -31,6 +31,7 @@ dev = [
31
31
  "pytest",
32
32
  "pytest-random-order",
33
33
  "pytest-timeout",
34
+ "pytest-xvfb",
34
35
  "coverage",
35
36
  "pytest-qt",
36
37
  "isort",
@@ -0,0 +1,55 @@
1
+ import random
2
+ import time
3
+ from contextlib import contextmanager
4
+
5
+ import pytest
6
+ from bec_lib.endpoints import MessageEndpoints
7
+
8
+ from bec_widgets.cli.client_utils import _start_plot_process
9
+ from bec_widgets.cli.rpc_register import RPCRegister
10
+ from bec_widgets.utils import BECDispatcher
11
+ from bec_widgets.widgets import BECDockArea, BECFigure
12
+
13
+
14
+ # make threads check in autouse, **will be executed at the end**; better than
15
+ # having it in fixtures for each test, since it prevents from needing to
16
+ # 'manually' shutdown bec_client_lib (for example) to make it happy, whereas
17
+ # whereas in fact bec_client_lib makes its on cleanup
18
+ @pytest.fixture(autouse=True)
19
+ def threads_check_fixture(threads_check):
20
+ return
21
+
22
+
23
+ @pytest.fixture
24
+ def gui_id():
25
+ return f"figure_{random.randint(0,100)}" # make a new gui id each time, to ensure no 'gui is alive' zombie key can perturbate
26
+
27
+
28
+ @contextmanager
29
+ def plot_server(gui_id, klass, client_lib):
30
+ dispatcher = BECDispatcher(client=client_lib) # Has to init singleton with fixture client
31
+ process, output_thread = _start_plot_process(
32
+ gui_id, klass, client_lib._client._service_config.redis
33
+ )
34
+ try:
35
+ while client_lib._client.connector.get(MessageEndpoints.gui_heartbeat(gui_id)) is None:
36
+ time.sleep(0.3)
37
+ yield gui_id
38
+ finally:
39
+ process.terminate()
40
+ process.wait()
41
+ output_thread.join()
42
+ dispatcher.disconnect_all()
43
+ dispatcher.reset_singleton()
44
+
45
+
46
+ @pytest.fixture
47
+ def rpc_server_figure(gui_id, bec_client_lib):
48
+ with plot_server(gui_id, BECFigure, bec_client_lib) as server:
49
+ yield server
50
+
51
+
52
+ @pytest.fixture
53
+ def rpc_server_dock(gui_id, bec_client_lib):
54
+ with plot_server(gui_id, BECDockArea, bec_client_lib) as server:
55
+ yield server