diff --git a/bec_widgets/utils/name_utils.py b/bec_widgets/utils/name_utils.py index 45c15f05..99c34c3c 100644 --- a/bec_widgets/utils/name_utils.py +++ b/bec_widgets/utils/name_utils.py @@ -16,6 +16,20 @@ def pascal_to_snake(name: str) -> str: return s2.lower() +def pascal_to_title(name: str) -> str: + """ + Convert PascalCase to a space-separated title. + + Args: + name (str): The name to be converted. + + Returns: + str: The converted name. + """ + s1 = re.sub(r"([a-z0-9])([A-Z])", r"\1 \2", name) + return re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1 \2", s1) + + def sanitize_namespace(namespace: str | None) -> str | None: """ Clean user-provided namespace labels for filesystem compatibility. diff --git a/tests/unit_tests/test_name_utils.py b/tests/unit_tests/test_name_utils.py index 665bd5c4..4df8634f 100644 --- a/tests/unit_tests/test_name_utils.py +++ b/tests/unit_tests/test_name_utils.py @@ -1,4 +1,4 @@ -from bec_widgets.utils.name_utils import pascal_to_snake, sanitize_namespace +from bec_widgets.utils.name_utils import pascal_to_snake, pascal_to_title, sanitize_namespace def test_pascal_to_snake(): @@ -6,6 +6,11 @@ def test_pascal_to_snake(): assert pascal_to_snake("BECStatusWidget") == "bec_status_widget" +def test_pascal_to_title(): + assert pascal_to_title("DigitalTwin") == "Digital Twin" + assert pascal_to_title("BECStatusWidget") == "BEC Status Widget" + + def test_sanitize_namespace(): assert sanitize_namespace("scan 1 / user") == "scan_1_user" assert sanitize_namespace(" beamline.state-1 ") == "beamline.state-1"