value-object-pattern 1.2.0__tar.gz → 1.4.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 (153) hide show
  1. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/PKG-INFO +1 -1
  2. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/__init__.py +1 -1
  3. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/models/value_object.py +8 -2
  4. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/aws_cloud_region_value_object.py +17 -4
  5. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/domain_value_object.py +3 -4
  6. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/ipv4_address_value_object.py +36 -62
  7. value_object_pattern-1.4.0/value_object_pattern/usables/internet/ipv4_network_value_object.py +223 -0
  8. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/ipv6_address_value_object.py +40 -64
  9. value_object_pattern-1.4.0/value_object_pattern/usables/internet/ipv6_network_value_object.py +199 -0
  10. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/port_value_object.py +15 -36
  11. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/utils/__init__.py +5 -10
  12. value_object_pattern-1.2.0/value_object_pattern/usables/internet/ipv4_network_value_object.py +0 -165
  13. value_object_pattern-1.2.0/value_object_pattern/usables/internet/ipv6_network_value_object.py +0 -145
  14. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/.gitignore +0 -0
  15. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/LICENSE.md +0 -0
  16. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/README.md +0 -0
  17. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/pyproject.toml +0 -0
  18. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/decorators/__init__.py +0 -0
  19. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/decorators/value_object_process.py +0 -0
  20. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/decorators/value_object_validation.py +0 -0
  21. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/models/__init__.py +0 -0
  22. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/models/base_model.py +0 -0
  23. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/models/collections/__init__.py +0 -0
  24. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/models/collections/list_value_object.py +0 -0
  25. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/models/enumeration_value_object.py +0 -0
  26. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/py.typed +0 -0
  27. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/__init__.py +0 -0
  28. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/__init__.py +0 -0
  29. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/date/__init__.py +0 -0
  30. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/date/date_value_object.py +0 -0
  31. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/date/string_date_value_object.py +0 -0
  32. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/datetime/__init__.py +0 -0
  33. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/datetime/datetime_value_object.py +0 -0
  34. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/datetime/string_datetime_value_object.py +0 -0
  35. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/timezone/__init__.py +0 -0
  36. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/timezone/string_timezone_value_object.py +0 -0
  37. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/dates/timezone/timezone_value_object.py +0 -0
  38. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/__init__.py +0 -0
  39. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/uuid/__init__.py +0 -0
  40. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v4_value_object.py +0 -0
  41. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_value_object.py +0 -0
  42. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/uuid/uuid_v4_value_object.py +0 -0
  43. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/uuid/uuid_value_object.py +0 -0
  44. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/__init__.py +0 -0
  45. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/country_tld_value_object.py +0 -0
  46. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/__init__.py +0 -0
  47. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/__init__.py +0 -0
  48. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/dni_value_object.py +0 -0
  49. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/nie_value_object.py +0 -0
  50. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/nif_value_object.py +0 -0
  51. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/nuss_value_object.py +0 -0
  52. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/passport_value_object.py +0 -0
  53. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/phone_number_value_object.py +0 -0
  54. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/__init__.py +0 -0
  55. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/administrative_technician_vehicle_plate_value_object.py +0 -0
  56. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/air_force_vehicle_plate_value_object.py +0 -0
  57. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/army_vehicle_plate_value_object.py +0 -0
  58. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/canarias_police_vehicle_plate_value_object.py +0 -0
  59. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/catalan_police_vehicle_plate_value_object.py +0 -0
  60. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/civil_guard_vehicle_plate_value_object.py +0 -0
  61. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/consular_corps_vehicle_plate_value_object.py +0 -0
  62. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/diplomatic_corps_vehicle_plate_value_object.py +0 -0
  63. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/especial_plate_vehicle_plate_value_object.py +0 -0
  64. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/historical_vehicle_plate_value_object.py +0 -0
  65. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/international_organization_vehicle_plate_value_object.py +0 -0
  66. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_development_vehicle_plate_value_object.py +0 -0
  67. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_environment_vehicle_plate_value_object.py +0 -0
  68. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/national_police_vehicle_plate_value_object.py +0 -0
  69. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/navy_vehicle_plate_value_object.py +0 -0
  70. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_truck_vehicle_plate_value_object.py +0 -0
  71. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_vehicle_plate_value_object.py +0 -0
  72. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/provincial_system_vehicle_plate_value_object.py +0 -0
  73. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/state_motor_pool_vehicle_plate_value_object.py +0 -0
  74. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_not_registered_vehicle_plate_value_object.py +0 -0
  75. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_registered_vehicle_plate_value_object.py +0 -0
  76. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_private_individual_vehicle_plate_value_object.py +0 -0
  77. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/two_wheels_vehicle_plate_value_object.py +0 -0
  78. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/__init__.py +0 -0
  79. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/provincial_plate_codes.txt +0 -0
  80. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/europe/spain/vehicle_plate_value_object.py +0 -0
  81. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/iso3166_alpha2_code_value_object.py +0 -0
  82. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/iso3166_alpha3_code_value_object.py +0 -0
  83. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/iso3166_numeric_code_value_object.py +0 -0
  84. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/phone_code_value_object.py +0 -0
  85. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/__init__.py +0 -0
  86. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_codes.txt +0 -0
  87. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_alpha3_mapping.txt +0 -0
  88. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_numeric_mapping.txt +0 -0
  89. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_phone_code_mapping.txt +0 -0
  90. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_tld_mapping.txt +0 -0
  91. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha3_codes.txt +0 -0
  92. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_numeric_codes.txt +0 -0
  93. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/identifiers/world/vin_value_object.py +0 -0
  94. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/__init__.py +0 -0
  95. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/host_value_object.py +0 -0
  96. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mac_address_value_object.py +0 -0
  97. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mac_addresses/__init__.py +0 -0
  98. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mac_addresses/cisco_mac_address_value_object.py +0 -0
  99. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mac_addresses/raw_mac_address_value_object.py +0 -0
  100. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mac_addresses/space_mac_address_value_object.py +0 -0
  101. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mac_addresses/universal_mac_address_value_object.py +0 -0
  102. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mac_addresses/windows_mac_address_value_object.py +0 -0
  103. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mobile/__init__.py +0 -0
  104. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/mobile/imei_value_object.py +0 -0
  105. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/uri/__init__.py +0 -0
  106. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/uri/http_https_url_value_object.py +0 -0
  107. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/uri/http_url_value_object.py +0 -0
  108. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/uri/https_url_value_object.py +0 -0
  109. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/uri/url_value_object.py +0 -0
  110. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/utils/aws_regions.txt +0 -0
  111. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/internet/utils/tld_domains.txt +0 -0
  112. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/__init__.py +0 -0
  113. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/credit_card_value_object.py +0 -0
  114. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/credit_cards/__init__.py +0 -0
  115. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/credit_cards/amex_credit_card_value_object.py +0 -0
  116. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/credit_cards/discover_credit_card_value_object.py +0 -0
  117. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/credit_cards/mastercard_credit_card_value_object.py +0 -0
  118. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/credit_cards/visa_credit_card_value_object.py +0 -0
  119. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/iban_value_object.py +0 -0
  120. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/utils/__init__.py +0 -0
  121. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/money/utils/iban_lengths.txt +0 -0
  122. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/__init__.py +0 -0
  123. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/boolean/__init__.py +0 -0
  124. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/boolean/boolean_value_object.py +0 -0
  125. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/boolean/false_value_object.py +0 -0
  126. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/boolean/true_value_object.py +0 -0
  127. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/bytes/__init__.py +0 -0
  128. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/bytes/bytes_value_object.py +0 -0
  129. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/float/__init__.py +0 -0
  130. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/float/float_value_object.py +0 -0
  131. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/float/negative_float_value_object.py +0 -0
  132. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/float/positive_float_value_object.py +0 -0
  133. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/integer/__init__.py +0 -0
  134. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/integer/even_integer_value_object.py +0 -0
  135. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/integer/integer_value_object.py +0 -0
  136. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/integer/negative_integer_value_object.py +0 -0
  137. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/integer/odd_integer_value_object.py +0 -0
  138. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/integer/positive_integer_value_object.py +0 -0
  139. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/none/__init__.py +0 -0
  140. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/none/none_value_object.py +0 -0
  141. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/none/not_none_value_object.py +0 -0
  142. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/__init__.py +0 -0
  143. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/alpha_value_object.py +0 -0
  144. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/alphanumeric_value_object.py +0 -0
  145. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/digit_value_object.py +0 -0
  146. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/lowercase_string_value_object.py +0 -0
  147. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/non_empty_string_value_object.py +0 -0
  148. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/printable_string_value_object.py +0 -0
  149. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/string_value_object.py +0 -0
  150. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/trimmed_string_value_object.py +0 -0
  151. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/primitives/string/uppercase_string_value_object.py +0 -0
  152. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/utils/__init__.py +0 -0
  153. {value_object_pattern-1.2.0 → value_object_pattern-1.4.0}/value_object_pattern/usables/utils/luhn_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: value-object-pattern
