bec-widgets 2.3.0__py3-none-any.whl → 2.5.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 (46) hide show
  1. .github/ISSUE_TEMPLATE/bug_report.md +26 -0
  2. .github/ISSUE_TEMPLATE/feature_request.md +48 -0
  3. .github/workflows/check_pr.yml +28 -0
  4. .github/workflows/ci.yml +36 -0
  5. .github/workflows/end2end-conda.yml +48 -0
  6. .github/workflows/formatter.yml +61 -0
  7. .github/workflows/generate-cli-check.yml +49 -0
  8. .github/workflows/pytest-matrix.yml +49 -0
  9. .github/workflows/pytest.yml +65 -0
  10. .github/workflows/semantic_release.yml +103 -0
  11. CHANGELOG.md +1726 -1546
  12. LICENSE +1 -1
  13. PKG-INFO +2 -1
  14. README.md +11 -0
  15. bec_widgets/cli/client.py +346 -0
  16. bec_widgets/examples/jupyter_console/jupyter_console_window.py +8 -8
  17. bec_widgets/tests/utils.py +3 -3
  18. bec_widgets/utils/entry_validator.py +13 -3
  19. bec_widgets/utils/side_panel.py +65 -39
  20. bec_widgets/utils/toolbar.py +79 -0
  21. bec_widgets/widgets/containers/layout_manager/layout_manager.py +34 -1
  22. bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +1 -1
  23. bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py +27 -31
  24. bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py +1 -1
  25. bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py +1 -1
  26. bec_widgets/widgets/editors/dict_backed_table.py +7 -0
  27. bec_widgets/widgets/editors/scan_metadata/scan_metadata.py +1 -0
  28. bec_widgets/widgets/editors/web_console/register_web_console.py +15 -0
  29. bec_widgets/widgets/editors/web_console/web_console.py +230 -0
  30. bec_widgets/widgets/editors/web_console/web_console.pyproject +1 -0
  31. bec_widgets/widgets/editors/web_console/web_console_plugin.py +54 -0
  32. bec_widgets/widgets/plots/image/image.py +90 -0
  33. bec_widgets/widgets/plots/roi/__init__.py +0 -0
  34. bec_widgets/widgets/plots/roi/image_roi.py +867 -0
  35. bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py +11 -46
  36. bec_widgets/widgets/utility/visual/color_button_native/__init__.py +0 -0
  37. bec_widgets/widgets/utility/visual/color_button_native/color_button_native.py +58 -0
  38. bec_widgets/widgets/utility/visual/color_button_native/color_button_native.pyproject +1 -0
  39. bec_widgets/widgets/utility/visual/color_button_native/color_button_native_plugin.py +56 -0
  40. bec_widgets/widgets/utility/visual/color_button_native/register_color_button_native.py +17 -0
  41. {bec_widgets-2.3.0.dist-info → bec_widgets-2.5.0.dist-info}/METADATA +2 -1
  42. {bec_widgets-2.3.0.dist-info → bec_widgets-2.5.0.dist-info}/RECORD +46 -25
  43. {bec_widgets-2.3.0.dist-info → bec_widgets-2.5.0.dist-info}/licenses/LICENSE +1 -1
  44. pyproject.toml +17 -5
  45. {bec_widgets-2.3.0.dist-info → bec_widgets-2.5.0.dist-info}/WHEEL +0 -0
  46. {bec_widgets-2.3.0.dist-info → bec_widgets-2.5.0.dist-info}/entry_points.txt +0 -0
@@ -31,6 +31,9 @@ from bec_widgets.widgets.control.device_input.device_line_edit.device_line_edit
31
31
  )
32
32
  from bec_widgets.widgets.dap.dap_combo_box.dap_combo_box import DapComboBox
33
33
  from bec_widgets.widgets.plots.waveform.curve import CurveConfig, DeviceSignal
34
+ from bec_widgets.widgets.utility.visual.color_button_native.color_button_native import (
35
+ ColorButtonNative,
36
+ )
34
37
  from bec_widgets.widgets.utility.visual.colormap_widget.colormap_widget import BECColorMapWidget
35
38
 
36
39
  if TYPE_CHECKING: # pragma: no cover
@@ -40,49 +43,6 @@ if TYPE_CHECKING: # pragma: no cover
40
43
  logger = bec_logger.logger
41
44
 
42
45
 
43
- class ColorButton(QPushButton):
44
- """A QPushButton subclass that displays a color.
45
-
46
- The background is set to the given color and the button text is the hex code.
47
- The text color is chosen automatically (black if the background is light, white if dark)
48
- to guarantee good readability.
49
- """
50
-
51
- def __init__(self, color="#000000", parent=None):
52
- """Initialize the color button.
53
-
54
- Args:
55
- color (str): The initial color in hex format (e.g., '#000000').
56
- parent: Optional QWidget parent.
57
- """
58
- super().__init__(parent)
59
- self.set_color(color)
60
-
61
- def set_color(self, color):
62
- """Set the button's color and update its appearance.
63
-
64
- Args:
65
- color (str or QColor): The new color to assign.
66
- """
67
- if isinstance(color, QColor):
68
- self._color = color.name()
69
- else:
70
- self._color = color
71
- self._update_appearance()
72
-
73
- def color(self):
74
- """Return the current color in hex."""
75
- return self._color
76
-
77
- def _update_appearance(self):
78
- """Update the button style based on the background color's brightness."""
79
- c = QColor(self._color)
80
- brightness = c.lightnessF()
81
- text_color = "#000000" if brightness > 0.5 else "#FFFFFF"
82
- self.setStyleSheet(f"background-color: {self._color}; color: {text_color};")
83
- self.setText(self._color)
84
-
85
-
86
46
  class CurveRow(QTreeWidgetItem):
