bec-widgets 0.82.2__py3-none-any.whl → 0.83.1__py3-none-any.whl

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 (46) hide show
  1. .gitlab-ci.yml +3 -0
  2. CHANGELOG.md +42 -46
  3. PKG-INFO +2 -2
  4. bec_widgets/examples/jupyter_console/jupyter_console_window.py +2 -2
  5. bec_widgets/qt_utils/toolbar.py +3 -1
  6. bec_widgets/utils/bec_connector.py +2 -0
  7. bec_widgets/utils/bec_widget.py +6 -0
  8. bec_widgets/utils/colors.py +27 -0
  9. bec_widgets/utils/generate_designer_plugin.py +6 -5
  10. bec_widgets/utils/reference_utils.py +92 -0
  11. bec_widgets/widgets/bec_status_box/bec_status_box.py +2 -2
  12. bec_widgets/widgets/console/console.py +1 -1
  13. bec_widgets/widgets/device_box/__init__.py +0 -0
  14. bec_widgets/widgets/device_box/device_box.py +197 -0
  15. bec_widgets/widgets/device_box/device_box.pyproject +1 -0
  16. bec_widgets/widgets/device_box/device_box.ui +179 -0
  17. bec_widgets/widgets/device_box/device_box_plugin.py +54 -0
  18. bec_widgets/widgets/device_box/register_device_box.py +15 -0
  19. bec_widgets/widgets/figure/figure.py +5 -6
  20. bec_widgets/widgets/figure/plots/axis_settings.py +2 -2
  21. bec_widgets/widgets/position_indicator/position_indicator.py +71 -0
  22. bec_widgets/widgets/position_indicator/position_indicator.pyproject +1 -0
  23. bec_widgets/widgets/position_indicator/position_indicator_plugin.py +54 -0
  24. bec_widgets/widgets/position_indicator/register_position_indicator.py +17 -0
  25. bec_widgets/widgets/scan_control/scan_control.py +2 -2
  26. bec_widgets/widgets/spinner/__init__.py +0 -0
  27. bec_widgets/widgets/spinner/register_spinner_widget.py +15 -0
  28. bec_widgets/widgets/spinner/spinner.py +86 -0
  29. bec_widgets/widgets/spinner/spinner_widget.pyproject +1 -0
  30. bec_widgets/widgets/spinner/spinner_widget_plugin.py +54 -0
  31. bec_widgets/widgets/vscode/vscode.py +0 -14
  32. bec_widgets/widgets/website/website.py +1 -1
  33. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.1.dist-info}/METADATA +2 -2
  34. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.1.dist-info}/RECORD +46 -24
  35. pyproject.toml +2 -2
  36. tests/references/SpinnerWidget/SpinnerWidget_darwin.png +0 -0
  37. tests/references/SpinnerWidget/SpinnerWidget_linux.png +0 -0
  38. tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png +0 -0
  39. tests/references/SpinnerWidget/SpinnerWidget_started_linux.png +0 -0
  40. tests/unit_tests/client_mocks.py +9 -1
  41. tests/unit_tests/test_device_box.py +98 -0
  42. tests/unit_tests/test_spinner.py +30 -0
  43. tests/unit_tests/test_vscode_widget.py +27 -32
  44. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.1.dist-info}/WHEEL +0 -0
  45. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.1.dist-info}/entry_points.txt +0 -0
  46. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec_widgets
3
- Version: 0.82.2
3
+ Version: 0.83.1
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
@@ -14,9 +14,9 @@ Requires-Dist: bec-lib~=2.16
14
14
  Requires-Dist: black~=24.0
15
15
  Requires-Dist: isort>=5.13.2,~=5.13
16
16
  Requires-Dist: pydantic~=2.0
17
- Requires-Dist: pyqtdarktheme~=2.1
18
17
  Requires-Dist: pyqtgraph~=0.13
19
18
  Requires-Dist: pyte
19
+ Requires-Dist: qdarkstyle>=3.2.2
20
20
  Requires-Dist: qtconsole>=5.5.1,~=5.5
21
21
  Requires-Dist: qtpy~=2.4
22
22
  Provides-Extra: dev
@@ -1,12 +1,12 @@
1
1
  .gitignore,sha256=cMQ1MLmnoR88aMCCJwUyfoTnufzl4-ckmHtlFUqHcT4,3253
2
- .gitlab-ci.yml,sha256=vuDJPAYOK0995_H6fu0N5dIgIrOJgTvKr0HZkNWlxMw,8142
2
+ .gitlab-ci.yml,sha256=zvb4A6QI5lQTsdfI5nPPL-tUNfcrz__SQjxW03QZ5Ek,8204
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=7VVqe14x1w6butWm_Du8rzXRFtf3RQYV3CsURU1-uT0,6428
5
+ CHANGELOG.md,sha256=XIRZNOiAJ6U-HWIqQIZQrJ-seB-mrY8_bRoAA-QMH6w,6629
6
6
  LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=9lGCW5x2H2CEYe7DJsHs1LlXB0Pn_hr7efNeRFUGzgo,1309
7
+ PKG-INFO,sha256=DQQ4PF3OQf7ROCg2O2cIkgZoV2jsXd_1z6I-P2Z5Px0,1308
8
8
  README.md,sha256=Od69x-RS85Hph0-WwWACwal4yUd67XkEn4APEfHhHFw,2649
