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.
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/CHANGELOG.md +32 -40
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/PKG-INFO +2 -1
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/auto_updates.py +1 -1
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/client.py +14 -4
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/client_utils.py +48 -49
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/jupyter_console/jupyter_console_window.py +4 -4
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/dock/dock.py +44 -35
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/dock/dock_area.py +18 -5
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py +2 -2
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/waveform/waveform.py +0 -1
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/spiral_progress_bar/ring.py +2 -1
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/bec_figure.md +4 -4
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/spiral_progress_bar.md +2 -2
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/pyproject.toml +2 -1
- bec_widgets-0.57.2/tests/end-2-end/conftest.py +55 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/end-2-end/test_bec_dock_rpc_e2e.py +72 -94
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/end-2-end/test_bec_figure_rpc_e2e.py +18 -30
- bec_widgets-0.57.2/tests/end-2-end/test_rpc_register_e2e.py +40 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_dock.py +1 -1
- bec_widgets-0.57.0/tests/end-2-end/conftest.py +0 -40
- bec_widgets-0.57.0/tests/end-2-end/test_rpc_register_e2e.py +0 -50
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.git_hooks/pre-commit +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitignore +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/issue_templates/bug_report_template.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/issue_templates/documentation_update_template.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/issue_templates/feature_request_template.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab/merge_request_templates/default.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.gitlab-ci.yml +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.pylintrc +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/.readthedocs.yaml +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/LICENSE +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/README.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/assets/bec_widgets_icon.png +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/assets/terminal_icon.png +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/generate_cli.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/rpc_register.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/rpc_wigdet_handler.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/cli/server.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/jupyter_console/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/jupyter_console/jupyter_console_window.ui +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/motor_movement/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/motor_movement/motor_control_compilations.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/examples/motor_movement/motor_controller.ui +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/bec_connector.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/bec_dispatcher.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/bec_table.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/colors.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/container_utils.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/crosshair.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/entry_validator.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/layout_manager.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/plugin_utils.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/rpc_decorator.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/thread_checker.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/ui_loader.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/validator_delegate.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/widget_io.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/utils/yaml_dialog.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/dock/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/figure.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/image.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/image_item.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/image/image_processor.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/motor_map/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/plot_base.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/waveform/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/jupyter_console/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/jupyter_console/jupyter_console.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_control.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_table/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_table/motor_table.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/motor_table/motor_table.ui +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_absolute/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_absolute/movement_absolute.ui +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_relative/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/movement_relative/movement_relative.ui +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/selection/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/selection/selection.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/motor_control/selection/selection.ui +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/scan_control/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/scan_control/scan_control.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/spiral_progress_bar/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/spiral_progress_bar/spiral_progress_bar.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/toolbar/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/toolbar/toolbar.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/Makefile +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/_static/custom.css +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/_templates/custom-class-template.rst +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/_templates/custom-module-template.rst +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/api_reference/api_reference.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/apps_48dp.svg +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/display_settings_48dp.svg +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_api.svg +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_contribute.svg +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_getting_started.svg +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/index_user_guide.svg +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/assets/rocket_launch_48dp.svg +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/conf.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/developer/developer.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/index.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/introduction/introduction.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/make.bat +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/requirements.txt +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/api_reference/api_reference.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/applications/applications.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/customisation.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/command_line_introduction.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/getting_started.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/gui_complex_gui.gif +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/getting_started/installation.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/user.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/image_plot.gif +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/motor.gif +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/progress_bar.gif +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/scatter_2D.gif +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/w1D.gif +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/docs/user/widgets/widgets.md +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/end-2-end/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/client_mocks.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/conftest.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_connector.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_dispatcher.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_figure.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_bec_motor_map.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_client_utils.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_configs/config_device.yaml +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_configs/config_scan.yaml +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_crosshair.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_generate_cli_client.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_motor_control.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_msgs/__init__.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_msgs/available_scans_message.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_plot_base.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_rpc_register.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_scan_control.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_spiral_progress_bar.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_waveform1d.py +0 -0
- {bec_widgets-0.57.0 → bec_widgets-0.57.2}/tests/unit_tests/test_widget_io.py +0 -0
- {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.
|
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
|
@@ -1468,20 +1468,20 @@ class BECDock(RPCBase):
|
|
1468
1468
|
"""
|
1469
1469
|
|
1470
1470
|
@rpc_call
|
1471
|
-
def
|
1471
|
+
def add_widget(
|
1472
1472
|
self,
|
1473
|
-
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
-
"
|
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
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
):
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
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:
|
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
|
-
|
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.
|
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
|
-
|
208
|
+
dock.detach()
|
196
209
|
return dock
|
197
210
|
|
198
211
|
def attach_all(self):
|
{bec_widgets-0.57.0 → bec_widgets-0.57.2}/bec_widgets/widgets/figure/plots/motor_map/motor_map.py
RENAMED
@@ -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)
|
@@ -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)),
|
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().
|
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().
|
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().
|
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().
|
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().
|
18
|
+
progress = gui.add_dock().add_widget("SpiralProgressBar")
|
19
19
|
# customize the size of the ring
|
20
|
-
progress.
|
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.
|
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
|