value-object-pattern 0.6.1__tar.gz → 0.7.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.
Files changed (76) hide show
  1. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/PKG-INFO +1 -1
  2. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/__init__.py +3 -2
  3. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/models/__init__.py +2 -0
  4. value_object_pattern-0.7.0/value_object_pattern/models/base_model.py +346 -0
  5. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/models/enumeration_value_object.py +8 -5
  6. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/models/value_object.py +9 -6
  7. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/bytes/bytes_value_object.py +1 -1
  8. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/.gitignore +0 -0
  9. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/LICENSE.md +0 -0
  10. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/README.md +0 -0
  11. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/pyproject.toml +0 -0
  12. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/decorators/__init__.py +0 -0
  13. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/decorators/value_object_process.py +0 -0
  14. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/decorators/value_object_validation.py +0 -0
  15. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/py.typed +0 -0
  16. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/__init__.py +0 -0
  17. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/__init__.py +0 -0
  18. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/date/__init__.py +0 -0
  19. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/date/date_value_object.py +0 -0
  20. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/date/string_date_value_object.py +0 -0
  21. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/datetime/__init__.py +0 -0
  22. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/datetime/datetime_value_object.py +0 -0
  23. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/datetime/string_datetime_value_object.py +0 -0
  24. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/timezone/__init__.py +0 -0
  25. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/timezone/string_timezone_value_object.py +0 -0
  26. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/dates/timezone/timezone_value_object.py +0 -0
  27. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/identifiers/__init__.py +0 -0
  28. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/identifiers/countries/__init__.py +0 -0
  29. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/identifiers/countries/spain/__init__.py +0 -0
  30. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/identifiers/countries/spain/dni_value_object.py +0 -0
  31. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/identifiers/string_uuid_value_object.py +0 -0
  32. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/identifiers/uuid_value_object.py +0 -0
  33. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/__init__.py +0 -0
  34. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/aws_cloud_region_value_object.py +0 -0
  35. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/domain_value_object.py +0 -0
  36. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/host_value_object.py +0 -0
  37. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/ipv4_address_value_object.py +0 -0
  38. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/ipv4_network_value_object.py +0 -0
  39. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/ipv6_address_value_object.py +0 -0
  40. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/ipv6_network_value_object.py +0 -0
  41. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/mac_address_value_object.py +0 -0
  42. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/port_value_object.py +0 -0
  43. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/uri/__init__.py +0 -0
  44. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/uri/http_https_url_value_object.py +0 -0
  45. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/uri/http_url_value_object.py +0 -0
  46. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/uri/https_url_value_object.py +0 -0
  47. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/internet/uri/url_value_object.py +0 -0
  48. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/__init__.py +0 -0
  49. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/boolean/__init__.py +0 -0
  50. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/boolean/boolean_value_object.py +0 -0
  51. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/boolean/false_value_object.py +0 -0
  52. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/boolean/true_value_object.py +0 -0
  53. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/bytes/__init__.py +0 -0
  54. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/float/__init__.py +0 -0
  55. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/float/float_value_object.py +0 -0
  56. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/float/negative_float_value_object.py +0 -0
  57. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/float/positive_float_value_object.py +0 -0
  58. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/integer/__init__.py +0 -0
  59. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/integer/even_integer_value_object.py +0 -0
  60. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/integer/integer_value_object.py +0 -0
  61. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/integer/negative_integer_value_object.py +0 -0
  62. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/integer/odd_integer_value_object.py +0 -0
  63. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/integer/positive_integer_value_object.py +0 -0
  64. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/none/__init__.py +0 -0
  65. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/none/none_value_object.py +0 -0
  66. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/none/not_none_value_object.py +0 -0
  67. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/__init__.py +0 -0
  68. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/alpha_value_object.py +0 -0
  69. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/alphanumeric_value_object.py +0 -0
  70. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/digit_value_object.py +0 -0
  71. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/lowercase_string_value_object.py +0 -0
  72. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/non_empty_string_value_object.py +0 -0
  73. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/printable_string_value_object.py +0 -0
  74. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/string_value_object.py +0 -0
  75. {value_object_pattern-0.6.1 → value_object_pattern-0.7.0}/value_object_pattern/usables/primitives/string/trimmed_string_value_object.py +0 -0
  76. {value_object_pattern-0.6.1 → value_object_pattern-0.7.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.6.1
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,9 +1,10 @@
1
- __version__ = '0.6.1'
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',
@@ -1,7 +1,9 @@
1
+ from .base_model import BaseModel
1
2
  from .enumeration_value_object import EnumerationValueObject
2
3
  from .value_object import ValueObject
3
4
 
4
5
  __all__ = (
6
+ 'BaseModel',
5
7
  'EnumerationValueObject',
6
8
  'ValueObject',
7
9
  )
@@ -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 isinstance(value, str):
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
- Value object generic type.
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 generic type.
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!s})'
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 <<<{str(object=value)}>>> must be bytes. Got <<<{type(value).__name__}>>> type.') # noqa: E501 # fmt: skip
50
+ raise TypeError(f'BytesValueObject value <<<{value}>>> must be bytes. Got <<<{type(value).__name__}>>> type.') # noqa: E501 # fmt: skip