3
- Version: 1.2.0
3
+ Version: 1.4.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
- __version__ = '1.2.0'
1
+ __version__ = '1.4.0'
2
2
 
3
3
  from .decorators import process, validation
4
4
  from .models import BaseModel, EnumerationValueObject, ValueObject
@@ -11,7 +11,7 @@ else:
11
11
 
12
12
  from abc import ABC
13
13
  from collections import deque
14
- from typing import Any, Callable, Generic, NoReturn, TypeVar
14
+ from typing import Any, Callable, Generic, TypeVar
15
15
 
16
16
  T = TypeVar('T')
17
17
 
@@ -215,7 +215,7 @@ class ValueObject(ABC, Generic[T]): # noqa: UP046
215
215
  return self._value == other.value
216
216
 
217
217
  @override
218
- def __setattr__(self, key: str, value: T) -> NoReturn:
218
+ def __setattr__(self, key: str, value: T) -> None:
219
219
  """
220
220
  Prevents modification or addition of attributes in the value object.
221
221
 
@@ -230,6 +230,12 @@ class ValueObject(ABC, Generic[T]): # noqa: UP046
230
230
  public_key = key.replace('_', '')
231
231
  public_slots1 = [slot.replace('_', '') for slot in self.__slots__]
232
232
 
233
+ if key.startswith('_internal_'):
234
+ # Allow internal attributes to be set, but not modified, those attributes should not be used outside the
235
+ # class, they are used for improving performance
236
+ object.__setattr__(self, key, value)
237
+ return
238
+
233
239
  if key in self.__slots__:
234
240
  raise AttributeError(f'Cannot modify attribute "{key}" of immutable instance.')
235
241
 
@@ -2,6 +2,8 @@
2
2
  AwsCloudRegionValueObject value object.
3
3
  """