87
47
  DELETE_BUTTON_COLOR = "#CC181E"
88
48
  """A unified row that can represent either a device or a DAP curve.
@@ -193,7 +153,7 @@ class CurveRow(QTreeWidgetItem):
193
153
  def _init_style_controls(self):
194
154
  """Create columns 3..6: color button, style combo, width spin, symbol spin."""
195
155
  # Color in col 3
196
- self.color_button = ColorButton(self.config.color)
156
+ self.color_button = ColorButtonNative(color=self.config.color)
197
157
  self.color_button.clicked.connect(lambda: self._select_color(self.color_button))
198
158
  self.tree.setItemWidget(self, 3, self.color_button)
199
159
 
@@ -284,6 +244,11 @@ class CurveRow(QTreeWidgetItem):
284
244
  self.dap_combo.deleteLater()
285
245
  self.dap_combo = None
286
246
 
247
+ if getattr(self, "color_button", None) is not None:
248
+ self.color_button.close()
249
+ self.color_button.deleteLater()
250
+ self.color_button = None
251
+
287
252
  # Remove the item from the tree widget
288
253
  index = self.tree.indexOfTopLevelItem(self)
289
254
  if index != -1:
@@ -337,8 +302,8 @@ class CurveRow(QTreeWidgetItem):
337
302
  self.config.label = f"{parent_conf.label}-{new_dap}"
338
303
 
339
304
  # Common style fields
340
- self.config.color = self.color_button.color()
341
- self.config.symbol_color = self.color_button.color()
305
+ self.config.color = self.color_button.color
306
+ self.config.symbol_color = self.color_button.color
342
307
  self.config.pen_style = self.style_combo.currentText()
343
308
  self.config.pen_width = self.width_spin.value()
344
309
  self.config.symbol_size = self.symbol_spin.value()
@@ -0,0 +1,58 @@
1
+ from qtpy.QtGui import QColor
2
+ from qtpy.QtWidgets import QPushButton
3
+
4
+ from bec_widgets import BECWidget, SafeProperty, SafeSlot
5
+
6
+
7
+ class ColorButtonNative(BECWidget, QPushButton):
8
+ """A QPushButton subclass that displays a color.
9
+
10
+ The background is set to the given color and the button text is the hex code.
11
+ The text color is chosen automatically (black if the background is light, white if dark)
12
+ to guarantee good readability.
13
+ """
14
+
15
+ RPC = False
16
+ PLUGIN = True
17
+ ICON_NAME = "colors"
18
+
19
+ def __init__(self, parent=None, color="#000000", **kwargs):
20
+ """Initialize the color button.
21
+
22
+ Args:
23
+ parent: Optional QWidget parent.
24
+ color (str): The initial color in hex format (e.g., '#000000').
25
+ """
26
+ super().__init__(parent=parent, **kwargs)
27
+ self.set_color(color)
28
+
29
+ @SafeSlot()
30
+ def set_color(self, color):
31
+ """Set the button's color and update its appearance.
32
+
33
+ Args:
34
+ color (str or QColor): The new color to assign.
35
+ """
36
+ if isinstance(color, QColor):
37
+ self._color = color.name()
38
+ else:
39
+ self._color = color
40
+ self._update_appearance()
41
+
42
+ @SafeProperty("QColor")
43
+ def color(self):
44
+ """Return the current color in hex."""
45
+ return self._color
46
+
47
+ @color.setter
48
+ def color(self, value):
49
+ """Set the button's color and update its appearance."""
50
+ self.set_color(value)
51
+
52
+ def _update_appearance(self):
53
+ """Update the button style based on the background color's brightness."""
54
+ c = QColor(self._color)
55
+ brightness = c.lightnessF()
56
+ text_color = "#000000" if brightness > 0.5 else "#FFFFFF"
57
+ self.setStyleSheet(f"background-color: {self._color}; color: {text_color};")
58
+ self.setText(self._color)
@@ -0,0 +1 @@
1
+ {'files': ['color_button_native.py']}
@@ -0,0 +1,56 @@
1
+ # Copyright (C) 2022 The Qt Company Ltd.
2
+ # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
3
+
4
+ from qtpy.QtDesigner import QDesignerCustomWidgetInterface
5
+
6
+ from bec_widgets.utils.bec_designer import designer_material_icon
7
+ from bec_widgets.widgets.utility.visual.color_button_native.color_button_native import (
8
+ ColorButtonNative,
9
+ )
10
+
11
+ DOM_XML = """
12
+ <ui language='c++'>
13
+ <widget class='ColorButtonNative' name='color_button_native'>
14
+ </widget>
15
+ </ui>
16
+ """
17
+
18
+
19
+ class ColorButtonNativePlugin(QDesignerCustomWidgetInterface): # pragma: no cover
20
+ def __init__(self):
21
+ super().__init__()
22
+ self._form_editor = None
23
+
24
+ def createWidget(self, parent):
25
+ t = ColorButtonNative(parent)
26
+ return t
27
+
28
+ def domXml(self):
29
+ return DOM_XML
30
+
31
+ def group(self):
32
+ return "BEC Buttons"
33
+
34
+ def icon(self):
35
+ return designer_material_icon(ColorButtonNative.ICON_NAME)
36
+
37
+ def includeFile(self):
38
+ return "color_button_native"
39
+
40
+ def initialize(self, form_editor):
41
+ self._form_editor = form_editor
42
+
43
+ def isContainer(self):
44
+ return False
45
+
46
+ def isInitialized(self):
47
+ return self._form_editor is not None
48
+
49
+ def name(self):
50
+ return "ColorButtonNative"
51
+
52
+ def toolTip(self):
53
+ return "A QPushButton subclass that displays a color."
54
+
55
+ def whatsThis(self):
56
+ return self.toolTip()
@@ -0,0 +1,17 @@
1
+ def main(): # pragma: no cover
2
+ from qtpy import PYSIDE6
3
+
4
+ if not PYSIDE6:
5
+ print("PYSIDE6 is not available in the environment. Cannot patch designer.")
6
+ return
7
+ from PySide6.QtDesigner import QPyDesignerCustomWidgetCollection
8
+
9
+ from bec_widgets.widgets.utility.visual.color_button_native.color_button_native_plugin import (
10
+ ColorButtonNativePlugin,
11
+ )
12
+
13
+ QPyDesignerCustomWidgetCollection.addCustomWidget(ColorButtonNativePlugin())
14
+
15
+
16
+ if __name__ == "__main__": # pragma: no cover
17
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec_widgets
3
- Version: 2.3.0
3
+ Version: 2.5.0
4
4
  Summary: BEC Widgets
