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

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -86,6 +86,31 @@ module Domainic
86
86
 
87
87
  alias _Bool? _Boolean?
88
88
 
89
+ # Creates a CUIDType instance
90
+ #
91
+ # @example
92
+ # type = _CUID.v2
93
+ #
94
+ # @param options [Hash] additional configuration options
95
+ #
96
+ # @return [Domainic::Type::CUIDType] the created type
97
+ def _CUID: (**__todo__ options) -> CUIDType
98
+
99
+ alias _Cuid _CUID
100
+
101
+ # Creates a nilable CUIDType instance.
102
+ #
103
+ # @example
104
+ # _CUID? === "la6m1dv00000gv25zp9ru12g" # => true
105
+ # _CUID? === nil # => true
106
+ #
107
+ # @param options [Hash] additional configuration options
108
+ #
109
+ # @return [Domainic::Type::UnionType] the created type (CUIDType or NilClass)
110
+ def _CUID?: (**__todo__ options) -> UnionType
111
+
112
+ alias _Cuid? _CUID?
113
+
89
114
  # Creates a DuckType instance.
90
115
  #
91
116
  # DuckType allows specifying behavior based on method availability.
@@ -104,6 +129,33 @@ module Domainic
104
129
 
105
130
  alias _RespondingTo _Duck
106
131
 
132
+ # Creates an EmailAddressType instance.
133
+ #
134
+ # EmailAddressType restricts values to valid email addresses.
135
+ #
136
+ # @example
137
+ # type = _EmailAddress.having_hostname('example.com')
138
+ #
139
+ # @param options [Hash] additional configuration options
140
+ #
141
+ # @return [Domainic::Type::EmailAddressType] the created type
142
+ def _EmailAddress: (**__todo__ options) -> EmailAddressType
143
+
144
+ alias _Email _EmailAddress
145
+
146
+ # Creates a nilable EmailAddressType instance.
147
+ #
148
+ # @example
149
+ # _EmailAddress?.validate("user@example.com") # => true
150
+ # _EmailAddress?.validate(nil) # => true
151
+ #
152
+ # @param options [Hash] additional configuration options
153
+ #
154
+ # @return [Domainic::Type::UnionType] the created type (EmailAddress or NilClass)
155
+ def _EmailAddress?: (**__todo__ options) -> UnionType
156
+
157
+ alias _Email? _EmailAddress?
158
+
107
159
  # Creates an EnumType instance.
108
160
  #
109
161
  # EnumType restricts values to a specific set of literals.
@@ -184,6 +236,50 @@ module Domainic
184
236
 
185
237
  alias _Map? _Hash?
186
238
 
239
+ # Creates a HostnameType instance.
240
+ #
241
+ # HostnameType restricts values to valid hostnames.
242
+ #
243
+ # @example
244
+ # type = _Hostname.matching('example.com')
245
+ #
246
+ # @param options [Hash] additional configuration options
247
+ #
248
+ # @return [Domainic::Type::HostnameType] the created type
249
+ def _Hostname: (**__todo__ options) -> HostnameType
250
+
251
+ # Creates a nilable HostnameType instance.
252
+ #
253
+ # @example
254
+ # _Hostname?.validate("example.com") # => true
255
+ # _Hostname?.validate(nil) # => true
256
+ #
257
+ # @param options [Hash] additional configuration options
258
+ #
259
+ # @return [Domainic::Type::UnionType] the created type (Hostname or NilClass)
260
+ def _Hostname?: (**__todo__ options) -> UnionType
261
+
262
+ # Creates a UnionType of IntegerType, UUIDType, and CUIDType
263
+ #
264
+ # @example
265
+ # _ID === 1234567890 # => true
266
+ # _ID === '123e4567-e89b-42d3-a456-426614174000' # => true
267
+ # _ID === 'la6m1dv00000gv25zp9ru12g' # => true
268
+ #
269
+ # @return [Domainic::Type::UnionType] the created type
270
+ def _ID: () -> UnionType
271
+
272
+ # Creates a nilable UnionType of IntegerType, UUIDType, and CUIDType
273
+ #
274
+ # @example
275
+ # _ID === 1234567890 # => true
276
+ # _ID === '123e4567-e89b-42d3-a456-426614174000' # => true
277
+ # _ID === 'la6m1dv00000gv25zp9ru12g' # => true
278
+ # _ID === nil # => true
279
+ #
280
+ # @return [Domainic::Type::UnionType] the created type
281
+ def _ID?: () -> UnionType
282
+
187
283
  # Create an InstanceType instance.
188
284
  #
189
285
  # @example
@@ -203,7 +299,7 @@ module Domainic
203
299
  #
204
300
  # @param options [Hash] additional configuration options
205
301
  #
206
- # @return [Domainic::Type::UnionType] the created type (Integer or NilClass)
302
+ # @return [Domainic::Type::UnionType] the created type (InstanceType or NilClass)
207
303
  def _Instance?: (**__todo__ options) -> UnionType
208
304
 
209
305
  alias _Record? _Instance?
@@ -299,6 +395,31 @@ module Domainic
299
395
 
300
396
  alias _Interned? _Symbol?
301
397
 
398
+ # Creates a UUIDType instance
399
+ #
400
+ # @example
401
+ # type = _UUID.v4_compact
402
+ #
403
+ # @param options [Hash] additional configuration options
404
+ #
405
+ # @return [Domainic::Type::UUIDType] the created type
406
+ def _UUID: (**__todo__ options) -> UUIDType
407
+
408
+ alias _Uuid _UUID
409
+
410
+ # Creates a nilable UUIDType instance.
411
+ #
412
+ # @example
413
+ # _UUID? === '123e4567-e89b-42d3-a456-426614174000' # => true
414
+ # _UUID? === nil # => true
415
+ #
416
+ # @param options [Hash] additional configuration options
417
+ #
418
+ # @return [Domainic::Type::UnionType] the created type (UUIDType or NilClass)
419
+ def _UUID?: (**__todo__ options) -> UnionType
420
+
421
+ alias _Uuid? _UUID?
422
+
302
423
  # Creates a UnionType instance.