4
4
 
5
+ from typing import NoReturn
6
+
5
7
  from value_object_pattern import process, validation
6
8
  from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
7
9
 
@@ -19,9 +21,8 @@ class AwsCloudRegionValueObject(NotEmptyStringValueObject, TrimmedStringValueObj
19
21
  ```python
20
22
  from value_object_pattern.usables.internet import AwsCloudRegionValueObject
21
23
 
22
- key = AwsCloudRegionValueObject(value='us-east-1')
23
-
24
- print(repr(key))
24
+ region = AwsCloudRegionValueObject(value='us-east-1')
25
+ print(repr(region))
25
26
  # >>> AwsCloudRegionValueObject(value=us-east-1)
26
27
  ```
27
28
  """
@@ -51,4 +52,16 @@ class AwsCloudRegionValueObject(NotEmptyStringValueObject, TrimmedStringValueObj
51
52
  ValueError: If the region does not exist.
52
53
  """
53
54
  if value not in get_aws_cloud_regions():
54
- raise ValueError(f'AwsCloudRegionValueObject value <<<{value}>>> does not exist.')
55
+ self._raise_value_is_not_valid_aws_cloud_region(value=value)
56
+
57
+ def _raise_value_is_not_valid_aws_cloud_region(self, value: str) -> NoReturn:
58
+ """
59
+ Raises a ValueError if the value is not a valid AWS cloud region.
60
+
61
+ Args:
62
+ value (str): The invalid AWS cloud region value.
63
+
64
+ Raises:
65
+ ValueError: If the value is not a valid AWS cloud region.
66
+ """
67
+ raise ValueError(f'AwsCloudRegionValueObject value <<<{value}>>> is not a valid AWS cloud region.')
@@ -21,9 +21,8 @@ class DomainValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
21
21
  ```python
22
22
  from value_object_pattern.usables.internet import DomainValueObject
23
23
 
24
- key = DomainValueObject(value='github.com')
25
-
26
- print(repr(key))
24
+ domain = DomainValueObject(value='github.com')
25
+ print(repr(domain))
27
26
  # >>> DomainValueObject(value=github.com)
28
27
  ```
29
28
  """
@@ -74,7 +73,7 @@ class DomainValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
74
73
  raise ValueError(f'DomainValueObject value <<<{value}>>> has not a valid top level domain.')
75
74
 
76
75
  tdl = value.lower().rstrip('.').split(sep='.')[-1]
77
- if tdl not in get_tld_dict()[len(tdl)]:
76
+ if tdl not in get_tld_dict():
78
77
  raise ValueError(f'DomainValueObject value <<<{value}>>> has not a valid top level domain <<<{tdl}>>>.')
79
78
 
80
79
  @validation(order=1)
@@ -5,7 +5,7 @@ Ipv4AddressValueObject value object.
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
- from ipaddress import AddressValueError, IPv4Address
8
+ from ipaddress import IPv4Address
9
9
 
10
10
  from value_object_pattern.decorators import process, validation
11
11
  from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
@@ -20,12 +20,13 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
20
20
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
21
21
 
22
22
  ip = Ipv4AddressValueObject(value='66.162.207.81')
23
-
24
23
  print(repr(ip))
25
24
  # >>> Ipv4AddressValueObject(value=66.162.207.81)
26
25
  ```
27
26
  """
28
27
 
28
+ _internal_ip_object: IPv4Address
29
+
29
30
  @process(order=0)
30
31
  def _ensure_value_is_normalized(self, value: str) -> str:
31
32
  """
@@ -37,7 +38,9 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
37
38
  Returns:
38
39
  str: Value with the normalized IPv4 address.
39
40
  """
40
- value = self._ipv4_address_normalize(value=value)
41
+ if '/' in value and value.endswith('/32'):
42
+ value = value[:-3]
43
+
41
44
  return str(object=IPv4Address(address=value))
42
45
 
43
46
  @validation(order=0)
@@ -51,44 +54,25 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
51
54
  Raises:
52
55
  ValueError: If the value is not a valid IPv4 address.
53
56
  """
54
- value = self._ipv4_address_normalize(value=value)
55
- self._ipv4_address_validate(value=value)
57
+ processed_value = self._ensure_value_is_normalized(value=value)
56
58
 
57
- @classmethod
58
- def _ipv4_address_normalize(cls, value: str) -> str:
59
- """
60
- Normalizes the given IPv4 address.
61
-
62
- Args:
63
- value (str): IPv4 address.
64
-
65
- Returns:
66
- str: Normalized IPv4 address.
67
- """
68
- if '/' in value and value.endswith('/32'):
69
- value = value[:-3]
59
+ try:
60
+ self._internal_ip_object = IPv4Address(address=processed_value)
70
61
 
71
- return value
62
+ except Exception:
63
+ self._raise_value_is_not_valid_ipv4_address(value=value)
72
64
 
73
- @classmethod
74
- def _ipv4_address_validate(cls, value: str) -> IPv4Address:
65
+ def _raise_value_is_not_valid_ipv4_address(self, value: str) -> None:
75
66
  """
76
- Validates the given IPv4 address.
67
+ Raises a ValueError if the value is not a valid IPv4 address.
77
68
 
78
69
  Args:
79
- value (str): IPv4 address.
70
+ value (str): Value.
80
71
 
81
72
  Raises:
82
73
  ValueError: If the value is not a valid IPv4 address.
83
-
84
- Returns:
85
- IPv4Address: IPv4 address.
86
74
  """
87
- try:
88
- return IPv4Address(address=value)
89
-
90
- except AddressValueError as error:
91
- raise ValueError(f'Ipv4AddressValueObject value <<<{value}>>> is not a valid IPv4 address.') from error
75
+ raise ValueError(f'Ipv4AddressValueObject value <<<{value}>>> is not a valid IPv4 address.')
92
76
 
93
77
  def is_reserved(self) -> bool:
94
78
  """
@@ -104,13 +88,12 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
104
88
  ```python
105
89
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
106
90
 
107
- is_reserved = Ipv4AddressValueObject(value='240.0.0.0').is_reserved()
108
-
109
- print(is_reserved)
91
+ ip = Ipv4AddressValueObject(value='240.0.0.0')
92
+ print(ip.is_reserved())
110
93
  # >>> True
111
94
  ```
112
95
  """
113
- return self._ipv4_address_validate(value=self.value).is_reserved
96
+ return self._internal_ip_object.is_reserved
114
97
 
115
98
  def is_private(self) -> bool:
116
99
  """
@@ -126,13 +109,12 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
126
109
  ```python
127
110
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
128
111
 
129
- is_private = Ipv4AddressValueObject(value='192.168.10.4').is_private()
130
-
131
- print(is_private)
112
+ ip = Ipv4AddressValueObject(value='192.168.10.4')
113
+ print(ip.is_private())
132
114
  # >>> True
133
115
  ```
134
116
  """
135
- return self._ipv4_address_validate(value=self.value).is_private
117
+ return self._internal_ip_object.is_private
136
118
 
137
119
  def is_global(self) -> bool:
138
120
  """
@@ -148,13 +130,12 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
148
130
  ```python
149
131
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
150
132
 
151
- is_global = Ipv4AddressValueObject(value='66.162.207.81').is_global()
152
-
153
- print(is_global)
133
+ ip = Ipv4AddressValueObject(value='66.162.207.81')
134
+ print(ip.is_global())
154
135
  # >>> True
155
136
  ```
156
137
  """
157
- return self._ipv4_address_validate(value=self.value).is_global
138
+ return self._internal_ip_object.is_global
158
139
 
159
140
  def is_multicast(self) -> bool:
160
141
  """
@@ -170,13 +151,12 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
170
151
  ```python
171
152
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
172
153
 
173
- is_multicast = Ipv4AddressValueObject(value='224.0.0.1').is_multicast()
174
-
175
- print(is_multicast)
154
+ ip = Ipv4AddressValueObject(value='224.0.0.1')
155
+ print(ip.is_multicast())
176
156
  # >>> True
177
157
  ```
178
158
  """
179
- return self._ipv4_address_validate(value=self.value).is_multicast
159
+ return self._internal_ip_object.is_multicast
180
160
 
181
161
  def is_unspecified(self) -> bool:
182
162
  """
@@ -192,13 +172,12 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
192
172
  ```python
193
173
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
194
174
 
195
- is_unspecified = Ipv4AddressValueObject(value='0.0.0.0').is_unspecified()
196
-
197
- print(is_unspecified)
175
+ ip = Ipv4AddressValueObject(value='0.0.0.0')
176
+ print(ip.is_unspecified())
198
177
  # >>> True
199
178
  ```
200
179
  """
201
- return self._ipv4_address_validate(value=self.value).is_unspecified
180
+ return self._internal_ip_object.is_unspecified
202
181
 
203
182
  def is_loopback(self) -> bool:
204
183
  """
@@ -214,13 +193,12 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
214
193
  ```python
215
194
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
216
195
 
217
- is_loopback = Ipv4AddressValueObject(value='127.0.0.1').is_loopback()
218
-
219
- print(is_loopback)
196
+ ip = Ipv4AddressValueObject(value='127.0.0.1')
197
+ print(ip.is_loopback())
220
198
  # >>> True
221
199
  ```
222
200
  """
223
- return self._ipv4_address_validate(value=self.value).is_loopback
201
+ return self._internal_ip_object.is_loopback
224
202
 
225
203
  def is_link_local(self) -> bool:
226
204
  """
@@ -236,13 +214,12 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
236
214
  ```python
237
215
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
238
216
 
239
- is_link_local = Ipv4AddressValueObject(value='169.254.0.0').is_link_local()
240
-
241
- print(is_link_local)
217
+ ip = Ipv4AddressValueObject(value='169.254.0.0')
218
+ print(ip.is_link_local())
242
219
  # >>> True
243
220
  ```
244
221
  """
245
- return self._ipv4_address_validate(value=self.value).is_link_local
222
+ return self._internal_ip_object.is_link_local
246
223
 
247
224
  @classmethod
248
225
  def UNSPECIFIED(cls) -> Ipv4AddressValueObject:
@@ -257,7 +234,6 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
257
234
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
258
235
 
259
236
  ip = Ipv4AddressValueObject.UNSPECIFIED()
260
-
261
237
  print(repr(ip))
262
238
  # >>> Ipv4AddressValueObject(value=0.0.0.0)
263
239
  ```
@@ -277,7 +253,6 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
277
253
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
278
254
 
279
255
  ip = Ipv4AddressValueObject.LOOPBACK()
280
-
281
256
  print(repr(ip))
282
257
  # >>> Ipv4AddressValueObject(value=127.0.0.1)
283
258
  ```
@@ -297,7 +272,6 @@ class Ipv4AddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObject
297
272
  from value_object_pattern.usables.internet import Ipv4AddressValueObject
298
273
 
299
274
  ip = Ipv4AddressValueObject.BROADCAST()
300
-
301
275
  print(repr(ip))
302
276
  # >>> Ipv4AddressValueObject(value=255.255.255.255)
303
277
  ```
@@ -0,0 +1,223 @@
1
+ # ruff: noqa: N802
2
+ """
3
+ Ipv4NetworkValueObject value object.
4
+ """
5
+
6
+ from ipaddress import IPv4Network, NetmaskValueError
7
+ from typing import Generator, NoReturn
8
+
9
+ from value_object_pattern.decorators import process, validation
10
+ from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
11
+
12
+ from .ipv4_address_value_object import Ipv4AddressValueObject
13
+
14
+
15
+ class Ipv4NetworkValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
16
+ """
17
+ Ipv4NetworkValueObject value object ensures the provided value is a valid IPv4 network.
18
+
19
+ Example:
20
+ ```python
21
+ from value_object_pattern.usables.internet import Ipv4NetworkValueObject
22
+
23
+ network = Ipv4NetworkValueObject(value='66.162.207.81')
24
+ print(repr(network))
25
+ # >>> Ipv4NetworkValueObject(value=66.162.207.81/32)
26
+ ```
27
+ """
28
+
29
+ _internal_network_object: IPv4Network
30
+
31
+ @process(order=0)
32
+ def _ensure_value_is_normalized(self, value: str) -> str:
33
+ """
34
+ Ensures the value object value is normalized IPv4 network.
35
+
36
+ Args:
37
+ value (str): Value.
38
+
39
+ Returns:
40
+ str: Value with the normalized IPv4 network.
41
+ """
42
+ return str(object=IPv4Network(address=value))
43
+
44
+ @validation(order=0)
45
+ def _ensure_value_is_valid_ipv4_network(self, value: str) -> None:
46
+ """
47
+ Ensures the value object value is a valid IPv4 network.
48
+
49
+ Args:
50
+ value (str): Value.
51
+
52
+ Raises:
53
+ ValueError: If the value does not have a valid netmask.
54
+ ValueError: If the value is not a valid IPv4 network.
55
+ """
56
+ try:
57
+ self._internal_network_object = IPv4Network(address=value)
58
+
59
+ except NetmaskValueError:
60
+ self._raise_value_has_not_a_valid_netmask(value=value)
61
+
62
+ except Exception:
63
+ self._raise_value_is_not_ipv4_network(value=value)
64
+
65
+ def _raise_value_has_not_a_valid_netmask(self, value: str) -> NoReturn:
66
+ """
67
+ Raises a ValueError if the value does not have a valid netmask.
68
+
69
+ Args:
70
+ value (str): The provided value.
71
+
72
+ Raises:
73
+ ValueError: If the value does not have a valid netmask.
74
+ """
75
+ raise ValueError(f'Ipv4NetworkValueObject value <<<{value}>>> has an invalid netmask.')
76
+
77
+ def _raise_value_is_not_ipv4_network(self, value: str) -> NoReturn:
78
+ """
79
+ Raises a TypeError if the value is not a valid IPv4 network.
80
+
81
+ Args:
82
+ value (str): The provided value.
83
+
84
+ Raises:
85
+ TypeError: If the value is not a valid IPv4 network.
86
+ """
87
+ raise ValueError(f'Ipv4NetworkValueObject value <<<{value}>>> is not a valid IPv4 network.')
88
+
89
+ def hosts(self) -> Generator[Ipv4AddressValueObject, None, None]: # noqa: UP043
90
+ """
91
+ Returns an iterator over the addresses of the given IPv4 network excluding the network and broadcast addresses.
92
+ If you want to iterate over all the addresses including the network and broadcast addresses, use the
93
+ `all_addresses` method.
94
+
95
+ Returns:
96
+ Generator[Ipv4AddressValueObject, None, None]: Iterator of IP addresses.
97
+
98
+ Example:
99
+ ```python
100
+ from value_object_pattern.usables.internet import Ipv4NetworkValueObject
101
+
102
+ network = Ipv4NetworkValueObject(value='192.168.10.0/24')
103
+ for address in network.hosts():
104
+ print(repr(address))
105
+ # >>> Ipv4AddressValueObject(value='192.168.10.1')
106
+ # >>> Ipv4AddressValueObject(value='192.168.10.2')
107
+ # >>> ...
108
+ # >>> Ipv4AddressValueObject(value='192.168.10.253')
109
+ # >>> Ipv4AddressValueObject(value='192.168.10.254')
110
+ ```
111
+ """
112
+ for address in self._internal_network_object.hosts():
113
+ yield Ipv4AddressValueObject(value=str(object=address))
114
+
115
+ def all_addresses(self) -> Generator[Ipv4AddressValueObject, None, None]: # noqa: UP043
116
+ """
117
+ Returns an iterator over all the addresses of the given IPv4 network, including the network and broadcast
118
+ addresses. If you want to iterate over the addresses excluding the network and broadcast addresses,
119
+ use the `hosts` method.
120
+
121
+ Returns:
122
+ Generator[Ipv4AddressValueObject, None, None]: Iterator of IP addresses.
123
+
124
+ Example:
125
+ ```python
126
+ from value_object_pattern.usables.internet import Ipv4NetworkValueObject
127
+
128
+ network = Ipv4NetworkValueObject(value='192.168.10.0/24')
129
+ for address in network.all_addresses():
130
+ print(repr(address))
131
+ # >>> Ipv4AddressValueObject(value='192.168.10.0')
132
+ # >>> Ipv4AddressValueObject(value='192.168.10.1')
133
+ # >>> ...
134
+ # >>> Ipv4AddressValueObject(value='192.168.10.254')
135
+ # >>> Ipv4AddressValueObject(value='192.168.10.255')
136
+ ```
137
+ """
138
+ for address in self._internal_network_object:
139
+ yield Ipv4AddressValueObject(value=str(address))
140
+
141
+ def get_network(self) -> Ipv4AddressValueObject:
142
+ """
143
+ Returns the network of the given IPv4 network.
144
+
145
+ Args:
146
+ value (str): IPv4 network.
147
+
148
+ Returns:
149
+ Ipv4AddressValueObject: The network IPv4 address.
150
+
151
+ Example:
152
+ ```python
153
+ from value_object_pattern.usables.internet import Ipv4NetworkValueObject
154
+
155
+ network = Ipv4NetworkValueObject(value='192.168.10.0/24')
156
+ print(repr(network.get_network()))
157
+ # >>> Ipv4AddressValueObject(value=192.168.10.0)
158
+ ```
159
+ """
160
+ return Ipv4AddressValueObject(value=str(object=self._internal_network_object.network_address))
161
+
162
+ def get_broadcast(self) -> Ipv4AddressValueObject:
163
+ """
164
+ Returns the broadcast of the given IPv4 network.
165
+
166
+ Args:
167
+ value (str): IPv4 network.
168
+
169
+ Returns:
170
+ Ipv4AddressValueObject: The broadcast IPv4 address.
171
+
172
+ Example:
173
+ ```python
174
+ from value_object_pattern.usables.internet import Ipv4NetworkValueObject
175
+
176
+ network = Ipv4NetworkValueObject(value='192.168.10.0/24')
177
+ print(repr(network.get_broadcast()))
178
+ # >>> Ipv4AddressValueObject(value=192.168.10.255)
179
+ ```
180
+ """
181
+ return Ipv4AddressValueObject(value=str(object=self._internal_network_object.broadcast_address))
182
+
183
+ def get_mask(self) -> int:
184
+ """
185
+ Returns the mask of the given IPv4 network.
186
+
187
+ Args:
188
+ value (str): IPv4 network.
189
+
190
+ Returns:
191
+ int: The network mask.
192
+
193
+ Example:
194
+ ```python
195
+ from value_object_pattern.usables.internet import Ipv4NetworkValueObject
196
+
197
+ network = Ipv4NetworkValueObject(value='192.168.10.0/24')
198
+ print(network.get_mask())
199
+ # >>> 24
200
+ ```
201
+ """
202
+ return self._internal_network_object.prefixlen
203
+
204
+ def get_number_addresses(self) -> int:
205
+ """
206
+ Returns the number of addresses of the given IPv4 network.
207
+
208
+ Args:
209
+ value (str): IPv4 network.
210
+
211
+ Returns:
212
+ int: The number of addresses.
213
+
214
+ Example:
215
+ ```python
216
+ from value_object_pattern.usables.internet import Ipv4NetworkValueObject
217
+
218
+ network = Ipv4NetworkValueObject(value='192.168.10.0/24')
219
+ print(network.get_number_addresses())
220
+ # >>> 256
221
+ ```
222
+ """
223
+ return self._internal_network_object.num_addresses