1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2026-04-10 10:40:55 +02:00

Compare commits

...

4 Commits

Author SHA1 Message Date
semantic-release
ade65dd629 2.45.14
Automatically generated by python-semantic-release
2026-01-23 16:50:26 +00:00
709ffd6927 fix(bec_status): adjust bec status widget to info and version signature 2026-01-23 17:49:41 +01:00
d577fac02f test(scan control): avoid strict length comparisons 2025-12-23 13:14:28 +01:00
0349c87261 ci: use auth.token instead of login_or_token 2025-12-23 13:14:28 +01:00
7 changed files with 55 additions and 17 deletions

View File

@@ -3,7 +3,7 @@ import os
from typing import Literal
import requests
from github import Github
from github import Auth, Github
from pydantic import BaseModel
@@ -24,7 +24,7 @@ class ProjectItemHandler:
def __init__(self, gh_config: GHConfig):
self.gh_config = gh_config
self.gh = Github(gh_config.token)
self.gh = Github(auth=Auth.Token(gh_config.token))
self.repo = self.gh.get_repo(f"{gh_config.organization}/{gh_config.repository}")
self.project_node_id = self.get_project_node_id()

View File

@@ -1,6 +1,27 @@
# CHANGELOG
## v2.45.14 (2026-01-23)
### Bug Fixes
- **bec_status**: Adjust bec status widget to info and version signature
([`709ffd6`](https://github.com/bec-project/bec_widgets/commit/709ffd6927dceb903cbd0797fc162e56aef378c1))
### Continuous Integration
- Use auth.token instead of login_or_token
([`0349c87`](https://github.com/bec-project/bec_widgets/commit/0349c872612ab0506e5662b813e78200a76d7590))
### Testing
- **device config**: Validate against pydantic
([`de8fe3b`](https://github.com/bec-project/bec_widgets/commit/de8fe3b5f503ace17b0064d2ce9f54662b0fb77e))
- **scan control**: Avoid strict length comparisons
([`d577fac`](https://github.com/bec-project/bec_widgets/commit/d577fac02fed11b2b1c44704c04fd111c2fed1d3))
## v2.45.13 (2025-12-17)
### Bug Fixes

View File

@@ -9,6 +9,7 @@ from dataclasses import dataclass
from typing import TYPE_CHECKING
from bec_lib.utils.import_utils import lazy_import_from
from pydantic import BaseModel
from qtpy.QtCore import QObject, QTimer, Signal, Slot
from qtpy.QtWidgets import QHBoxLayout, QTreeWidget, QTreeWidgetItem
@@ -18,9 +19,10 @@ from bec_widgets.widgets.services.bec_status_box.status_item import StatusItem
if TYPE_CHECKING: # pragma: no cover
from bec_lib.client import BECClient
# TODO : Put normal imports back when Pydantic gets faster
BECStatus = lazy_import_from("bec_lib.messages", ("BECStatus",))
from bec_lib.messages import BECStatus, ServiceMetricMessage, StatusMessage
else:
# TODO : Put normal imports back when Pydantic gets faster
BECStatus = lazy_import_from("bec_lib.messages", ("BECStatus",))
@dataclass
@@ -200,7 +202,11 @@ class BECStatusBox(BECWidget, CompactPopupWidget):
self.status_container[service_name].update({"info": service_info_item})
@Slot(dict, dict)
def update_service_status(self, services_info: dict, services_metric: dict) -> None:
def update_service_status(
self,
services_info: dict[str, StatusMessage],
services_metric: dict[str, ServiceMetricMessage],
) -> None:
"""Callback function services_metric from BECServiceStatusMixin.
It updates the status of all services.
@@ -209,6 +215,9 @@ class BECStatusBox(BECWidget, CompactPopupWidget):
services_metric (dict): A dictionary containing the service metrics for all running BEC services.
"""
checked = [self.box_name]
# FIXME: We simply replace the pydantic message with dict for now until we refactor the widget
for val in services_info.values():
val.info = val.info.model_dump() if isinstance(val.info, BaseModel) else val.info
services_info = self.update_core_services(services_info, services_metric)
checked.extend(self.CORE_SERVICES)

View File

@@ -141,7 +141,11 @@ class StatusItem(QWidget):
metrics_text = (
f"<b>SERVICE:</b> {self.config.service_name}<br><b>STATUS:</b> {self.config.status}<br>"
)
metrics_text += f"<b>BEC_LIB VERSION:</b> {self.config.info['version']}<br>"
if "version" in self.config.info:
metrics_text += f"<b>BEC_LIB VERSION:</b> {self.config.info['version']}<br>"
if "versions" in self.config.info:
for component, version in self.config.info["versions"].items():
metrics_text += f"<b>{component.upper()} VERSION:</b> {version}<br>"
if self.config.metrics:
for key, value in self.config.metrics.items():
if key == "create_time":

View File

@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "bec_widgets"
version = "2.45.13"
version = "2.45.14"
description = "BEC Widgets"
requires-python = ">=3.11"
classifiers = [

View File

@@ -1,7 +1,5 @@
import time
import pytest
from bec_widgets.utils.widget_io import WidgetIO
@@ -24,8 +22,10 @@ def test_scan_control_populate_scans_e2e(scan_control):
scan_control.comboBox_scan_selection.itemText(i)
for i in range(scan_control.comboBox_scan_selection.count())
]
assert scan_control.comboBox_scan_selection.count() == len(expected_scans)
assert sorted(items) == sorted(expected_scans)
# Verify that we have at least the expected scans.
# There may be more scans if additional scans are added to the test plugin.
assert scan_control.comboBox_scan_selection.count() >= len(expected_scans)
assert all(scan in items for scan in expected_scans)
def test_run_line_scan_with_parameters_e2e(scan_control, bec_client_lib, qtbot):

View File

@@ -2,7 +2,7 @@
from unittest import mock
import pytest
from bec_lib.messages import BECStatus, ServiceMetricMessage, StatusMessage
from bec_lib.messages import BECStatus, ServiceInfo, ServiceMetricMessage, StatusMessage
from bec_widgets.widgets.services.bec_status_box.bec_status_box import (
BECServiceInfoContainer,
@@ -75,13 +75,17 @@ def test_update_service_status(status_box):
"""Also checks check redundant tree items"""
name = "test_service"
status = BECStatus.IDLE
info = {"test": "test"}
info = StatusMessage(name=name, status=status, info=ServiceInfo(user="test", hostname="host"))
metrics = {"metric": "test_metric"}
status_box.add_tree_item(name, status, info, {})
not_connected_name = "invalid_service"
status_box.add_tree_item(not_connected_name, status, info, metrics)
services_status = {name: StatusMessage(name=name, status=status, info=info)}
services_status = {
name: StatusMessage(
name=name, status=status, info=ServiceInfo(user="test", hostname="host")
)
}
services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
with mock.patch.object(status_box, "update_core_services", return_value=services_status):
@@ -95,7 +99,7 @@ def test_update_core_services(status_box):
status_box.CORE_SERVICES = ["test_service"]
name = "test_service"
status = BECStatus.RUNNING
info = {"test": "test"}
info = ServiceInfo(user="test", hostname="host")
metrics = {"metric": "test_metric"}
services_status = {name: StatusMessage(name=name, status=status, info=info)}
services_metrics = {name: ServiceMetricMessage(name=name, metrics=metrics)}
@@ -115,7 +119,7 @@ def test_update_core_services(status_box):
def test_double_click_item(status_box):
name = "test_service"
status = BECStatus.IDLE
info = {"test": "test"}
info = ServiceInfo(user="test", hostname="host")
metrics = {"MyData": "This should be shown nicely"}
status_box.add_tree_item(name, status, info, metrics)
container = status_box.status_container[name]