9
- pyproject.toml,sha256=Jsa50E-GnKAaTBdJplPyg-B7sHQsIPL2GS-IHwugDFA,2358
9
+ pyproject.toml,sha256=LyalVcXB0KNBOfUgjPnaHLv6kQFZCn7vvbFlnjZ_bnc,2357
10
10
  .git_hooks/pre-commit,sha256=n3RofIZHJl8zfJJIUomcMyYGFi_rwq4CC19z0snz3FI,286
11
11
  .gitlab/issue_templates/bug_report_template.md,sha256=gAuyEwl7XlnebBrkiJ9AqffSNOywmr8vygUFWKTuQeI,386
12
12
  .gitlab/issue_templates/documentation_update_template.md,sha256=FHLdb3TS_D9aL4CYZCjyXSulbaW5mrN2CmwTaeLPbNw,860
@@ -25,7 +25,7 @@ bec_widgets/cli/rpc_wigdet_handler.py,sha256=6kQng2DyS6rhLJqSJ7xa0kdgSxp-35A2upc
25
25
  bec_widgets/cli/server.py,sha256=FZkqsjUHIkCUFMKUFm7ls_eslXvhIFzLpINEYxeWP5s,7722
26
26
  bec_widgets/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  bec_widgets/examples/jupyter_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=oOVCTY68bAn9HDFd5W_xNqQhI7Nsm7TaqYYLqLWXo2w,5520
28
+ bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=S6OTEp8i1sWRyfB9ZBhl64ZaqBvjonI9xqqtWv2Amp4,5540
29
29
  bec_widgets/examples/jupyter_console/jupyter_console_window.ui,sha256=2A2mNTUMZBYygz8K4qWzrcjnNqZBMVyeHm26iLZVRWI,1473
30
30
  bec_widgets/examples/plugin_example_pyside/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  bec_widgets/examples/plugin_example_pyside/main.py,sha256=xdC6RWSRt1rW8Prj0CsDeCPct6-_j3__oJmdgogB5PI,505
@@ -36,20 +36,21 @@ bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py,sha256=BBt3MD8oDLU
36
36
  bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py,sha256=LNwplI6deUdKY6FOhUuWBanotxk9asF2G-6k7lFfA8Y,2301
37
37
  bec_widgets/qt_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  bec_widgets/qt_utils/settings_dialog.py,sha256=rR_Zk4RGTnI4dz5OEzCc13lVpxlOKuwOf4_7wqXSbRw,3373
39
- bec_widgets/qt_utils/toolbar.py,sha256=r6H4A8_3s2AItmdV8JS9UMSM4hV8Fx_162grYL2Pwzw,2111
39
+ bec_widgets/qt_utils/toolbar.py,sha256=UUvC_AwUW3d6MqAzRJIBBqNWLrvBQI9UvekJ9Dw1A-w,2142
40
40
  bec_widgets/utils/__init__.py,sha256=1930ji1Jj6dVuY81Wd2kYBhHYNV-2R0bN_L4o9zBj1U,533
41
- bec_widgets/utils/bec_connector.py,sha256=JScGWHEt4kh6C-C0O_JV_bOuiQlBjYTAPJktqgeAj70,9534
41
+ bec_widgets/utils/bec_connector.py,sha256=NypWbIrqb2ls3SIpflM6KihidV9fkroiJu2tQk6KwOA,9604
42
42
  bec_widgets/utils/bec_designer.py,sha256=ak3G8FdojUPjVBBwdPXw7tN5P2Uxr-SSoQt394jXeAA,4308
43
43
  bec_widgets/utils/bec_dispatcher.py,sha256=dghOw63Ql6rQ-zH1ZaYU6kT9Dg5kNDcZwEdu2YPBJeU,6150
44
44
  bec_widgets/utils/bec_table.py,sha256=nA2b8ukSeUfquFMAxGrUVOqdrzMoDYD6O_4EYbOG2zk,717
45
- bec_widgets/utils/bec_widget.py,sha256=Y-t90XMe2PASvY96Xve5a_jevXqnxk1SJ-mfy6ULC9Y,59
46
- bec_widgets/utils/colors.py,sha256=CP_lwj757CpwdVhWSfdNEXKFCEVVVF48DizD2WJKSwI,9759
45
+ bec_widgets/utils/bec_widget.py,sha256=eC7jhCqyABDf_wGbM6cCdtSF4__rpnVs2Ir1XzGHrCs,238
46
+ bec_widgets/utils/colors.py,sha256=RAGaA4jdvsFSxGlbhSBYL5mdlwS-9rq45tJM7U-7xXs,10587
47
47
  bec_widgets/utils/container_utils.py,sha256=m3VUyAYmSWkEwApP9tBvKxPYVtc2kHw4toxIpMryJy4,1495
48
48
  bec_widgets/utils/crosshair.py,sha256=SubY4FQCI6vUKsmMYGKHR7uYdGQJ6vhoYLuC1XlKS9I,9626
49
49
  bec_widgets/utils/entry_validator.py,sha256=3skJIsUwTYicT76AMHm_M78RiWtUgyD2zb-Rxo2HdHQ,1313
50
- bec_widgets/utils/generate_designer_plugin.py,sha256=T6DqL29sN4LcXLH8Hoa410UGnoRzjsZ-z0PRGTEzkRE,5809
50
+ bec_widgets/utils/generate_designer_plugin.py,sha256=JlkJo0Iu5dA_7HQ0silT8kLnYHhKZ8fKUFeysm1k0l0,5878
51
51
  bec_widgets/utils/layout_manager.py,sha256=H0nKsIMaPxRkof1MEXlSmW6w1dFxA6astaGzf4stI84,4727
