value-object-pattern 1.32.0__tar.gz → 1.33.1__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 (189) hide show
  1. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/PKG-INFO +1 -1
  2. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/__init__.py +1 -1
  3. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/__init__.py +2 -0
  4. value_object_pattern-1.33.1/value_object_pattern/usables/internet/domain_or_localhost_value_object.py +22 -0
  5. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/domain_value_object.py +5 -1
  6. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/email_address_value_object.py +1 -2
  7. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/host_value_object.py +3 -3
  8. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/uri/http_https_url_value_object.py +16 -1
  9. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/uri/https_url_value_object.py +16 -1
  10. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/uri/url_value_object.py +143 -19
  11. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/.gitignore +0 -0
  12. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/LICENSE.md +0 -0
  13. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/README.md +0 -0
  14. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/pyproject.toml +0 -0
  15. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/decorators/__init__.py +0 -0
  16. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/decorators/classproperty.py +0 -0
  17. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/decorators/value_object_process.py +0 -0
  18. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/decorators/value_object_validation.py +0 -0
  19. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/__init__.py +0 -0
  20. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/base_model.py +0 -0
  21. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/collections/__init__.py +0 -0
  22. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/collections/dict_value_object.py +0 -0
  23. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/collections/list_value_object.py +0 -0
  24. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/enumeration_value_object.py +0 -0
  25. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/primitive_conversion.py +0 -0
  26. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/type_matching.py +0 -0
  27. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/union_value_object.py +0 -0
  28. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/models/value_object.py +0 -0
  29. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/py.typed +0 -0
  30. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/__init__.py +0 -0
  31. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/__init__.py +0 -0
  32. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/date/__init__.py +0 -0
  33. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/date/date_value_object.py +0 -0
  34. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/date/string_date_value_object.py +0 -0
  35. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/datetime/__init__.py +0 -0
  36. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/datetime/datetime_value_object.py +0 -0
  37. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/datetime/string_datetime_value_object.py +0 -0
  38. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/timezone/__init__.py +0 -0
  39. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/timezone/string_timezone_value_object.py +0 -0
  40. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/dates/timezone/timezone_value_object.py +0 -0
  41. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/__init__.py +0 -0
  42. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/__init__.py +0 -0
  43. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_v1_value_object.py +0 -0
  44. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_v3_value_object.py +0 -0
  45. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_v4_value_object.py +0 -0
  46. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_v5_value_object.py +0 -0
  47. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_v6_value_object.py +0 -0
  48. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_v7_value_object.py +0 -0
  49. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_v8_value_object.py +0 -0
  50. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/string_uuid_value_object.py +0 -0
  51. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_v1_value_object.py +0 -0
  52. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_v3_value_object.py +0 -0
  53. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_v4_value_object.py +0 -0
  54. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_v5_value_object.py +0 -0
  55. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_v6_value_object.py +0 -0
  56. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_v7_value_object.py +0 -0
  57. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_v8_value_object.py +0 -0
  58. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/uuid/uuid_value_object.py +0 -0
  59. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/__init__.py +0 -0
  60. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/country_tld_value_object.py +0 -0
  61. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/__init__.py +0 -0
  62. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/__init__.py +0 -0
  63. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/dni_value_object.py +0 -0
  64. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/nie_value_object.py +0 -0
  65. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/nif_value_object.py +0 -0
  66. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/nuss_value_object.py +0 -0
  67. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/passport_value_object.py +0 -0
  68. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/phone_number_value_object.py +0 -0
  69. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/__init__.py +0 -0
  70. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/administrative_technician_vehicle_plate_value_object.py +0 -0
  71. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/air_force_vehicle_plate_value_object.py +0 -0
  72. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/army_vehicle_plate_value_object.py +0 -0
  73. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/canarias_police_vehicle_plate_value_object.py +0 -0
  74. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/catalan_police_vehicle_plate_value_object.py +0 -0
  75. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/civil_guard_vehicle_plate_value_object.py +0 -0
  76. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/consular_corps_vehicle_plate_value_object.py +0 -0
  77. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/diplomatic_corps_vehicle_plate_value_object.py +0 -0
  78. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/especial_plate_vehicle_plate_value_object.py +0 -0
  79. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/historical_vehicle_plate_value_object.py +0 -0
  80. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/international_organization_vehicle_plate_value_object.py +0 -0
  81. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_development_vehicle_plate_value_object.py +0 -0
  82. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_environment_vehicle_plate_value_object.py +0 -0
  83. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/national_police_vehicle_plate_value_object.py +0 -0
  84. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/navy_vehicle_plate_value_object.py +0 -0
  85. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_truck_vehicle_plate_value_object.py +0 -0
  86. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_vehicle_plate_value_object.py +0 -0
  87. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/provincial_system_vehicle_plate_value_object.py +0 -0
  88. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/state_motor_pool_vehicle_plate_value_object.py +0 -0
  89. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_not_registered_vehicle_plate_value_object.py +0 -0
  90. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_registered_vehicle_plate_value_object.py +0 -0
  91. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_private_individual_vehicle_plate_value_object.py +0 -0
  92. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/two_wheels_vehicle_plate_value_object.py +0 -0
  93. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/__init__.py +0 -0
  94. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/provincial_plate_codes.txt +0 -0
  95. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/utils/__init__.py +0 -0
  96. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/utils/provincial_codes.txt +0 -0
  97. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/europe/spain/vehicle_plate_value_object.py +0 -0
  98. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/iso3166_alpha2_code_value_object.py +0 -0
  99. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/iso3166_alpha3_code_value_object.py +0 -0
  100. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/iso3166_numeric_code_value_object.py +0 -0
  101. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/phone_code_value_object.py +0 -0
  102. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/__init__.py +0 -0
  103. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_codes.txt +0 -0
  104. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_alpha3_mapping.txt +0 -0
  105. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_numeric_mapping.txt +0 -0
  106. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_phone_code_mapping.txt +0 -0
  107. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_tld_mapping.txt +0 -0
  108. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha3_codes.txt +0 -0
  109. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/utils/iso3166_numeric_codes.txt +0 -0
  110. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/identifiers/world/vin_value_object.py +0 -0
  111. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/aws_cloud_region_value_object.py +0 -0
  112. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/ip_address_value_object.py +0 -0
  113. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/ipv4_address_value_object.py +0 -0
  114. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/ipv4_network_value_object.py +0 -0
  115. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/ipv6_address_value_object.py +0 -0
  116. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/ipv6_network_value_object.py +0 -0
  117. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/keys/__init__.py +0 -0
  118. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/keys/kebab_case_key_value_object.py +0 -0
  119. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/keys/snake_case_key_value_object.py +0 -0
  120. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mac_address_value_object.py +0 -0
  121. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mac_addresses/__init__.py +0 -0
  122. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mac_addresses/cisco_mac_address_value_object.py +0 -0
  123. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mac_addresses/raw_mac_address_value_object.py +0 -0
  124. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mac_addresses/space_mac_address_value_object.py +0 -0
  125. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mac_addresses/universal_mac_address_value_object.py +0 -0
  126. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mac_addresses/windows_mac_address_value_object.py +0 -0
  127. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mobile/__init__.py +0 -0
  128. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/mobile/imei_value_object.py +0 -0
  129. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/port_value_object.py +0 -0
  130. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/slug_value_object.py +0 -0
  131. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/uri/__init__.py +0 -0
  132. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/uri/http_url_value_object.py +0 -0
  133. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/user_agent_value_object.py +0 -0
  134. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/utils/__init__.py +0 -0
  135. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/utils/aws_regions.txt +0 -0
  136. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/internet/utils/tld_domains.txt +0 -0
  137. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/__init__.py +0 -0
  138. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/credit_card_value_object.py +0 -0
  139. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/credit_cards/__init__.py +0 -0
  140. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/credit_cards/amex_credit_card_value_object.py +0 -0
  141. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/credit_cards/discover_credit_card_value_object.py +0 -0
  142. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/credit_cards/mastercard_credit_card_value_object.py +0 -0
  143. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/credit_cards/visa_credit_card_value_object.py +0 -0
  144. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/iban_value_object.py +0 -0
  145. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/utils/__init__.py +0 -0
  146. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/money/utils/iban_lengths.txt +0 -0
  147. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/__init__.py +0 -0
  148. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/boolean/__init__.py +0 -0
  149. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/boolean/boolean_value_object.py +0 -0
  150. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/boolean/false_value_object.py +0 -0
  151. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/boolean/true_value_object.py +0 -0
  152. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/bytes/__init__.py +0 -0
  153. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/bytes/bytes_value_object.py +0 -0
  154. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/float/__init__.py +0 -0
  155. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/float/float_value_object.py +0 -0
  156. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/float/negative_float_value_object.py +0 -0
  157. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/float/negative_or_zero_float_value_object.py +0 -0
  158. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/float/positive_float_value_object.py +0 -0
  159. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/float/positive_or_zero_float_value_object.py +0 -0
  160. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/__init__.py +0 -0
  161. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/even_integer_value_object.py +0 -0
  162. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/integer_value_object.py +0 -0
  163. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/negative_integer_value_object.py +0 -0
  164. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/negative_or_zero_integer_value_object.py +0 -0
  165. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/odd_integer_value_object.py +0 -0
  166. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/positive_integer_value_object.py +0 -0
  167. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/integer/positive_or_zero_integer_value_object.py +0 -0
  168. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/none/__init__.py +0 -0
  169. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/none/none_value_object.py +0 -0
  170. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/none/not_none_value_object.py +0 -0
  171. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/__init__.py +0 -0
  172. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/alpha_value_object.py +0 -0
  173. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/alphanumeric_value_object.py +0 -0
  174. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/base64_value_object.py +0 -0
  175. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/camel_case_string_value_object.py +0 -0
  176. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/digit_value_object.py +0 -0
  177. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/kebab_case_string_value_object.py +0 -0
  178. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/lowercase_string_value_object.py +0 -0
  179. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/non_empty_string_value_object.py +0 -0
  180. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/pascal_case_string_value_object.py +0 -0
  181. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/printable_string_value_object.py +0 -0
  182. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/screaming_snake_case_string_value_object.py +0 -0
  183. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/secret_string_value_object.py +0 -0
  184. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/snake_case_string_value_object.py +0 -0
  185. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/string_value_object.py +0 -0
  186. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/trimmed_string_value_object.py +0 -0
  187. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/primitives/string/uppercase_string_value_object.py +0 -0
  188. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/value_object_pattern/usables/utils/__init__.py +0 -0
  189. {value_object_pattern-1.32.0 → value_object_pattern-1.33.1}/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.32.0
