Skip to content

Commit 15bd4ec

Browse files
adriamontotoCopilot
andcommitted
feat: implement PascalCaseStringValueObject for PascalCase validation
Co-authored-by: Copilot <copilot@github.com> Signed-off-by: Adria Montoto <75563346+adriamontoto@users.noreply.github.com>
1 parent 4e3bc64 commit 15bd4ec

4 files changed

Lines changed: 61 additions & 0 deletions

File tree

value_object_pattern/usables/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
NotEmptyStringValueObject,
2020
NotNoneValueObject,
2121
OddIntegerValueObject,
22+
PascalCaseStringValueObject,
2223
PositiveFloatValueObject,
2324
PositiveIntegerValueObject,
2425
PositiveOrZeroFloatValueObject,
@@ -55,6 +56,7 @@
5556
'NotEmptyStringValueObject',
5657
'NotNoneValueObject',
5758
'OddIntegerValueObject',
59+
'PascalCaseStringValueObject',
5860
'PositiveFloatValueObject',
5961
'PositiveIntegerValueObject',
6062
'PositiveOrZeroFloatValueObject',

value_object_pattern/usables/primitives/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
KebabCaseStringValueObject,
2626
LowercaseStringValueObject,
2727
NotEmptyStringValueObject,
28+
PascalCaseStringValueObject,
2829
PrintableStringValueObject,
2930
ScreamingSnakeCaseStringValueObject,
3031
SnakeCaseStringValueObject,
@@ -54,6 +55,7 @@
5455
'NotEmptyStringValueObject',
5556
'NotNoneValueObject',
5657
'OddIntegerValueObject',
58+
'PascalCaseStringValueObject',
5759
'PositiveFloatValueObject',
5860
'PositiveIntegerValueObject',
5961
'PositiveOrZeroFloatValueObject',

value_object_pattern/usables/primitives/string/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .kebab_case_string_value_object import KebabCaseStringValueObject
66
from .lowercase_string_value_object import LowercaseStringValueObject
77
from .non_empty_string_value_object import NotEmptyStringValueObject
8+
from .pascal_case_string_value_object import PascalCaseStringValueObject
89
from .printable_string_value_object import PrintableStringValueObject
910
from .screaming_snake_case_string_value_object import ScreamingSnakeCaseStringValueObject
1011
from .snake_case_string_value_object import SnakeCaseStringValueObject
@@ -20,6 +21,7 @@
2021
'KebabCaseStringValueObject',
2122
'LowercaseStringValueObject',
2223
'NotEmptyStringValueObject',
24+
'PascalCaseStringValueObject',
2325
'PrintableStringValueObject',
2426
'ScreamingSnakeCaseStringValueObject',
2527
'SnakeCaseStringValueObject',
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""
2+
PascalCaseStringValueObject value object.
3+
"""
4+
5+
from re import Pattern, compile as re_compile
6+
from typing import NoReturn
7+
8+
from value_object_pattern.decorators import validation
9+
10+
from .non_empty_string_value_object import NotEmptyStringValueObject
11+
from .trimmed_string_value_object import TrimmedStringValueObject
12+
13+
14+
class PascalCaseStringValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
15+
"""
16+
PascalCaseStringValueObject value object ensures the provided value is PascalCase.
17+
18+
Example:
19+
```python
20+
from value_object_pattern.usables import PascalCaseStringValueObject
21+
22+
string = PascalCaseStringValueObject(value='Abcd1234Word')
23+
24+
print(repr(string))
25+
# >>> PascalCaseStringValueObject(value='Abcd1234Word')
26+
```
27+
"""
28+
29+
_VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[A-Z][a-z0-9]*(?:[A-Z][a-z0-9]*)*$')
30+
31+
@validation(order=0)
32+
def _ensure_value_is_pascal_case(self, value: str) -> None:
33+
"""
34+
Ensures the value object `value` is PascalCase.
35+
36+
Args:
37+
value (str): The provided value.
38+
39+
Raises:
40+
ValueError: If the `value` is not PascalCase.
41+
"""
42+
if not self._VALIDATION_REGEX.fullmatch(string=value):
43+
self._raise_value_is_not_pascal_case(value=value)
44+
45+
def _raise_value_is_not_pascal_case(self, value: str) -> NoReturn:
46+
"""
47+
Raises a ValueError if the value object `value` is PascalCase.
48+
49+
Args:
50+
value (str): The provided value.
51+
52+
Raises:
53+
ValueError: If the `value` is not PascalCase.
54+
"""
55+
raise ValueError(f'PascalCaseStringValueObject value <<<{value}>>> has invalid format. Only PascalCase strings starting with an uppercase letter and continuing with alphanumeric words are allowed.') # noqa: E501 # fmt: skip

0 commit comments

Comments
 (0)