value-object-pattern 0.2.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/PKG-INFO +1 -1
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/pyproject.toml +1 -1
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/__init__.py +3 -2
- value_object_pattern-0.3.0/value_object_pattern/models/__init__.py +7 -0
- value_object_pattern-0.3.0/value_object_pattern/models/enumeration_value_object.py +169 -0
- value_object_pattern-0.2.0/value_object_pattern/models/__init__.py +0 -3
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/.gitignore +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/LICENSE.md +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/README.md +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/decorators/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/decorators/value_object_process.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/decorators/value_object_validation.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/models/value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/py.typed +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/dates/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/dates/date/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/dates/date/date_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/dates/date/string_date_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/dates/datetime/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/dates/datetime/datetime_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/dates/datetime/string_datetime_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/identifiers/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/identifiers/countries/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/identifiers/countries/spain/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/identifiers/countries/spain/dni_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/identifiers/string_uuid_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/identifiers/uuid_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/aws_cloud_region_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/domain_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/host_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/ipv4_address_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/ipv4_network_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/ipv6_address_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/ipv6_network_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/mac_address_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/port_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/uri/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/uri/http_https_url_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/uri/http_url_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/uri/https_url_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/internet/uri/url_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/boolean/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/boolean/boolean_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/boolean/false_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/boolean/true_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/bytes/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/bytes/bytes_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/float/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/float/float_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/float/negative_float_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/float/positive_float_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/integer/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/integer/even_integer_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/integer/integer_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/integer/negative_integer_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/integer/odd_integer_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/integer/positive_integer_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/__init__.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/alpha_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/alphanumeric_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/digit_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/lowercase_string_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/non_empty_string_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/printable_string_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/string_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/trimmed_string_value_object.py +0 -0
- {value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/primitives/string/uppercase_string_value_object.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: value-object-pattern
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.3.0
|
4
4
|
Summary: The Value Object Pattern is a Python package that streamlines the creation and management of value objects in your projects.
|
5
5
|
Project-URL: Homepage, https://github.com/adriamontoto/value-object-pattern
|
6
6
|
Project-URL: Repository, https://github.com/adriamontoto/value-object-pattern
|
@@ -66,7 +66,7 @@ test = [
|
|
66
66
|
'object-mother-pattern>=1.0.0',
|
67
67
|
{ include-group = 'coverage' },
|
68
68
|
]
|
69
|
-
types = ['types-python-dateutil>=2.9.0.20241206
|
69
|
+
types = ['types-python-dateutil>=2.9.0.20241206']
|
70
70
|
all = [
|
71
71
|
{ include-group = 'audit' },
|
72
72
|
{ include-group = 'coverage' },
|
@@ -1,9 +1,10 @@
|
|
1
|
-
__version__ = '0.
|
1
|
+
__version__ = '0.3.0'
|
2
2
|
|
3
3
|
from .decorators import process, validation
|
4
|
-
from .models import ValueObject
|
4
|
+
from .models import EnumerationValueObject, ValueObject
|
5
5
|
|
6
6
|
__all__ = (
|
7
|
+
'EnumerationValueObject',
|
7
8
|
'ValueObject',
|
8
9
|
'process',
|
9
10
|
'validation',
|
@@ -0,0 +1,169 @@
|
|
1
|
+
"""
|
2
|
+
EnumerationValueObject module.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from enum import Enum
|
6
|
+
from inspect import isclass
|
7
|
+
from sys import version_info
|
8
|
+
from typing import Any, Generic, TypeVar, get_args, get_origin
|
9
|
+
|
10
|
+
if version_info >= (3, 12):
|
11
|
+
from typing import override # pragma: no cover
|
12
|
+
else:
|
13
|
+
from typing_extensions import override # pragma: no cover
|
14
|
+
|
15
|
+
from value_object_pattern.decorators import process, validation
|
16
|
+
from value_object_pattern.models.value_object import ValueObject
|
17
|
+
|
18
|
+
E = TypeVar('E', bound=Enum)
|
19
|
+
|
20
|
+
|
21
|
+
class EnumerationValueObject(ValueObject[str | E], Generic[E]):
|
22
|
+
"""
|
23
|
+
EnumerationValueObject is a value object that ensures the provided value is from an enumeration.
|
24
|
+
|
25
|
+
Example:
|
26
|
+
```python
|
27
|
+
from enum import Enum, unique
|
28
|
+
|
29
|
+
from value_object_pattern import EnumerationValueObject
|
30
|
+
|
31
|
+
|
32
|
+
@unique
|
33
|
+
class ColorEnumeration(Enum):
|
34
|
+
RED = 1
|
35
|
+
GREEN = 2
|
36
|
+
BLUE = 3
|
37
|
+
|
38
|
+
|
39
|
+
class ColorValueObject(EnumerationValueObject[ColorEnumeration]):
|
40
|
+
pass
|
41
|
+
|
42
|
+
|
43
|
+
red = ColorValueObject(value=ColorEnumeration.RED)
|
44
|
+
green = ColorValueObject(value='GREEN')
|
45
|
+
print(repr(red), repr(green))
|
46
|
+
# >>> ColorValueObject(value=ColorEnumeration.RED) ColorValueObject(value=ColorEnumeration.GREEN)
|
47
|
+
```
|
48
|
+
"""
|
49
|
+
|
50
|
+
_enumeration: type[E]
|
51
|
+
|
52
|
+
@override
|
53
|
+
def __init_subclass__(cls, **kwargs: Any) -> None:
|
54
|
+
"""
|
55
|
+
Initializes the class.
|
56
|
+
|
57
|
+
Args:
|
58
|
+
**kwargs (Any): Keyword arguments.
|
59
|
+
|
60
|
+
Raises:
|
61
|
+
TypeError: If the class parameter is not an Enum subclass.
|
62
|
+
TypeError: If the class is not parameterized.
|
63
|
+
"""
|
64
|
+
super().__init_subclass__(**kwargs)
|
65
|
+
|
66
|
+
for base in getattr(cls, '__orig_bases__', ()):
|
67
|
+
if get_origin(tp=base) is EnumerationValueObject:
|
68
|
+
enumeration, *_ = get_args(tp=base)
|
69
|
+
|
70
|
+
if not (isclass(object=enumeration) and issubclass(enumeration, Enum)):
|
71
|
+
raise TypeError(f'EnumerationValueObject[...] <<<{enumeration}>>> must be an Enum subclass. Got <<<{type(enumeration).__name__}>>> type.') # noqa: E501 # fmt: skip
|
72
|
+
|
73
|
+
cls._enumeration = enumeration
|
74
|
+
return
|
75
|
+
|
76
|
+
raise TypeError('EnumerationValueObject must be parameterized, e.g. "class ColorValueObject(EnumerationValueObject[ColorEnumeration])".') # noqa: E501 # fmt: skip
|
77
|
+
|
78
|
+
@override
|
79
|
+
def __repr__(self) -> str:
|
80
|
+
"""
|
81
|
+
Returns a detailed string representation of the value object.
|
82
|
+
|
83
|
+
Returns:
|
84
|
+
str: A string representation of the value object in the format 'ClassName(value=value)'.
|
85
|
+
|
86
|
+
Example:
|
87
|
+
```python
|
88
|
+
from enum import Enum, unique
|
89
|
+
|
90
|
+
from value_object_pattern import EnumerationValueObject
|
91
|
+
|
92
|
+
|
93
|
+
@unique
|
94
|
+
class ColorEnumeration(Enum):
|
95
|
+
RED = 1
|
96
|
+
GREEN = 2
|
97
|
+
BLUE = 3
|
98
|
+
|
99
|
+
|
100
|
+
class ColorValueObject(EnumerationValueObject[ColorEnumeration]):
|
101
|
+
pass
|
102
|
+
|
103
|
+
|
104
|
+
red = ColorValueObject(value=ColorEnumeration.RED)
|
105
|
+
print(repr(red))
|
106
|
+
# >>> ColorValueObject(value=ColorEnumeration.RED)
|
107
|
+
```
|
108
|
+
"""
|
109
|
+
return f'{self.__class__.__name__}(value={self.value.__class__.__name__}.{self.value.name})'
|
110
|
+
|
111
|
+
@process(order=0)
|
112
|
+
def _ensure_value_is_stored_as_enumeration(self, value: str | E) -> E:
|
113
|
+
"""
|
114
|
+
Ensures the value object `value` is stored as an enumeration.
|
115
|
+
|
116
|
+
Args:
|
117
|
+
value (str | E): The provided value. It can be the name of the member or the member itself.
|
118
|
+
|
119
|
+
Returns:
|
120
|
+
E: The processed value.
|
121
|
+
"""
|
122
|
+
if isinstance(value, str):
|
123
|
+
return self._enumeration[value.upper()]
|
124
|
+
|
125
|
+
return value
|
126
|
+
|
127
|
+
@validation(order=0)
|
128
|
+
def _ensure_value_is_from_enumeration(self, value: str | E) -> None:
|
129
|
+
"""
|
130
|
+
Ensures the value object `value` is from the enumeration.
|
131
|
+
|
132
|
+
Args:
|
133
|
+
value (str | E): The provided value. It can be the name of the member or the member itself.
|
134
|
+
|
135
|
+
Raises:
|
136
|
+
TypeError: If the `value` is not from the enumeration.
|
137
|
+
"""
|
138
|
+
if isinstance(value, self._enumeration):
|
139
|
+
return
|
140
|
+
|
141
|
+
if isinstance(value, str) and value in self._enumeration.__members__:
|
142
|
+
return
|
143
|
+
|
144
|
+
raise TypeError(f'EnumerationValueObject value <<<{value}>>> must be from the enumeration <<<{self._title}>>>.') # noqa: E501 # fmt: skip
|
145
|
+
|
146
|
+
@override
|
147
|
+
@property
|
148
|
+
def value(self) -> E:
|
149
|
+
"""
|
150
|
+
Returns the value object value.
|
151
|
+
|
152
|
+
Returns:
|
153
|
+
E: The value object value.
|
154
|
+
|
155
|
+
Example:
|
156
|
+
```python
|
157
|
+
from value_object_pattern import ValueObject
|
158
|
+
|
159
|
+
|
160
|
+
class IntegerValueObject(ValueObject[int]):
|
161
|
+
pass
|
162
|
+
|
163
|
+
|
164
|
+
integer = IntegerValueObject(value=10)
|
165
|
+
print(integer.value)
|
166
|
+
# >>> 10
|
167
|
+
```
|
168
|
+
"""
|
169
|
+
return self._value # type: ignore[return-value]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{value_object_pattern-0.2.0 → value_object_pattern-0.3.0}/value_object_pattern/usables/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|