52
52
  bec_widgets/utils/plugin_utils.py,sha256=njvVdvF-AR47Yn80ntpvFldEvLuFx9GV-qEX4p_n4AI,5263
53
+ bec_widgets/utils/reference_utils.py,sha256=8pq06TOvZBZdim0G6hvPJXzVDib7ve4o-Ptvfp563nk,2859
53
54
  bec_widgets/utils/rpc_decorator.py,sha256=pIvtqySQLnuS7l2Ti_UAe4WX7CRivZnsE5ZdKAihxh0,479
54
55
  bec_widgets/utils/thread_checker.py,sha256=rDNuA3X6KQyA7JPb67mccTg0z8YkInynLAENQDQpbuE,1607
55
56
  bec_widgets/utils/ui_loader.py,sha256=9C4DkMIM8PEGXs2LmbZMyLVt38EIO9-T9C2UnK2SAvE,4882
@@ -67,7 +68,7 @@ bec_widgets/widgets/bec_queue/bec_queue.pyproject,sha256=VhoNmAv1DQUl9dg7dELyf5i
67
68
  bec_widgets/widgets/bec_queue/bec_queue_plugin.py,sha256=hDJm8Zd_GIDw2R8VYn4ytwrHVCmJUjC9dGDMae2omU0,1175
68
69
  bec_widgets/widgets/bec_queue/register_bec_queue.py,sha256=XnwtUSa1asK1b80knKWodcyX9qJy4DnKsQL_FoDfZy4,463
69
70
  bec_widgets/widgets/bec_status_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- bec_widgets/widgets/bec_status_box/bec_status_box.py,sha256=mZqwwMCkSqgHToQI6qBUElhP4PFzCgi_Fo5jr9qj1DU,13023
71
+ bec_widgets/widgets/bec_status_box/bec_status_box.py,sha256=3EunaSYlVemrrFsILfAacqTqaFIuNxnTd7mb_xrfi3k,13043
71
72
  bec_widgets/widgets/bec_status_box/bec_status_box.pyproject,sha256=JWtx3Csfn2h7ODtk10HtyBNLf6tFIqyU6g04rMWOO1U,32
72
73
  bec_widgets/widgets/bec_status_box/bec_status_box_plugin.py,sha256=CNFIETpkORLQ9J3l91jefiRLJs5Ru3nsWIPoUwaRbB0,1242
73
74
  bec_widgets/widgets/bec_status_box/register_bec_status_box.py,sha256=EiQITnkNw7IU7hE776wAeXro97eZd9XlsB9essgCebE,481
@@ -78,7 +79,13 @@ bec_widgets/widgets/color_button/color_button.pyproject,sha256=LUYF4VkDOB4ttVe7Y
78
79
  bec_widgets/widgets/color_button/color_button_plugin.py,sha256=CvO3L6r8pBd-0DNuqjQ7uKF9u1mU6xFs23sS_dsj4tw,1256
79
80
  bec_widgets/widgets/color_button/register_color_button.py,sha256=ZAx3t7G2VI2S-1qcEof31Xi9O0X8deLeZNgS651L1JI,475
80
81
  bec_widgets/widgets/color_button/assets/color_button.png,sha256=dkjgGHSdxu98nM68O16fGpxBjxkkeLN8iu9M_8i5-NY,5618
81
- bec_widgets/widgets/console/console.py,sha256=EgKYlbW3NrRPoQwIr8x739sLd1IRBWkEy286VDQw0gA,17838
82
+ bec_widgets/widgets/console/console.py,sha256=IW1OerycmS-cm8CKGFig44Qye8mxsmVcKvLHAc3lXco,17845
83
+ bec_widgets/widgets/device_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ bec_widgets/widgets/device_box/device_box.py,sha256=ofYQJLY02pitmAJG0Y3GWBg8txNmaJDWhQVe9KFQDYA,6938
85
+ bec_widgets/widgets/device_box/device_box.pyproject,sha256=jtwvhaySJRdnuV99mEZT3htmWKVLphFeetEW4al7s-o,28
86
+ bec_widgets/widgets/device_box/device_box.ui,sha256=z7j60J4ZKYjH9eyHl6FnZ_Z8lkdq1LQftxveSZQ6g_w,4865
87
+ bec_widgets/widgets/device_box/device_box_plugin.py,sha256=n7l3OIKqtQGsL86ygDekb0wb4bBySJXMUo58eTtKIdQ,1212
88
+ bec_widgets/widgets/device_box/register_device_box.py,sha256=K7Hx4FIQDXasejaw6njwkFkkkwk63Smm6pHoOEdLWPw,467
82
89
  bec_widgets/widgets/device_combobox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
90
  bec_widgets/widgets/device_combobox/device_combobox.py,sha256=L6hPOk3LkTy9U_HRdU7bvqCH1L1Y_BuPYTTfl1eqShg,2824
84
91
  bec_widgets/widgets/device_combobox/device_combobox.pyproject,sha256=wI2eXR5ky_IM9-BCHJnH_9CEqYcZwIuLcgitSEr8OJU,40
@@ -95,9 +102,9 @@ bec_widgets/widgets/dock/__init__.py,sha256=B7foHt02gnhM7mFksa7GJVwT7n0j_JvYDCt6
95
102
  bec_widgets/widgets/dock/dock.py,sha256=joymi8NRoIuzuugUj9ccF9e1m57HwLQhhMmjaWiwTnM,7597
