Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/fastcs/transports/epics/ca/ioc.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
record_metadata_from_attribute,
record_metadata_from_datatype,
)
from fastcs.transports.epics.util import controller_pv_prefix, snake_to_pascal
from fastcs.transports.epics.util import controller_pv_prefix
from fastcs.util import snake_to_pascal

EPICS_MAX_NAME_LENGTH = 60

Expand Down
2 changes: 1 addition & 1 deletion src/fastcs/transports/epics/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
from fastcs.methods import Command
from fastcs.transports.controller_api import ControllerAPI
from fastcs.transports.epics.options import EpicsGUIFormat, EpicsGUIOptions
from fastcs.transports.epics.util import snake_to_pascal
from fastcs.util import snake_to_pascal

logger = bind_logger(logger_name=__name__)

Expand Down
9 changes: 3 additions & 6 deletions src/fastcs/transports/epics/pva/ioc.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@

from fastcs.attributes import AttrR, AttrRW, AttrW
from fastcs.transports.controller_api import ControllerAPI
from fastcs.transports.epics.util import controller_pv_prefix, snake_to_pascal
from fastcs.transports.epics.util import controller_pv_prefix
from fastcs.util import snake_to_pascal

from ._pv_handlers import (
make_command_pv,
make_shared_read_pv,
make_shared_write_pv,
)
from ._pv_handlers import make_command_pv, make_shared_read_pv, make_shared_write_pv
from .pvi import add_pvi_info


Expand Down
2 changes: 1 addition & 1 deletion src/fastcs/transports/epics/pva/pvi.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from fastcs.attributes import Attribute, AttrR, AttrRW, AttrW
from fastcs.transports.controller_api import ControllerAPI
from fastcs.transports.epics.util import snake_to_pascal
from fastcs.util import snake_to_pascal

from .types import p4p_alarm_states, p4p_timestamp_now

Expand Down
12 changes: 1 addition & 11 deletions src/fastcs/transports/epics/util.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
import re

from fastcs.transports.controller_api import ControllerAPI


def snake_to_pascal(name: str) -> str:
"""Converts string from snake case to Pascal case.
If string is not a valid snake case it will be returned unchanged
"""
if re.fullmatch(r"[a-z][a-z0-9]*(?:_[a-z0-9]+)*", name):
name = re.sub(r"(?:^|_)([a-z0-9])", lambda match: match.group(1).upper(), name)
return name
from fastcs.util import snake_to_pascal


def controller_pv_prefix(prefix: str, controller_api: ControllerAPI) -> str:
Expand Down
11 changes: 11 additions & 0 deletions src/fastcs/util.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,13 @@
import re

ONCE = float("inf")
"""Sentinel value to call a ``scan`` or io ``update`` method once on start up"""


def snake_to_pascal(name: str) -> str:
"""Converts string from snake case to Pascal case.
If string is not a valid snake case it will be returned unchanged
"""
if re.fullmatch(r"[a-z][a-z0-9]*(?:_[a-z0-9]+)*", name):
name = re.sub(r"(?:^|_)([a-z0-9])", lambda match: match.group(1).upper(), name)
return name
28 changes: 28 additions & 0 deletions tests/test_util.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from fastcs.util import snake_to_pascal


def test_snake_to_pascal():
name1 = "name_in_snake_case"
name2 = "name-not-in-snake-case"
name3 = "name_with-different_separators"
name4 = "name_with_numbers_1_2_3"
name5 = "numbers_1_2_3_in_the_middle"
name6 = "1_2_3_starting_with_numbers"
name7 = "name1_with2_a3_number4"
name8 = "name_in_lower_case"
name9 = "NameAlreadyInPascalCase"
name10 = "Name_With_%_Invalid_&_Symbols_£_"
name11 = "a_b_c_d"
name12 = "test"
assert snake_to_pascal(name1) == "NameInSnakeCase"
assert snake_to_pascal(name2) == "name-not-in-snake-case"
assert snake_to_pascal(name3) == "name_with-different_separators"
assert snake_to_pascal(name4) == "NameWithNumbers123"
assert snake_to_pascal(name5) == "Numbers123InTheMiddle"
assert snake_to_pascal(name6) == "1_2_3_starting_with_numbers"
assert snake_to_pascal(name7) == "Name1With2A3Number4"
assert snake_to_pascal(name8) == "NameInLowerCase"
assert snake_to_pascal(name9) == "NameAlreadyInPascalCase"
assert snake_to_pascal(name10) == "Name_With_%_Invalid_&_Symbols_£_"
assert snake_to_pascal(name11) == "ABCD"
assert snake_to_pascal(name12) == "Test"
29 changes: 1 addition & 28 deletions tests/transports/epics/test_epics_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,7 @@
from pvi.device import SignalR
from pydantic import ValidationError

from fastcs.transports.epics.util import snake_to_pascal


def test_snake_to_pascal():
name1 = "name_in_snake_case"
name2 = "name-not-in-snake-case"
name3 = "name_with-different_separators"
name4 = "name_with_numbers_1_2_3"
name5 = "numbers_1_2_3_in_the_middle"
name6 = "1_2_3_starting_with_numbers"
name7 = "name1_with2_a3_number4"
name8 = "name_in_lower_case"
name9 = "NameAlreadyInPascalCase"
name10 = "Name_With_%_Invalid_&_Symbols_£_"
name11 = "a_b_c_d"
name12 = "test"
assert snake_to_pascal(name1) == "NameInSnakeCase"
assert snake_to_pascal(name2) == "name-not-in-snake-case"
assert snake_to_pascal(name3) == "name_with-different_separators"
assert snake_to_pascal(name4) == "NameWithNumbers123"
assert snake_to_pascal(name5) == "Numbers123InTheMiddle"
assert snake_to_pascal(name6) == "1_2_3_starting_with_numbers"
assert snake_to_pascal(name7) == "Name1With2A3Number4"
assert snake_to_pascal(name8) == "NameInLowerCase"
assert snake_to_pascal(name9) == "NameAlreadyInPascalCase"
assert snake_to_pascal(name10) == "Name_With_%_Invalid_&_Symbols_£_"
assert snake_to_pascal(name11) == "ABCD"
assert snake_to_pascal(name12) == "Test"
from fastcs.util import snake_to_pascal


def test_pvi_validation_error():
Expand Down