303
424
  #
304
425
  # Allows combining multiple types into a single union type.
@@ -314,6 +435,33 @@ module Domainic
314
435
 
315
436
  alias _Either _Union
316
437
 
438
+ # Creates a URIType instance.
439
+ #
440
+ # URIType restricts values to valid URIs.
441
+ #
442
+ # @example
443
+ # type = _URI.having_scheme('https')
444
+ #
445
+ # @param options [Hash] additional configuration options
446
+ #
447
+ # @return [Domainic::Type::URIType] the created type
448
+ def _Uri: (**__todo__ options) -> URIType
449
+
450
+ alias _Url _Uri
451
+
452
+ # Creates a nilable URIType instance.
453
+ #
454
+ # @example
455
+ # _Uri?.validate("https://example.com") # => true
456
+ # _Uri?.validate(nil) # => true
457
+ #
458
+ # @param options [Hash] additional configuration options
459
+ #
460
+ # @return [Domainic::Type::UnionType] the created type (URIType or NilClass)
461
+ def _Uri?: (**__todo__ options) -> UnionType
462
+
463
+ alias _Url? _Uri?
464
+
317
465
  # Creates a VoidType instance.
318
466
  #
319
467
  # Represents an operation that returns no value.
@@ -0,0 +1,110 @@
1
+ module Domainic
2
+ module Type
3
+ # A type for validating CUIDs according to official specifications
4
+ #
5
+ # This type provides comprehensive CUID validation following the official
6
+ # CUID specifications. It supports both v1 and v2 formats, with proper
7
+ # format-specific validation.
8
+ #
9
+ # Key features:
10
+ # - CUID v1 validation (25 characters, c-prefix)
11
+ # - CUID v2 validation (variable length 14-24 chars)
12
+ # - Length validation
13
+ # - Character set validation
14
+ #
15
+ # @example Basic usage
16
+ # type = CUIDType.new
17
+ # type.validate("ch72gsb320000udocl363eofy") # => true
18
+ # type.validate("invalid") # => false
19
+ #
20
+ # @example With version constraints
21
+ # type = CUIDType.new.being_version(2)
22
+ # type.validate("clh3am1f30000udocbhqg4151") # => true
23
+ #
24
+ # @author {https://aaronmallen.me Aaron Allen}
25
+ # @since 0.1.0
26
+ class CUIDType
27
+ extend Behavior::ClassMethods
28
+
29
+ include Behavior
30
+
31
+ # Contains CUID validation regular expressions and version-specific modules
32
+ #
33
+ # This module provides validation patterns for both CUID v1 and v2 formats,
34
+ # following the official specification.
35
+ #
36
+ # @since 0.1.0
37
+ module CUID
38
+ # Regular expression for CUID v1 format
39
+ #
40
+ # Validates CUIDs in v1 format: c-prefix + 24 lowercase alphanumeric chars
41
+ # Example: "ch72gsb320000udocl363eofy"
42
+ #
43
+ # @since 0.1.0
44
+ V1_REGEXP: Regexp
45
+
46
+ # Regular expression for CUID v2 format
47
+ #
48
+ # Validates CUIDs in v2 format: k-p prefix + 13-23 lowercase alphanumeric chars
49
+ # Example: "clh3am1f30000udocbhqg4151"
50
+ #
51
+ # @since 0.1.0
52
+ V2_REGEXP: Regexp
53
+
54
+ # Regular expression for any valid CUID (v1 or v2)
55
+ ALL_REGEXP: Regexp
56
+ end
57
+
58
+ # Constrain CUID to specific version
59
+ #
60
+ # Creates a constraint ensuring the CUID matches a specific version (1 or 2).
61
+ #
62
+ # @example
63
+ # type.being_version(1)
64
+ # type.validate("ch72gsb320000udocl363eofy") # => true
65
+ #
66
+ # @param version [Integer] CUID version (1 or 2)
67
+ # @return [self] self for method chaining
68
+ # @raise [ArgumentError] if version is neither 1 nor 2
69
+ def being_version: (Integer version) -> self
70
+
71
+ alias version being_version
72
+
73
+ # Constrain CUID to Version 1
74
+ #
75
+ # Creates a constraint ensuring the CUID is a Version 1 CUID.
76
+ # Version 1 CUIDs are 25 characters long and start with 'c'.
77
+ #
78
+ # @example
79
+ # type.being_version_one
80
+ # type.validate("ch72gsb320000udocl363eofy") # => true
81
+ #
82
+ # @return [self] self for method chaining
83
+ def being_version_one: () -> self
84
+
85
+ alias being_v1 being_version_one
86
+
87
+ alias v1 being_version_one
88
+
89
+ alias version_one being_version_one
90
+
91
+ # Constrain CUID to Version 2
92
+ #
93
+ # Creates a constraint ensuring the CUID is a Version 2 CUID.
94
+ # Version 2 CUIDs are 14-24 characters and start with k-p.
95
+ #
96
+ # @example
97
+ # type.being_version_two
98
+ # type.validate("clh3am1f30000udocbhqg4151") # => true
99
+ #
100
+ # @return [self] self for method chaining
101
+ def being_version_two: () -> self
102
+
103
+ alias being_v2 being_version_two
104
+
105
+ alias v2 being_version_two
106
+
107
+ alias version_two being_version_two
108
+ end
109
+ end
110
+ end