Skip to content

Commit ea16723

Browse files
committed
Improved pascal_case + tests
1 parent 7ed4683 commit ea16723

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

dash/_utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import secrets
1212
import string
1313
import inspect
14+
import re
15+
1416
from html import escape
1517
from functools import wraps
1618
from typing import Union
@@ -302,3 +304,14 @@ def get_caller_name():
302304
return s.frame.f_locals.get("__name__", "__main__")
303305

304306
return "__main__"
307+
308+
309+
def pascal_case(name: str | None):
310+
s = re.sub(r"\s", "_", str(name))
311+
# Replace leading `_`
312+
s = re.sub("^[_]+", "", s)
313+
if not s:
314+
return s
315+
return s[0].upper() + re.sub(
316+
r"[\-_\.]+([a-z])", lambda match: match.group(1).upper(), s[1:]
317+
)

dash/development/_py_prop_typing.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import string
44
import textwrap
55
import importlib
6-
import re
6+
7+
from .._utils import pascal_case
78

89

910
shapes = {}
@@ -51,12 +52,6 @@ def generate_any(*_):
5152
return "typing.Any"
5253

5354

54-
def pascal_case(name: str):
55-
return name[0].upper() + re.sub(
56-
r"[\-_\.\s]([a-z])", lambda match: match.group(1).upper(), name[1:]
57-
)
58-
59-
6055
def generate_shape(type_info, component_name: str, prop_name: str):
6156
props = []
6257
name = pascal_case(prop_name)

tests/unit/library/test_utils.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,19 @@ def test_ddut001_attribute_dict():
5858
a.x = 4
5959
assert err.value.args == ("Object is final: No new keys may be added.", "x")
6060
assert "x" not in a
61+
62+
63+
@pytest.mark.parametrize(
64+
"value,expected",
65+
[
66+
("foo_bar", "FooBar"),
67+
("", ""),
68+
("fooBarFoo", "FooBarFoo"),
69+
("foo bar", "FooBar"),
70+
("foo-bar", "FooBar"),
71+
("__private_prop", "PrivateProp"),
72+
("double__middle___triple", "DoubleMiddleTriple"),
73+
],
74+
)
75+
def test_ddut002_pascal_case(value, expected):
76+
assert utils.pascal_case(value) == expected

0 commit comments

Comments
 (0)