96
103
  bec_widgets/widgets/dock/dock_area.py,sha256=WKIt61v7w2YXahfIL4nddWHPfpTpw52uphX4QCbS3q0,7913
97
104
  bec_widgets/widgets/figure/__init__.py,sha256=3hGx_KOV7QHCYAV06aNuUgKq4QIYCjUTad-DrwkUaBM,44
98
- bec_widgets/widgets/figure/figure.py,sha256=bxaqwrgT4FXeFXA4dACIorWZ2ydJ5ddHux8Xghjw8Jk,32048
105
+ bec_widgets/widgets/figure/figure.py,sha256=5N9GvUMwOOcQgIR78olVhXjIb0W64vIpG6_8WPcoNsc,32014
99
106
  bec_widgets/widgets/figure/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
- bec_widgets/widgets/figure/plots/axis_settings.py,sha256=RMvbPgu8r1bk8zZz49hkUSHmcqRdw19zrsfLHcgDUIc,2261
107
+ bec_widgets/widgets/figure/plots/axis_settings.py,sha256=CCvJwo1RjpnLJG9TmGqf9fyPpUNyLT8k7pPEnqVuaGM,2281
101
108
  bec_widgets/widgets/figure/plots/axis_settings.ui,sha256=zMKZK6lH_3KJGO4RA_paXAH7UzZJ4Snlil3MK4pK3L8,11589
102
109
  bec_widgets/widgets/figure/plots/plot_base.py,sha256=7kPcUfC_Ub795DfUHdnIWccqjkrRSuE0AJ53wodbg-U,10420
103
110
  bec_widgets/widgets/figure/plots/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -124,12 +131,21 @@ bec_widgets/widgets/motor_map/motor_map_dialog/__init__.py,sha256=47DEQpj8HBSa-_
124
131
  bec_widgets/widgets/motor_map/motor_map_dialog/motor_map_settings.py,sha256=terJ5NHRzAsiUwdqg-hTbkQ5gadnRT0Ol0_Fm66kPF4,2011
125
132
  bec_widgets/widgets/motor_map/motor_map_dialog/motor_map_settings.ui,sha256=nv5vPftt6vcIl60OOZLRvwD29rdHVWOoGmz168BnwKw,2685
126
133
  bec_widgets/widgets/motor_map/motor_map_dialog/motor_map_toolbar.py,sha256=R6pmxhB_1ouc6f6cNQQvbxTHb3Ko3K_gTGs5WIYgnRI,2194
134
+ bec_widgets/widgets/position_indicator/position_indicator.py,sha256=QVlWvs_RvEJe5IMxGYCpi-CXYF7vFeMqEMFCs6u5NGc,2020
135
+ bec_widgets/widgets/position_indicator/position_indicator.pyproject,sha256=s0JEf5YkpMag19ddFSYeRZ8erBau7erO3bqw05YrTyg,36
136
+ bec_widgets/widgets/position_indicator/position_indicator_plugin.py,sha256=h9EQU4t6KdKVAZh5ILalpl1K8b7JMHf-2AFYREej2-w,1241
137
+ bec_widgets/widgets/position_indicator/register_position_indicator.py,sha256=OZNiMgM_80TPSAXK_0hXAkne4vUh8DGvh_OdpOiMpwI,516
127
138
  bec_widgets/widgets/ring_progress_bar/__init__.py,sha256=_uoJKnDM2YAeUBfwc5WLbIHSJj7zm_FAurSKP3WRaCw,47
128
139
  bec_widgets/widgets/ring_progress_bar/ring.py,sha256=19zFj-6ZrIPLXYqvs5EPcrmDWnfnSLlEOmzJffL4d3A,11241
129
140
  bec_widgets/widgets/ring_progress_bar/ring_progress_bar.py,sha256=sU4Dur2XzBVfDYAYazI6pjOZOhzggoQIuc9VD3PWgac,24073
130
141
  bec_widgets/widgets/scan_control/__init__.py,sha256=IOfHl15vxb_uC6KN62-PeUzbBha_vQyqkkXbJ2HU674,38
131
- bec_widgets/widgets/scan_control/scan_control.py,sha256=EHibpeK8vpG6rlg8zhvDDz8GDUzDmvhYH0aX7-Xo4m8,7689
142
+ bec_widgets/widgets/scan_control/scan_control.py,sha256=Jhr3kUaA_pd_80YK8UlPqoYk0MI-N4RfWXZM3J6uT-8,7709
132
143
  bec_widgets/widgets/scan_control/scan_group_box.py,sha256=wrrJLfI0apfll0NKpqM8ymlbl5NaqA9cKNgyfVdYR00,7420
144
+ bec_widgets/widgets/spinner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
+ bec_widgets/widgets/spinner/register_spinner_widget.py,sha256=_zCPjLh4M7NTSHP1Atdn6yu33zJ3LJkcBy3KOJ5eSVY,476
146
+ bec_widgets/widgets/spinner/spinner.py,sha256=6q2r6y9ISGc-PRFVTd0RhLu_-G7tftZs7CXQ-uRKT1U,2495
147
+ bec_widgets/widgets/spinner/spinner_widget.pyproject,sha256=zzLajGB3DTgVnrSqMey2jRpBlxTq9cBXZL9tWJCKe-I,25
148
+ bec_widgets/widgets/spinner/spinner_widget_plugin.py,sha256=ZcG1QIwpbriapM5ZrR4gQ-WA2a7ARhsstk8EIY-OGTU,1187
133
149
  bec_widgets/widgets/stop_button/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