5
5
  Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec_widgets/issues
6
6
  Project-URL: Homepage, https://gitlab.psi.ch/bec/bec_widgets
@@ -25,6 +25,7 @@ Requires-Dist: coverage~=7.0; extra == 'dev'
25
25
  Requires-Dist: fakeredis>=2.23.2,~=2.23; extra == 'dev'
26
26
  Requires-Dist: isort>=5.13.2,~=5.13; extra == 'dev'
27
27
  Requires-Dist: pytest-bec-e2e<=4.0,>=2.21.4; extra == 'dev'
28
+ Requires-Dist: pytest-cov~=6.1.1; extra == 'dev'
28
29
  Requires-Dist: pytest-qt~=4.4; extra == 'dev'
29
30
  Requires-Dist: pytest-random-order~=1.1; extra == 'dev'
30
31
  Requires-Dist: pytest-timeout~=2.2; extra == 'dev'
@@ -2,12 +2,22 @@
2
2
  .gitlab-ci.yml,sha256=1nMYldzVk0tFkBWYTcUjumOrdSADASheWOAc0kOFDYs,9509
3
3
  .pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
4
4
  .readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
5
- CHANGELOG.md,sha256=84qXQAMmKo7pVz1-jy1-rsVvR4anW_XFW_sa-hfaVwQ,272212
6
- LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
7
- PKG-INFO,sha256=VLRYtZJrG4rhrc2HYV5vKW6xKbxmg4G-C-yAtPLHqrI,1224
8
- README.md,sha256=KgdKusjlvEvFtdNZCeDMO91y77MWK2iDcYMDziksOr4,2553
9
- pyproject.toml,sha256=Cpof5gMH5hRjnHv3I9uwUER3V86lyW_eHUUcYfgku_s,2568
5
+ CHANGELOG.md,sha256=h7kdqbYxLcnSHMm1ZlTgI3qX9is3O3FZ06Np2p5O5OI,283984
6
+ LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
7
+ PKG-INFO,sha256=d4teMR3mTeaZ-dcAXB-vAH5w4wJ36LuExkG8lf5nh9U,1273
8
+ README.md,sha256=oY5Jc1uXehRASuwUJ0umin2vfkFh7tHF-LLruHTaQx0,3560
9
+ pyproject.toml,sha256=wM4rYmu934tOm5F908GwhWKscxO5tkhqYp7klvvzxyo,2902
10
10
  .git_hooks/pre-commit,sha256=n3RofIZHJl8zfJJIUomcMyYGFi_rwq4CC19z0snz3FI,286
11
+ .github/ISSUE_TEMPLATE/bug_report.md,sha256=EnMCP_Fo6ozZ0epRQqprabyJDMzSEHvHPRW6xAJVnR0,491
12
+ .github/ISSUE_TEMPLATE/feature_request.md,sha256=JmGrIly0ougXdUShMwsvWi6cgK1fcYNKkF03lKgQH44,1649
13
+ .github/workflows/check_pr.yml,sha256=jKMtYBJTNRAdw_MAS4JzdKVSoNrv8nxUQMqobsYFAXw,903
14
+ .github/workflows/ci.yml,sha256=1mhavTQnhEksshnaTDhDce-BIdai209l5AeMSFlOTSw,986
15
+ .github/workflows/end2end-conda.yml,sha256=N7q_sOZL1Mcivdkb8YIdvqbkkaG79rjHDQRpR2xPdtM,1794
16
+ .github/workflows/formatter.yml,sha256=CdUVrRxWyVes9y-Ez3jiCJXqANPJtl6kfpGQxeWMhcQ,1694
17
+ .github/workflows/generate-cli-check.yml,sha256=b6TcK8F5Hy0sFjgXpk0w3BO9eMDZw9WysTl3P7zEPuQ,1742
18
+ .github/workflows/pytest-matrix.yml,sha256=r61nxCVDo-YZ9XIHG2YwdgEX-TF5JNBcWdKHhUyBeqA,1902
19
+ .github/workflows/pytest.yml,sha256=Vtz8uYct2vDVWPAkELhG7lHAKsu5glVCaZL8soANiNE,2204
20
+ .github/workflows/semantic_release.yml,sha256=pdkv1rVG3YgG7yu4nNWvbGZifH4bqO1eh3pM0KHRK04,3720
11
21
  .gitlab/issue_templates/bug_report_template.md,sha256=gAuyEwl7XlnebBrkiJ9AqffSNOywmr8vygUFWKTuQeI,386
