value-object-pattern 0.4.0__py3-none-any.whl → 0.6.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.
@@ -1,4 +1,4 @@
1
- __version__ = '0.4.0'
1
+ __version__ = '0.6.0'
2
2
 
3
3
  from .decorators import process, validation
4
4
  from .models import EnumerationValueObject, ValueObject
@@ -11,7 +11,9 @@ from .primitives import (
11
11
  LowercaseStringValueObject,
12
12
  NegativeFloatValueObject,
13
13
  NegativeIntegerValueObject,
14
+ NoneValueObject,
14
15
  NotEmptyStringValueObject,
16
+ NotNoneValueObject,
15
17
  OddIntegerValueObject,
16
18
  PositiveFloatValueObject,
17
19
  PositiveIntegerValueObject,
@@ -37,8 +39,10 @@ __all__ = (
37
39
  'LowercaseStringValueObject',
38
40
  'NegativeFloatValueObject',
39
41
  'NegativeIntegerValueObject',
42
+ 'NoneValueObject',
40
43
  'NotEmptyStringValueObject',
41
44
  'NotEmptyStringValueObject',
45
+ 'NotNoneValueObject',
42
46
  'OddIntegerValueObject',
43
47
  'PositiveFloatValueObject',
44
48
  'PositiveIntegerValueObject',
@@ -1,9 +1,12 @@
1
1
  from .date import DateValueObject, StringDateValueObject
2
2
  from .datetime import DatetimeValueObject, StringDatetimeValueObject
3
+ from .timezone import StringTimezoneValueObject, TimezoneValueObject
3
4
 
4
5
  __all__ = (
5
6
  'DateValueObject',
6
7
  'DatetimeValueObject',
7
8
  'StringDateValueObject',
8
9
  'StringDatetimeValueObject',
10
+ 'StringTimezoneValueObject',
11
+ 'TimezoneValueObject',
9
12
  )
@@ -0,0 +1,7 @@
1
+ from .string_timezone_value_object import StringTimezoneValueObject
2
+ from .timezone_value_object import TimezoneValueObject
3
+
4
+ __all__ = (
5
+ 'StringTimezoneValueObject',
6
+ 'TimezoneValueObject',
7
+ )
@@ -0,0 +1,66 @@
1
+ """
2
+ StringTimezoneValueObject value object.
3
+ """
4
+
5
+ from typing import Any, NoReturn
6
+ from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
7
+
8
+ from value_object_pattern.decorators import process, validation
9
+ from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
10
+
11
+
12
+ class StringTimezoneValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
13
+ """
14
+ StringTimezoneValueObject value object ensures the provided value is a string timezone.
15
+
16
+ Example:
17
+ ```python
18
+ from value_object_pattern.usables.dates import StringTimezoneValueObject
19
+
20
+ timezone = StringTimezoneValueObject(value='UTC')
21
+
22
+ print(repr(timezone))
23
+ # >>> StringTimezoneValueObject(value='UTC')
24
+ ```
25
+ """
26
+
27
+ @process(order=0)
28
+ def _ensure_value_is_normalized(self, value: str) -> str:
29
+ """
30
+ Ensures the value object `value` is normalized timezone string (uppercase).
31
+
32
+ Args:
33
+ value (str): The provided value.
34
+
35
+ Returns:
36
+ str: The normalized timezone string.
37
+ """
38
+ return value.upper()
39
+
40
+ @validation(order=0)
41
+ def _ensure_value_is_timezone(self, value: str) -> None:
42
+ """
43
+ Ensures the value object `value` is a string timezone.
44
+
45
+ Args:
46
+ value (str): The provided value.
47
+
48
+ Raises:
49
+ ValueError: If the `value` is not a timezone.
50
+ """
51
+ try:
52
+ ZoneInfo(value)
53
+ except ZoneInfoNotFoundError:
54
+ self._raise_value_is_not_timezone(value=value)
55
+
56
+ def _raise_value_is_not_timezone(self, value: Any) -> NoReturn:
57
+ """
58
+ Raises a ValueError if the value object `value` is not a timezone.
59
+
60
+ Args:
61
+ value (Any): The provided value.
62
+
63
+ Raises:
64
+ ValueError: If the `value` is not a timezone.
65
+ """
66
+ raise ValueError(f'StringTimezoneValueObject value <<<{value}>>> must be a timezone.')
@@ -0,0 +1,53 @@
1
+ """
2
+ TimezoneValueObject value object.
3
+ """
4
+
5
+ from datetime import tzinfo
6
+ from typing import Any, NoReturn
7
+
8
+ from value_object_pattern.decorators import validation
9
+ from value_object_pattern.models import ValueObject
10
+
11
+
12
+ class TimezoneValueObject(ValueObject[tzinfo]):
13
+ """
14
+ TimezoneValueObject value object ensures the provided value is a timezone.
15
+
16
+ Example:
17
+ ```python
18
+ from datetime import UTC
19
+
20
+ from value_object_pattern.usables import TimezoneValueObject
21
+
22
+ timezone = TimezoneValueObject(value=UTC)
23
+
24
+ print(repr(timezone))
25
+ # >>> TimezoneValueObject(value=UTC)
26
+ ```
27
+ """
28
+
29
+ @validation(order=0)
30
+ def _ensure_value_is_timezone(self, value: tzinfo) -> None:
31
+ """
32
+ Ensures the value object `value` is a timezone.
33
+
34
+ Args:
35
+ value (tzinfo): The provided value.
36
+
37
+ Raises:
38
+ TypeError: If the `value` is not a timezone.
39
+ """
40
+ if not isinstance(value, tzinfo):
41
+ self._raise_value_is_not_timezone(value=value)
42
+
43
+ def _raise_value_is_not_timezone(self, value: Any) -> NoReturn:
44
+ """
45
+ Raises a TypeError if the value object `value` is not a timezone.
46
+
47
+ Args:
48
+ value (Any): The provided value.
49
+
50
+ Raises:
51
+ TypeError: If the `value` is not a timezone.
52
+ """
53
+ raise TypeError(f'TimezoneValueObject value <<<{value}>>> must be a timezone. Got <<<{type(value).__name__}>>> type.') # noqa: E501 # fmt: skip
@@ -8,6 +8,7 @@ from .integer import (
8
8
  OddIntegerValueObject,
9
9
  PositiveIntegerValueObject,
10
10
  )
11
+ from .none import NoneValueObject, NotNoneValueObject
11
12
  from .string import (
12
13
  AlphaStringValueObject,
13
14
  AlphanumericStringValueObject,
@@ -33,7 +34,9 @@ __all__ = (
33
34
  'LowercaseStringValueObject',
34
35
  'NegativeFloatValueObject',
35
36
  'NegativeIntegerValueObject',
37
+ 'NoneValueObject',
36
38
  'NotEmptyStringValueObject',
39
+ 'NotNoneValueObject',
37
40
  'OddIntegerValueObject',
38
41
  'PositiveFloatValueObject',
39
42
  'PositiveIntegerValueObject',
@@ -0,0 +1,7 @@
1
+ from .none_value_object import NoneValueObject
2
+ from .not_none_value_object import NotNoneValueObject
3
+
4
+ __all__ = (
5
+ 'NoneValueObject',
6
+ 'NotNoneValueObject',
7
+ )
@@ -0,0 +1,50 @@
1
+ """
2
+ NoneValueObject value object.
3
+ """
4
+
5
+ from typing import Any, NoReturn
6
+
7
+ from value_object_pattern.decorators import validation
8
+ from value_object_pattern.models import ValueObject
9
+
10
+
11
+ class NoneValueObject(ValueObject[None]):
12
+ """
13
+ NoneValueObject value object ensures the provided value is None.
14
+
15
+ Example:
16
+ ```python
17
+ from value_object_pattern.usables import NoneValueObject
18
+
19
+ none = NoneValueObject(value=None)
20
+
21
+ print(repr(none))
22
+ # >>> NoneValueObject(value=None)
23
+ ```
24
+ """
25
+
26
+ @validation(order=0)
27
+ def _ensure_value_is_none(self, value: None) -> None:
28
+ """
29
+ Ensures the value object `value` is None.
30
+
31
+ Args:
32
+ value (None): The provided value.
33
+
34
+ Raises:
35
+ TypeError: If the `value` is not None.
36
+ """
37
+ if value is not None:
38
+ self._raise_value_is_not_none(value=value)
39
+
40
+ def _raise_value_is_not_none(self, value: Any) -> NoReturn:
41
+ """
42
+ Raises a TypeError if the value object `value` is not None.
43
+
44
+ Args:
45
+ value (Any): The provided value.
46
+
47
+ Raises:
48
+ TypeError: If the `value` is not None.
49
+ """
50
+ raise TypeError(f'NoneValueObject value <<<{value}>>> must be None. Got <<<{type(value).__name__}>>> type.') # noqa: E501 # fmt: skip
@@ -0,0 +1,50 @@
1
+ """
2
+ NotNoneValueObject value object.
3
+ """
4
+
5
+ from typing import Any, NoReturn
6
+
7
+ from value_object_pattern.decorators import validation
8
+ from value_object_pattern.models import ValueObject
9
+
10
+
11
+ class NotNoneValueObject(ValueObject[Any]):
12
+ """
13
+ NotNoneValueObject value object ensures the provided value is not None.
14
+
15
+ Example:
16
+ ```python
17
+ from value_object_pattern.usables import NotNoneValueObject
18
+
19
+ none = NotNoneValueObject(value='test')
20
+
21
+ print(repr(none))
22
+ # >>> NotNoneValueObject(value=test)
23
+ ```
24
+ """
25
+
26
+ @validation(order=0)
27
+ def _ensure_value_is_not_none(self, value: Any) -> None:
28
+ """
29
+ Ensures the value object `value` is not None.
30
+
31
+ Args:
32
+ value (Any): The provided value.
33
+
34
+ Raises:
35
+ TypeError: If the `value` is None.
36
+ """
37
+ if value is None:
38
+ self._raise_value_is_not_none(value=value)
39
+
40
+ def _raise_value_is_not_none(self, value: Any) -> NoReturn:
41
+ """
42
+ Raises a TypeError if the value object `value` is None.
43
+
44
+ Args:
45
+ value (Any): The provided value.
46
+
47
+ Raises:
48
+ TypeError: If the `value` is None.
49
+ """
50
+ raise TypeError(f'NotNoneValueObject value <<<{value}>>> must be not None.')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: value-object-pattern
3
- Version: 0.4.0
3
+ Version: 0.6.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,4 +1,4 @@
1
- value_object_pattern/__init__.py,sha256=12VKCLbhT9Cz8m58ucw8UJ4NhO2G0YY6TZjcEWF7MWA,220
1
+ value_object_pattern/__init__.py,sha256=sWOpV8M7-tNpRZ7NiKDbKg9p67qEM149u-VLic9sKUg,220
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
@@ -6,14 +6,17 @@ value_object_pattern/decorators/value_object_validation.py,sha256=ENAQuOLalc-dDz
6
6
  value_object_pattern/models/__init__.py,sha256=1BsXKFnX_0EufuHurfgdpbMUvnrjF8HLz46saTcmNr4,163
7
7
  value_object_pattern/models/enumeration_value_object.py,sha256=6ih7GlohDcA3Lknk6SaIsve2Udaco8iHTPkRCrhvYJo,4886
8
8
  value_object_pattern/models/value_object.py,sha256=-xXCk_qwCj_VBIzNJfUflM4vD7M0bicJdlprFYh2_Uw,13627
9
- value_object_pattern/usables/__init__.py,sha256=LsHh5uSECizrDXPogZC3zRMzcBIBPyiWXpqSrG2qHrg,1483
10
- value_object_pattern/usables/dates/__init__.py,sha256=x4MafCtJ1S9WN36cVGOfPdXeKgfptlg4QkcH9fPV4tA,253
9
+ value_object_pattern/usables/__init__.py,sha256=-VuuKrTyD8X0ImNexe3S6zcrf24o17_p1ghdb9bEyqs,1577
10
+ value_object_pattern/usables/dates/__init__.py,sha256=fGcL0u-dpxruMAWP-As1-ZUr-982SK1vb3sjnYyJh5g,382
11
11
  value_object_pattern/usables/dates/date/__init__.py,sha256=rSifr41n8gmqW80e0Ygzoj221dpVsZy7m4TecC_VJus,174
12
12
  value_object_pattern/usables/dates/date/date_value_object.py,sha256=f2JuxEJlZaMRMPq53qtDnFLxNC-uJLZJwt31_lVetqo,5054
13
13
  value_object_pattern/usables/dates/date/string_date_value_object.py,sha256=yT60yG4dTK8tffkzom05OcLpP7jHTzc0OqhU5fjTbvU,6327
14
14
  value_object_pattern/usables/dates/datetime/__init__.py,sha256=5WY9lBtGPf3p7Kb_0v7plLFrq4GzZCj8kw3cU7qHZjk,198
15
15
  value_object_pattern/usables/dates/datetime/datetime_value_object.py,sha256=-HvQz1ixAesh9HVafzejSOti88eORJ3aH8502kgqXhY,6759
16
16
  value_object_pattern/usables/dates/datetime/string_datetime_value_object.py,sha256=fm9t4N1oxfHPUgmw2RwVWq3W_NaOkpqwvSJapfNgjNM,8334
17
+ value_object_pattern/usables/dates/timezone/__init__.py,sha256=_InzUzzIoSWusLcMwq8SaT-M0LkJUtAPA1wgFgnQlj4,198
18
+ value_object_pattern/usables/dates/timezone/string_timezone_value_object.py,sha256=0O2gJJu39IF70e6V0GZWTVoZBL89jjfOA5i_Bp33nQ4,1927
19
+ value_object_pattern/usables/dates/timezone/timezone_value_object.py,sha256=nzy63t5ffJyiAVfbaLHRkXn3mE6c0-qmVDOAvchdwWs,1466
17
20
  value_object_pattern/usables/identifiers/__init__.py,sha256=0-JdvoXEqs_Y-XwVc-Jl2ak5wF4fp3XJXjUp0Z0qOxs,174
18
21
  value_object_pattern/usables/identifiers/string_uuid_value_object.py,sha256=l5itu12JycSS8qQKg-Fou6Sj0mKxKFZEQx3Zq4iAZtE,1852
19
22
  value_object_pattern/usables/identifiers/uuid_value_object.py,sha256=BxvvSQXrHngExB8opsxZC8bgcYGLlpNeCug7iOg2IoQ,1402
@@ -35,7 +38,7 @@ value_object_pattern/usables/internet/uri/http_https_url_value_object.py,sha256=
35
38
  value_object_pattern/usables/internet/uri/http_url_value_object.py,sha256=nU1IjKRmYAV2JWe-Fvji_PGti5qM540OWHf_qtDLiGw,1033
36
39
  value_object_pattern/usables/internet/uri/https_url_value_object.py,sha256=SpbIvKHn2kgXVSsxpa7dk5FEr7RwDsgjpSGqPfxl7rU,1048
37
40
  value_object_pattern/usables/internet/uri/url_value_object.py,sha256=03jHtGBCPjqhbGkSXtb8qoIv5QUF3ze-cC27-kEIWqA,12419
38
- value_object_pattern/usables/primitives/__init__.py,sha256=j4AatSdlRIUyQlwZuKMtGhtzgTI4F3lQXw1cC38--2w,1304
41
+ value_object_pattern/usables/primitives/__init__.py,sha256=qA0M7r8cFRbe-eX756KYmHKp8OAaGVBqdDVAQeWYKzo,1407
39
42
  value_object_pattern/usables/primitives/boolean/__init__.py,sha256=WhOVH2JAoQnhevx9pW1OsJh-nUF9qKpB4ZGybfSI0U4,237
40
43
  value_object_pattern/usables/primitives/boolean/boolean_value_object.py,sha256=CV8UWwQwxcMXOPfuWouePA2ce17_t0S6YxE3gH8mVj8,1380
41
44
  value_object_pattern/usables/primitives/boolean/false_value_object.py,sha256=bQRyyjYrjcAXTlStiJSC2aKpTUFWG3foASOfkMk3Kwo,1264
@@ -52,6 +55,9 @@ value_object_pattern/usables/primitives/integer/integer_value_object.py,sha256=J
52
55
  value_object_pattern/usables/primitives/integer/negative_integer_value_object.py,sha256=2dYhMs421Oxmt73Hmd8wa2_Er9fNTlGdiuLtf3JasNM,1410
53
56
  value_object_pattern/usables/primitives/integer/odd_integer_value_object.py,sha256=fiFJlPJf4aG9CDfyUpxkGqsBPMQuRQuKA7bAZUDz8Fo,1345
54
57
  value_object_pattern/usables/primitives/integer/positive_integer_value_object.py,sha256=PDaGwCnGWnARbrYfCIHcLFKJAqSQ90A_8q-6HG91L0I,1432
58
+ value_object_pattern/usables/primitives/none/__init__.py,sha256=2dTbYS2HgP5AO6ps3HzzYmpM2zteLl0wzrmtpA0mxcw,165
59
+ value_object_pattern/usables/primitives/none/none_value_object.py,sha256=Wjg8rojYjoYL30fZVGzFA1E68fuDA0n5v-rCUFWDXqQ,1308
60
+ value_object_pattern/usables/primitives/none/not_none_value_object.py,sha256=8DC8ezGrm9K1aPbhXzjsbb90dzYoOA3mkqvYYorlzSQ,1262
55
61
  value_object_pattern/usables/primitives/string/__init__.py,sha256=exdLDLKtfF4QNl5XdA916JqJd-5whAVDQfQcrRrDTzc,879
56
62
  value_object_pattern/usables/primitives/string/alpha_value_object.py,sha256=-wB24ZG3LlZjKmlVZt3tfkTeDeFqdlV9cGmYpVkYgKc,1383
57
63
  value_object_pattern/usables/primitives/string/alphanumeric_value_object.py,sha256=rXDAgezOC57hPcIcZWmsleIuWPh5XNvjjr7vi02kwUw,1503
@@ -62,7 +68,7 @@ value_object_pattern/usables/primitives/string/printable_string_value_object.py,
62
68
  value_object_pattern/usables/primitives/string/string_value_object.py,sha256=6u98oMzz5qsVNEWna-UpziDmzFhaLFW7J5NBoJnbKWk,1370
63
69
  value_object_pattern/usables/primitives/string/trimmed_string_value_object.py,sha256=WMp4IBA74cEli-N_9Q7qU_oMszHtk5tgCr6o2y99HMs,1435
64
70
  value_object_pattern/usables/primitives/string/uppercase_string_value_object.py,sha256=yZajkdq09zb56_UHs4nc0sIeTV4K74ek26JcoHYhM64,1457
65
- value_object_pattern-0.4.0.dist-info/METADATA,sha256=4wEChHY3T0DNwarqKoc9_gGhl4hsomvd86r1bN7W1sI,4018
66
- value_object_pattern-0.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
67
- value_object_pattern-0.4.0.dist-info/licenses/LICENSE.md,sha256=6E0wpVdiB-k3oJ9cvVG9BPZ07yIevD3IuOECHKveFkM,1076
68
- value_object_pattern-0.4.0.dist-info/RECORD,,
71
+ value_object_pattern-0.6.0.dist-info/METADATA,sha256=af5HBo3Pmr0pyagjcT_0kcsRtoT3Z_g_7ogxWupJAb4,4018
72
+ value_object_pattern-0.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
73
+ value_object_pattern-0.6.0.dist-info/licenses/LICENSE.md,sha256=6E0wpVdiB-k3oJ9cvVG9BPZ07yIevD3IuOECHKveFkM,1076
74
+ value_object_pattern-0.6.0.dist-info/RECORD,,