diff --git a/src/semiwrap/name_transform.py b/src/semiwrap/name_transform.py index 7f34920..70dcc56 100644 --- a/src/semiwrap/name_transform.py +++ b/src/semiwrap/name_transform.py @@ -57,6 +57,7 @@ class NameTransforms: _WORD_RE = re.compile(r"[A-Z]+(?=[A-Z][a-z]|[0-9]|_|$)|[A-Z]?[a-z]+|[0-9]+|[A-Z]+") +_CAPS_CASE_PART_RE = re.compile(r"[A-Z0-9]+") def _split_underscore_affixes(name: str) -> typing.Tuple[str, str, str]: @@ -89,10 +90,12 @@ def _normalize_known_words( def _split_words_no_known_words(name: str) -> typing.List[str]: + parts = [part for part in name.replace("-", "_").split("_") if part] + if parts and all(_CAPS_CASE_PART_RE.fullmatch(part) for part in parts): + return parts + words: typing.List[str] = [] - for part in name.replace("-", "_").split("_"): - if not part: - continue + for part in parts: words.extend(m.group(0) for m in _WORD_RE.finditer(part)) return words or [name] diff --git a/tests/test_name_transform.py b/tests/test_name_transform.py index b08bc05..725a067 100644 --- a/tests/test_name_transform.py +++ b/tests/test_name_transform.py @@ -20,6 +20,8 @@ ("http_server", "http_server"), ("getFOO", "get_foo"), ("PascalCase_LikeThis", "pascal_case_like_this"), + ("CAN_S0", "can_s0"), + ("WPI_TIMESRC_V4L_EOF", "wpi_timesrc_v4l_eof"), ], ) def test_snake_case_transform(source, expected): @@ -115,6 +117,8 @@ def test_builtin_transforms_do_not_strip_non_k_camel_case_prefix(): ("http_server", "HTTP_SERVER"), ("getFOO", "GET_FOO"), ("PascalCase_LikeThis", "PASCAL_CASE_LIKE_THIS"), + ("CAN_S0", "CAN_S0"), + ("WPI_TIMESRC_V4L_EOF", "WPI_TIMESRC_V4L_EOF"), ], ) def test_caps_case_transform(source, expected):