150
  bec_widgets/widgets/stop_button/register_stop_button.py,sha256=U7r3fEOH-uPhAQI-nTituHXDDXDWR4JQZ7_vD6b_dfM,471
135
151
  bec_widgets/widgets/stop_button/stop_button.py,sha256=icJQT1k5G_nvdHWZZkGEZVQupt-mWd2viK8zYg5B5dI,793
@@ -144,9 +160,9 @@ bec_widgets/widgets/toggle/toggle.py,sha256=JzCGYoyHBrlBWCoyL94QX4zSLyEwWbCNHMeg
144
160
  bec_widgets/widgets/toggle/toggle_switch.pyproject,sha256=Msa-AS5H5XlqW65r8GlX2AxD8FnFnDyDgGnbKcXqKOw,24
145
161
  bec_widgets/widgets/toggle/toggle_switch_plugin.py,sha256=8e8JjUx6T5CIx7ixWLwVdT9JOJTbQ8aWwd3_9VAc_Mw,1177
146
162
  bec_widgets/widgets/vscode/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
- bec_widgets/widgets/vscode/vscode.py,sha256=ZyJJCJapYrGhqgudEt8JQn723DDqLdwjsXxXa5q3EkU,2544
163
+ bec_widgets/widgets/vscode/vscode.py,sha256=yV1D9PK2IYomq9yYfwqUOrZGIeBwMnNuBfXxBc2M8Qc,2231
148
164
  bec_widgets/widgets/website/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
- bec_widgets/widgets/website/website.py,sha256=iMOooGlZPQ5Y_T_7g4rJZXj-tKpbIupA1O6_WN27JuI,1722
165
+ bec_widgets/widgets/website/website.py,sha256=-5JG2dh7Ftw9xv8I4p08TxjaRzaql9XZDiv1iQOIFsU,1726
150
166
  docs/Makefile,sha256=i2WHuFlgfyAPEW4ssEP8NY4cOibDJrVjvzSEU8_Ggwc,634
151
167
  docs/conf.py,sha256=HxLxupNGu0Smhwn57g1kFdjZzFuaWVREgRJKhT1zi2k,2464
152
168
  docs/index.md,sha256=8ZCgaLIbJsYvt-jwi--QxsNwnK4-k3rejIeOOLclG40,1101
@@ -202,8 +218,12 @@ tests/end-2-end/test_bec_dock_rpc_e2e.py,sha256=uDhauuLEWg9Baf3N1KSeq6HPUWtuU6a9
202
218
  tests/end-2-end/test_bec_figure_rpc_e2e.py,sha256=mjg29huqTivLnukG_XyoMtjOy2P_7JACIhMEzahLXb8,6601
203
219
  tests/end-2-end/test_rpc_register_e2e.py,sha256=blhMiW7HVHX1kGm5dg8Sv0PeCuJ0gnBz3evznQFz_B8,1619
204
220
  tests/end-2-end/test_scan_control_e2e.py,sha256=u7oLgFyltkMW2apSZKDukMIXvYrbhHrU32p4mBdn8VE,2276
221
+ tests/references/SpinnerWidget/SpinnerWidget_darwin.png,sha256=OyiGxyQx0XCKEa1OeAZFVfFXHAllBDOjsvyTA_dDmoc,8353
222
+ tests/references/SpinnerWidget/SpinnerWidget_linux.png,sha256=OyiGxyQx0XCKEa1OeAZFVfFXHAllBDOjsvyTA_dDmoc,8353
223
+ tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png,sha256=NA7dOdKY-leFv8JI_5x3OIIY-XlSXSTIflVquz0UUZc,13784
224
+ tests/references/SpinnerWidget/SpinnerWidget_started_linux.png,sha256=NA7dOdKY-leFv8JI_5x3OIIY-XlSXSTIflVquz0UUZc,13784
205
225
  tests/unit_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
- tests/unit_tests/client_mocks.py,sha256=BTBpA75CqeJhqYCI5M5XSX2-e4wMoHxi2rnc1PnmsuE,4549
226
+ tests/unit_tests/client_mocks.py,sha256=_gtf12kTxmwaXKwSOG5Cc0dqVEY1PHi-hmqdTdLhLTk,4752
207
227
  tests/unit_tests/conftest.py,sha256=KrnktXPWmZhnKNue-xGWOLD1XGEvdz9Vf7V2eO3XQ3A,596
208
228
  tests/unit_tests/test_bec_connector.py,sha256=zGDfNHwLFZTbpyX6-yc7Pwzr2jWO_HGZ8T4NFCNo4IE,2444
209
229
  tests/unit_tests/test_bec_dispatcher.py,sha256=rYPiRizHaswhGZw55IBMneDFxmPiCCLAZQBqjEkpdyY,3992
@@ -216,6 +236,7 @@ tests/unit_tests/test_bec_status_box.py,sha256=gZdjyy9DNuUP9UwleTLj2Dp5HUImiqnkH
216
236
  tests/unit_tests/test_client_utils.py,sha256=CBdWIVJ_UiyFzTJnX3XJm4PGw2uXhFvRCP_Y9ifckbw,2630
