diff --git a/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py b/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py index 7c0ef7c5..cb5279b4 100644 --- a/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py +++ b/bec_widgets/widgets/containers/advanced_dock_area/advanced_dock_area.py @@ -1,7 +1,9 @@ from __future__ import annotations import os -from typing import Callable, Literal, Mapping, Sequence +from typing import Literal, Mapping, Sequence + +import slugify from bec_lib import bec_logger from qtpy.QtCore import QTimer, Signal @@ -21,7 +23,6 @@ from bec_widgets import BECWidget, SafeProperty, SafeSlot from bec_widgets.cli.rpc.rpc_widget_handler import widget_handler from bec_widgets.utils import BECDispatcher from bec_widgets.utils.colors import apply_theme -from bec_widgets.utils.name_utils import sanitize_namespace from bec_widgets.utils.toolbars.actions import ( ExpandableMenuAction, MaterialIconAction, @@ -81,6 +82,7 @@ from bec_widgets.widgets.services.bec_queue.bec_queue import BECQueue from bec_widgets.widgets.services.bec_status_box.bec_status_box import BECStatusBox from bec_widgets.widgets.utility.logpanel import LogPanel from bec_widgets.widgets.utility.visual.dark_mode_button.dark_mode_button import DarkModeButton +from tests.unit_tests.test_modular_toolbar import separator_action logger = bec_logger.logger @@ -130,7 +132,7 @@ class AdvancedDockArea(DockAreaWidget): self._profile_namespace_hint = profile_namespace self._profile_namespace_auto = auto_profile_namespace self._profile_namespace_resolved: str | None | object = _PROFILE_NAMESPACE_UNSET - self._instance_id = sanitize_namespace(instance_id) if instance_id else None + self._instance_id = slugify.slugify(instance_id, separator="_") if instance_id else None self._auto_save_upon_exit = auto_save_upon_exit self._profile_management_enabled = enable_profile_management self._restore_initial_profile = restore_initial_profile @@ -558,7 +560,7 @@ class AdvancedDockArea(DockAreaWidget): if not candidate: candidate = self.__class__.__name__ - resolved = sanitize_namespace(candidate) if candidate else None + resolved = slugify.slugify(candidate, separator="_") if candidate else None if not resolved: resolved = "general" self._profile_namespace_resolved = resolved # type: ignore[assignment] diff --git a/bec_widgets/widgets/containers/advanced_dock_area/profile_utils.py b/bec_widgets/widgets/containers/advanced_dock_area/profile_utils.py index ded47f32..267a7bdc 100644 --- a/bec_widgets/widgets/containers/advanced_dock_area/profile_utils.py +++ b/bec_widgets/widgets/containers/advanced_dock_area/profile_utils.py @@ -10,12 +10,12 @@ Policy: from __future__ import annotations import os -import re import shutil from functools import lru_cache from pathlib import Path from typing import Literal +import slugify from bec_lib import bec_logger from bec_lib.client import BECClient from bec_lib.plugin_helper import plugin_package_name, plugin_repo_path @@ -137,7 +137,7 @@ def _profiles_dir(segment: str, namespace: str | None) -> str: str: Absolute directory path for the requested segment/namespace pair. """ base = os.path.join(_settings_profiles_root(), segment) - ns = sanitize_namespace(namespace) + ns = slugify.slugify(namespace, separator="_") if namespace else None path = os.path.join(base, ns) if ns else base os.makedirs(path, exist_ok=True) return path @@ -154,7 +154,7 @@ def _user_path_candidates(name: str, namespace: str | None) -> list[str]: Returns: list[str]: Ordered list of candidate user profile paths (.ini files). """ - ns = sanitize_namespace(namespace) + ns = slugify.slugify(namespace, separator="_") if namespace else None primary = os.path.join(_profiles_dir("user", ns), f"{name}.ini") if not ns: return [primary] @@ -173,7 +173,7 @@ def _default_path_candidates(name: str, namespace: str | None) -> list[str]: Returns: list[str]: Ordered list of candidate default profile paths (.ini files). """ - ns = sanitize_namespace(namespace) + ns = slugify.slugify(namespace, separator="_") if namespace else None primary = os.path.join(_profiles_dir("default", ns), f"{name}.ini") if not ns: return [primary] @@ -452,7 +452,7 @@ def list_profiles(namespace: str | None = None) -> list[str]: Returns: list[str]: Sorted unique profile names. """ - ns = sanitize_namespace(namespace) + ns = slugify.slugify(namespace, separator="_") if namespace else None def _collect_from(directory: str) -> set[str]: if not os.path.isdir(directory): @@ -553,11 +553,11 @@ def _last_profile_key(namespace: str | None, instance: str | None = None) -> str Returns: str: Scoped key string. """ - ns = sanitize_namespace(namespace) + ns = slugify.slugify(namespace, separator="_") if namespace else None key = SETTINGS_KEYS["last_profile"] if ns: key = f"{key}/{ns}" - inst = sanitize_namespace(instance) if instance else "" + inst = slugify.slugify(instance, separator="_") if instance else "" if inst: key = f"{key}@{inst}" return key