12
22
  .gitlab/issue_templates/documentation_update_template.md,sha256=FHLdb3TS_D9aL4CYZCjyXSulbaW5mrN2CmwTaeLPbNw,860
13
23
  .gitlab/issue_templates/feature_request_template.md,sha256=vjxCnmj53Mp4FPzCrNxhkO-8StRQUZ36PlXu4K8VGaI,1543
@@ -23,7 +33,7 @@ bec_widgets/assets/app_icons/bec_widgets_icon.png,sha256=K8dgGwIjalDh9PRHUsSQBqg
23
33
  bec_widgets/assets/app_icons/ui_loader_tile.png,sha256=qSK3XHqvnAVGV9Q0ulORcGFbXJ9LDq2uz8l9uTtMsNk,1812476
24
34
  bec_widgets/assets/app_icons/widget_launch_tile.png,sha256=bWsICHFfSe9-ESUj3AwlE95dDOea-f6M-s9fBapsxB4,2252911
25
35
  bec_widgets/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- bec_widgets/cli/client.py,sha256=2Z0ihxMONJChLuhMxaRon0gNsnbuhTz4jlsSg-xAKEk,80350
36
+ bec_widgets/cli/client.py,sha256=PbeumL7pGM2uncKn00Hm3jGeEEY7ANwrgVcyLDDSG6M,90128
27
37
  bec_widgets/cli/client_utils.py,sha256=F2hyt--jL53bN8NoWifNUMqwwx5FbpS6I1apERdTRzM,18114
28
38
  bec_widgets/cli/generate_cli.py,sha256=xcPNyJoa3IjddX1yEDY45tT-Cs4jO5cQLUmcEubKs44,10976
29
39
  bec_widgets/cli/server.py,sha256=lYEkOaokLbND4KjbXyySzb5nq3YQ6m4L0NAmHAjMCIU,5633
@@ -37,7 +47,7 @@ bec_widgets/examples/general_app/general_app.py,sha256=PoFCTuA_1yqrpgthASpYFgH7J
37
47
  bec_widgets/examples/general_app/general_app.ui,sha256=TsejkM3Z8znnixyqxoj4SwhIIpIzTAuGAMkGXSS1aT8,10479
38
48
  bec_widgets/examples/general_app/web_links.py,sha256=d5OgzgI9zb-NAC0pOGanOtJX3nZoe4x8QuQTw-_hK_8,434
39
49
  bec_widgets/examples/jupyter_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=l3rb_5SQx-bniv2QxWHo4qaTtr0g0-cfWVoCxUa3AFI,6507
50
+ bec_widgets/examples/jupyter_console/jupyter_console_window.py,sha256=Zqb2jjmlELs3W9t_T-V8dGgQJ7z3YPDzGJNXMxRH3ys,6503
41
51
  bec_widgets/examples/plugin_example_pyside/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
52
  bec_widgets/examples/plugin_example_pyside/main.py,sha256=zDP5wO7wb3BVsQ15HOCRT1nNmCujIVRvSXZ3Txje8L0,549
43
53
  bec_widgets/examples/plugin_example_pyside/registertictactoe.py,sha256=cVhBnP0qx5j9Jft-VeKvlTFE-bX58hbP45CX0f4r5pM,535
@@ -46,7 +56,7 @@ bec_widgets/examples/plugin_example_pyside/tictactoe.py,sha256=s3rCurXloVcmMdzZi
46
56
  bec_widgets/examples/plugin_example_pyside/tictactoeplugin.py,sha256=MFMwONn4EZ3V8DboEG4I3BXpURE9JDbKB7XTzzfZl5w,1978
47
57
  bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py,sha256=SiJaoX3OYA8YMkSwU1d7KEfSUjQQUsQgpRAxSSlr8oQ,2376
48
58
  bec_widgets/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- bec_widgets/tests/utils.py,sha256=GbQtN7qf9n-8FoAfNddZ4aAqA7oBo_hGAlnKELd6Xzw,6943
59
+ bec_widgets/tests/utils.py,sha256=-aBZ9LfzN1rWUarT5FZusdjY4GpRI2FIx2zfxF9STLY,6958
50
60
  bec_widgets/utils/__init__.py,sha256=1930ji1Jj6dVuY81Wd2kYBhHYNV-2R0bN_L4o9zBj1U,533
51
61
  bec_widgets/utils/bec_connector.py,sha256=ATOSyZqryn1QHPc7aotiDnUtzFhlj_gmcukMT_pqjHQ,19272
52
62
  bec_widgets/utils/bec_designer.py,sha256=ehNl_i743rijmhPiIGNd1bihE7-l4oJzTVoa4yjPjls,5426
@@ -60,7 +70,7 @@ bec_widgets/utils/colors.py,sha256=4Oms3kcstf7-WddGMB2TZXPqJwFMGVjFyBO8tHZHnxk,1
60
70
  bec_widgets/utils/compact_popup.py,sha256=xVK_lQqL5Hy1ZnUzHXB8GU-Ru-mXevKcdM8ync3ssiA,10269
