value-object-pattern 1.26.0__tar.gz → 1.27.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 (186) hide show
  1. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/PKG-INFO +1 -1
  2. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/__init__.py +1 -1
  3. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/__init__.py +8 -1
  4. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/__init__.py +5 -2
  5. value_object_pattern-1.27.0/value_object_pattern/usables/internet/keys/__init__.py +7 -0
  6. value_object_pattern-1.27.0/value_object_pattern/usables/internet/keys/kebab_case_key_value_object.py +53 -0
  7. value_object_pattern-1.27.0/value_object_pattern/usables/internet/keys/snake_case_key_value_object.py +53 -0
  8. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/slug_value_object.py +10 -0
  9. value_object_pattern-1.27.0/value_object_pattern/usables/internet/user_agent_value_object.py +21 -0
  10. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/__init__.py +8 -0
  11. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/__init__.py +8 -0
  12. value_object_pattern-1.27.0/value_object_pattern/usables/primitives/string/camel_case_string_value_object.py +55 -0
  13. value_object_pattern-1.27.0/value_object_pattern/usables/primitives/string/kebab_case_string_value_object.py +55 -0
  14. value_object_pattern-1.27.0/value_object_pattern/usables/primitives/string/screaming_snake_case_string_value_object.py +55 -0
  15. value_object_pattern-1.27.0/value_object_pattern/usables/primitives/string/snake_case_string_value_object.py +55 -0
  16. value_object_pattern-1.26.0/value_object_pattern/usables/internet/key_value_object.py +0 -43
  17. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/.gitignore +0 -0
  18. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/LICENSE.md +0 -0
  19. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/README.md +0 -0
  20. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/pyproject.toml +0 -0
  21. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/decorators/__init__.py +0 -0
  22. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/decorators/classproperty.py +0 -0
  23. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/decorators/value_object_process.py +0 -0
  24. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/decorators/value_object_validation.py +0 -0
  25. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/__init__.py +0 -0
  26. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/base_model.py +0 -0
  27. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/collections/__init__.py +0 -0
  28. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/collections/dict_value_object.py +0 -0
  29. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/collections/list_value_object.py +0 -0
  30. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/enumeration_value_object.py +0 -0
  31. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/primitive_conversion.py +0 -0
  32. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/type_matching.py +0 -0
  33. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/union_value_object.py +0 -0
  34. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/models/value_object.py +0 -0
  35. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/py.typed +0 -0
  36. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/__init__.py +0 -0
  37. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/date/__init__.py +0 -0
  38. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/date/date_value_object.py +0 -0
  39. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/date/string_date_value_object.py +0 -0
  40. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/datetime/__init__.py +0 -0
  41. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/datetime/datetime_value_object.py +0 -0
  42. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/datetime/string_datetime_value_object.py +0 -0
  43. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/timezone/__init__.py +0 -0
  44. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/timezone/string_timezone_value_object.py +0 -0
  45. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/dates/timezone/timezone_value_object.py +0 -0
  46. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/__init__.py +0 -0
  47. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/__init__.py +0 -0
  48. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v1_value_object.py +0 -0
  49. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v3_value_object.py +0 -0
  50. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v4_value_object.py +0 -0
  51. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v5_value_object.py +0 -0
  52. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v6_value_object.py +0 -0
  53. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v7_value_object.py +0 -0
  54. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v8_value_object.py +0 -0
  55. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_value_object.py +0 -0
  56. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_v1_value_object.py +0 -0
  57. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_v3_value_object.py +0 -0
  58. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_v4_value_object.py +0 -0
  59. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_v5_value_object.py +0 -0
  60. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_v6_value_object.py +0 -0
  61. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_v7_value_object.py +0 -0
  62. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_v8_value_object.py +0 -0
  63. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/uuid/uuid_value_object.py +0 -0
  64. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/__init__.py +0 -0
  65. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/country_tld_value_object.py +0 -0
  66. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/__init__.py +0 -0
  67. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/__init__.py +0 -0
  68. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/dni_value_object.py +0 -0
  69. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/nie_value_object.py +0 -0
  70. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/nif_value_object.py +0 -0
  71. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/nuss_value_object.py +0 -0
  72. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/passport_value_object.py +0 -0
  73. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/phone_number_value_object.py +0 -0
  74. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/__init__.py +0 -0
  75. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/administrative_technician_vehicle_plate_value_object.py +0 -0
  76. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/air_force_vehicle_plate_value_object.py +0 -0
  77. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/army_vehicle_plate_value_object.py +0 -0
  78. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/canarias_police_vehicle_plate_value_object.py +0 -0
  79. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/catalan_police_vehicle_plate_value_object.py +0 -0
  80. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/civil_guard_vehicle_plate_value_object.py +0 -0
  81. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/consular_corps_vehicle_plate_value_object.py +0 -0
  82. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/diplomatic_corps_vehicle_plate_value_object.py +0 -0
  83. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/especial_plate_vehicle_plate_value_object.py +0 -0
  84. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/historical_vehicle_plate_value_object.py +0 -0
  85. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/international_organization_vehicle_plate_value_object.py +0 -0
  86. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_development_vehicle_plate_value_object.py +0 -0
  87. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_environment_vehicle_plate_value_object.py +0 -0
  88. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/national_police_vehicle_plate_value_object.py +0 -0
  89. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/navy_vehicle_plate_value_object.py +0 -0
  90. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_truck_vehicle_plate_value_object.py +0 -0
  91. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_vehicle_plate_value_object.py +0 -0
  92. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/provincial_system_vehicle_plate_value_object.py +0 -0
  93. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/state_motor_pool_vehicle_plate_value_object.py +0 -0
  94. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_not_registered_vehicle_plate_value_object.py +0 -0
  95. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_registered_vehicle_plate_value_object.py +0 -0
  96. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_private_individual_vehicle_plate_value_object.py +0 -0
  97. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/two_wheels_vehicle_plate_value_object.py +0 -0
  98. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/__init__.py +0 -0
  99. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/provincial_plate_codes.txt +0 -0
  100. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/utils/__init__.py +0 -0
  101. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/utils/provincial_codes.txt +0 -0
  102. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/europe/spain/vehicle_plate_value_object.py +0 -0
  103. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/iso3166_alpha2_code_value_object.py +0 -0
  104. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/iso3166_alpha3_code_value_object.py +0 -0
  105. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/iso3166_numeric_code_value_object.py +0 -0
  106. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/phone_code_value_object.py +0 -0
  107. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/__init__.py +0 -0
  108. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_codes.txt +0 -0
  109. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_alpha3_mapping.txt +0 -0
  110. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_numeric_mapping.txt +0 -0
  111. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_phone_code_mapping.txt +0 -0
  112. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_tld_mapping.txt +0 -0
  113. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha3_codes.txt +0 -0
  114. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_numeric_codes.txt +0 -0
  115. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/identifiers/world/vin_value_object.py +0 -0
  116. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/aws_cloud_region_value_object.py +0 -0
  117. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/domain_value_object.py +0 -0
  118. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/email_address_value_object.py +0 -0
  119. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/host_value_object.py +0 -0
  120. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/ip_address_value_object.py +0 -0
  121. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/ipv4_address_value_object.py +0 -0
  122. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/ipv4_network_value_object.py +0 -0
  123. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/ipv6_address_value_object.py +0 -0
  124. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/ipv6_network_value_object.py +0 -0
  125. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mac_address_value_object.py +0 -0
  126. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mac_addresses/__init__.py +0 -0
  127. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mac_addresses/cisco_mac_address_value_object.py +0 -0
  128. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mac_addresses/raw_mac_address_value_object.py +0 -0
  129. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mac_addresses/space_mac_address_value_object.py +0 -0
  130. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mac_addresses/universal_mac_address_value_object.py +0 -0
  131. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mac_addresses/windows_mac_address_value_object.py +0 -0
  132. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mobile/__init__.py +0 -0
  133. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/mobile/imei_value_object.py +0 -0
  134. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/port_value_object.py +0 -0
  135. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/uri/__init__.py +0 -0
  136. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/uri/http_https_url_value_object.py +0 -0
  137. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/uri/http_url_value_object.py +0 -0
  138. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/uri/https_url_value_object.py +0 -0
  139. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/uri/url_value_object.py +0 -0
  140. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/utils/__init__.py +0 -0
  141. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/utils/aws_regions.txt +0 -0
  142. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/internet/utils/tld_domains.txt +0 -0
  143. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/__init__.py +0 -0
  144. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/credit_card_value_object.py +0 -0
  145. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/credit_cards/__init__.py +0 -0
  146. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/credit_cards/amex_credit_card_value_object.py +0 -0
  147. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/credit_cards/discover_credit_card_value_object.py +0 -0
  148. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/credit_cards/mastercard_credit_card_value_object.py +0 -0
  149. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/credit_cards/visa_credit_card_value_object.py +0 -0
  150. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/iban_value_object.py +0 -0
  151. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/utils/__init__.py +0 -0
  152. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/money/utils/iban_lengths.txt +0 -0
  153. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/boolean/__init__.py +0 -0
  154. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/boolean/boolean_value_object.py +0 -0
  155. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/boolean/false_value_object.py +0 -0
  156. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/boolean/true_value_object.py +0 -0
  157. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/bytes/__init__.py +0 -0
  158. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/bytes/bytes_value_object.py +0 -0
  159. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/float/__init__.py +0 -0
  160. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/float/float_value_object.py +0 -0
  161. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/float/negative_float_value_object.py +0 -0
  162. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/float/negative_or_zero_float_value_object.py +0 -0
  163. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/float/positive_float_value_object.py +0 -0
  164. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/float/positive_or_zero_float_value_object.py +0 -0
  165. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/__init__.py +0 -0
  166. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/even_integer_value_object.py +0 -0
  167. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/integer_value_object.py +0 -0
  168. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/negative_integer_value_object.py +0 -0
  169. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/negative_or_zero_integer_value_object.py +0 -0
  170. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/odd_integer_value_object.py +0 -0
  171. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/positive_integer_value_object.py +0 -0
  172. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/integer/positive_or_zero_integer_value_object.py +0 -0
  173. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/none/__init__.py +0 -0
  174. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/none/none_value_object.py +0 -0
  175. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/none/not_none_value_object.py +0 -0
  176. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/alpha_value_object.py +0 -0
  177. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/alphanumeric_value_object.py +0 -0
  178. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/digit_value_object.py +0 -0
  179. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/lowercase_string_value_object.py +0 -0
  180. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/non_empty_string_value_object.py +0 -0
  181. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/printable_string_value_object.py +0 -0
  182. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/string_value_object.py +0 -0
  183. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/trimmed_string_value_object.py +0 -0
  184. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/primitives/string/uppercase_string_value_object.py +0 -0
  185. {value_object_pattern-1.26.0 → value_object_pattern-1.27.0}/value_object_pattern/usables/utils/__init__.py +0 -0
  186. {value_object_pattern-1.26.0 → value_object_pattern-1.27.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.26.0
3
+ Version: 1.27.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.26.0'
1
+ __version__ = '1.27.0'
2
2
 
3
3
  from .decorators import process, validation
4
4
  from .models import BaseModel, EnumerationValueObject, UnionValueObject, ValueObject
@@ -3,11 +3,13 @@ from .primitives import (
3
3
  AlphanumericStringValueObject,
4
4
  BooleanValueObject,
5
5
  BytesValueObject,
6
+ CamelCaseStringValueObject,
6
7
  DigitStringValueObject,
7
8
  EvenIntegerValueObject,
8
9
  FalseValueObject,
9
10
  FloatValueObject,
10
11
  IntegerValueObject,
12
+ KebabCaseStringValueObject,
11
13
  LowercaseStringValueObject,
12
14
  NegativeFloatValueObject,
13
15
  NegativeIntegerValueObject,
@@ -22,6 +24,8 @@ from .primitives import (
22
24
  PositiveOrZeroFloatValueObject,
23
25
  PositiveOrZeroIntegerValueObject,
24
26
  PrintableStringValueObject,
27
+ ScreamingSnakeCaseStringValueObject,
28
+ SnakeCaseStringValueObject,
25
29
  StringValueObject,
26
30
  TrimmedStringValueObject,
27
31
  TrueValueObject,
@@ -33,12 +37,13 @@ __all__ = (
33
37
  'AlphanumericStringValueObject',
34
38
  'BooleanValueObject',
35
39
  'BytesValueObject',
40
+ 'CamelCaseStringValueObject',
36
41
  'DigitStringValueObject',
37
42
  'EvenIntegerValueObject',
38
43
  'FalseValueObject',
39
44
  'FloatValueObject',
40
- 'HexadecimalStringValueObject',
41
45
  'IntegerValueObject',
46
+ 'KebabCaseStringValueObject',
42
47
  'LowercaseStringValueObject',
43
48
  'LowercaseStringValueObject',
44
49
  'NegativeFloatValueObject',
@@ -56,6 +61,8 @@ __all__ = (
56
61
  'PositiveOrZeroIntegerValueObject',
57
62
  'PrintableStringValueObject',
58
63
  'PrintableStringValueObject',
64
+ 'ScreamingSnakeCaseStringValueObject',
65
+ 'SnakeCaseStringValueObject',
59
66
  'StringValueObject',
60
67
  'StringValueObject',
61
68
  'TrimmedStringValueObject',
@@ -7,11 +7,12 @@ from .ipv4_address_value_object import Ipv4AddressValueObject
7
7
  from .ipv4_network_value_object import Ipv4NetworkValueObject
8
8
  from .ipv6_address_value_object import Ipv6AddressValueObject
9
9
  from .ipv6_network_value_object import Ipv6NetworkValueObject
10
- from .key_value_object import KeyValueObject
10
+ from .keys import KebabCaseKeyValueObject, SnakeCaseKeyValueObject
11
11
  from .mac_address_value_object import MacAddressValueObject
12
12
  from .port_value_object import PortValueObject
13
13
  from .slug_value_object import SlugValueObject
14
14
  from .uri import HttpHttpsUrlValueObject, HttpUrlValueObject, HttpsUrlValueObject, UrlValueObject
15
+ from .user_agent_value_object import UserAgentValueObject
15
16
 
16
17
  __all__ = (
17
18
  'AwsCloudRegionValueObject',
@@ -26,9 +27,11 @@ __all__ = (
26
27
  'Ipv4NetworkValueObject',
27
28
  'Ipv6AddressValueObject',
28
29
  'Ipv6NetworkValueObject',
29
- 'KeyValueObject',
30
+ 'KebabCaseKeyValueObject',
30
31
  'MacAddressValueObject',
31
32
  'PortValueObject',
32
33
  'SlugValueObject',
34
+ 'SnakeCaseKeyValueObject',
33
35
  'UrlValueObject',
36
+ 'UserAgentValueObject',
34
37
  )
@@ -0,0 +1,7 @@
1
+ from .kebab_case_key_value_object import KebabCaseKeyValueObject
2
+ from .snake_case_key_value_object import SnakeCaseKeyValueObject
3
+
4
+ __all__ = (
5
+ 'KebabCaseKeyValueObject',
6
+ 'SnakeCaseKeyValueObject',
7
+ )
@@ -0,0 +1,53 @@
1
+ """
2
+ KebabCaseKeyValueObject value object.
3
+ """
4
+
5
+ from re import Pattern, compile as re_compile
6
+ from typing import NoReturn
7
+
8
+ from value_object_pattern.decorators import validation
9
+ from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
10
+
11
+
12
+ class KebabCaseKeyValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
13
+ """
14
+ KebabCaseKeyValueObject ensures the provided value is a valid kebab-case dotted key.
15
+
16
+ Example:
17
+ ```python
18
+ from value_object_pattern.usables.internet.keys import KebabCaseKeyValueObject
19
+
20
+ key = KebabCaseKeyValueObject(value='organization.api-keys.rotate-after-days')
21
+
22
+ print(repr(key))
23
+ # >>> KebabCaseKeyValueObject(value='organization.api-keys.rotate-after-days')
24
+ ```
25
+ """
26
+
27
+ _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[a-z0-9]+(?:-[a-z0-9]+)*(?:\.[a-z0-9]+(?:-[a-z0-9]+)*)*$')
28
+
29
+ @validation(order=0)
30
+ def _ensure_value_follows_validation_regex(self, value: str) -> None:
31
+ """
32
+ Ensures the value object `value` follows the kebab-case dotted key format.
33
+
34
+ Args:
35
+ value (str): The provided value.
36
+
37
+ Raises:
38
+ ValueError: If the `value` has invalid format.
39
+ """
40
+ if not self._VALIDATION_REGEX.fullmatch(string=value):
41
+ self._raise_value_contains_invalid_characters(value=value)
42
+
43
+ def _raise_value_contains_invalid_characters(self, value: str) -> NoReturn:
44
+ """
45
+ Raises a ValueError if the value object `value` contains invalid characters.
46
+
47
+ Args:
48
+ value (str): The provided value.
49
+
50
+ Raises:
51
+ ValueError: If the `value` has invalid format.
52
+ """
53
+ raise ValueError(f'KebabCaseKeyValueObject value <<<{value}>>> has invalid format. Only lowercase letters and digits separated by single hyphens inside dot-separated segments are allowed.') # noqa: E501 # fmt: skip
@@ -0,0 +1,53 @@
1
+ """
2
+ SnakeCaseKeyValueObject value object.
3
+ """
4
+
5
+ from re import Pattern, compile as re_compile
6
+ from typing import NoReturn
7
+
8
+ from value_object_pattern.decorators import validation
9
+ from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
10
+
11
+
12
+ class SnakeCaseKeyValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
13
+ """
14
+ SnakeCaseKeyValueObject ensures the provided value is a valid snake_case dotted key.
15
+
16
+ Example:
17
+ ```python
18
+ from value_object_pattern.usables.internet.keys import SnakeCaseKeyValueObject
19
+
20
+ key = SnakeCaseKeyValueObject(value='organization.api_keys.rotate_after_days')
21
+
22
+ print(repr(key))
23
+ # >>> SnakeCaseKeyValueObject(value='organization.api_keys.rotate_after_days')
24
+ ```
25
+ """
26
+
27
+ _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[a-z0-9]+(?:_[a-z0-9]+)*(?:\.[a-z0-9]+(?:_[a-z0-9]+)*)*$')
28
+
29
+ @validation(order=0)
30
+ def _ensure_value_follows_validation_regex(self, value: str) -> None:
31
+ """
32
+ Ensures the value object `value` follows the snake_case dotted key format.
33
+
34
+ Args:
35
+ value (str): The provided value.
36
+
37
+ Raises:
38
+ ValueError: If the `value` has invalid format.
39
+ """
40
+ if not self._VALIDATION_REGEX.fullmatch(string=value):
41
+ self._raise_value_contains_invalid_characters(value=value)
42
+
43
+ def _raise_value_contains_invalid_characters(self, value: str) -> NoReturn:
44
+ """
45
+ Raises a ValueError if the value object `value` contains invalid characters.
46
+
47
+ Args:
48
+ value (str): The provided value.
49
+
50
+ Raises:
51
+ ValueError: If the `value` has invalid format.
52
+ """
53
+ raise ValueError(f'SnakeCaseKeyValueObject value <<<{value}>>> has invalid format. Only lowercase letters and digits separated by single underscores inside dot-separated segments are allowed.') # noqa: E501 # fmt: skip
@@ -12,6 +12,16 @@ from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStrin
12
12
  class SlugValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
13
13
  """
14
14
  SlugValueObject ensures the provided value is a valid slug string.
15
+
16
+ Example:
17
+ ```python
18
+ from value_object_pattern.usables.internet import SlugValueObject
19
+
20
+ slug = SlugValueObject(value='summer-release-2026')
21
+
22
+ print(repr(slug))
23
+ # >>> SlugValueObject(value='summer-release-2026')
24
+ ```
15
25
  """
16
26
 
17
27
  _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[a-z0-9]+(?:-[a-z0-9]+)*$')
@@ -0,0 +1,21 @@
1
+ """
2
+ UserAgentValueObject value object.
3
+ """
4
+
5
+ from value_object_pattern.usables import NotEmptyStringValueObject, PrintableStringValueObject, TrimmedStringValueObject
6
+
7
+
8
+ class UserAgentValueObject(NotEmptyStringValueObject, PrintableStringValueObject, TrimmedStringValueObject):
9
+ """
10
+ UserAgentValueObject ensures the provided value is a non-empty, trimmed, printable user agent string.
11
+
12
+ Example:
13
+ ```python
14
+ from value_object_pattern.usables.internet import UserAgentValueObject
15
+
16
+ user_agent = UserAgentValueObject(value='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15')
17
+
18
+ print(repr(user_agent))
19
+ # >>> UserAgentValueObject(value='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15')
20
+ ```
21
+ """
@@ -20,10 +20,14 @@ from .none import NoneValueObject, NotNoneValueObject
20
20
  from .string import (
21
21
  AlphaStringValueObject,
22
22
  AlphanumericStringValueObject,
23
+ CamelCaseStringValueObject,
23
24
  DigitStringValueObject,
25
+ KebabCaseStringValueObject,
24
26
  LowercaseStringValueObject,
25
27
  NotEmptyStringValueObject,
26
28
  PrintableStringValueObject,
29
+ ScreamingSnakeCaseStringValueObject,
30
+ SnakeCaseStringValueObject,
27
31
  StringValueObject,
28
32
  TrimmedStringValueObject,
29
33
  UppercaseStringValueObject,
@@ -34,11 +38,13 @@ __all__ = (
34
38
  'AlphanumericStringValueObject',
35
39
  'BooleanValueObject',
36
40
  'BytesValueObject',
41
+ 'CamelCaseStringValueObject',
37
42
  'DigitStringValueObject',
38
43
  'EvenIntegerValueObject',
39
44
  'FalseValueObject',
40
45
  'FloatValueObject',
41
46
  'IntegerValueObject',
47
+ 'KebabCaseStringValueObject',
42
48
  'LowercaseStringValueObject',
43
49
  'NegativeFloatValueObject',
44
50
  'NegativeIntegerValueObject',
@@ -53,6 +59,8 @@ __all__ = (
53
59
  'PositiveOrZeroFloatValueObject',
54
60
  'PositiveOrZeroIntegerValueObject',
55
61
  'PrintableStringValueObject',
62
+ 'ScreamingSnakeCaseStringValueObject',
63
+ 'SnakeCaseStringValueObject',
56
64
  'StringValueObject',
57
65
  'TrimmedStringValueObject',
58
66
  'TrueValueObject',
@@ -1,9 +1,13 @@
1
1
  from .alpha_value_object import AlphaStringValueObject
2
2
  from .alphanumeric_value_object import AlphanumericStringValueObject
3
+ from .camel_case_string_value_object import CamelCaseStringValueObject
3
4
  from .digit_value_object import DigitStringValueObject
5
+ from .kebab_case_string_value_object import KebabCaseStringValueObject
4
6
  from .lowercase_string_value_object import LowercaseStringValueObject
5
7
  from .non_empty_string_value_object import NotEmptyStringValueObject
6
8
  from .printable_string_value_object import PrintableStringValueObject
9
+ from .screaming_snake_case_string_value_object import ScreamingSnakeCaseStringValueObject
10
+ from .snake_case_string_value_object import SnakeCaseStringValueObject
7
11
  from .string_value_object import StringValueObject
8
12
  from .trimmed_string_value_object import TrimmedStringValueObject
9
13
  from .uppercase_string_value_object import UppercaseStringValueObject
@@ -11,10 +15,14 @@ from .uppercase_string_value_object import UppercaseStringValueObject
11
15
  __all__ = (
12
16
  'AlphaStringValueObject',
13
17
  'AlphanumericStringValueObject',
18
+ 'CamelCaseStringValueObject',
14
19
  'DigitStringValueObject',
20
+ 'KebabCaseStringValueObject',
15
21
  'LowercaseStringValueObject',
16
22
  'NotEmptyStringValueObject',
17
23
  'PrintableStringValueObject',
24
+ 'ScreamingSnakeCaseStringValueObject',
25
+ 'SnakeCaseStringValueObject',
18
26
  'StringValueObject',
19
27
  'TrimmedStringValueObject',
20
28
  'UppercaseStringValueObject',
@@ -0,0 +1,55 @@
1
+ """
2
+ CamelCaseStringValueObject value object.
3
+ """
4
+
5
+ from re import Pattern, compile as re_compile
6
+ from typing import NoReturn
7
+
8
+ from value_object_pattern.decorators import validation
9
+
10
+ from .non_empty_string_value_object import NotEmptyStringValueObject
11
+ from .trimmed_string_value_object import TrimmedStringValueObject
12
+
13
+
14
+ class CamelCaseStringValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
15
+ """
16
+ CamelCaseStringValueObject value object ensures the provided value is camelCase.
17
+
18
+ Example:
19
+ ```python
20
+ from value_object_pattern.usables import CamelCaseStringValueObject
21
+
22
+ string = CamelCaseStringValueObject(value='abcd1234Word')
23
+
24
+ print(repr(string))
25
+ # >>> CamelCaseStringValueObject(value='abcd1234Word')
26
+ ```
27
+ """
28
+
29
+ _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)*$')
30
+
31
+ @validation(order=0)
32
+ def _ensure_value_is_camel_case(self, value: str) -> None:
33
+ """
34
+ Ensures the value object `value` is camelCase.
35
+
36
+ Args:
37
+ value (str): The provided value.
38
+
39
+ Raises:
40
+ ValueError: If the `value` is not camelCase.
41
+ """
42
+ if not self._VALIDATION_REGEX.fullmatch(string=value):
43
+ self._raise_value_is_not_camel_case(value=value)
44
+
45
+ def _raise_value_is_not_camel_case(self, value: str) -> NoReturn:
46
+ """
47
+ Raises a ValueError if the value object `value` is not camelCase.
48
+
49
+ Args:
50
+ value (str): The provided value.
51
+
52
+ Raises:
53
+ ValueError: If the `value` is not camelCase.
54
+ """
55
+ raise ValueError(f'CamelCaseStringValueObject value <<<{value}>>> has invalid format. Only camelCase strings starting with a lowercase letter and continuing with alphanumeric words are allowed.') # noqa: E501 # fmt: skip
@@ -0,0 +1,55 @@
1
+ """
2
+ KebabCaseStringValueObject value object.
3
+ """
4
+
5
+ from re import Pattern, compile as re_compile
6
+ from typing import NoReturn
7
+
8
+ from value_object_pattern.decorators import validation
9
+
10
+ from .non_empty_string_value_object import NotEmptyStringValueObject
11
+ from .trimmed_string_value_object import TrimmedStringValueObject
12
+
13
+
14
+ class KebabCaseStringValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
15
+ """
16
+ KebabCaseStringValueObject value object ensures the provided value is kebab-case.
17
+
18
+ Example:
19
+ ```python
20
+ from value_object_pattern.usables import KebabCaseStringValueObject
21
+
22
+ string = KebabCaseStringValueObject(value='abcd-1234')
23
+
24
+ print(repr(string))
25
+ # >>> KebabCaseStringValueObject(value='abcd-1234')
26
+ ```
27
+ """
28
+
29
+ _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[a-z0-9]+(?:-[a-z0-9]+)*$')
30
+
31
+ @validation(order=0)
32
+ def _ensure_value_is_kebab_case(self, value: str) -> None:
33
+ """
34
+ Ensures the value object `value` is kebab-case.
35
+
36
+ Args:
37
+ value (str): The provided value.
38
+
39
+ Raises:
40
+ ValueError: If the `value` is not kebab-case.
41
+ """
42
+ if not self._VALIDATION_REGEX.fullmatch(string=value):
43
+ self._raise_value_is_not_kebab_case(value=value)
44
+
45
+ def _raise_value_is_not_kebab_case(self, value: str) -> NoReturn:
46
+ """
47
+ Raises a ValueError if the value object `value` is not kebab-case.
48
+
49
+ Args:
50
+ value (str): The provided value.
51
+
52
+ Raises:
53
+ ValueError: If the `value` is not kebab-case.
54
+ """
55
+ raise ValueError(f'KebabCaseStringValueObject value <<<{value}>>> has invalid format. Only lowercase letters and digits separated by single hyphens are allowed.') # noqa: E501 # fmt: skip
@@ -0,0 +1,55 @@
1
+ """
2
+ ScreamingSnakeCaseStringValueObject value object.
3
+ """
4
+
5
+ from re import Pattern, compile as re_compile
6
+ from typing import NoReturn
7
+
8
+ from value_object_pattern.decorators import validation
9
+
10
+ from .non_empty_string_value_object import NotEmptyStringValueObject
11
+ from .trimmed_string_value_object import TrimmedStringValueObject
12
+
13
+
14
+ class ScreamingSnakeCaseStringValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
15
+ """
16
+ ScreamingSnakeCaseStringValueObject value object ensures the provided value is SCREAMING_SNAKE_CASE.
17
+
18
+ Example:
19
+ ```python
20
+ from value_object_pattern.usables import ScreamingSnakeCaseStringValueObject
21
+
22
+ string = ScreamingSnakeCaseStringValueObject(value='ABCD_1234')
23
+
24
+ print(repr(string))
25
+ # >>> ScreamingSnakeCaseStringValueObject(value='ABCD_1234')
26
+ ```
27
+ """
28
+
29
+ _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[A-Z0-9]+(?:_[A-Z0-9]+)*$')
30
+
31
+ @validation(order=0)
32
+ def _ensure_value_is_screaming_snake_case(self, value: str) -> None:
33
+ """
34
+ Ensures the value object `value` is SCREAMING_SNAKE_CASE.
35
+
36
+ Args:
37
+ value (str): The provided value.
38
+
39
+ Raises:
40
+ ValueError: If the `value` is not SCREAMING_SNAKE_CASE.
41
+ """
42
+ if not self._VALIDATION_REGEX.fullmatch(string=value):
43
+ self._raise_value_is_not_screaming_snake_case(value=value)
44
+
45
+ def _raise_value_is_not_screaming_snake_case(self, value: str) -> NoReturn:
46
+ """
47
+ Raises a ValueError if the value object `value` is not SCREAMING_SNAKE_CASE.
48
+
49
+ Args:
50
+ value (str): The provided value.
51
+
52
+ Raises:
53
+ ValueError: If the `value` is not SCREAMING_SNAKE_CASE.
54
+ """
55
+ raise ValueError(f'ScreamingSnakeCaseStringValueObject value <<<{value}>>> has invalid format. Only uppercase letters and digits separated by single underscores are allowed.') # noqa: E501 # fmt: skip
@@ -0,0 +1,55 @@
1
+ """
2
+ SnakeCaseStringValueObject value object.
3
+ """
4
+
5
+ from re import Pattern, compile as re_compile
6
+ from typing import NoReturn
7
+
8
+ from value_object_pattern.decorators import validation
9
+
10
+ from .non_empty_string_value_object import NotEmptyStringValueObject
11
+ from .trimmed_string_value_object import TrimmedStringValueObject
12
+
13
+
14
+ class SnakeCaseStringValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
15
+ """
16
+ SnakeCaseStringValueObject value object ensures the provided value is snake_case.
17
+
18
+ Example:
19
+ ```python
20
+ from value_object_pattern.usables import SnakeCaseStringValueObject
21
+
22
+ string = SnakeCaseStringValueObject(value='abcd_1234')
23
+
24
+ print(repr(string))
25
+ # >>> SnakeCaseStringValueObject(value='abcd_1234')
26
+ ```
27
+ """
28
+
29
+ _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[a-z0-9]+(?:_[a-z0-9]+)*$')
30
+
31
+ @validation(order=0)
32
+ def _ensure_value_is_snake_case(self, value: str) -> None:
33
+ """
34
+ Ensures the value object `value` is snake_case.
35
+
36
+ Args:
37
+ value (str): The provided value.
38
+
39
+ Raises:
40
+ ValueError: If the `value` is not snake_case.
41
+ """
42
+ if not self._VALIDATION_REGEX.fullmatch(string=value):
43
+ self._raise_value_is_not_snake_case(value=value)
44
+
45
+ def _raise_value_is_not_snake_case(self, value: str) -> NoReturn:
46
+ """
47
+ Raises a ValueError if the value object `value` is not snake_case.
48
+
49
+ Args:
50
+ value (str): The provided value.
51
+
52
+ Raises:
53
+ ValueError: If the `value` is not snake_case.
54
+ """
55
+ raise ValueError(f'SnakeCaseStringValueObject value <<<{value}>>> has invalid format. Only lowercase letters and digits separated by single underscores are allowed.') # noqa: E501 # fmt: skip
@@ -1,43 +0,0 @@
1
- """
2
- KeyValueObject value object.
3
- """
4
-
5
- from re import Pattern, compile as re_compile
6
- from typing import NoReturn
7
-
8
- from value_object_pattern.decorators import validation
9
- from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
10
-
11
-
12
- class KeyValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
13
- """
14
- KeyValueObject ensures the provided value is a valid key string.
15
- """
16
-
17
- _VALIDATION_REGEX: Pattern[str] = re_compile(pattern=r'^[a-z0-9]+(?:[.-][a-z0-9]+)*$')
18
-
19
- @validation(order=0)
20
- def _ensure_value_follows_validation_regex(self, value: str) -> None:
21
- """
22
- Ensures the value object `value` only contains allowed characters.
23
-
24
- Args:
25
- value (str): The provided value.
26
-
27
- Raises:
28
- ValueError: If the `value` contains disallowed characters.
29
- """
30
- if not self._VALIDATION_REGEX.fullmatch(string=value):
31
- self._raise_value_contains_invalid_characters(value=value)
32
-
33
- def _raise_value_contains_invalid_characters(self, value: str) -> NoReturn:
34
- """
35
- Raises a ValueError if the value object `value` contains invalid characters.
36
-
37
- Args:
38
- value (str): The provided value.
39
-
40
- Raises:
41
- ValueError: If the `value` contains invalid characters.
42
- """
43
- raise ValueError(f'KeyValueObject value <<<{value}>>> has invalid format. Only lowercase letters and digits separated by single hyphens or dots are allowed.') # noqa: E501 # fmt: skip