value-object-pattern 0.6.1__py3-none-any.whl → 0.7.0__py3-none-any.whl
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/__init__.py +3 -2
- value_object_pattern/models/__init__.py +2 -0
- value_object_pattern/models/base_model.py +346 -0
- value_object_pattern/models/enumeration_value_object.py +8 -5
- value_object_pattern/models/value_object.py +9 -6
- value_object_pattern/usables/primitives/bytes/bytes_value_object.py +1 -1
- {value_object_pattern-0.6.1.dist-info → value_object_pattern-0.7.0.dist-info}/METADATA +1 -1
- {value_object_pattern-0.6.1.dist-info → value_object_pattern-0.7.0.dist-info}/RECORD +10 -9
- {value_object_pattern-0.6.1.dist-info → value_object_pattern-0.7.0.dist-info}/WHEEL +0 -0
- {value_object_pattern-0.6.1.dist-info → value_object_pattern-0.7.0.dist-info}/licenses/LICENSE.md +0 -0
value_object_pattern/__init__.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
__version__ = '0.
|
1
|
+
__version__ = '0.7.0'
|
2
2
|
|
3
3
|
from .decorators import process, validation
|
4
|
-
from .models import EnumerationValueObject, ValueObject
|
4
|
+
from .models import BaseModel, EnumerationValueObject, ValueObject
|
5
5
|
|
6
6
|
__all__ = (
|
7
|
+
'BaseModel',
|
7
8
|
'EnumerationValueObject',
|
8
9
|
'ValueObject',
|
9
10
|
'process',
|
@@ -0,0 +1,346 @@
|
|
1
|
+
"""
|
2
|
+
BaseModel module.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from sys import version_info
|
6
|
+
|
7
|
+
if version_info >= (3, 12):
|
8
|
+
from typing import override # pragma: no cover
|
9
|
+
else:
|
10
|
+
from typing_extensions import override # pragma: no cover
|
11
|
+
|
12
|
+
from abc import ABC, abstractmethod
|
13
|
+
from typing import Any, Self
|
14
|
+
|
15
|
+
|
16
|
+
class BaseModel(ABC):
|
17
|
+
"""
|
18
|
+
BaseModel class is a base class for all aggregate root classes.
|
19
|
+
|
20
|
+
***This class is abstract and should not be instantiated directly***.
|
21
|
+
|
22
|
+
Example:
|
23
|
+
```python
|
24
|
+
from datetime import datetime
|
25
|
+
|
26
|
+
from value_object_pattern import BaseModel
|
27
|
+
|
28
|
+
|
29
|
+
class User(BaseModel):
|
30
|
+
name: str
|
31
|
+
_birthdate: datetime
|
32
|
+
__password: str
|
33
|
+
|
34
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
35
|
+
self.name = name
|
36
|
+
self.birthdate = birthdate
|
37
|
+
self.__password = password
|
38
|
+
|
39
|
+
|
40
|
+
user = User(name='John Doe', birthdate=datetime.now(), password='password')
|
41
|
+
print(user)
|
42
|
+
# >>> User(birthdate=1900-01-01T00:00:00+00:00, name=John Doe)
|
43
|
+
```
|
44
|
+
"""
|
45
|
+
|
46
|
+
@abstractmethod
|
47
|
+
def __init__(self) -> None:
|
48
|
+
"""
|
49
|
+
Initialize the BaseModel class.
|
50
|
+
|
51
|
+
***This method is abstract and should be implemented by the child class***.
|
52
|
+
|
53
|
+
Example:
|
54
|
+
```python
|
55
|
+
from datetime import datetime
|
56
|
+
|
57
|
+
from value_object_pattern import BaseModel
|
58
|
+
|
59
|
+
|
60
|
+
class User(BaseModel):
|
61
|
+
name: str
|
62
|
+
_birthdate: datetime
|
63
|
+
__password: str
|
64
|
+
|
65
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
66
|
+
self.name = name
|
67
|
+
self.birthdate = birthdate
|
68
|
+
self.__password = password
|
69
|
+
|
70
|
+
|
71
|
+
user = User(name='John Doe', birthdate=datetime.now(), password='password')
|
72
|
+
print(user)
|
73
|
+
# >>> User(birthdate=1900-01-01T00:00:00+00:00, name=John Doe)
|
74
|
+
```
|
75
|
+
"""
|
76
|
+
|
77
|
+
@override
|
78
|
+
def __repr__(self) -> str:
|
79
|
+
"""
|
80
|
+
Returns the class representation as a string. Private attributes that start with "__" are not included, this
|
81
|
+
can be used to hide sensitive information.
|
82
|
+
|
83
|
+
Returns:
|
84
|
+
str: String representation of the class.
|
85
|
+
|
86
|
+
Example:
|
87
|
+
```python
|
88
|
+
from datetime import datetime
|
89
|
+
|
90
|
+
from value_object_pattern import BaseModel
|
91
|
+
|
92
|
+
|
93
|
+
class User(BaseModel):
|
94
|
+
name: str
|
95
|
+
_birthdate: datetime
|
96
|
+
__password: str
|
97
|
+
|
98
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
99
|
+
self.name = name
|
100
|
+
self.birthdate = birthdate
|
101
|
+
self.__password = password
|
102
|
+
|
103
|
+
|
104
|
+
user = User(name='John Doe', birthdate=datetime.now(), password='password')
|
105
|
+
print(repr(user))
|
106
|
+
# >>> User(birthdate=datetime.datetime(1900, 1, 1, 0, 0), name='John Doe')
|
107
|
+
```
|
108
|
+
"""
|
109
|
+
attributes = []
|
110
|
+
for key, value in sorted(self._to_dict(ignore_private=True).items()):
|
111
|
+
attributes.append(f'{key}={value!r}')
|
112
|
+
|
113
|
+
return f'{self.__class__.__name__}({", ".join(attributes)})'
|
114
|
+
|
115
|
+
@override
|
116
|
+
def __str__(self) -> str:
|
117
|
+
"""
|
118
|
+
Returns the class string representation. Private attributes that start with "__" are not included, this can be
|
119
|
+
used to hide sensitive information.
|
120
|
+
|
121
|
+
Returns:
|
122
|
+
str: String representation of the class.
|
123
|
+
|
124
|
+
Example:
|
125
|
+
```python
|
126
|
+
from datetime import datetime
|
127
|
+
|
128
|
+
from value_object_pattern import BaseModel
|
129
|
+
|
130
|
+
|
131
|
+
class User(BaseModel):
|
132
|
+
name: str
|
133
|
+
_birthdate: datetime
|
134
|
+
__password: str
|
135
|
+
|
136
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
137
|
+
self.name = name
|
138
|
+
self.birthdate = birthdate
|
139
|
+
self.__password = password
|
140
|
+
|
141
|
+
|
142
|
+
user = User(name='John Doe', birthdate=datetime.now(), password='password')
|
143
|
+
print(str(user))
|
144
|
+
# >>> User(birthdate=1900-01-01T00:00:00+00:00, name=John Doe)
|
145
|
+
```
|
146
|
+
"""
|
147
|
+
attributes = []
|
148
|
+
for key, value in sorted(self.to_primitives().items()):
|
149
|
+
attributes.append(f'{key}={value}')
|
150
|
+
|
151
|
+
return f'{self.__class__.__name__}({", ".join(attributes)})'
|
152
|
+
|
153
|
+
@override
|
154
|
+
def __hash__(self) -> int:
|
155
|
+
"""
|
156
|
+
Returns the hash of the class. Private attributes that start with "__" are not included, this can be used to
|
157
|
+
hide sensitive information.
|
158
|
+
|
159
|
+
Returns:
|
160
|
+
int: Hash of the class.
|
161
|
+
|
162
|
+
Example:
|
163
|
+
```python
|
164
|
+
from datetime import datetime
|
165
|
+
|
166
|
+
from value_object_pattern import BaseModel
|
167
|
+
|
168
|
+
|
169
|
+
class User(BaseModel):
|
170
|
+
name: str
|
171
|
+
_birthdate: datetime
|
172
|
+
__password: str
|
173
|
+
|
174
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
175
|
+
self.name = name
|
176
|
+
self.birthdate = birthdate
|
177
|
+
self.__password = password
|
178
|
+
|
179
|
+
|
180
|
+
user = User(name='John Doe', birthdate=datetime.now(), password='password')
|
181
|
+
print(hash(user))
|
182
|
+
# >>> 4606426846015488538
|
183
|
+
```
|
184
|
+
"""
|
185
|
+
return hash(tuple(sorted(self._to_dict(ignore_private=True).items())))
|
186
|
+
|
187
|
+
@override
|
188
|
+
def __eq__(self, other: object) -> bool:
|
189
|
+
"""
|
190
|
+
Check if the class is equal to another object. Private attributes that start with "__" are not included, this
|
191
|
+
can be used to hide sensitive information.
|
192
|
+
|
193
|
+
Args:
|
194
|
+
other (object): Object to compare.
|
195
|
+
|
196
|
+
Returns:
|
197
|
+
bool: True if the objects are equal, otherwise False.
|
198
|
+
|
199
|
+
Example:
|
200
|
+
```python
|
201
|
+
from datetime import datetime
|
202
|
+
|
203
|
+
from value_object_pattern import BaseModel
|
204
|
+
|
205
|
+
|
206
|
+
class User(BaseModel):
|
207
|
+
name: str
|
208
|
+
_birthdate: datetime
|
209
|
+
__password: str
|
210
|
+
|
211
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
212
|
+
self.name = name
|
213
|
+
self.birthdate = birthdate
|
214
|
+
self.__password = password
|
215
|
+
|
216
|
+
|
217
|
+
today = datetime.now()
|
218
|
+
user = User(name='John Doe', birthdate=today, password='password')
|
219
|
+
user_2 = User(name='John Doe', birthdate=today, password='another-password')
|
220
|
+
print(user == user_2)
|
221
|
+
# >>> True
|
222
|
+
```
|
223
|
+
"""
|
224
|
+
if not isinstance(other, self.__class__):
|
225
|
+
return NotImplemented
|
226
|
+
|
227
|
+
return self._to_dict(ignore_private=True) == other._to_dict(ignore_private=True)
|
228
|
+
|
229
|
+
def _to_dict(self, *, ignore_private: bool = True) -> dict[str, Any]:
|
230
|
+
"""
|
231
|
+
Returns the class as a dictionary. The difference between this method and `to_primitives` is that this method
|
232
|
+
does not convert attributes to primitives.
|
233
|
+
|
234
|
+
***This method is not intended to be used directly, use `to_primitives` instead.***
|
235
|
+
|
236
|
+
Args:
|
237
|
+
ignore_private (bool, optional): Whether to ignore private attributes (those that start with double
|
238
|
+
underscore "__"). Defaults to True.
|
239
|
+
|
240
|
+
Returns:
|
241
|
+
dict[str, Any]: Dictionary representation of the class.
|
242
|
+
"""
|
243
|
+
dictionary: dict[str, Any] = {}
|
244
|
+
for key, value in self.__dict__.items():
|
245
|
+
if ignore_private and key.startswith(f'_{self.__class__.__name__}__'):
|
246
|
+
continue # ignore private attributes
|
247
|
+
|
248
|
+
key = key.replace(f'_{self.__class__.__name__}__', '')
|
249
|
+
|
250
|
+
if key.startswith('_'):
|
251
|
+
key = key[1:]
|
252
|
+
|
253
|
+
dictionary[key] = value
|
254
|
+
|
255
|
+
return dictionary
|
256
|
+
|
257
|
+
@classmethod
|
258
|
+
def from_primitives(cls, primitives: dict[str, Any]) -> Self:
|
259
|
+
"""
|
260
|
+
Create an instance of the class with a dictionary of its primitives.
|
261
|
+
|
262
|
+
Args:
|
263
|
+
primitives (dict[str, Any]): Dictionary to create the instance from.
|
264
|
+
|
265
|
+
Returns:
|
266
|
+
Self: Instance of the class.
|
267
|
+
|
268
|
+
Example:
|
269
|
+
```python
|
270
|
+
from datetime import datetime
|
271
|
+
|
272
|
+
from value_object_pattern import BaseModel
|
273
|
+
|
274
|
+
|
275
|
+
class User(BaseModel):
|
276
|
+
name: str
|
277
|
+
_birthdate: datetime
|
278
|
+
__password: str
|
279
|
+
|
280
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
281
|
+
self.name = name
|
282
|
+
self.birthdate = birthdate
|
283
|
+
self.__password = password
|
284
|
+
|
285
|
+
|
286
|
+
user = User.from_primitives(primitives={'name': 'John Doe', 'birthdate': datetime.now(), 'password': 'password'})
|
287
|
+
print(user.to_primitives())
|
288
|
+
# >>> {'name': 'John Doe', 'birthdate': '1900-01-01T00:00:00+00:00'}
|
289
|
+
```
|
290
|
+
""" # noqa: E501
|
291
|
+
return cls(**primitives)
|
292
|
+
|
293
|
+
def to_primitives(self) -> dict[str, Any]:
|
294
|
+
"""
|
295
|
+
Returns the class as a dictionary of its primitives. Private attributes that start with "__" are not included,
|
296
|
+
this can be used to hide sensitive information.
|
297
|
+
|
298
|
+
Returns:
|
299
|
+
dict[str, Any]: Primitives dictionary representation of the class.
|
300
|
+
|
301
|
+
Example:
|
302
|
+
```python
|
303
|
+
from datetime import datetime
|
304
|
+
|
305
|
+
from value_object_pattern import BaseModel
|
306
|
+
|
307
|
+
|
308
|
+
class User(BaseModel):
|
309
|
+
name: str
|
310
|
+
_birthdate: datetime
|
311
|
+
__password: str
|
312
|
+
|
313
|
+
def __init__(self, name: str, birthdate: datetime, password: str) -> None:
|
314
|
+
self.name = name
|
315
|
+
self.birthdate = birthdate
|
316
|
+
self.__password = password
|
317
|
+
|
318
|
+
|
319
|
+
user = User(name='John Doe', birthdate=datetime.now(), password='password')
|
320
|
+
print(user.to_primitives())
|
321
|
+
# >>> {'name': 'John Doe', 'birthdate': '1900-01-01T00:00:00+00:00'}
|
322
|
+
```
|
323
|
+
"""
|
324
|
+
primitive_types: tuple[type, ...] = (int, float, str, bool, bytes, bytearray, memoryview, type(None))
|
325
|
+
collection_types: tuple[type, ...] = (list, dict, tuple, set, frozenset)
|
326
|
+
|
327
|
+
dictionary = self._to_dict(ignore_private=True)
|
328
|
+
for key, value in dictionary.items():
|
329
|
+
if isinstance(value, BaseModel):
|
330
|
+
value = value.to_primitives()
|
331
|
+
|
332
|
+
elif hasattr(value, 'value'):
|
333
|
+
value = value.value
|
334
|
+
|
335
|
+
elif isinstance(value, primitive_types): # noqa: SIM114
|
336
|
+
pass
|
337
|
+
|
338
|
+
elif isinstance(value, collection_types):
|
339
|
+
pass
|
340
|
+
|
341
|
+
else:
|
342
|
+
value = str(value)
|
343
|
+
|
344
|
+
dictionary[key] = value
|
345
|
+
|
346
|
+
return dictionary
|
@@ -2,16 +2,17 @@
|
|
2
2
|
EnumerationValueObject module.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from enum import Enum
|
6
|
-
from inspect import isclass
|
7
5
|
from sys import version_info
|
8
|
-
from typing import Any, Generic, TypeVar, get_args, get_origin
|
9
6
|
|
10
7
|
if version_info >= (3, 12):
|
11
8
|
from typing import override # pragma: no cover
|
12
9
|
else:
|
13
10
|
from typing_extensions import override # pragma: no cover
|
14
11
|
|
12
|
+
from enum import Enum
|
13
|
+
from inspect import isclass
|
14
|
+
from typing import Any, Generic, TypeVar, get_args, get_origin
|
15
|
+
|
15
16
|
from value_object_pattern.decorators import process, validation
|
16
17
|
from value_object_pattern.models.value_object import ValueObject
|
17
18
|
|
@@ -22,6 +23,8 @@ class EnumerationValueObject(ValueObject[str | E], Generic[E]): # noqa: UP046
|
|
22
23
|
"""
|
23
24
|
EnumerationValueObject is a value object that ensures the provided value is from an enumeration.
|
24
25
|
|
26
|
+
***This class is abstract and should not be instantiated directly***.
|
27
|
+
|
25
28
|
Example:
|
26
29
|
```python
|
27
30
|
from enum import Enum, unique
|
@@ -119,10 +122,10 @@ class EnumerationValueObject(ValueObject[str | E], Generic[E]): # noqa: UP046
|
|
119
122
|
Returns:
|
120
123
|
E: The processed value.
|
121
124
|
"""
|
122
|
-
if
|
125
|
+
if type(value) is str:
|
123
126
|
return self._enumeration[value.upper()]
|
124
127
|
|
125
|
-
return value
|
128
|
+
return value # type: ignore[return-value]
|
126
129
|
|
127
130
|
@validation(order=0)
|
128
131
|
def _ensure_value_is_from_enumeration(self, value: str | E) -> None:
|
@@ -1,23 +1,26 @@
|
|
1
1
|
"""
|
2
|
-
|
2
|
+
ValueObject module.
|
3
3
|
"""
|
4
4
|
|
5
|
-
from abc import ABC
|
6
|
-
from collections import deque
|
7
5
|
from sys import version_info
|
8
|
-
from typing import Any, Callable, Generic, NoReturn, TypeVar
|
9
6
|
|
10
7
|
if version_info >= (3, 12):
|
11
8
|
from typing import override # pragma: no cover
|
12
9
|
else:
|
13
10
|
from typing_extensions import override # pragma: no cover
|
14
11
|
|
12
|
+
from abc import ABC
|
13
|
+
from collections import deque
|
14
|
+
from typing import Any, Callable, Generic, NoReturn, TypeVar
|
15
|
+
|
15
16
|
T = TypeVar('T')
|
16
17
|
|
17
18
|
|
18
19
|
class ValueObject(ABC, Generic[T]): # noqa: UP046
|
19
20
|
"""
|
20
|
-
ValueObject
|
21
|
+
ValueObject class is a value object that ensures the provided value follows the domain rules.
|
22
|
+
|
23
|
+
***This class is abstract and should not be instantiated directly***.
|
21
24
|
|
22
25
|
Example:
|
23
26
|
```python
|
@@ -128,7 +131,7 @@ class ValueObject(ABC, Generic[T]): # noqa: UP046
|
|
128
131
|
# >>> IntegerValueObject(value=10)
|
129
132
|
```
|
130
133
|
"""
|
131
|
-
return f'{self.__class__.__name__}(value={self._value!
|
134
|
+
return f'{self.__class__.__name__}(value={self._value!r})'
|
132
135
|
|
133
136
|
@override
|
134
137
|
def __str__(self) -> str:
|
@@ -47,4 +47,4 @@ class BytesValueObject(ValueObject[bytes]):
|
|
47
47
|
Raises:
|
48
48
|
TypeError: If the `value` is not bytes.
|
49
49
|
"""
|
50
|
-
raise TypeError(f'BytesValueObject value <<<{
|
50
|
+
raise TypeError(f'BytesValueObject value <<<{value}>>> must be bytes. Got <<<{type(value).__name__}>>> type.') # noqa: E501 # fmt: skip
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: value-object-pattern
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.7.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
|
@@ -1,11 +1,12 @@
|
|
1
|
-
value_object_pattern/__init__.py,sha256=
|
1
|
+
value_object_pattern/__init__.py,sha256=i_mpYSCbXs3zUImIoRui-YhwqXbp7olBKE3lmFk012Y,248
|
2
2
|
value_object_pattern/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
value_object_pattern/decorators/__init__.py,sha256=Ze0c0z3x5sdmV-KB7nljPsybpoTXAgjJDGfR8FCIxUQ,138
|
4
4
|
value_object_pattern/decorators/value_object_process.py,sha256=Q_0w26XolcfZOE6avveA5OGs1yIMNAVC_AxsBV8F5D0,2621
|
5
5
|
value_object_pattern/decorators/value_object_validation.py,sha256=ENAQuOLalc-dDzVEpRolbBg8Y0g7--4DRimHTPDD12U,2793
|
6
|
-
value_object_pattern/models/__init__.py,sha256=
|
7
|
-
value_object_pattern/models/
|
8
|
-
value_object_pattern/models/
|
6
|
+
value_object_pattern/models/__init__.py,sha256=4bghKWDFI6V_Xag35CuEvq0lzkdiLKPgv0zd7LyvfP0,214
|
7
|
+
value_object_pattern/models/base_model.py,sha256=6sFIusvrUbbwiHOJxxD3xrcyPRJS0Sib0VSXYKc0gRg,10332
|
8
|
+
value_object_pattern/models/enumeration_value_object.py,sha256=YI0a5PV8-hK0imW_22RQ9WkwxzzKC58LFNte8l_Po-o,4988
|
9
|
+
value_object_pattern/models/value_object.py,sha256=ekpGJLi5S8Okg-4XId7t8k26Gxx1krROgIo1gKrlmtQ,13764
|
9
10
|
value_object_pattern/usables/__init__.py,sha256=-VuuKrTyD8X0ImNexe3S6zcrf24o17_p1ghdb9bEyqs,1577
|
10
11
|
value_object_pattern/usables/dates/__init__.py,sha256=fGcL0u-dpxruMAWP-As1-ZUr-982SK1vb3sjnYyJh5g,382
|
11
12
|
value_object_pattern/usables/dates/date/__init__.py,sha256=rSifr41n8gmqW80e0Ygzoj221dpVsZy7m4TecC_VJus,174
|
@@ -44,7 +45,7 @@ value_object_pattern/usables/primitives/boolean/boolean_value_object.py,sha256=C
|
|
44
45
|
value_object_pattern/usables/primitives/boolean/false_value_object.py,sha256=bQRyyjYrjcAXTlStiJSC2aKpTUFWG3foASOfkMk3Kwo,1264
|
45
46
|
value_object_pattern/usables/primitives/boolean/true_value_object.py,sha256=PymHByY4fBrD6yl6yzvhpbZNN-gRyldnU3Pnq0oSUNU,1253
|
46
47
|
value_object_pattern/usables/primitives/bytes/__init__.py,sha256=QRqBTEXxNaKWDgusLCyW5OG_uFCfueV0WMm9pB7V8bk,82
|
47
|
-
value_object_pattern/usables/primitives/bytes/bytes_value_object.py,sha256=
|
48
|
+
value_object_pattern/usables/primitives/bytes/bytes_value_object.py,sha256=KF_7HayhHIyrWmQ7OgeuH8w8wK-qeWAas6BpeUQZeuI,1376
|
48
49
|
value_object_pattern/usables/primitives/float/__init__.py,sha256=N28h_ApJgiqZKSHl-_57CZ1zj4b8y1UoHpolblv5dOI,284
|
49
50
|
value_object_pattern/usables/primitives/float/float_value_object.py,sha256=erRGRUsgaZ6PKt9xYC-G6jPTk3vkMtKw7ezpUAKAv7M,1348
|
50
51
|
value_object_pattern/usables/primitives/float/negative_float_value_object.py,sha256=DVZnWoIURpisUyBVaTNwDnlSIULJ4eAMbO9pzTnzytY,1382
|
@@ -68,7 +69,7 @@ value_object_pattern/usables/primitives/string/printable_string_value_object.py,
|
|
68
69
|
value_object_pattern/usables/primitives/string/string_value_object.py,sha256=6u98oMzz5qsVNEWna-UpziDmzFhaLFW7J5NBoJnbKWk,1370
|
69
70
|
value_object_pattern/usables/primitives/string/trimmed_string_value_object.py,sha256=WMp4IBA74cEli-N_9Q7qU_oMszHtk5tgCr6o2y99HMs,1435
|
70
71
|
value_object_pattern/usables/primitives/string/uppercase_string_value_object.py,sha256=yZajkdq09zb56_UHs4nc0sIeTV4K74ek26JcoHYhM64,1457
|
71
|
-
value_object_pattern-0.
|
72
|
-
value_object_pattern-0.
|
73
|
-
value_object_pattern-0.
|
74
|
-
value_object_pattern-0.
|
72
|
+
value_object_pattern-0.7.0.dist-info/METADATA,sha256=-pCuF-dXjqWMUKyBwzTdDf24VgycphMYbDW1vBXo6Xo,4018
|
73
|
+
value_object_pattern-0.7.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
74
|
+
value_object_pattern-0.7.0.dist-info/licenses/LICENSE.md,sha256=6E0wpVdiB-k3oJ9cvVG9BPZ07yIevD3IuOECHKveFkM,1076
|
75
|
+
value_object_pattern-0.7.0.dist-info/RECORD,,
|
File without changes
|
{value_object_pattern-0.6.1.dist-info → value_object_pattern-0.7.0.dist-info}/licenses/LICENSE.md
RENAMED
File without changes
|