61
71
  bec_widgets/utils/container_utils.py,sha256=J8YXombOlAPa3M8NGZdhntp2NirBu4raDEQZOgP4elM,3791
62
72
  bec_widgets/utils/crosshair.py,sha256=z2Db0tz-SqDGn3wwyCOuQ5mZn9gQU8wQ7YrCVAAAU_A,18892
63
- bec_widgets/utils/entry_validator.py,sha256=8NCsQCYecPz-tn6AW0LtBoxRnjz-KI5oecU7bQNjqMg,1384
73
+ bec_widgets/utils/entry_validator.py,sha256=lwT8HP0RDG1FXENIeZ3IDEF2DQmD8KXGkRxPoMXbryk,1817
64
74
  bec_widgets/utils/error_popups.py,sha256=UBAmD1YlAgKodpihudyf0VWtI59KGFiLgnjiKmKGjgk,13254
65
75
  bec_widgets/utils/expandable_frame.py,sha256=VV4mgwz4lXbO3r-dNCX2QFUguwWCCXSUkXyjDSTJHbU,2345
66
76
  bec_widgets/utils/filter_io.py,sha256=GKO6GOTiKxTuTp_SHp5Ewou54N7wIZXgWWvlFvhbBmw,5114
@@ -80,9 +90,9 @@ bec_widgets/utils/rpc_decorator.py,sha256=pIvtqySQLnuS7l2Ti_UAe4WX7CRivZnsE5ZdKA
80
90
  bec_widgets/utils/rpc_server.py,sha256=iOIEy8s5DAL_aG6RC9G5DScBfyolpfDVeR2a_3h46JM,10310
81
91
  bec_widgets/utils/serialization.py,sha256=_SO8q0ylC0MWckT9yTbCtF0QNsRoT6ysL8WnN8-GQ-U,1174
82
92
  bec_widgets/utils/settings_dialog.py,sha256=1z6noC9k6BSIGAw12DvHHiW3LmvPquaGMjWSe5wdmek,4307
83
- bec_widgets/utils/side_panel.py,sha256=MIm21i3daDhxY87qjVXdQoxkYjYxiIXLEbjRGO6UGrY,12638
93
+ bec_widgets/utils/side_panel.py,sha256=enxcQOwJOMfD3MxgPA9mQSKSX_F6Omy2zePncYDW1FA,14193
84
94
  bec_widgets/utils/thread_checker.py,sha256=rDNuA3X6KQyA7JPb67mccTg0z8YkInynLAENQDQpbuE,1607
85
- bec_widgets/utils/toolbar.py,sha256=HzzePUnHjw-7ltMKtzIDmkAojjb4PpJM9TAY9as0S_4,37473
95
+ bec_widgets/utils/toolbar.py,sha256=SUzR1E5TTsuWa9lS5HHVQ-XznEGMf6MbGVS842UML9w,40500
86
96
  bec_widgets/utils/ui_loader.py,sha256=uLROPSeprfmNE9y2_010fUuvEd5oLfs3X2oah4FnMkg,4945
87
97
  bec_widgets/utils/validator_delegate.py,sha256=Emj1WF6W8Ke1ruBWUfmHdVJpmOSPezuOt4zvQTay_44,442
88
98
  bec_widgets/utils/widget_io.py,sha256=afR7i59fw2WrEQCmkH5dwhz1uNjfMPnJTIhE8NWVBsU,21552
@@ -104,7 +114,7 @@ bec_widgets/widgets/containers/dock/dock_area.pyproject,sha256=URW0UrDXCnkzk80rb
104
114
  bec_widgets/widgets/containers/dock/dock_area_plugin.py,sha256=fDVXKPZuHr85B2fLfAYf_Ic5d9mZQpnZrODTDquzZpM,1331
105
115
  bec_widgets/widgets/containers/dock/register_dock_area.py,sha256=L7BL4qknCjtqsDP-RMQzk2qRPpcYuzXWlb7sJB_0DDM,475
106
116
  bec_widgets/widgets/containers/layout_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
- bec_widgets/widgets/containers/layout_manager/layout_manager.py,sha256=uh74nmUQegAi8HZU-ctAMGmzjoNDZidmGUuJcO0P_hg,33797
117
+ bec_widgets/widgets/containers/layout_manager/layout_manager.py,sha256=V7s8mtB3VLPstyGVaR9YKcoTVlfMMOYNpIJUsw2WQVc,35198
108
118
  bec_widgets/widgets/containers/main_window/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
119
  bec_widgets/widgets/containers/main_window/main_window.py,sha256=Y9egriyEuK9b7sER5gqwTSlCmA7EnIMnKpeF-Ui2UM0,6189
110
120
  bec_widgets/widgets/containers/main_window/addons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -164,15 +174,15 @@ bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plu
164
174
  bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py,sha256=vjoIwn1CQbg3gEwKzgY2MuscfGab2agM5YV0r1_UL0k,531
165
175
  bec_widgets/widgets/control/device_input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
176
  bec_widgets/widgets/control/device_input/base_classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