3
+ Version: 1.33.1
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.32.0'
1
+ __version__ = '1.33.1'
2
2
 
3
3
  from .decorators import process, validation
4
4
  from .models import BaseModel, EnumerationValueObject, UnionValueObject, ValueObject
@@ -1,4 +1,5 @@
1
1
  from .aws_cloud_region_value_object import AwsCloudRegionValueObject
2
+ from .domain_or_localhost_value_object import DomainOrLocalhostValueObject
2
3
  from .domain_value_object import DomainValueObject
3
4
  from .email_address_value_object import EmailAddressValueObject
4
5
  from .host_value_object import HostValueObject
@@ -16,6 +17,7 @@ from .user_agent_value_object import UserAgentValueObject
16
17
 
17
18
  __all__ = (
18
19
  'AwsCloudRegionValueObject',
20
+ 'DomainOrLocalhostValueObject',
19
21
  'DomainValueObject',
20
22
  'EmailAddressValueObject',
21
23
  'HostValueObject',
@@ -0,0 +1,22 @@
1
+ """
2
+ DomainOrLocalhostValueObject value object.
3
+ """
4
+
5
+ from .domain_value_object import DomainValueObject
6
+
7
+
8
+ class DomainOrLocalhostValueObject(DomainValueObject):
9
+ """
10
+ DomainOrLocalhostValueObject ensures the provided value is a valid domain or localhost.
11
+
12
+ Example:
13
+ ```python
14
+ from value_object_pattern.usables.internet import DomainOrLocalhostValueObject
15
+
16
+ domain = DomainOrLocalhostValueObject(value='localhost')
17
+ print(repr(domain))
18
+ # >>> DomainOrLocalhostValueObject(value=localhost)
19
+ ```
20
+ """
21
+
22
+ _DOMAIN_VALID_SINGLE_LABELS: frozenset[str] = frozenset({'localhost'})
@@ -32,6 +32,7 @@ class DomainValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
32
32
  _DOMAIN_MAX_LABEL_LENGTH: int = 63
33
33
  _DOMAIN_MAX_DOMAIN_LENGTH: int = 253
34
34
  _DOMAIN_REGEX: Pattern[str] = re_compile(pattern=r'[0-9a-zA-Z-]+')
35
+ _DOMAIN_VALID_SINGLE_LABELS: frozenset[str] = frozenset()
35
36
 
36
37
  @process(order=0)
37
38
  def _ensure_domain_is_in_lowercase(self, value: str) -> str:
@@ -72,7 +73,10 @@ class DomainValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
72
73
  ValueError: If domain value has not a valid top level domain.
73
74
  """
74
75
  if '.' not in processed_value:
75
- self._raise_value_has_not_valid_top_level_domain(value=value)
76
+ if processed_value not in self._DOMAIN_VALID_SINGLE_LABELS:
77
+ self._raise_value_has_not_valid_top_level_domain(value=value)
78
+
79
+ return
76
80
 
77
81
  tdl = processed_value.split(sep='.')[-1]
78
82
  if tdl not in get_tld_dict():
@@ -214,8 +214,7 @@ class EmailAddressValueObject(NotEmptyStringValueObject, TrimmedStringValueObjec
214
214
  try:
215
215
  self._internal_domain_part = DomainValueObject(value=self._internal_domain_part).value
216
216
 
217
- except Exception as exception:
218
- print(f'{exception}')
217
+ except (TypeError, ValueError):
219
218
  self._raise_value_invalid_domain_error(value=value, domain_part=self._internal_domain_part)
220
219
 
221
220
  def _raise_email_address_domain_contains_invalid_characters_error(self, value: str, domain_part: str) -> NoReturn:
@@ -7,7 +7,7 @@ from typing import NoReturn
7
7
  from value_object_pattern import process, validation
8
8
  from value_object_pattern.usables import NotEmptyStringValueObject, TrimmedStringValueObject
9
9
 
10
- from .domain_value_object import DomainValueObject
10
+ from .domain_or_localhost_value_object import DomainOrLocalhostValueObject
11
11
  from .ipv4_address_value_object import Ipv4AddressValueObject
12
12
  from .ipv6_address_value_object import Ipv6AddressValueObject
13
13
 
@@ -38,7 +38,7 @@ class HostValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
38
38
  str: The host value stored in respective format.
39
39
  """
40
40
  if self._is_domain(value=value):
41
- return DomainValueObject(value=value).value
41
+ return DomainOrLocalhostValueObject(value=value).value
42
42
 
43
43
  if self._is_ipv4_address(value=value):
44
44
  return Ipv4AddressValueObject(value=value).value
@@ -104,7 +104,7 @@ class HostValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
104
104
  bool: True if the value is a domain, False otherwise.
105
105
  """
106
106
  try:
107
- DomainValueObject(value=value)
107
+ DomainOrLocalhostValueObject(value=value)
108
108
  return True
109
109
 
110
110
  except (TypeError, ValueError):
@@ -2,6 +2,8 @@
2
2
  HttpHttpsUrlValueObject value object.
3
3
  """
4
4
 
5
+ from typing import NoReturn
6
+
5
7
  from value_object_pattern import validation
6
8
 
7
9
  from .url_value_object import UrlValueObject, split_url
@@ -36,4 +38,17 @@ class HttpHttpsUrlValueObject(UrlValueObject):
36
38
  scheme, *_ = split_url(value=value)
37
39
 
38
40
  if scheme not in ('http', 'https'):
39
- raise ValueError(f'HttpHttpsUrlValueObject value <<<{value}>>> scheme is not HTTP or HTTPS')
41
+ self._raise_value_is_not_http_https_url(value=value, scheme=scheme)
42
+
43
+ def _raise_value_is_not_http_https_url(self, value: str, scheme: str) -> NoReturn:
44
+ """
45
+ Raise an error if the URL scheme is not HTTP or HTTPS.
46
+
47
+ Args:
48
+ value (str): The URL value.
49
+ scheme (str): The invalid scheme.
50
+
51
+ Raises:
52
+ ValueError: If the URL scheme is not HTTP or HTTPS.
53
+ """
54
+ raise ValueError(f'HttpHttpsUrlValueObject value <<<{value}>>> scheme is not HTTP or HTTPS')
@@ -2,6 +2,8 @@
2
2
  HttpsUrlValueObject value object.
3
3
  """
4
4
 
5
+ from typing import NoReturn
6
+
5
7
  from value_object_pattern import validation
6
8
 
7
9
  from .url_value_object import UrlValueObject, split_url
@@ -36,4 +38,17 @@ class HttpsUrlValueObject(UrlValueObject):
36
38
  scheme, *_ = split_url(value=value)
37
39
 
38
40
  if scheme != 'https':
39
- raise ValueError(f'HttpsUrlValueObject value <<<{value}>>> scheme is not HTTPS')
41
+ self._raise_value_is_not_https_url(value=value, scheme=scheme)
42
+
43
+ def _raise_value_is_not_https_url(self, value: str, scheme: str) -> NoReturn:
44
+ """
45
+ Raise an error if the URL scheme is not HTTPS.
46
+
47
+ Args:
48
+ value (str): The URL value.
49
+ scheme (str): The invalid scheme.
50
+
51
+ Raises:
52
+ ValueError: If the URL scheme is not HTTPS.
53
+ """
54
+ raise ValueError(f'HttpsUrlValueObject value <<<{value}>>> scheme is not HTTPS')
@@ -4,6 +4,7 @@ UrlValueObject value object.
4
4
 
5
5
  from functools import lru_cache
6
6
  from re import Pattern, compile as re_compile
7
+ from typing import NoReturn
7
8
  from urllib.parse import parse_qs, urlsplit
8
9
 
9
10
  from value_object_pattern import process, validation
@@ -37,6 +38,9 @@ def join_url(
37
38
  Returns:
38
39
  str: The URL joined.
39
40
  """
41
+ if ':' in host and not host.startswith('['):
42
+ host = f'[{host}]'
43
+
40
44
  netloc = host
41
45
  if user_information:
42
46
  netloc = f'{user_information}@{netloc}'
@@ -88,9 +92,18 @@ def split_netloc(value: str) -> tuple[str | None, str, int | None]:
88
92
  # prevent splitting passwords with @
89
93
  user_information, host_port = value.rsplit(sep='@', maxsplit=1)
90
94
 
95
+ if host_port.startswith('['):
96
+ host, _, port_string = host_port[1:].partition(']')
97
+ if port_string:
98
+ port = int(port_string.removeprefix(':'))
99
+
100
+ return user_information, host, port
101
+
102
+ if host_port.count(':') > 1:
103
+ raise ValueError('IPv6 URL hosts must be enclosed in brackets.')
104
+
91
105
  host = host_port
92
- if ':' in host_port and host_port.count(':') == 1:
93
- # prevent splitting IPv6 addresses
106
+ if ':' in host_port:
94
107
  host, port_string = host_port.rsplit(sep=':', maxsplit=1)
95
108
  port = int(port_string)
96
109
 
@@ -166,11 +179,23 @@ class UrlValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
166
179
  try:
167
180
  scheme, netloc, path, query, fragment = split_url(value=value)
168
181
 
169
- except ValueError as error:
170
- raise ValueError(f'UrlValueObject value <<<{value}>>> is not a valid url.') from error
182
+ except ValueError:
183
+ self._raise_value_is_not_valid_url(value=value)
171
184
 
172
185
  if not scheme and not netloc and not path and not query and not fragment:
173
- raise ValueError(f'UrlValueObject value <<<{value}>>> is not a valid url.')
186
+ self._raise_value_is_not_valid_url(value=value)
187
+
188
+ def _raise_value_is_not_valid_url(self, value: str) -> NoReturn:
189
+ """
190
+ Raise an error if the value is not a valid URL.
191
+
192
+ Args:
193
+ value (str): The invalid URL value.
194
+
195
+ Raises:
196
+ ValueError: If the value is not a valid URL.
197
+ """
198
+ raise ValueError(f'UrlValueObject value <<<{value}>>> is not a valid url.')
174
199
 
175
200
  @validation(order=1)
176
201
  def _validate_url_scheme(self, value: str) -> None:
@@ -188,7 +213,20 @@ class UrlValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
188
213
  """
189
214
  scheme, *_ = split_url(value=value)
190
215
  if not self._URL_SCHEME_REGEX.match(string=scheme):
191
- raise ValueError(f'UrlValueObject value <<<{value}>>> contains an invalid scheme <<<{scheme}>>>.')
216
+ self._raise_value_has_not_valid_scheme(value=value, scheme=scheme)
217
+
218
+ def _raise_value_has_not_valid_scheme(self, value: str, scheme: str) -> NoReturn:
219
+ """
220
+ Raise an error if the URL scheme is invalid.
221
+
222
+ Args:
223
+ value (str): The URL value.
224
+ scheme (str): The invalid scheme.
225
+
226
+ Raises:
227
+ ValueError: If the URL scheme is invalid.
228
+ """
229
+ raise ValueError(f'UrlValueObject value <<<{value}>>> contains an invalid scheme <<<{scheme}>>>.')
192
230
 
193
231
  @validation(order=2)
194
232
  def _validate_url_netloc(self, value: str) -> None:
@@ -207,23 +245,70 @@ class UrlValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
207
245
  https://www.rfc-editor.org/rfc/rfc3986#section-3.2.3
208
246
  """
209
247
  _, netloc, *_ = split_url(value=value)
210
- user_information, host, port = split_netloc(value=netloc)
248
+ try:
249
+ user_information, host, port = split_netloc(value=netloc)
250
+
251
+ except ValueError:
252
+ if netloc.count(':') > 1 and not netloc.startswith('['):
253
+ self._raise_value_is_not_valid_url(value=value)
254
+
255
+ invalid_port = netloc.rsplit(sep=':', maxsplit=1)[-1]
256
+ self._raise_value_has_not_valid_port(value=value, port=invalid_port)
211
257
 
212
258
  if user_information is not None and not self._URL_USER_INFORMATION_REGEX.match(string=user_information): # noqa: E501 # fmt: skip
213
- raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid user information <<<{user_information}>>>.') # noqa: E501 # fmt: skip
259
+ self._raise_value_has_not_valid_user_information(value=value, user_information=user_information)
214
260
 
215
261
  try:
216
262
  HostValueObject(value=host)
217
263
 
218
- except ValueError as error:
219
- raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid host <<<{host}>>>.') from error
264
+ except (TypeError, ValueError):
265
+ self._raise_value_has_not_valid_host(value=value, host=host)
220
266
 
221
- try:
222
- if port is not None:
267
+ if port is not None:
268
+ try:
223
269
  PortValueObject(value=port)
224
270
 
225
- except ValueError as error:
226
- raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid port <<<{port}>>>.') from error
271
+ except (TypeError, ValueError):
272
+ self._raise_value_has_not_valid_port(value=value, port=port)
273
+
274
+ def _raise_value_has_not_valid_user_information(self, value: str, user_information: str) -> NoReturn:
275
+ """
276
+ Raise an error if the URL user information is invalid.
277
+
278
+ Args:
279
+ value (str): The URL value.
280
+ user_information (str): The invalid user information.
281
+
282
+ Raises:
283
+ ValueError: If the URL user information is invalid.
284
+ """
285
+ raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid user information <<<{user_information}>>>.') # noqa: E501 # fmt: skip
286
+
287
+ def _raise_value_has_not_valid_host(self, value: str, host: str) -> NoReturn:
288
+ """
289
+ Raise an error if the URL host is invalid.
290
+
291
+ Args:
292
+ value (str): The URL value.
293
+ host (str): The invalid host.
294
+
295
+ Raises:
296
+ ValueError: If the URL host is invalid.
297
+ """
298
+ raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid host <<<{host}>>>.')
299
+
300
+ def _raise_value_has_not_valid_port(self, value: str, port: int | str) -> NoReturn:
301
+ """
302
+ Raise an error if the URL port is invalid.
303
+
304
+ Args:
305
+ value (str): The URL value.
306
+ port (int | str): The invalid port.
307
+
308
+ Raises:
309
+ ValueError: If the URL port is invalid.
310
+ """
311
+ raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid port <<<{port}>>>.')
227
312
 
228
313
  @validation(order=3)
229
314
  def _validate_url_path(self, value: str) -> None:
@@ -244,7 +329,20 @@ class UrlValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
244
329
  return
245
330
 
246
331
  if not self._URL_PATH_REGEX.match(string=path):
247
- raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid path <<<{path}>>>.')
332
+ self._raise_value_has_not_valid_path(value=value, path=path)
333
+
334
+ def _raise_value_has_not_valid_path(self, value: str, path: str) -> NoReturn:
335
+ """
336
+ Raise an error if the URL path is invalid.
337
+
338
+ Args:
339
+ value (str): The URL value.
340
+ path (str): The invalid path.
341
+
342
+ Raises:
343
+ ValueError: If the URL path is invalid.
344
+ """
345
+ raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid path <<<{path}>>>.')
248
346
 
249
347
  @validation(order=4)
250
348
  def _validate_url_query(self, value: str) -> None:
@@ -267,11 +365,24 @@ class UrlValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
267
365
  try:
268
366
  parse_qs(qs=query)
269
367
 
270
- except ValueError as error:
271
- raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid query <<<{query}>>>.') from error
368
+ except ValueError:
369
+ self._raise_value_has_not_valid_query(value=value, query=query)
272
370
 
273
371
  if not self._URL_QUERY_REGEX.match(string=query):
274
- raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid query <<<{query}>>>.')
372
+ self._raise_value_has_not_valid_query(value=value, query=query)
373
+
374
+ def _raise_value_has_not_valid_query(self, value: str, query: str) -> NoReturn:
375
+ """
376
+ Raise an error if the URL query is invalid.
377
+
378
+ Args:
379
+ value (str): The URL value.
380
+ query (str): The invalid query.
381
+
382
+ Raises:
383
+ ValueError: If the URL query is invalid.
384
+ """
385
+ raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid query <<<{query}>>>.')
275
386
 
276
387
  @validation(order=5)
277
388
  def _validate_url_fragment(self, value: str) -> None:
@@ -292,7 +403,20 @@ class UrlValueObject(NotEmptyStringValueObject, TrimmedStringValueObject):
292
403
  return
293
404
 
294
405
  if not self._URL_FRAGMENT_REGEX.match(string=fragment):
295
- raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid fragment <<<{fragment}>>>.')
406
+ self._raise_value_has_not_valid_fragment(value=value, fragment=fragment)
407
+
408
+ def _raise_value_has_not_valid_fragment(self, value: str, fragment: str) -> NoReturn:
409
+ """
410
+ Raise an error if the URL fragment is invalid.
411
+
412
+ Args:
413
+ value (str): The URL value.
414
+ fragment (str): The invalid fragment.
415
+
416
+ Raises:
417
+ ValueError: If the URL fragment is invalid.
418
+ """
419
+ raise ValueError(f'UrlValueObject value <<<{value}>>> has not a valid fragment <<<{fragment}>>>.')
296
420
 
297
421
  @property
298
422
  def scheme(self) -> str: