domainic-type 0.1.0.alpha.3.0.2 → 0.1.0.alpha.3.1.0

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 (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/domainic/type/behavior/string_behavior/matching_behavior.rb +115 -0
  3. data/lib/domainic/type/behavior/string_behavior.rb +2 -111
  4. data/lib/domainic/type/behavior/uri_behavior.rb +97 -0
  5. data/lib/domainic/type/behavior.rb +21 -1
  6. data/lib/domainic/type/config/registry.yml +15 -0
  7. data/lib/domainic/type/definitions.rb +182 -1
  8. data/lib/domainic/type/types/core/array_type.rb +1 -1
  9. data/lib/domainic/type/types/core/float_type.rb +1 -1
  10. data/lib/domainic/type/types/core/hash_type.rb +1 -1
  11. data/lib/domainic/type/types/core/integer_type.rb +1 -1
  12. data/lib/domainic/type/types/core/string_type.rb +1 -1
  13. data/lib/domainic/type/types/core/symbol_type.rb +1 -1
  14. data/lib/domainic/type/types/identifier/cuid_type.rb +140 -0
  15. data/lib/domainic/type/types/identifier/uuid_type.rb +513 -0
  16. data/lib/domainic/type/types/network/email_address_type.rb +149 -0
  17. data/lib/domainic/type/types/network/hostname_type.rb +107 -0
  18. data/lib/domainic/type/types/network/uri_type.rb +224 -0
  19. data/sig/domainic/type/behavior/string_behavior/matching_behavior.rbs +84 -0
  20. data/sig/domainic/type/behavior/string_behavior.rbs +2 -82
  21. data/sig/domainic/type/behavior/uri_behavior.rbs +95 -0
  22. data/sig/domainic/type/behavior.rbs +9 -0
  23. data/sig/domainic/type/definitions.rbs +149 -1
  24. data/sig/domainic/type/types/identifier/cuid_type.rbs +110 -0
  25. data/sig/domainic/type/types/identifier/uuid_type.rbs +469 -0
  26. data/sig/domainic/type/types/network/email_address_type.rbs +127 -0
  27. data/sig/domainic/type/types/network/hostname_type.rbs +76 -0
  28. data/sig/domainic/type/types/network/uri_type.rbs +159 -0
  29. metadata +20 -6
@@ -33,7 +33,7 @@ module Domainic
33
33
  include Behavior
34
34
  include Behavior::NumericBehavior
35
35
 
36
- intrinsic :self, :type, Float, abort_on_failure: true, description: :not_described
36
+ intrinsically_constrain :self, :type, Float, abort_on_failure: true, description: :not_described
37
37
  end
38
38
  end
39
39
  end
@@ -42,7 +42,7 @@ module Domainic
42
42
  include Behavior
43
43
  include Behavior::EnumerableBehavior
44
44
 
45
- intrinsic :self, :type, Hash, abort_on_failure: true, description: :not_described
45
+ intrinsically_constrain :self, :type, Hash, abort_on_failure: true, description: :not_described
46
46
 
47
47
  # Validate that the hash contains specific keys
48
48
  #
@@ -32,7 +32,7 @@ module Domainic
32
32
  include Behavior
33
33
  include Behavior::NumericBehavior
34
34
 
35
- intrinsic :self, :type, Integer, abort_on_failure: true, description: :not_described
35
+ intrinsically_constrain :self, :type, Integer, abort_on_failure: true, description: :not_described
36
36
  end
37
37
  end
38
38
  end
@@ -45,7 +45,7 @@ module Domainic
45
45
  include Behavior
46
46
  include Behavior::StringBehavior
47
47
 
48
- intrinsic :self, :type, String, abort_on_failure: true, description: :not_described
48
+ intrinsically_constrain :self, :type, String, abort_on_failure: true, description: :not_described
49
49
  end
50
50
  end
51
51
  end
@@ -45,7 +45,7 @@ module Domainic
45
45
  include Behavior
46
46
  include Behavior::StringBehavior
47
47
 
48
- intrinsic :self, :type, Symbol, abort_on_failure: true, description: :not_described
48
+ intrinsically_constrain :self, :type, Symbol, abort_on_failure: true, description: :not_described
49
49
  end
50
50
  end
51
51
  end
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'domainic/type/behavior'
4
+
5
+ module Domainic
6
+ module Type
7
+ # A type for validating CUIDs according to official specifications
8
+ #
9
+ # This type provides comprehensive CUID validation following the official
10
+ # CUID specifications. It supports both v1 and v2 formats, with proper
11
+ # format-specific validation.
12
+ #
13
+ # Key features:
14
+ # - CUID v1 validation (25 characters, c-prefix)
15
+ # - CUID v2 validation (variable length 14-24 chars)
16
+ # - Length validation
17
+ # - Character set validation
18
+ #
19
+ # @example Basic usage
20
+ # type = CUIDType.new
21
+ # type.validate("ch72gsb320000udocl363eofy") # => true
22
+ # type.validate("invalid") # => false
23
+ #
24
+ # @example With version constraints
25
+ # type = CUIDType.new.being_version(2)
26
+ # type.validate("clh3am1f30000udocbhqg4151") # => true
27
+ #
28
+ # @author {https://aaronmallen.me Aaron Allen}
29
+ # @since 0.1.0
30
+ class CUIDType
31
+ # @rbs! extend Behavior::ClassMethods
32
+
33
+ include Behavior
34
+
35
+ # Contains CUID validation regular expressions and version-specific modules
36
+ #
37
+ # This module provides validation patterns for both CUID v1 and v2 formats,
38
+ # following the official specification.
39
+ #
40
+ # @since 0.1.0
41
+ module CUID
42
+ # Regular expression for CUID v1 format
43
+ #
44
+ # Validates CUIDs in v1 format: c-prefix + 24 lowercase alphanumeric chars
45
+ # Example: "ch72gsb320000udocl363eofy"
46
+ #
47
+ # @since 0.1.0
48
+ V1_REGEXP = /\Ac[a-z0-9]{24}\z/ #: Regexp
49
+
50
+ # Regular expression for CUID v2 format
51
+ #
52
+ # Validates CUIDs in v2 format: k-p prefix + 13-23 lowercase alphanumeric chars
53
+ # Example: "clh3am1f30000udocbhqg4151"
54
+ #
55
+ # @since 0.1.0
56
+ V2_REGEXP = /\A[k-p][a-z0-9]{13,23}\z/ #: Regexp
57
+
58
+ # Regular expression for any valid CUID (v1 or v2)
59
+ ALL_REGEXP = Regexp.union(V1_REGEXP, V2_REGEXP) #: Regexp
60
+ end
61
+
62
+ # Core CUID constraints
63
+ intrinsically_constrain :self, :type, String, description: :not_described
64
+
65
+ # Accept either v1 or v2 format by default
66
+ intrinsically_constrain :self, :match_pattern, CUID::ALL_REGEXP,
67
+ description: 'CUID format', concerning: :format
68
+
69
+ # Length constraint covers both v1 (25 chars) and v2 (14-24 chars)
70
+ intrinsically_constrain :length, :range, { minimum: 14, maximum: 25 },
71
+ description: 'having', concerning: :size
72
+
73
+ # Constrain CUID to specific version
74
+ #
75
+ # Creates a constraint ensuring the CUID matches a specific version (1 or 2).
76
+ #
77
+ # @example
78
+ # type.being_version(1)
79
+ # type.validate("ch72gsb320000udocl363eofy") # => true
80
+ #
81
+ # @param version [Integer] CUID version (1 or 2)
82
+ # @return [self] self for method chaining
83
+ # @raise [ArgumentError] if version is neither 1 nor 2
84
+ # @rbs (Integer version) -> self
85
+ def being_version(version)
86
+ case version
87
+ when 1 then being_version_one
88
+ when 2 then being_version_two
89
+ else
90
+ raise ArgumentError, "Invalid version: #{version}. Must be 1 or 2"
91
+ end
92
+ end
93
+ alias version being_version
94
+
95
+ # Constrain CUID to Version 1
96
+ #
97
+ # Creates a constraint ensuring the CUID is a Version 1 CUID.
98
+ # Version 1 CUIDs are 25 characters long and start with 'c'.
99
+ #
100
+ # @example
101
+ # type.being_version_one
102
+ # type.validate("ch72gsb320000udocl363eofy") # => true
103
+ #
104
+ # @return [self] self for method chaining
105
+ # @rbs () -> self
106
+ def being_version_one
107
+ constrain :length, :range, { minimum: 25, maximum: 25 },
108
+ concerning: :size, description: 'having v1 length'
109
+ constrain :self, :match_pattern, CUID::V1_REGEXP,
110
+ description: 'v1 CUID format',
111
+ concerning: :version
112
+ end
113
+ alias being_v1 being_version_one
114
+ alias v1 being_version_one
115
+ alias version_one being_version_one
116
+
117
+ # Constrain CUID to Version 2
118
+ #
119
+ # Creates a constraint ensuring the CUID is a Version 2 CUID.
120
+ # Version 2 CUIDs are 14-24 characters and start with k-p.
121
+ #
122
+ # @example
123
+ # type.being_version_two
124
+ # type.validate("clh3am1f30000udocbhqg4151") # => true
125
+ #
126
+ # @return [self] self for method chaining
127
+ # @rbs () -> self
128
+ def being_version_two
129
+ constrain :length, :range, { minimum: 14, maximum: 24 },
130
+ concerning: :size, description: 'having v2 length'
131
+ constrain :self, :match_pattern, CUID::V2_REGEXP,
132
+ description: 'v2 CUID format',
133
+ concerning: :version
134
+ end
135
+ alias being_v2 being_version_two
136
+ alias v2 being_version_two
137
+ alias version_two being_version_two
138
+ end
139
+ end
140
+ end