- bec_widgets/widgets/control/device_input/base_classes/device_input_base.py,sha256=pt86xacZ7F8wbHDC1MaTzdihsiv470cOEqvOJYDnL1s,15923
168
- bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py,sha256=m10ELl4AwJXCWZpHWeElyti1qQvWBEhUQNlnvp6Nse8,9588
177
+ bec_widgets/widgets/control/device_input/base_classes/device_input_base.py,sha256=r4DwWQz2wwNQ3Uswzdy12MGycV7pFrE_Zv4h_2G5IRA,15915
178
+ bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py,sha256=rauBYZ2_5mXkTFgVk5d77g8D7b_ugK7g0By7a5YVmu0,9139
169
179
  bec_widgets/widgets/control/device_input/device_combobox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
170
180
  bec_widgets/widgets/control/device_input/device_combobox/device_combo_box.pyproject,sha256=wI2eXR5ky_IM9-BCHJnH_9CEqYcZwIuLcgitSEr8OJU,40
171
181
  bec_widgets/widgets/control/device_input/device_combobox/device_combo_box_plugin.py,sha256=E8LD9T4O2w621q25uHqBqZLDiQ6zpMR25ZDuf51jrPw,1434
172
- bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py,sha256=_sgnrd_Oz6Parm9EI1FX7DBd8RM3wV9p_eViPWrtQdw,6139
182
+ bec_widgets/widgets/control/device_input/device_combobox/device_combobox.py,sha256=5HZBYWM9rhqisd8G0p2Scdzg7-WC_u8ob6fj0hpuApM,6131
173
183
  bec_widgets/widgets/control/device_input/device_combobox/register_device_combo_box.py,sha256=elw4M4xfIFWe8C0MkdqqqyfnyOVrdl0g0j6bqwOU1GE,526
174
184
  bec_widgets/widgets/control/device_input/device_line_edit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
- bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py,sha256=yxQ1s0LA7mSS-RCK5dh8l13-36-OS0L6wsBnKuRhWfE,6628
185
+ bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.py,sha256=NRCqE0o30caosgmMTIWCWgqbpDe1EXThR--XJrHP9rI,6620
176
186
  bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.pyproject,sha256=tqAYXRbxsHR41MwqmAxvfq1CFeZ1IRv84whUG67HjjE,41
177
187
  bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit_plugin.py,sha256=LoG1VyO21pZ9dbnDVU03xzqgP8P1oEmdeotlkYs_pE8,1466
178
188
  bec_widgets/widgets/control/device_input/device_line_edit/register_device_line_edit.py,sha256=NTB3HghW5S7NvUlPe_k_uFYQLWPYgjgln2bAYipfkpM,527
@@ -206,7 +216,7 @@ bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_compact.ui,sha256=JbdMEPzbA3p2
206
216
  bec_widgets/widgets/dap/lmfit_dialog/lmfit_dialog_vertical.ui,sha256=BVm0XydqbgmIYOs3YPQzQsL4v4gZzourR10dH_2NrVg,5078
207
217
  bec_widgets/widgets/dap/lmfit_dialog/register_lm_fit_dialog.py,sha256=7tB1gsvv310_kVuKf2u4EdSR4F1posm7QCrWH5Kih-Q,480
208
218
  bec_widgets/widgets/editors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
209
- bec_widgets/widgets/editors/dict_backed_table.py,sha256=QQ-ktAQ4odp7SKFnRbLJ9PEH2pErgy5c8GLyfj5nEK0,6151
219
+ bec_widgets/widgets/editors/dict_backed_table.py,sha256=u8n5diNaKY-UBb5vkpDSRtSI7w7g1096g37co8nxA8A,6422
210
220
  bec_widgets/widgets/editors/console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
221
  bec_widgets/widgets/editors/console/console.py,sha256=OB5vvqpYNhUGWzn5Dx5rR1n0rQulef5Yv-by5RGjr2w,29323
212
222
  bec_widgets/widgets/editors/console/console.pyproject,sha256=JcoDuZG03g1Bxkd3Aipo7jjLexujfbibIZqXHIgLSWc,26
@@ -217,7 +227,7 @@ bec_widgets/widgets/editors/jupyter_console/jupyter_console.py,sha256=-e7HQOECeH
217
227
  bec_widgets/widgets/editors/scan_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
228
  bec_widgets/widgets/editors/scan_metadata/_util.py,sha256=3mm8ziir0UPnf25ONEfQ277SFC8132HeQVgdXWik5tI,1881
219
229
  bec_widgets/widgets/editors/scan_metadata/register_scan_metadata.py,sha256=dGcd8AXM1E9i-N45_CIRdCIyKtHJlq_7neyKHrDx6C0,487
220
- bec_widgets/widgets/editors/scan_metadata/scan_metadata.py,sha256=Wxy5adojcI8gsvqtONui_Fqbhfz_UUwbuF7xgNl7nE4,5296
230
+ bec_widgets/widgets/editors/scan_metadata/scan_metadata.py,sha256=DPTwBSp9wkjL0FC5vMXr0Eby0Xo1T-9ak5YeALdY-jw,5371
221
231
  bec_widgets/widgets/editors/scan_metadata/scan_metadata.pyproject,sha256=_4guiQAGxiQ4gSN5i5S160UnFXvPFC1W1nG77PubNYQ,31
222
232
  bec_widgets/widgets/editors/scan_metadata/scan_metadata_plugin.py,sha256=ldp4O8JYh9WPwI0mybH1-4FOF-b6EOF6A0tRQCmbyxo,1329
223
233
  bec_widgets/widgets/editors/text_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -230,6 +240,10 @@ bec_widgets/widgets/editors/vscode/register_vs_code_editor.py,sha256=nx38IeUI3iG
