bec-widgets 0.82.2__py3-none-any.whl → 0.83.0__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 (40) hide show
  1. .gitlab-ci.yml +3 -0
  2. CHANGELOG.md +26 -28
  3. PKG-INFO +1 -1
  4. bec_widgets/utils/bec_connector.py +2 -0
  5. bec_widgets/utils/bec_widget.py +6 -0
  6. bec_widgets/utils/generate_designer_plugin.py +6 -5
  7. bec_widgets/utils/reference_utils.py +92 -0
  8. bec_widgets/widgets/console/console.py +1 -1
  9. bec_widgets/widgets/device_box/__init__.py +0 -0
  10. bec_widgets/widgets/device_box/device_box.py +197 -0
  11. bec_widgets/widgets/device_box/device_box.pyproject +1 -0
  12. bec_widgets/widgets/device_box/device_box.ui +179 -0
  13. bec_widgets/widgets/device_box/device_box_plugin.py +54 -0
  14. bec_widgets/widgets/device_box/register_device_box.py +15 -0
  15. bec_widgets/widgets/figure/figure.py +3 -3
  16. bec_widgets/widgets/position_indicator/position_indicator.py +71 -0
  17. bec_widgets/widgets/position_indicator/position_indicator.pyproject +1 -0
  18. bec_widgets/widgets/position_indicator/position_indicator_plugin.py +54 -0
  19. bec_widgets/widgets/position_indicator/register_position_indicator.py +17 -0
  20. bec_widgets/widgets/spinner/__init__.py +0 -0
  21. bec_widgets/widgets/spinner/register_spinner_widget.py +15 -0
  22. bec_widgets/widgets/spinner/spinner.py +85 -0
  23. bec_widgets/widgets/spinner/spinner_widget.pyproject +1 -0
  24. bec_widgets/widgets/spinner/spinner_widget_plugin.py +54 -0
  25. bec_widgets/widgets/vscode/vscode.py +0 -14
  26. bec_widgets/widgets/website/website.py +1 -1
  27. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.0.dist-info}/METADATA +1 -1
  28. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.0.dist-info}/RECORD +40 -18
  29. pyproject.toml +1 -1
  30. tests/references/SpinnerWidget/SpinnerWidget_darwin.png +0 -0
  31. tests/references/SpinnerWidget/SpinnerWidget_linux.png +0 -0
  32. tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png +0 -0
  33. tests/references/SpinnerWidget/SpinnerWidget_started_linux.png +0 -0
  34. tests/unit_tests/client_mocks.py +9 -1
  35. tests/unit_tests/test_device_box.py +98 -0
  36. tests/unit_tests/test_spinner.py +30 -0
  37. tests/unit_tests/test_vscode_widget.py +27 -32
  38. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.0.dist-info}/WHEEL +0 -0
  39. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.0.dist-info}/entry_points.txt +0 -0
  40. {bec_widgets-0.82.2.dist-info → bec_widgets-0.83.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,30 @@
1
+ import pytest
2
+ import qdarktheme
3
+
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
+ qdarktheme.setup_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()