217
237
  tests/unit_tests/test_color_validation.py,sha256=xbFbtFDia36XLgaNrX2IwvAX3IDC_Odpj5BGoJSgiIE,2389
218
238
  tests/unit_tests/test_crosshair.py,sha256=3OMAJ2ZaISYXMOtkXf1rPdy94vCr8njeLi6uHblBL9Q,5045
239
+ tests/unit_tests/test_device_box.py,sha256=q9IVFpt1NF3TBF0Jhk-I-LRiuvvHG3FGUalw4jEYwVo,3431
219
240
  tests/unit_tests/test_device_input_base.py,sha256=r1tI7BFAhpv7V7gf_n5gjusyrBFOfuCqIkdVg7YA7vY,2444
220
241
  tests/unit_tests/test_device_input_widgets.py,sha256=Q40xNKGvJT2dvNttRH68WZi0au8PwpUgBi2EB4LXfC8,5841
221
242
  tests/unit_tests/test_generate_cli_client.py,sha256=ng-eV5iF7Dhm-6YpxYo99CMY0KgqoaZBQNkMeKULDBU,3355
@@ -230,10 +251,11 @@ tests/unit_tests/test_rpc_widget_handler.py,sha256=ceQ3BPnBIFY2Hy-sDPw0wxxREVTTp
230
251
  tests/unit_tests/test_scan_control.py,sha256=Wr6KcE8av4sEIOx5VgYbzVCem3Jgb4Kzx_oOuvwlmkE,13459
231
252
  tests/unit_tests/test_scan_control_group_box.py,sha256=HNqjP10B_NonikspNwKz9upJU-t7xf6hwBerNhbC-uo,5563
232
253
  tests/unit_tests/test_setting_dialog.py,sha256=QbHWwLa1VGFwYie-SN3rjS3ICo7A44S4AKN2qeNvIKY,3137
254
+ tests/unit_tests/test_spinner.py,sha256=DshxDw1eKNsgMCgt7QKtXPOq-_Uz3OPwiFnqYepSFXU,794
233
255
  tests/unit_tests/test_stop_button.py,sha256=tpQanzBUyl7qLXjbMUQqm3U3vShbKKARcnLpgsu3P0E,789
234
256
  tests/unit_tests/test_text_box_widget.py,sha256=cT0uEHt_6d-FwST0A_wE9sFW9E3F_nJbKhuBAeU4yHg,1862
235
257
  tests/unit_tests/test_toggle.py,sha256=Amzgres7te0tTQIDR2WMKSx9Kce44TxMpIPR6HZygXQ,832
236
- tests/unit_tests/test_vscode_widget.py,sha256=NVB23ppLqIj-Opd8QnapqUJzDMz6mIZfm3wGPnFXyUE,2788
258
+ tests/unit_tests/test_vscode_widget.py,sha256=G1G7nCQGXFUn0BnMECE7mHmAm0C6pYx1JpEi_XEhodY,2682
237
259
  tests/unit_tests/test_waveform1d.py,sha256=inc-CyRA_3-PE99WnR6vDdfRE1vgp-ZoLVJ-Qbq0qFY,15967
238
260
  tests/unit_tests/test_website_widget.py,sha256=fBADIJJBAHU4Ro7u95kdemFVNv196UOcuO9oLHuHt8A,761
239
261
  tests/unit_tests/test_widget_io.py,sha256=FeL3ZYSBQnRt6jxj8VGYw1cmcicRQyHKleahw7XIyR0,3475
@@ -243,8 +265,8 @@ tests/unit_tests/test_configs/config_device_no_entry.yaml,sha256=hdvue9KLc_kfNzG
243
265
  tests/unit_tests/test_configs/config_scan.yaml,sha256=vo484BbWOjA_e-h6bTjSV9k7QaQHrlAvx-z8wtY-P4E,1915
244
266
  tests/unit_tests/test_msgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
245
267
  tests/unit_tests/test_msgs/available_scans_message.py,sha256=m_z97hIrjHXXMa2Ex-UvsPmTxOYXfjxyJaGkIY6StTY,46532
