value-object-pattern 1.33.0__tar.gz → 1.34.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.
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/PKG-INFO +30 -2
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/README.md +29 -1
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/pyproject.toml +1 -1
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/__init__.py +3 -2
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/__init__.py +2 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/base_model.py +3 -3
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/collections/list_value_object.py +11 -11
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/primitive_conversion.py +78 -2
- value_object_pattern-1.34.0/value_object_pattern/models/secret_value_object.py +44 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/value_object.py +26 -4
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/__init__.py +12 -2
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/email_address_value_object.py +1 -2
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/uri/http_https_url_value_object.py +16 -1
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/uri/https_url_value_object.py +16 -1
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/uri/url_value_object.py +126 -18
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/__init__.py +12 -2
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/__init__.py +11 -2
- value_object_pattern-1.34.0/value_object_pattern/usables/primitives/string/base32_value_object.py +60 -0
- value_object_pattern-1.34.0/value_object_pattern/usables/primitives/string/base36_value_object.py +53 -0
- value_object_pattern-1.34.0/value_object_pattern/usables/primitives/string/base56_value_object.py +53 -0
- value_object_pattern-1.34.0/value_object_pattern/usables/primitives/string/base58_value_object.py +53 -0
- value_object_pattern-1.34.0/value_object_pattern/usables/primitives/string/hexadecimal_value_object.py +60 -0
- value_object_pattern-1.33.0/value_object_pattern/usables/primitives/string/secret_string_value_object.py +0 -43
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/.gitignore +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/LICENSE.md +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/decorators/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/decorators/classproperty.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/decorators/value_object_process.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/decorators/value_object_validation.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/collections/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/collections/dict_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/enumeration_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/type_matching.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/union_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/py.typed +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/date/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/date/date_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/date/string_date_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/datetime/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/datetime/datetime_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/datetime/string_datetime_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/timezone/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/timezone/string_timezone_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/dates/timezone/timezone_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v1_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v3_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v4_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v5_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v6_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v7_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_v8_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/string_uuid_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_v1_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_v3_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_v4_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_v5_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_v6_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_v7_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_v8_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/uuid/uuid_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/country_tld_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/dni_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/nie_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/nif_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/nuss_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/passport_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/phone_number_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/administrative_technician_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/air_force_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/army_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/canarias_police_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/catalan_police_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/civil_guard_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/consular_corps_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/diplomatic_corps_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/especial_plate_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/historical_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/international_organization_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_development_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ministry_environment_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/national_police_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/navy_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_truck_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/ordinary_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/provincial_system_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/state_motor_pool_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_not_registered_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_company_registered_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/temporal_private_individual_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/two_wheels_vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/plates/utils/provincial_plate_codes.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/utils/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/utils/provincial_codes.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/europe/spain/vehicle_plate_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/iso3166_alpha2_code_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/iso3166_alpha3_code_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/iso3166_numeric_code_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/phone_code_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_codes.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_alpha3_mapping.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_numeric_mapping.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_phone_code_mapping.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha2_to_tld_mapping.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_alpha3_codes.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/utils/iso3166_numeric_codes.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/identifiers/world/vin_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/aws_cloud_region_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/domain_or_localhost_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/domain_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/host_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/ip_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/ipv4_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/ipv4_network_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/ipv6_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/ipv6_network_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/keys/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/keys/kebab_case_key_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/keys/snake_case_key_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mac_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mac_addresses/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mac_addresses/cisco_mac_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mac_addresses/raw_mac_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mac_addresses/space_mac_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mac_addresses/universal_mac_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mac_addresses/windows_mac_address_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mobile/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/mobile/imei_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/port_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/slug_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/uri/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/uri/http_url_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/user_agent_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/utils/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/utils/aws_regions.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/internet/utils/tld_domains.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/credit_card_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/credit_cards/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/credit_cards/amex_credit_card_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/credit_cards/discover_credit_card_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/credit_cards/mastercard_credit_card_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/credit_cards/visa_credit_card_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/iban_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/utils/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/money/utils/iban_lengths.txt +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/boolean/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/boolean/boolean_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/boolean/false_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/boolean/true_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/bytes/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/bytes/bytes_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/float/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/float/float_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/float/negative_float_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/float/negative_or_zero_float_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/float/positive_float_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/float/positive_or_zero_float_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/even_integer_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/integer_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/negative_integer_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/negative_or_zero_integer_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/odd_integer_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/positive_integer_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/integer/positive_or_zero_integer_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/none/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/none/none_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/none/not_none_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/alpha_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/alphanumeric_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/base64_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/camel_case_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/digit_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/kebab_case_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/lowercase_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/non_empty_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/pascal_case_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/printable_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/screaming_snake_case_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/snake_case_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/trimmed_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/primitives/string/uppercase_string_value_object.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/utils/__init__.py +0 -0
- {value_object_pattern-1.33.0 → value_object_pattern-1.34.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.
|
|
3
|
+
Version: 1.34.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
|
|
@@ -261,6 +261,7 @@ low-level operations, and boundary examples.
|
|
|
261
261
|
| Model | Purpose |
|
|
262
262
|
| --- | --- |
|
|
263
263
|
| `ValueObject[T]` | Base class for immutable validated single-value wrappers. |
|
|
264
|
+
| `SecretValueObject` | Composition marker that redacts any value object's display in either inheritance order. |
|
|
264
265
|
| `EnumerationValueObject[E]` | Stores enum members while accepting enum members or raw enum values. |
|
|
265
266
|
| `UnionValueObject[T]` | Accepts and converts values that match a union annotation; supports subclass and inline construction. |
|
|
266
267
|
| `BaseModel` | Adds representation, equality, copying, and primitive conversion for aggregate-like models. |
|
|
@@ -269,6 +270,32 @@ low-level operations, and boundary examples.
|
|
|
269
270
|
|
|
270
271
|
See [`docs/usage/README.md`](docs/usage/README.md) for examples of each model.
|
|
271
272
|
|
|
273
|
+
Compose `SecretValueObject` with the typed value object that owns validation. The marker does not need a type argument and may appear before or after the value-object base:
|
|
274
|
+
|
|
275
|
+
```python
|
|
276
|
+
from value_object_pattern import SecretValueObject
|
|
277
|
+
from value_object_pattern.usables import IntegerValueObject, StringValueObject
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
class SecretToken(SecretValueObject, StringValueObject):
|
|
281
|
+
pass
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
class SecretPin(IntegerValueObject, SecretValueObject):
|
|
285
|
+
pass
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
token = SecretToken(value='hidden-token')
|
|
289
|
+
pin = SecretPin(value=1234)
|
|
290
|
+
|
|
291
|
+
assert str(token) == '********'
|
|
292
|
+
assert str(pin) == '********'
|
|
293
|
+
assert token.value == 'hidden-token'
|
|
294
|
+
assert pin.value == 1234
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Display redaction is not encryption: `.value` and primitive conversion still expose the raw stored value.
|
|
298
|
+
|
|
272
299
|
<p align="right">
|
|
273
300
|
<a href="#readme-top">🔼 Back to top</a>
|
|
274
301
|
</p><br><br>
|
|
@@ -282,7 +309,8 @@ The package includes reusable validators for common shapes:
|
|
|
282
309
|
| Category | Examples |
|
|
283
310
|
| --- | --- |
|
|
284
311
|
| Primitives | strings, bytes, booleans, integers, floats, `None` / not-`None` |
|
|
285
|
-
| String formats | non-empty, trimmed, alpha, alphanumeric, lower/upper case, snake case, kebab case
|
|
312
|
+
| String formats | non-empty, trimmed, alpha, alphanumeric, lower/upper case, snake case, kebab case |
|
|
313
|
+
| Encoded strings | hexadecimal/Base16, Base32, Base36, ambiguity-free Base56, Bitcoin Base58, standard Base64 |
|
|
286
314
|
| Dates | `date`, `datetime`, date strings, datetime strings, timezone objects, timezone names |
|
|
287
315
|
| Identifiers | UUIDs and UUID strings, world codes, Spanish identifiers and vehicle plates |
|
|
288
316
|
| Internet | URLs, hosts, domains, ports, emails, IP addresses, networks, MAC addresses, slugs, keys |
|
|
@@ -236,6 +236,7 @@ low-level operations, and boundary examples.
|
|
|
236
236
|
| Model | Purpose |
|
|
237
237
|
| --- | --- |
|
|
238
238
|
| `ValueObject[T]` | Base class for immutable validated single-value wrappers. |
|
|
239
|
+
| `SecretValueObject` | Composition marker that redacts any value object's display in either inheritance order. |
|
|
239
240
|
| `EnumerationValueObject[E]` | Stores enum members while accepting enum members or raw enum values. |
|
|
240
241
|
| `UnionValueObject[T]` | Accepts and converts values that match a union annotation; supports subclass and inline construction. |
|
|
241
242
|
| `BaseModel` | Adds representation, equality, copying, and primitive conversion for aggregate-like models. |
|
|
@@ -244,6 +245,32 @@ low-level operations, and boundary examples.
|
|
|
244
245
|
|
|
245
246
|
See [`docs/usage/README.md`](docs/usage/README.md) for examples of each model.
|
|
246
247
|
|
|
248
|
+
Compose `SecretValueObject` with the typed value object that owns validation. The marker does not need a type argument and may appear before or after the value-object base:
|
|
249
|
+
|
|
250
|
+
```python
|
|
251
|
+
from value_object_pattern import SecretValueObject
|
|
252
|
+
from value_object_pattern.usables import IntegerValueObject, StringValueObject
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class SecretToken(SecretValueObject, StringValueObject):
|
|
256
|
+
pass
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
class SecretPin(IntegerValueObject, SecretValueObject):
|
|
260
|
+
pass
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
token = SecretToken(value='hidden-token')
|
|
264
|
+
pin = SecretPin(value=1234)
|
|
265
|
+
|
|
266
|
+
assert str(token) == '********'
|
|
267
|
+
assert str(pin) == '********'
|
|
268
|
+
assert token.value == 'hidden-token'
|
|
269
|
+
assert pin.value == 1234
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Display redaction is not encryption: `.value` and primitive conversion still expose the raw stored value.
|
|
273
|
+
|
|
247
274
|
<p align="right">
|
|
248
275
|
<a href="#readme-top">🔼 Back to top</a>
|
|
249
276
|
</p><br><br>
|
|
@@ -257,7 +284,8 @@ The package includes reusable validators for common shapes:
|
|
|
257
284
|
| Category | Examples |
|
|
258
285
|
| --- | --- |
|
|
259
286
|
| Primitives | strings, bytes, booleans, integers, floats, `None` / not-`None` |
|
|
260
|
-
| String formats | non-empty, trimmed, alpha, alphanumeric, lower/upper case, snake case, kebab case
|
|
287
|
+
| String formats | non-empty, trimmed, alpha, alphanumeric, lower/upper case, snake case, kebab case |
|
|
288
|
+
| Encoded strings | hexadecimal/Base16, Base32, Base36, ambiguity-free Base56, Bitcoin Base58, standard Base64 |
|
|
261
289
|
| Dates | `date`, `datetime`, date strings, datetime strings, timezone objects, timezone names |
|
|
262
290
|
| Identifiers | UUIDs and UUID strings, world codes, Spanish identifiers and vehicle plates |
|
|
263
291
|
| Internet | URLs, hosts, domains, ports, emails, IP addresses, networks, MAC addresses, slugs, keys |
|
|
@@ -63,7 +63,7 @@ release = ['build>=1.2.2', 'python-semantic-release>=10.0.2']
|
|
|
63
63
|
test = [
|
|
64
64
|
'pytest>=8.0.0',
|
|
65
65
|
'pytest-randomly>=3.0.0',
|
|
66
|
-
'object-mother-pattern>=3.
|
|
66
|
+
'object-mother-pattern>=3.16.0',
|
|
67
67
|
{ include-group = 'coverage' },
|
|
68
68
|
]
|
|
69
69
|
types = ['types-python-dateutil>=2.9.0.20241206']
|
{value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/__init__.py
RENAMED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
__version__ = '1.
|
|
1
|
+
__version__ = '1.34.0'
|
|
2
2
|
|
|
3
3
|
from .decorators import process, validation
|
|
4
|
-
from .models import BaseModel, EnumerationValueObject, UnionValueObject, ValueObject
|
|
4
|
+
from .models import BaseModel, EnumerationValueObject, SecretValueObject, UnionValueObject, ValueObject
|
|
5
5
|
|
|
6
6
|
__all__ = (
|
|
7
7
|
'BaseModel',
|
|
8
8
|
'EnumerationValueObject',
|
|
9
|
+
'SecretValueObject',
|
|
9
10
|
'UnionValueObject',
|
|
10
11
|
'ValueObject',
|
|
11
12
|
'process',
|
{value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/models/__init__.py
RENAMED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from .base_model import BaseModel
|
|
2
2
|
from .enumeration_value_object import EnumerationValueObject
|
|
3
|
+
from .secret_value_object import SecretValueObject
|
|
3
4
|
from .union_value_object import UnionValueObject
|
|
4
5
|
from .value_object import ValueObject
|
|
5
6
|
|
|
6
7
|
__all__ = (
|
|
7
8
|
'BaseModel',
|
|
8
9
|
'EnumerationValueObject',
|
|
10
|
+
'SecretValueObject',
|
|
9
11
|
'UnionValueObject',
|
|
10
12
|
'ValueObject',
|
|
11
13
|
)
|
|
@@ -17,7 +17,7 @@ from inspect import Parameter, _empty, signature
|
|
|
17
17
|
from types import UnionType
|
|
18
18
|
from typing import Any, NoReturn, Self, Union, get_args, get_origin, get_type_hints
|
|
19
19
|
|
|
20
|
-
from .primitive_conversion import from_primitive, to_primitive
|
|
20
|
+
from .primitive_conversion import from_primitive, to_display_primitive, to_primitive
|
|
21
21
|
from .type_matching import matches_expected_type
|
|
22
22
|
|
|
23
23
|
|
|
@@ -158,8 +158,8 @@ class BaseModel(ABC):
|
|
|
158
158
|
```
|
|
159
159
|
"""
|
|
160
160
|
attributes = []
|
|
161
|
-
for key, value in sorted(self.
|
|
162
|
-
attributes.append(f'{key}={value}')
|
|
161
|
+
for key, value in sorted(self._to_dict(ignore_private=True).items()):
|
|
162
|
+
attributes.append(f'{key}={to_display_primitive(value=value)}')
|
|
163
163
|
|
|
164
164
|
return f'{self.__class__.__name__}({", ".join(attributes)})'
|
|
165
165
|
|
|
@@ -18,7 +18,7 @@ from types import UnionType
|
|
|
18
18
|
from typing import Any, ClassVar, Generic, NoReturn, Self, TypeVar, Union, cast, get_args, get_origin
|
|
19
19
|
|
|
20
20
|
from value_object_pattern.decorators import validation
|
|
21
|
-
from value_object_pattern.models import
|
|
21
|
+
from value_object_pattern.models import ValueObject
|
|
22
22
|
from value_object_pattern.models.primitive_conversion import from_primitive, to_primitive
|
|
23
23
|
from value_object_pattern.models.type_matching import matches_expected_type
|
|
24
24
|
|
|
@@ -328,19 +328,19 @@ class ListValueObject(ValueObject[list[T]], Generic[T]): # noqa: UP046
|
|
|
328
328
|
# >>> [1, 2, 3]
|
|
329
329
|
```
|
|
330
330
|
"""
|
|
331
|
+
if self._has_secret_display():
|
|
332
|
+
return ValueObject.__repr__(self)
|
|
333
|
+
|
|
331
334
|
primitive_types: tuple[type, ...] = (int, float, str, bool, bytes, bytearray, memoryview, type(None))
|
|
332
335
|
collection_types: tuple[type, ...] = (list, dict, tuple, set, frozenset)
|
|
333
336
|
|
|
334
337
|
list_to_return: list[Any] = []
|
|
335
338
|
for item in self._value:
|
|
336
|
-
if isinstance(item,
|
|
337
|
-
list_to_return.append(repr(item))
|
|
338
|
-
|
|
339
|
-
elif isinstance(item, Enum):
|
|
339
|
+
if isinstance(item, Enum):
|
|
340
340
|
list_to_return.append(item.value)
|
|
341
341
|
|
|
342
342
|
elif isinstance(item, ValueObject):
|
|
343
|
-
value = item.
|
|
343
|
+
value = item._resolved_value_for_display()
|
|
344
344
|
|
|
345
345
|
if isinstance(value, Enum):
|
|
346
346
|
value = value.value
|
|
@@ -388,19 +388,19 @@ class ListValueObject(ValueObject[list[T]], Generic[T]): # noqa: UP046
|
|
|
388
388
|
# >>> [1, 2, 3]
|
|
389
389
|
```
|
|
390
390
|
"""
|
|
391
|
+
if self._has_secret_display():
|
|
392
|
+
return ValueObject.__str__(self)
|
|
393
|
+
|
|
391
394
|
primitive_types: tuple[type, ...] = (int, float, str, bool, bytes, bytearray, memoryview, type(None))
|
|
392
395
|
collection_types: tuple[type, ...] = (list, dict, tuple, set, frozenset)
|
|
393
396
|
|
|
394
397
|
list_to_return: list[Any] = []
|
|
395
398
|
for item in self._value:
|
|
396
|
-
if isinstance(item,
|
|
397
|
-
list_to_return.append(str(object=item))
|
|
398
|
-
|
|
399
|
-
elif isinstance(item, Enum):
|
|
399
|
+
if isinstance(item, Enum):
|
|
400
400
|
list_to_return.append(item.value)
|
|
401
401
|
|
|
402
402
|
elif isinstance(item, ValueObject):
|
|
403
|
-
value = item.
|
|
403
|
+
value = item._resolved_value_for_display()
|
|
404
404
|
|
|
405
405
|
if isinstance(value, Enum):
|
|
406
406
|
value = value.value
|
|
@@ -20,7 +20,7 @@ def to_primitive(value: Any) -> Any:
|
|
|
20
20
|
"""
|
|
21
21
|
Recursively convert value objects, models, enums, and collections to primitive representations.
|
|
22
22
|
|
|
23
|
-
`ValueObject` instances are converted through their
|
|
23
|
+
`ValueObject` instances are converted through their stored value, `BaseModel`-like objects through
|
|
24
24
|
`to_primitives()`, enums through their `.value`, and collections item by item.
|
|
25
25
|
|
|
26
26
|
Args:
|
|
@@ -49,6 +49,82 @@ def to_primitive(value: Any) -> Any:
|
|
|
49
49
|
return str(object=value)
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
def to_display_primitive(value: Any) -> Any:
|
|
53
|
+
"""
|
|
54
|
+
Recursively convert a value for display while honoring value-object redaction.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
value (Any): Value to convert.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Any: Display-safe primitive representation.
|
|
61
|
+
"""
|
|
62
|
+
if isinstance(value, PRIMITIVE_TYPES):
|
|
63
|
+
return value
|
|
64
|
+
|
|
65
|
+
if isinstance(value, Enum):
|
|
66
|
+
return to_display_primitive(value=value.value)
|
|
67
|
+
|
|
68
|
+
if isinstance(value, ValueObject):
|
|
69
|
+
return _convert_value_for_display(value=value)
|
|
70
|
+
|
|
71
|
+
if isinstance(value, (list, tuple, set, frozenset, dict)):
|
|
72
|
+
return _convert_collection_for_display(value=value)
|
|
73
|
+
|
|
74
|
+
if callable(getattr(value, 'to_primitives', None)):
|
|
75
|
+
return str(object=value)
|
|
76
|
+
|
|
77
|
+
if hasattr(value, 'value'):
|
|
78
|
+
return _convert_value_for_display(value=value)
|
|
79
|
+
|
|
80
|
+
return str(object=value)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _convert_value_for_display(*, value: Any) -> Any:
|
|
84
|
+
"""
|
|
85
|
+
Convert a value-like wrapper through its display value.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
value (Any): Value-like wrapper.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
Any: Display-safe primitive representation.
|
|
92
|
+
"""
|
|
93
|
+
nested_value = (
|
|
94
|
+
value._resolved_value_for_display() if isinstance(value, ValueObject) else getattr(value, 'value', value)
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
if nested_value is value:
|
|
98
|
+
return str(object=value)
|
|
99
|
+
|
|
100
|
+
return to_display_primitive(value=nested_value)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _convert_collection_for_display(*, value: Any) -> Any:
|
|
104
|
+
"""
|
|
105
|
+
Recursively convert collection values for display.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
value (Any): Collection value.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Any: Display-safe collection.
|
|
112
|
+
"""
|
|
113
|
+
if isinstance(value, list):
|
|
114
|
+
return [to_display_primitive(value=item) for item in value]
|
|
115
|
+
|
|
116
|
+
if isinstance(value, tuple):
|
|
117
|
+
return tuple(to_display_primitive(value=item) for item in value)
|
|
118
|
+
|
|
119
|
+
if isinstance(value, set):
|
|
120
|
+
return {to_display_primitive(value=item) for item in value}
|
|
121
|
+
|
|
122
|
+
if isinstance(value, frozenset):
|
|
123
|
+
return frozenset(to_display_primitive(value=item) for item in value)
|
|
124
|
+
|
|
125
|
+
return {to_display_primitive(value=key): to_display_primitive(value=item) for key, item in value.items()}
|
|
126
|
+
|
|
127
|
+
|
|
52
128
|
def from_primitive(*, value: Any, expected_type: Any) -> Any:
|
|
53
129
|
"""
|
|
54
130
|
Recursively convert a primitive value into `expected_type` when possible.
|
|
@@ -108,7 +184,7 @@ def _convert_with_value_attribute(*, value: Any) -> Any:
|
|
|
108
184
|
Any: Converted value or sentinel when the branch does not apply.
|
|
109
185
|
"""
|
|
110
186
|
if isinstance(value, ValueObject):
|
|
111
|
-
nested_value = value.
|
|
187
|
+
nested_value = value.value
|
|
112
188
|
if nested_value is value:
|
|
113
189
|
return str(object=value)
|
|
114
190
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Composition marker for display-redacted value objects.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SecretValueObject:
|
|
7
|
+
"""
|
|
8
|
+
Redact the display output of any accompanying value-object base.
|
|
9
|
+
|
|
10
|
+
This composition-only marker does not store or validate values. Combine it with any `ValueObject` subclass in either
|
|
11
|
+
inheritance order. The accompanying value object supplies the wrapped type, validation, processing, and primitive
|
|
12
|
+
conversion behavior.
|
|
13
|
+
|
|
14
|
+
The raw value remains available through `.value` and primitive conversion. Redaction is a presentation guard, not
|
|
15
|
+
encryption or secure secret storage.
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
```python
|
|
19
|
+
from value_object_pattern import SecretValueObject
|
|
20
|
+
from value_object_pattern.usables import StringValueObject
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SecretString(SecretValueObject, StringValueObject):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
secret = SecretString(value='hidden-value')
|
|
28
|
+
print(secret)
|
|
29
|
+
# >>> ********
|
|
30
|
+
```
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
__slots__ = ()
|
|
34
|
+
|
|
35
|
+
_MASK: str = '********'
|
|
36
|
+
|
|
37
|
+
def _secret_value_for_display(self) -> str:
|
|
38
|
+
"""
|
|
39
|
+
Return the fixed display mask.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
str: Redacted display value.
|
|
43
|
+
"""
|
|
44
|
+
return self._MASK
|
|
@@ -143,7 +143,7 @@ class ValueObject(ABC, Generic[T]): # noqa: UP046
|
|
|
143
143
|
# >>> IntegerValueObject(value=10)
|
|
144
144
|
```
|
|
145
145
|
"""
|
|
146
|
-
return f'{self.__class__.__name__}(value={self.
|
|
146
|
+
return f'{self.__class__.__name__}(value={self._resolved_value_for_display()!r})'
|
|
147
147
|
|
|
148
148
|
@override
|
|
149
149
|
def __str__(self) -> str:
|
|
@@ -167,7 +167,7 @@ class ValueObject(ABC, Generic[T]): # noqa: UP046
|
|
|
167
167
|
# >>> 10
|
|
168
168
|
```
|
|
169
169
|
"""
|
|
170
|
-
return str(object=self.
|
|
170
|
+
return str(object=self._resolved_value_for_display())
|
|
171
171
|
|
|
172
172
|
@override
|
|
173
173
|
def __hash__(self) -> int:
|
|
@@ -380,13 +380,35 @@ class ValueObject(ABC, Generic[T]): # noqa: UP046
|
|
|
380
380
|
|
|
381
381
|
def _value_for_display(self) -> Any:
|
|
382
382
|
"""
|
|
383
|
-
|
|
383
|
+
Return the value used by display-oriented representations.
|
|
384
384
|
|
|
385
385
|
Returns:
|
|
386
|
-
Any: Value safe for string
|
|
386
|
+
Any: Value safe for string and repr display paths.
|
|
387
387
|
"""
|
|
388
388
|
return self.value
|
|
389
389
|
|
|
390
|
+
def _resolved_value_for_display(self) -> Any:
|
|
391
|
+
"""
|
|
392
|
+
Resolve the final display value, giving secret redaction precedence.
|
|
393
|
+
|
|
394
|
+
Returns:
|
|
395
|
+
Any: Redacted value for secret compositions, otherwise the regular display value.
|
|
396
|
+
"""
|
|
397
|
+
secret_value_for_display = getattr(self, '_secret_value_for_display', None)
|
|
398
|
+
if callable(secret_value_for_display):
|
|
399
|
+
return secret_value_for_display()
|
|
400
|
+
|
|
401
|
+
return self._value_for_display()
|
|
402
|
+
|
|
403
|
+
def _has_secret_display(self) -> bool:
|
|
404
|
+
"""
|
|
405
|
+
Return whether this value object carries the secret display marker.
|
|
406
|
+
|
|
407
|
+
Returns:
|
|
408
|
+
bool: True when secret display composition is active.
|
|
409
|
+
"""
|
|
410
|
+
return callable(getattr(self, '_secret_value_for_display', None))
|
|
411
|
+
|
|
390
412
|
def _post_order_dfs_mro(self, cls: type, visited: set[type] | None = None, cut_off: type = object) -> list[type]:
|
|
391
413
|
"""
|
|
392
414
|
Computes the Post-Order Depth-First Search (DFS) Method Resolution Order (MRO) of a class.
|
{value_object_pattern-1.33.0 → value_object_pattern-1.34.0}/value_object_pattern/usables/__init__.py
RENAMED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
from .primitives import (
|
|
2
2
|
AlphaStringValueObject,
|
|
3
3
|
AlphanumericStringValueObject,
|
|
4
|
+
Base16StringValueObject,
|
|
5
|
+
Base32StringValueObject,
|
|
6
|
+
Base36StringValueObject,
|
|
7
|
+
Base56StringValueObject,
|
|
8
|
+
Base58StringValueObject,
|
|
4
9
|
Base64StringValueObject,
|
|
5
10
|
BooleanValueObject,
|
|
6
11
|
BytesValueObject,
|
|
@@ -9,6 +14,7 @@ from .primitives import (
|
|
|
9
14
|
EvenIntegerValueObject,
|
|
10
15
|
FalseValueObject,
|
|
11
16
|
FloatValueObject,
|
|
17
|
+
HexadecimalStringValueObject,
|
|
12
18
|
IntegerValueObject,
|
|
13
19
|
KebabCaseStringValueObject,
|
|
14
20
|
LowercaseStringValueObject,
|
|
@@ -27,7 +33,6 @@ from .primitives import (
|
|
|
27
33
|
PositiveOrZeroIntegerValueObject,
|
|
28
34
|
PrintableStringValueObject,
|
|
29
35
|
ScreamingSnakeCaseStringValueObject,
|
|
30
|
-
SecretStringValueObject,
|
|
31
36
|
SnakeCaseStringValueObject,
|
|
32
37
|
StringValueObject,
|
|
33
38
|
TrimmedStringValueObject,
|
|
@@ -38,6 +43,11 @@ from .primitives import (
|
|
|
38
43
|
__all__ = (
|
|
39
44
|
'AlphaStringValueObject',
|
|
40
45
|
'AlphanumericStringValueObject',
|
|
46
|
+
'Base16StringValueObject',
|
|
47
|
+
'Base32StringValueObject',
|
|
48
|
+
'Base36StringValueObject',
|
|
49
|
+
'Base56StringValueObject',
|
|
50
|
+
'Base58StringValueObject',
|
|
41
51
|
'Base64StringValueObject',
|
|
42
52
|
'BooleanValueObject',
|
|
43
53
|
'BytesValueObject',
|
|
@@ -46,6 +56,7 @@ __all__ = (
|
|
|
46
56
|
'EvenIntegerValueObject',
|
|
47
57
|
'FalseValueObject',
|
|
48
58
|
'FloatValueObject',
|
|
59
|
+
'HexadecimalStringValueObject',
|
|
49
60
|
'IntegerValueObject',
|
|
50
61
|
'KebabCaseStringValueObject',
|
|
51
62
|
'LowercaseStringValueObject',
|
|
@@ -67,7 +78,6 @@ __all__ = (
|
|
|
67
78
|
'PrintableStringValueObject',
|
|
68
79
|
'PrintableStringValueObject',
|
|
69
80
|
'ScreamingSnakeCaseStringValueObject',
|
|
70
|
-
'SecretStringValueObject',
|
|
71
81
|
'SnakeCaseStringValueObject',
|
|
72
82
|
'StringValueObject',
|
|
73
83
|
'StringValueObject',
|
|
@@ -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
|
|
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:
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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')
|