230
240
  bec_widgets/widgets/editors/vscode/vs_code_editor.pyproject,sha256=bxx0jZlSfBo-Em7p15W1QIJ9lFr9jqTqGynUQG01ocU,24
231
241
  bec_widgets/widgets/editors/vscode/vs_code_editor_plugin.py,sha256=n0NNsGVbgjKYy9frE1njLRTGbcpQTMNyztmVA8HS8Gs,1346
232
242
  bec_widgets/widgets/editors/vscode/vscode.py,sha256=djQm4uwExENKOY27ZQEE3cvDvfM-8CWVSnXf5mVXvsk,6216
243
+ bec_widgets/widgets/editors/web_console/register_web_console.py,sha256=7XW-OreiNcEpe4l-AOmbx2ckDC16FDddvtnnqF-0N5I,479
244
+ bec_widgets/widgets/editors/web_console/web_console.py,sha256=DJTT16q2BEbvFC-3F-lVnKNF-QYyCk02L3oy4hmFHgw,7137
245
+ bec_widgets/widgets/editors/web_console/web_console.pyproject,sha256=z1FZSkWOyfeO2noufC-iVjAJm7lS5bPHq-x0q3C7NUA,29
246
+ bec_widgets/widgets/editors/web_console/web_console_plugin.py,sha256=Jyy6FHhuDrG0QS8cizRDbe9O0MLfG4twi7iNHjhc80U,1254
233
247
  bec_widgets/widgets/editors/website/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
234
248
  bec_widgets/widgets/editors/website/register_website_widget.py,sha256=VSVrZRCZoIxnpwyN5kZ6NvR7-5b1TX2yE30dRs01hSc,484
235
249
  bec_widgets/widgets/editors/website/website.py,sha256=AtttTUSeRl3fE7r88PmjwL1Rmlx5_g1en3Sr__NPuRY,3059
@@ -243,7 +257,7 @@ bec_widgets/widgets/games/register_minesweeper.py,sha256=8fgMBD3yB-5_eGqhG_qxpj3
243
257
  bec_widgets/widgets/plots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
258
  bec_widgets/widgets/plots/plot_base.py,sha256=NliWkXihJIPHRJHe-CNIrdjgxONk7uExG_3SsIpyoRQ,33848
245
259
  bec_widgets/widgets/plots/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
246
- bec_widgets/widgets/plots/image/image.py,sha256=IBu06Okf1VLGRmeq-2aQTYvoQKkHvJZSwZaHx4dYm1I,31506
260
+ bec_widgets/widgets/plots/image/image.py,sha256=KzBfUysHwVHEhOydzNbsn0NYTSk0CjkGlyev7otClFQ,34338
247
261
  bec_widgets/widgets/plots/image/image.pyproject,sha256=_sRCIu4MNgToaB4D7tUMWq3xKX6T2VoRS3UzGNIseHQ,23
248
262
  bec_widgets/widgets/plots/image/image_item.py,sha256=2bn9H5YLmo7ohQnnf1mLlL24TASnlZNzMvF7buMutmI,8728
249
263
  bec_widgets/widgets/plots/image/image_plugin.py,sha256=R0Hzh2GgYlfZLPZwOMgqLKKIA5DxEnTcSrbI7zTe-tI,1204
@@ -272,6 +286,8 @@ bec_widgets/widgets/plots/multi_waveform/settings/control_panel.py,sha256=3oxxec
272
286
  bec_widgets/widgets/plots/multi_waveform/settings/multi_waveform_controls.ui,sha256=rkLNyVn2ovv-Q9IH2o8_l3F9uvH0QoudWUGmKvcLpK4,5857
273
287
  bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
288
  bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py,sha256=lGreAkRBd-A4X_wqYZiKyGDmb_3uzLunjSju9A2PjWw,2532
289
+ bec_widgets/widgets/plots/roi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
290
+ bec_widgets/widgets/plots/roi/image_roi.py,sha256=fD58NF4uNwr1Zww6tl7-gSjTFiyalbZD37TjfGCYO4w,31383
275
291
  bec_widgets/widgets/plots/scatter_waveform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
292
  bec_widgets/widgets/plots/scatter_waveform/register_scatter_waveform.py,sha256=KttVjlAK3PfP9tyMfLnqEm6kphap8NZyqyaRry8oebY,514
277
293
  bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py,sha256=nCyZ_6EunS1m5XkLB-CwfBV9L4IX04D9SpHlHc8zG_I,6763
@@ -300,7 +316,7 @@ bec_widgets/widgets/plots/waveform/waveform_plugin.py,sha256=2AZPtBHs75l9cdhwQnY
300
316
  bec_widgets/widgets/plots/waveform/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
301
317
  bec_widgets/widgets/plots/waveform/settings/curve_settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
302
318
  bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_setting.py,sha256=Q-wgtzsllExbeOxQoCPmcCQfKRjp_hJeYcinSSy_0HI,4454
303
- bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py,sha256=K4izTVL2b3v-NlAYS39_0cbFCTBjdKFKpcI0Lis8KKI,22144
319
+ bec_widgets/widgets/plots/waveform/settings/curve_settings/curve_tree.py,sha256=P_503kqKzKcSwkDnjCfB-u0zLTZGoMEbCsR-xAACtww,21030
304
320
  bec_widgets/widgets/plots/waveform/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
305
321
  bec_widgets/widgets/plots/waveform/utils/roi_manager.py,sha256=zCl3-p3qP02zi837Udz8VUzsbUAwiP-26K3VpLsvaUU,2964