246
- bec_widgets-0.82.2.dist-info/METADATA,sha256=9lGCW5x2H2CEYe7DJsHs1LlXB0Pn_hr7efNeRFUGzgo,1309
247
- bec_widgets-0.82.2.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
248
- bec_widgets-0.82.2.dist-info/entry_points.txt,sha256=3otEkCdDB9LZJuBLzG4pFLK5Di0CVybN_12IsZrQ-58,166
249
- bec_widgets-0.82.2.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
250
- bec_widgets-0.82.2.dist-info/RECORD,,
268
+ bec_widgets-0.83.1.dist-info/METADATA,sha256=DQQ4PF3OQf7ROCg2O2cIkgZoV2jsXd_1z6I-P2Z5Px0,1308
269
+ bec_widgets-0.83.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
270
+ bec_widgets-0.83.1.dist-info/entry_points.txt,sha256=3otEkCdDB9LZJuBLzG4pFLK5Di0CVybN_12IsZrQ-58,166
271
+ bec_widgets-0.83.1.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
272
+ bec_widgets-0.83.1.dist-info/RECORD,,
pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_widgets"
7
- version = "0.82.2"
7
+ version = "0.83.1"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -19,7 +19,7 @@ dependencies = [
19
19
  "isort~=5.13, >=5.13.2", # needed for bw-generate-cli
20
20
  "pydantic~=2.0",
21
21
  "pyqtgraph~=0.13",
22
- "pyqtdarktheme~=2.1",
22
+ "qdarkstyle>=3.2.2",
23
23
  "qtconsole~=5.5, >=5.5.1", # needed for jupyter console
24
24
  "qtpy~=2.4",
25
25
  "pyte", # needed for vt100 console
@@ -49,11 +49,19 @@ class FakePositioner(FakeDevice):
49
49
  self.read_value = read_value
50
50
  self.name = name
51
51
 
52
+ @property
53
+ def precision(self):
54
+ return 3
55
+
52
56
  def set_read_value(self, value):
53
57
  self.read_value = value
54
58
 
55
59
  def read(self):
56
- return {self.name: {"value": self.read_value}}
60
+ return {
61
+ self.name: {"value": self.read_value},
62
+ f"{self.name}_setpoint": {"value": self.read_value},
63
+ f"{self.name}_motor_is_moving": {"value": 0},
64
+ }
57
65
 
58
66
  def set_limits(self, limits):
59
67
  self.limits = limits
@@ -0,0 +1,98 @@
1
+ from unittest import mock
2
+
3
+ import pytest
4
+ from bec_lib.endpoints import MessageEndpoints
5
+ from bec_lib.messages import ScanQueueMessage
6
+ from qtpy.QtGui import QValidator
7
+
8
+ from bec_widgets.widgets.device_box.device_box import DeviceBox
9
+
10
+ from .client_mocks import mocked_client
11
+
12
+
13
+ @pytest.fixture
14
+ def device_box(qtbot, mocked_client):
15
+ with mock.patch("bec_widgets.widgets.device_box.device_box.uuid.uuid4") as mock_uuid:
16
+ mock_uuid.return_value = "fake_uuid"
17
+ db = DeviceBox(device="samx", client=mocked_client)
18
+ qtbot.addWidget(db)
19
+ yield db
20
+
21
+
22
+ def test_device_box(device_box):
23
+ assert device_box.device == "samx"
24
+ data = device_box.dev["samx"].read()
25
+
26
+ setpoint_text = device_box.ui.setpoint.text()
27
+ # check that the setpoint is taken correctly after init
28
+ assert float(setpoint_text) == data["samx_setpoint"]["value"]
29
+
30
+ # check that the precision is taken correctly after init
31
+ precision = device_box.dev["samx"].precision
32
+ assert setpoint_text == f"{data['samx_setpoint']['value']:.{precision}f}"
33
+
34
+ # check that the step size is set according to the device precision
35
+ assert device_box.ui.step_size.value() == 10**-precision * 10
36
+
37
+
38
+ def test_device_box_update_limits(device_box):
39
+ device_box._limits = None
40
+ device_box.update_limits([0, 10])
41
+ assert device_box._limits == [0, 10]
42
+ assert device_box.setpoint_validator.bottom() == 0
43
+ assert device_box.setpoint_validator.top() == 10
44
+ assert device_box.setpoint_validator.validate("100", 0) == (
45
+ QValidator.State.Intermediate,
46
+ "100",
47
+ 0,
48
+ )
49
+
50
+ device_box.update_limits(None)
51
+ assert device_box._limits is None
52
+ assert device_box.setpoint_validator.validate("100", 0) == (
53
+ QValidator.State.Acceptable,
54
+ "100",
55
+ 0,
56
+ )
57
+
58
+
59
+ def test_device_box_on_stop(device_box):
60
+ with mock.patch.object(device_box.client.connector, "send") as mock_send:
61
+ device_box.on_stop()
62
+ params = {"device": "samx", "rpc_id": "fake_uuid", "func": "stop", "args": [], "kwargs": {}}
63
+ msg = ScanQueueMessage(
64
+ scan_type="device_rpc",
65
+ parameter=params,
66
+ queue="emergency",
67
+ metadata={"RID": "fake_uuid", "response": False},
68
+ )
69
+ mock_send.assert_called_once_with(MessageEndpoints.scan_queue_request(), msg)
70
+
71
+
72
+ def test_device_box_setpoint_change(device_box):
73
+ with mock.patch.object(device_box.dev["samx"], "move") as mock_move:
74
+ device_box.ui.setpoint.setText("100")
75
+ device_box.on_setpoint_change()
76
+ mock_move.assert_called_once_with(100, relative=False)
77
+
78
+
79
+ def test_device_box_on_tweak_right(device_box):
80
+ with mock.patch.object(device_box.dev["samx"], "move") as mock_move:
81
+ device_box.ui.step_size.setValue(0.1)
82
+ device_box.on_tweak_right()
83
+ mock_move.assert_called_once_with(0.1, relative=True)
84
+
85
+
86
+ def test_device_box_on_tweak_left(device_box):
87
+ with mock.patch.object(device_box.dev["samx"], "move") as mock_move:
88
+ device_box.ui.step_size.setValue(0.1)
89
+ device_box.on_tweak_left()
90
+ mock_move.assert_called_once_with(-0.1, relative=True)
91
+
92
+
93
+ def test_device_box_setpoint_out_of_range(device_box):
94
+ device_box.update_limits([0, 10])
95
+ device_box.ui.setpoint.setText("100")
96
+ device_box.on_setpoint_change()
97
+ assert device_box.ui.setpoint.text() == "100"
98
+ assert device_box.ui.setpoint.hasAcceptableInput() == False
@@ -0,0 +1,30 @@
1
+ import pytest
2
+
3
+ from bec_widgets.utils.colors import apply_theme
4
+ from bec_widgets.utils.reference_utils import snap_and_compare
5
+ from bec_widgets.widgets.spinner.spinner import SpinnerWidget
6
+
7
+
8
+ @pytest.fixture
9
+ def spinner_widget(qtbot):
10
+ apply_theme("light")
11
+ spinner = SpinnerWidget()
12
+ qtbot.addWidget(spinner)
13
+ qtbot.waitExposed(spinner)
14
+ yield spinner
15
+
16
+
17
+ def test_spinner_widget_paint_event(spinner_widget, qtbot):
18
+ spinner_widget.paintEvent(None)
19
+
20
+
21
+ def test_spinner_widget_rendered(spinner_widget, qtbot, tmpdir):
22
+ spinner_widget.update()
23
+ qtbot.wait(200)
24
+ snap_and_compare(spinner_widget, str(tmpdir), suffix="")
25
+
26
+ spinner_widget._started = True
27
+ spinner_widget.update()
28
+ qtbot.wait(200)
29
+
30
+ snap_and_compare(spinner_widget, str(tmpdir), suffix="started")
@@ -25,54 +25,49 @@ def test_vscode_widget(qtbot, vscode_widget):
25
25
  def test_start_server(qtbot, mocked_client):
26
26
 
27
27
  with mock.patch("bec_widgets.widgets.vscode.vscode.subprocess.Popen") as mock_popen:
28
- mock_process = mock.Mock()
29
- mock_process.stdout.fileno.return_value = 1
30
- mock_process.poll.return_value = None
31
- mock_process.stdout.read.return_value = (
32
- f"available at http://{VSCodeEditor.host}:{VSCodeEditor.port}?tkn={VSCodeEditor.token}"
33
- )
34
- mock_popen.return_value = mock_process
35
-
36
- widget = VSCodeEditor(client=mocked_client)
37
-
38
- mock_popen.assert_called_once_with(
39
- shlex.split(
40
- f"code serve-web --port {widget.port} --connection-token={widget.token} --accept-server-license-terms"
41
- ),
42
- text=True,
43
- stdout=subprocess.PIPE,
44
- stderr=subprocess.DEVNULL,
45
- preexec_fn=os.setsid,
46
- )
28
+ with mock.patch("bec_widgets.widgets.vscode.vscode.select.select") as mock_select:
29
+ mock_process = mock.Mock()
30
+ mock_process.stdout.fileno.return_value = 1
31
+ mock_process.poll.return_value = None
32
+ mock_process.stdout.read.return_value = f"available at http://{VSCodeEditor.host}:{VSCodeEditor.port}?tkn={VSCodeEditor.token}"
33
+ mock_popen.return_value = mock_process
34
+ mock_select.return_value = [[mock_process.stdout], [], []]
35
+
36
+ widget = VSCodeEditor(client=mocked_client)
37
+
38
+ mock_popen.assert_called_once_with(
39
+ shlex.split(
40
+ f"code serve-web --port {widget.port} --connection-token={widget.token} --accept-server-license-terms"
41
+ ),
42
+ text=True,
43
+ stdout=subprocess.PIPE,
44
+ stderr=subprocess.DEVNULL,
45
+ preexec_fn=os.setsid,
46
+ )
47
47
 
48
48
 
49
49
  @pytest.fixture
50
50
  def patched_vscode_process(qtbot, vscode_widget):
51
51
  with mock.patch("bec_widgets.widgets.vscode.vscode.os.killpg") as mock_killpg:
52
52
  with mock.patch("bec_widgets.widgets.vscode.vscode.os.getpgid") as mock_getpgid:
53
- with mock.patch(
54
- "bec_widgets.widgets.website.website.WebsiteWidget.closeEvent"
55
- ) as mock_close_event:
56
- mock_getpgid.return_value = 123
57
- vscode_widget.process = mock.Mock()
58
- yield vscode_widget, mock_killpg, mock_close_event
53
+ mock_getpgid.return_value = 123
54
+ vscode_widget.process = mock.Mock()
55
+ yield vscode_widget, mock_killpg
59
56
 
60
57
 
61
- def test_close_event(qtbot, patched_vscode_process):
62
- vscode_patched, mock_killpg, mock_close_event = patched_vscode_process
58
+ def test_vscode_cleanup(qtbot, patched_vscode_process):
59
+ vscode_patched, mock_killpg = patched_vscode_process
63
60
  vscode_patched.process.pid = 123
64
61
  vscode_patched.process.poll.return_value = None
65
- vscode_patched.closeEvent(None)
62
+ vscode_patched.cleanup()
66
63
  mock_killpg.assert_called_once_with(123, 15)
67
64
  vscode_patched.process.wait.assert_called_once()
68
- mock_close_event.assert_called_once()
69
65
 
70
66
 
71
67
  def test_close_event_on_terminated_code(qtbot, patched_vscode_process):
72
- vscode_patched, mock_killpg, mock_close_event = patched_vscode_process
68
+ vscode_patched, mock_killpg = patched_vscode_process
73
69
  vscode_patched.process.pid = 123
74
70
  vscode_patched.process.poll.return_value = 0
75
- vscode_patched.closeEvent(None)
71
+ vscode_patched.cleanup()
76
72
  mock_killpg.assert_not_called()
77
73
  vscode_patched.process.wait.assert_not_called()
78
- mock_close_event.assert_called_once()