Skip to content

Commit

Permalink
Make to_camelcase cacheable.
Browse files Browse the repository at this point in the history
  • Loading branch information
denpamusic committed May 23, 2024
1 parent 6fc2129 commit 848f113
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 5 deletions.
7 changes: 6 additions & 1 deletion pyplumio/devices/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ def get_device_handler(device_type: int) -> str:

type_name = to_camelcase(
DeviceType(device_type).name,
overrides={"ecomax": "EcoMAX", "ecoster": "EcoSTER"},
overrides=frozenset(
(
("ecomax", "EcoMAX"),
("ecoster", "EcoSTER"),
)
),
)
return f"devices.{type_name.lower()}.{type_name}"

Expand Down
5 changes: 4 additions & 1 deletion pyplumio/frames/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,10 @@ def get_frame_handler(frame_type: int) -> str:
raise UnknownFrameError(f"Unknown frame type ({frame_type})")

module, type_name = FrameType(frame_type).name.split("_", 1)
type_name = to_camelcase(type_name, overrides={"uid": "UID"})
type_name = to_camelcase(
type_name,
overrides=frozenset((("uid", "UID"),)),
)
return f"frames.{module.lower()}s.{type_name}{module.capitalize()}"


Expand Down
9 changes: 7 additions & 2 deletions pyplumio/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,21 @@

from __future__ import annotations

from functools import cache
from typing import Any


def to_camelcase(text: str, overrides: dict[str, str] | None = None) -> str:
@cache
def to_camelcase(text: str, overrides: frozenset[tuple[str, str]] | None = None) -> str:
"""Convert snake_case to CamelCase."""
if overrides is None:
return "".join((x.capitalize() or "_") for x in text.split("_"))

overrides_dict = dict(overrides)
return "".join(
(x.capitalize() or "_") if x.lower() not in overrides else overrides[x.lower()]
(x.capitalize() or "_")
if x.lower() not in overrides_dict
else overrides_dict[x.lower()]
for x in text.split("_")
)

Expand Down
8 changes: 7 additions & 1 deletion tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ def test_to_camelcase() -> None:
assert utils.to_camelcase("make_love_not_war") == "MakeLoveNotWar"
assert (
utils.to_camelcase(
"make_love_not_war", overrides={"love": "LOVE", "not": "not"}
"make_love_not_war",
overrides=frozenset(
(
("love", "LOVE"),
("not", "not"),
)
),
)
== "MakeLOVEnotWar"
)
Expand Down

0 comments on commit 848f113

Please sign in to comment.