306
322
  bec_widgets/widgets/progress/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -363,6 +379,11 @@ bec_widgets/widgets/utility/visual/color_button/color_button.py,sha256=Z-NVeS2A3
363
379
  bec_widgets/widgets/utility/visual/color_button/color_button.pyproject,sha256=LUYF4VkDOB4ttVe7YfvLh64K-XZg0-xaVT06BqCT3UA,30
364
380
  bec_widgets/widgets/utility/visual/color_button/color_button_plugin.py,sha256=Eqp6eW1Iu1uS40_rHzgA_Hxy1F6Co7pzv2fdz5cWNGU,1282
365
381
  bec_widgets/widgets/utility/visual/color_button/register_color_button.py,sha256=BD1XGznJqYX3DgUPy2HWDgzu8KdLspR6wagseG5Bo2s,507
382
+ bec_widgets/widgets/utility/visual/color_button_native/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
383
+ bec_widgets/widgets/utility/visual/color_button_native/color_button_native.py,sha256=8GgEOSQ86ZWaaGj_6iFExbQSuFmdP72N_GywCRUWVxQ,1833
384
+ bec_widgets/widgets/utility/visual/color_button_native/color_button_native.pyproject,sha256=ceGob3QdHeAvyTj5RQTuxpUB2hNFh3nhRfNpHep4K_k,37
385
+ bec_widgets/widgets/utility/visual/color_button_native/color_button_native_plugin.py,sha256=RfGUHfLRqRfXGbDAR6SJ46OleXaXEmXyfCjqtQ9yjBs,1389
386
+ bec_widgets/widgets/utility/visual/color_button_native/register_color_button_native.py,sha256=-TLOcJNpg0hsUaGBNPhWFrzgVwSmXuk8xtY48zAERSc,533
366
387
  bec_widgets/widgets/utility/visual/colormap_selector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
367
388
  bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.py,sha256=OqyVPcqclQqpeK96k_lIoGFcLcnfb4tMS4EkMQZRP9Q,3838
368
389
  bec_widgets/widgets/utility/visual/colormap_selector/colormap_selector.pyproject,sha256=lHl9qmlMCB6BKB2orqctKwLcKK3Swc0THsyr-5O_vXM,35
@@ -378,8 +399,8 @@ bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=O
378
399
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
379
400
  bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
380
401
  bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
381
- bec_widgets-2.3.0.dist-info/METADATA,sha256=VLRYtZJrG4rhrc2HYV5vKW6xKbxmg4G-C-yAtPLHqrI,1224
382
- bec_widgets-2.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
383
- bec_widgets-2.3.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
384
- bec_widgets-2.3.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
385
- bec_widgets-2.3.0.dist-info/RECORD,,
402
+ bec_widgets-2.5.0.dist-info/METADATA,sha256=d4teMR3mTeaZ-dcAXB-vAH5w4wJ36LuExkG8lf5nh9U,1273
403
+ bec_widgets-2.5.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
404
+ bec_widgets-2.5.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
405
+ bec_widgets-2.5.0.dist-info/licenses/LICENSE,sha256=Daeiu871NcAp8uYi4eB_qHgvypG-HX0ioRQyQxFwjeg,1531
406
+ bec_widgets-2.5.0.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  BSD 3-Clause License
2
2
 
3
- Copyright (c) 2023, bec
3
+ Copyright (c) 2025, Paul Scherrer Institute
4
4
  All rights reserved.
5
5
 
6
6
  Redistribution and use in source and binary forms, with or without
pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_widgets"
7
- version = "2.3.0"
7
+ version = "2.5.0"
8
8
  description = "BEC Widgets"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -38,6 +38,7 @@ dev = [
38
38
  "pytest-timeout~=2.2",
39
39
  "pytest-xvfb~=3.0",
40
40
  "pytest~=8.0",
41
+ "pytest-cov~=6.1.1",
41
42
  ]
42
43
 
43
44
  [project.urls]
@@ -70,7 +71,7 @@ include_trailing_comma = true
70
71
  known_first_party = ["bec_widgets"]
71
72
 
72
73
  [tool.semantic_release]
73
- build_command = "python -m build"
74
+ build_command = "pip install build wheel && python -m build"
74
75
  version_toml = ["pyproject.toml:project.version"]
75
76
 
76
77
  [tool.semantic_release.commit_author]
@@ -96,12 +97,23 @@ default_bump_level = 0
96
97
 
97
98
  [tool.semantic_release.remote]
98
99
  name = "origin"
99
- type = "gitlab"
100
- ignore_token_for_push = false
100
+ type = "github"
101
+ ignore_token_for_push = true
101
102
 
102
103
  [tool.semantic_release.remote.token]
103
- env = "GL_TOKEN"
104
+ env = "GH_TOKEN"
104
105
 
105
106
  [tool.semantic_release.publish]
106
107
  dist_glob_patterns = ["dist/*"]
107
108
  upload_to_vcs_release = true
109
+
110
+ [tool.coverage.report]
111
+ skip_empty = true # exclude empty *files*, e.g. __init__.py, from the report
112
+ exclude_lines = [
113
+ "pragma: no cover",
114
+ "if TYPE_CHECKING:",
115
+ "return NotImplemented",
116
+ "raise NotImplementedError",
117
+ "\\.\\.\\.",
118
+ 'if __name__ == "__main__":',
119
+ ]