Skip to content

Commit 6830688

Browse files
committed
feat: update new format rules camel_case, pascal_case, snake_case, kebab_case
1 parent 91c4b88 commit 6830688

File tree

3 files changed

+159
-1
lines changed

3 files changed

+159
-1
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,18 @@ This rule formats text according to specified rules. This rule now supports the
238238
... "format_lowercase": "UPPERCASE TITLE",
239239
... "format_uppercase": "lowercase content",
240240
... "format_upper_head": "camelVariable",
241+
... "format_camel_case": "Camel case",
242+
... "format_pascal_case": "pascal case",
243+
... "format_kabab_case": "Kebab case",
244+
... "format_snake_case": "Snake case",
241245
... }).generated()
242246
uppercase title
243247
LOWERCASE CONTENT
244248
CamelVariable
249+
camelCase
250+
PascalCase
251+
kebab-case
252+
snake_case
245253
```
246254

247255
### IndentRule

src/dictrule/built_in_rules/format_rule.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
Optional,
88
)
99

10+
import re
1011
from enum import Enum
1112
from ..rule import Rule
1213
from ..dr_property import dr_property
@@ -27,10 +28,18 @@ class FormatRule(Rule):
2728
... "format_lowercase": "UPPERCASE TITLE",
2829
... "format_uppercase": "lowercase content",
2930
... "format_upper_head": "camelVariable",
31+
... "format_camel_case": "Camel case",
32+
... "format_pascal_case": "pascal case",
33+
... "format_kabab_case": "Kebab case",
34+
... "format_snake_case": "Snake case",
3035
... }).generated()
3136
uppercase title
3237
LOWERCASE CONTENT
3338
CamelVariable
39+
camelCase
40+
PascalCase
41+
kebab-case
42+
snake_case
3443
"""
3544

3645
@dr_property(prefix_matching=True)
@@ -43,6 +52,10 @@ class Type(Enum):
4352
LOWERCASE = "lowercase"
4453
UPPERCASE = "uppercase"
4554
UPPER_HEAD = "upper_head"
55+
CAMEL_CASE = "camel_case"
56+
PASCAL_CASE = "pascal_case"
57+
KEBAB_CASE = "kebab_case"
58+
SNAKE_CASE = "snake_case"
4659

4760
@staticmethod
4861
def from_str(string: str) -> Optional["FormatRule.Type"]:
@@ -84,6 +97,32 @@ def format(
8497
if self == FormatRule.Type.UPPER_HEAD:
8598
return (text[0].upper() + text[1:]) if len(text) > 0 else ""
8699

100+
if self == FormatRule.Type.CAMEL_CASE:
101+
words = list(filter(None, re.split(r"[^a-zA-Z0-9]+", text)))
102+
return (
103+
words[0][0].lower()
104+
+ (words[0][1:] if len(words[0]) > 0 else "")
105+
+ "".join(
106+
word[0].upper() + (word[1:] if len(word) > 0 else "")
107+
for word in words[1:]
108+
)
109+
)
110+
111+
if self == FormatRule.Type.PASCAL_CASE:
112+
words = list(filter(None, re.split(r"[^a-zA-Z0-9]+", text)))
113+
return "".join(
114+
word[0].upper() + (word[1:] if len(word) > 0 else "")
115+
for word in words
116+
)
117+
118+
if self == FormatRule.Type.KEBAB_CASE:
119+
kebab_text = re.sub(r"[^a-zA-Z0-9]+", "-", text).strip("-").lower()
120+
return kebab_text
121+
122+
if self == FormatRule.Type.SNAKE_CASE:
123+
snake_text = re.sub(r"[^a-zA-Z0-9]+", "_", text).strip("_").lower()
124+
return snake_text
125+
87126
return text
88127

89128
def parse(

tests/built_in_rules/test_format_rule.py

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""FormatRule test"""
22

3-
from dictrule.built_in_rules import FormatRule
43
import unittest
4+
from dictrule.built_in_rules import FormatRule
55

66

77
class TestFormatRule(unittest.TestCase):
@@ -46,6 +46,117 @@ def test_format_upper_head(self):
4646
)
4747
self.assertEqual(parsed, "MyText 123")
4848

49+
def test_format_camel_case(self):
50+
"""Test method"""
51+
52+
texts = [
53+
"My Camel Case 123",
54+
"My CamelCase 123",
55+
"MyCamelCase 123",
56+
"MyCamelCase123",
57+
"myCamelCase123",
58+
"My-Camel-Case 123",
59+
"My-Camel-Case-123",
60+
"---My---Camel---Case---123---",
61+
"My_Camel_Case_123",
62+
"$$My $Camel $Case $123",
63+
"$$my $camel $case $123",
64+
]
65+
66+
rule = FormatRule()
67+
68+
for text in texts:
69+
parsed = rule.parse(
70+
rule_dict={
71+
"format_camel_case": text,
72+
},
73+
rule_callback=lambda x, y: y,
74+
)
75+
self.assertEqual(parsed, "myCamelCase123")
76+
77+
def test_format_pascal_case(self):
78+
"""Test method"""
79+
80+
texts = [
81+
"My Pascal Case 123",
82+
"my pascal case 123",
83+
"My PascalCase 123",
84+
"MyPascalCase 123",
85+
"MyPascalCase123",
86+
"myPascalCase123",
87+
"My-Pascal-Case 123",
88+
"My-Pascal-Case-123",
89+
"---My---Pascal---Case---123---",
90+
"My_Pascal_Case_123",
91+
"$$My $Pascal $Case $123",
92+
"$$my $pascal $case $123",
93+
]
94+
95+
rule = FormatRule()
96+
97+
for text in texts:
98+
parsed = rule.parse(
99+
rule_dict={
100+
"format_pascal_case": text,
101+
},
102+
rule_callback=lambda x, y: y,
103+
)
104+
self.assertEqual(parsed, "MyPascalCase123")
105+
106+
def test_format_kebab_case(self):
107+
"""Test method"""
108+
109+
texts = [
110+
"My Kebab Case 123",
111+
"my kebab case 123",
112+
"My-Kebab-Case 123",
113+
"My-Kebab-Case-123",
114+
"---My---Kebab---Case---123---",
115+
"My_Kebab_Case_123",
116+
"$$My $Kebab $Case $123",
117+
"$$my $kebab $case $123",
118+
"my-kebab-case-123",
119+
"__my-kebab-case-123__",
120+
]
121+
122+
rule = FormatRule()
123+
124+
for text in texts:
125+
parsed = rule.parse(
126+
rule_dict={
127+
"format_kebab_case": text,
128+
},
129+
rule_callback=lambda x, y: y,
130+
)
131+
self.assertEqual(parsed, "my-kebab-case-123")
132+
133+
def test_format_snake_case(self):
134+
"""Test method"""
135+
136+
texts = [
137+
"My Snake Case 123",
138+
"my snake case 123",
139+
"My-Snake-Case 123",
140+
"My-Snake-Case-123",
141+
"---My---Snake---Case---123---",
142+
"My_Snake_Case_123",
143+
"$$My $Snake $Case $123",
144+
"$$my $snake $case $123",
145+
"my-snake-case-123",
146+
"__my-snake-case-123__",
147+
]
148+
149+
rule = FormatRule()
150+
151+
for text in texts:
152+
parsed = rule.parse(
153+
rule_dict={
154+
"format_snake_case": text,
155+
},
156+
rule_callback=lambda x, y: y,
157+
)
158+
self.assertEqual(parsed, "my_snake_case_123")
159+
49160
def test_format_empty(self):
50161
"""Test method"""
51162

0 commit comments

Comments
 (0)