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.
- checksums.yaml +4 -4
- data/lib/domainic/type/behavior/string_behavior/matching_behavior.rb +115 -0
- data/lib/domainic/type/behavior/string_behavior.rb +2 -111
- data/lib/domainic/type/behavior/uri_behavior.rb +97 -0
- data/lib/domainic/type/behavior.rb +21 -1
- data/lib/domainic/type/config/registry.yml +15 -0
- data/lib/domainic/type/definitions.rb +182 -1
- data/lib/domainic/type/types/core/array_type.rb +1 -1
- data/lib/domainic/type/types/core/float_type.rb +1 -1
- data/lib/domainic/type/types/core/hash_type.rb +1 -1
- data/lib/domainic/type/types/core/integer_type.rb +1 -1
- data/lib/domainic/type/types/core/string_type.rb +1 -1
- data/lib/domainic/type/types/core/symbol_type.rb +1 -1
- data/lib/domainic/type/types/identifier/cuid_type.rb +140 -0
- data/lib/domainic/type/types/identifier/uuid_type.rb +513 -0
- data/lib/domainic/type/types/network/email_address_type.rb +149 -0
- data/lib/domainic/type/types/network/hostname_type.rb +107 -0
- data/lib/domainic/type/types/network/uri_type.rb +224 -0
- data/sig/domainic/type/behavior/string_behavior/matching_behavior.rbs +84 -0
- data/sig/domainic/type/behavior/string_behavior.rbs +2 -82
- data/sig/domainic/type/behavior/uri_behavior.rbs +95 -0
- data/sig/domainic/type/behavior.rbs +9 -0
- data/sig/domainic/type/definitions.rbs +149 -1
- data/sig/domainic/type/types/identifier/cuid_type.rbs +110 -0
- data/sig/domainic/type/types/identifier/uuid_type.rbs +469 -0
- data/sig/domainic/type/types/network/email_address_type.rbs +127 -0
- data/sig/domainic/type/types/network/hostname_type.rbs +76 -0
- data/sig/domainic/type/types/network/uri_type.rbs +159 -0
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba2ef6a6a8d06966d736c794476322b088878573154468dc55de61a85704f459
|
4
|
+
data.tar.gz: 8f7fcb77831968e9f6f4f42c58bc2f63892b56bae35902aec892932dc5425acc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fbe93a49fd3d0063c7d9e392cc1e99180cbdfacb3a1a355c813eaa3df5f476be03e6c44b265871bdea82c646c250b5f486b4446f8c0ce2efbc4481c778d5553
|
7
|
+
data.tar.gz: 2509ae814a1dbb07a2100c24fe0aff90b8c59123f41d8b37a90bce60c9ad33fe1ecd9d57562533e3f7c52f5c051c27120136d1d7f1efe1df4714212281663827
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Domainic
|
4
|
+
module Type
|
5
|
+
module Behavior
|
6
|
+
module StringBehavior
|
7
|
+
# A module providing string matching constraint methods
|
8
|
+
#
|
9
|
+
# This module extends types with methods for constraining string values based on
|
10
|
+
# equality, pattern matching, and substring inclusion/exclusion. It provides a
|
11
|
+
# fluent interface for building complex string matching constraints.
|
12
|
+
#
|
13
|
+
# @example Basic equality constraints
|
14
|
+
# type = StringType.new
|
15
|
+
# .being_equal_to("expected")
|
16
|
+
# .not_being_equal_to("forbidden")
|
17
|
+
#
|
18
|
+
# @example Pattern matching constraints
|
19
|
+
# type = StringType.new
|
20
|
+
# .matching(/^\w+$/, /[0-9]/)
|
21
|
+
# .not_matching(/admin/i)
|
22
|
+
#
|
23
|
+
# @example Substring constraints
|
24
|
+
# type = StringType.new
|
25
|
+
# .containing("allowed", "required")
|
26
|
+
# .excluding("forbidden", "blocked")
|
27
|
+
#
|
28
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
29
|
+
# @since 0.1.0
|
30
|
+
module MatchingBehavior
|
31
|
+
# Constrain string to equal a specific value
|
32
|
+
#
|
33
|
+
# @param literal [String, Symbol] the value to match against
|
34
|
+
# @return [Behavior] self for method chaining
|
35
|
+
# @rbs (String | Symbol literal) -> Behavior
|
36
|
+
def being_equal_to(literal)
|
37
|
+
# @type self: Object & Behavior
|
38
|
+
constrain :self, :equality, literal, description: 'equaling'
|
39
|
+
end
|
40
|
+
alias eql being_equal_to
|
41
|
+
alias equal_to being_equal_to
|
42
|
+
alias equaling being_equal_to
|
43
|
+
|
44
|
+
# Constrain string to contain specific substrings
|
45
|
+
#
|
46
|
+
# @param literals [Array<String, Symbol>] the required substrings
|
47
|
+
# @return [Behavior] self for method chaining
|
48
|
+
# @rbs (*String | Symbol literals) -> Behavior
|
49
|
+
def containing(*literals)
|
50
|
+
# @type self: Object & Behavior
|
51
|
+
including = literals.map do |literal|
|
52
|
+
@constraints.prepare :self, :inclusion, literal, coerce_with: lambda(&:to_s)
|
53
|
+
end
|
54
|
+
constrain :self, :and, including, concerning: :inclusion
|
55
|
+
end
|
56
|
+
alias including containing
|
57
|
+
|
58
|
+
# Constrain string to exclude specific substrings
|
59
|
+
#
|
60
|
+
# @param literals [Array<String, Symbol>] the forbidden substrings
|
61
|
+
# @return [Behavior] self for method chaining
|
62
|
+
# @rbs (*String | Symbol literals) -> Behavior
|
63
|
+
def excluding(*literals)
|
64
|
+
# @type self: Object & Behavior
|
65
|
+
including = literals.map do |literal|
|
66
|
+
@constraints.prepare :self, :inclusion, literal, coerce_with: lambda(&:to_s)
|
67
|
+
end
|
68
|
+
constrain :self, :nor, including, concerning: :exclusion
|
69
|
+
end
|
70
|
+
alias omitting excluding
|
71
|
+
|
72
|
+
# Constrain string to match specific patterns
|
73
|
+
#
|
74
|
+
# @param patterns [Array<String, Regexp>] the required patterns
|
75
|
+
# @return [Behavior] self for method chaining
|
76
|
+
# @rbs (*String | Regexp patterns) -> Behavior
|
77
|
+
def matching(*patterns)
|
78
|
+
# @type self: Object & Behavior
|
79
|
+
matching_patterns = patterns.map do |pattern|
|
80
|
+
@constraints.prepare :self, :match_pattern, pattern
|
81
|
+
end
|
82
|
+
constrain :self, :and, matching_patterns, concerning: :pattern_inclusion
|
83
|
+
end
|
84
|
+
|
85
|
+
# Constrain string to not equal a specific value
|
86
|
+
#
|
87
|
+
# @param literal [String, Symbol] the forbidden value
|
88
|
+
# @return [Behavior] self for method chaining
|
89
|
+
# @rbs (String | Symbol literal) -> Behavior
|
90
|
+
def not_being_equal_to(literal)
|
91
|
+
# @type self: Object & Behavior
|
92
|
+
equal_to = @constraints.prepare :self, :equality, literal
|
93
|
+
constrain :self, :not, equal_to, concerning: :equality, description: 'being'
|
94
|
+
end
|
95
|
+
alias not_eql not_being_equal_to
|
96
|
+
alias not_equal_to not_being_equal_to
|
97
|
+
alias not_equaling not_being_equal_to
|
98
|
+
|
99
|
+
# Constrain string to not match specific patterns
|
100
|
+
#
|
101
|
+
# @param patterns [Array<String, Regexp>] the forbidden patterns
|
102
|
+
# @return [Behavior] self for method chaining
|
103
|
+
# @rbs (*String | Regexp patterns) -> Behavior
|
104
|
+
def not_matching(*patterns)
|
105
|
+
# @type self: Object & Behavior
|
106
|
+
matching_patterns = patterns.map do |pattern|
|
107
|
+
@constraints.prepare :self, :match_pattern, pattern
|
108
|
+
end
|
109
|
+
constrain :self, :nor, matching_patterns, concerning: :pattern_exclusion
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'domainic/type/behavior/string_behavior/matching_behavior'
|
3
4
|
require 'domainic/type/behavior/sizable_behavior'
|
4
5
|
|
5
6
|
module Domainic
|
@@ -54,6 +55,7 @@ module Domainic
|
|
54
55
|
# @author {https://aaronmallen.me Aaron Allen}
|
55
56
|
# @since 0.1.0
|
56
57
|
module StringBehavior
|
58
|
+
include MatchingBehavior
|
57
59
|
include SizableBehavior
|
58
60
|
|
59
61
|
# Validate string contains only alphanumeric characters.
|
@@ -102,24 +104,6 @@ module Domainic
|
|
102
104
|
end
|
103
105
|
alias empty being_empty
|
104
106
|
|
105
|
-
# Validate string equals a specific value.
|
106
|
-
#
|
107
|
-
# @example
|
108
|
-
# type.being_equal_to("hello")
|
109
|
-
# type.validate("hello") # => true
|
110
|
-
# type.validate("world") # => false
|
111
|
-
#
|
112
|
-
# @param literal [String, Symbol] the value to compare against
|
113
|
-
# @return [Behavior] self for method chaining
|
114
|
-
# @rbs (String | Symbol literal) -> Behavior
|
115
|
-
def being_equal_to(literal)
|
116
|
-
# @type self: Object & Behavior
|
117
|
-
constrain :self, :equality, literal, description: 'equaling'
|
118
|
-
end
|
119
|
-
alias eql being_equal_to
|
120
|
-
alias equal_to being_equal_to
|
121
|
-
alias equaling being_equal_to
|
122
|
-
|
123
107
|
# Validate string is lowercase.
|
124
108
|
#
|
125
109
|
# @example
|
@@ -266,62 +250,6 @@ module Domainic
|
|
266
250
|
alias not_being_lowercase being_uppercase
|
267
251
|
alias uppercase being_uppercase
|
268
252
|
|
269
|
-
# Validate string contains all specified substrings.
|
270
|
-
#
|
271
|
-
# @example
|
272
|
-
# type.containing("hello", "world")
|
273
|
-
# type.validate("hello world") # => true
|
274
|
-
# type.validate("hello") # => false
|
275
|
-
#
|
276
|
-
# @param literals [Array<String, Symbol>] the substrings to look for
|
277
|
-
# @return [Behavior] self for method chaining
|
278
|
-
# @rbs (*String | Symbol literals) -> Behavior
|
279
|
-
def containing(*literals)
|
280
|
-
# @type self: Object & Behavior
|
281
|
-
including = literals.map do |literal|
|
282
|
-
@constraints.prepare :self, :inclusion, literal, coerce_with: lambda(&:to_s)
|
283
|
-
end
|
284
|
-
constrain :self, :and, including, concerning: :inclusion
|
285
|
-
end
|
286
|
-
alias including containing
|
287
|
-
|
288
|
-
# Validate string does not contain any specified substrings.
|
289
|
-
#
|
290
|
-
# @example
|
291
|
-
# type.excluding("foo", "bar")
|
292
|
-
# type.validate("hello world") # => true
|
293
|
-
# type.validate("foo bar") # => false
|
294
|
-
#
|
295
|
-
# @param literals [Array<String, Symbol>] the substrings to exclude
|
296
|
-
# @return [Behavior] self for method chaining
|
297
|
-
# @rbs (*String | Symbol literals) -> Behavior
|
298
|
-
def excluding(*literals)
|
299
|
-
# @type self: Object & Behavior
|
300
|
-
including = literals.map do |literal|
|
301
|
-
@constraints.prepare :self, :inclusion, literal, coerce_with: lambda(&:to_s)
|
302
|
-
end
|
303
|
-
constrain :self, :nor, including, concerning: :exclusion
|
304
|
-
end
|
305
|
-
alias omitting excluding
|
306
|
-
|
307
|
-
# Validate string matches all specified patterns.
|
308
|
-
#
|
309
|
-
# @example
|
310
|
-
# type.matching(/^\w+$/, /\d/)
|
311
|
-
# type.validate("hello123") # => true
|
312
|
-
# type.validate("hello") # => false
|
313
|
-
#
|
314
|
-
# @param patterns [Array<String, Regexp>] the patterns to match against
|
315
|
-
# @return [Behavior] self for method chaining
|
316
|
-
# @rbs (*String | Regexp patterns) -> Behavior
|
317
|
-
def matching(*patterns)
|
318
|
-
# @type self: Object & Behavior
|
319
|
-
matching_patterns = patterns.map do |pattern|
|
320
|
-
@constraints.prepare :self, :match_pattern, pattern
|
321
|
-
end
|
322
|
-
constrain :self, :and, matching_patterns, concerning: :pattern_inclusion
|
323
|
-
end
|
324
|
-
|
325
253
|
# Validate string is not empty.
|
326
254
|
#
|
327
255
|
# @example
|
@@ -336,43 +264,6 @@ module Domainic
|
|
336
264
|
empty = @constraints.prepare :self, :emptiness
|
337
265
|
constrain :self, :not, empty, concerning: :emptiness, description: 'being'
|
338
266
|
end
|
339
|
-
|
340
|
-
# Validate string does not equal a specific value.
|
341
|
-
#
|
342
|
-
# @example
|
343
|
-
# type.not_being_equal_to("admin")
|
344
|
-
# type.validate("user") # => true
|
345
|
-
# type.validate("admin") # => false
|
346
|
-
#
|
347
|
-
# @param literal [String, Symbol] the value to compare against
|
348
|
-
# @return [Behavior] self for method chaining
|
349
|
-
# @rbs (String | Symbol literal) -> Behavior
|
350
|
-
def not_being_equal_to(literal)
|
351
|
-
# @type self: Object & Behavior
|
352
|
-
equal_to = @constraints.prepare :self, :equality, literal
|
353
|
-
constrain :self, :not, equal_to, concerning: :equality, description: 'being'
|
354
|
-
end
|
355
|
-
alias not_eql not_being_equal_to
|
356
|
-
alias not_equal_to not_being_equal_to
|
357
|
-
alias not_equaling not_being_equal_to
|
358
|
-
|
359
|
-
# Validate string does not match any specified patterns.
|
360
|
-
#
|
361
|
-
# @example
|
362
|
-
# type.not_matching(/\d/, /[A-Z]/)
|
363
|
-
# type.validate("hello") # => true
|
364
|
-
# type.validate("Hello123") # => false
|
365
|
-
#
|
366
|
-
# @param patterns [Array<String, Regexp>] the patterns to avoid matching
|
367
|
-
# @return [Behavior] self for method chaining
|
368
|
-
# @rbs (*String | Regexp patterns) -> Behavior
|
369
|
-
def not_matching(*patterns)
|
370
|
-
# @type self: Object & Behavior
|
371
|
-
matching_patterns = patterns.map do |pattern|
|
372
|
-
@constraints.prepare :self, :match_pattern, pattern
|
373
|
-
end
|
374
|
-
constrain :self, :nor, matching_patterns, concerning: :pattern_exclusion
|
375
|
-
end
|
376
267
|
end
|
377
268
|
end
|
378
269
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Domainic
|
4
|
+
module Type
|
5
|
+
module Behavior
|
6
|
+
# A module providing URI-based validation behaviors for types.
|
7
|
+
#
|
8
|
+
# This module extends the base Type::Behavior with methods designed for validating URI-related constraints.
|
9
|
+
# It focuses on ensuring URIs conform to specific rules, such as restricting or excluding particular
|
10
|
+
# top-level domains (TLDs). These features are useful for scenarios like domain-specific validations
|
11
|
+
# or blocking specific domain extensions.
|
12
|
+
#
|
13
|
+
# Key features:
|
14
|
+
# - Top-level domain inclusion constraints
|
15
|
+
# - Top-level domain exclusion constraints
|
16
|
+
# - Flexible and customizable pattern matching
|
17
|
+
# - Consistent interface for defining URI-related constraints
|
18
|
+
#
|
19
|
+
# @example Basic usage
|
20
|
+
# class MyType
|
21
|
+
# include Domainic::Type::Behavior::URIBehavior
|
22
|
+
#
|
23
|
+
# def initialize
|
24
|
+
# super
|
25
|
+
# having_top_level_domain("com", "org") # Allow only .com and .org
|
26
|
+
# not_having_top_level_domain("test", "dev") # Exclude .test and .dev
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# @example Method aliases
|
31
|
+
# type.having_top_level_domain("com") # Allow only .com
|
32
|
+
# type.tld("com") # Same as above
|
33
|
+
# type.with_tld("com") # Same as above
|
34
|
+
#
|
35
|
+
# type.not_having_top_level_domain("test") # Exclude .test
|
36
|
+
# type.not_tld("test") # Same as above
|
37
|
+
# type.not_top_level_domain("test") # Same as above
|
38
|
+
#
|
39
|
+
# This module provides a consistent interface for working with URIs, ensuring flexibility and
|
40
|
+
# extensibility for domain and TLD validation tasks.
|
41
|
+
#
|
42
|
+
# @author {https://aaronmallen.me Aaron Allen}
|
43
|
+
# @since 0.1.0
|
44
|
+
module URIBehavior
|
45
|
+
# Constrain URIBehavior to allowed top-level domains
|
46
|
+
#
|
47
|
+
# Creates a constraint ensuring the URIBehavior uses one of the specified top-level
|
48
|
+
# domains (TLDs). This allows restricting emails to specific TLDs like .com or .org.
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# type.having_top_level_domain("com", "org")
|
52
|
+
# type.validate("example.com") # => true
|
53
|
+
# type.validate("example.net") # => false
|
54
|
+
#
|
55
|
+
# @param top_level_domains [Array<String>] List of allowed TLDs
|
56
|
+
# @return [self] self for method chaining
|
57
|
+
# @rbs (*String top_level_domains) -> Behavior
|
58
|
+
def having_top_level_domain(*top_level_domains)
|
59
|
+
pattern = /\.(#{top_level_domains.map { |t| Regexp.escape(t) }.join('|')})\z/i
|
60
|
+
# @type self: Object & Behavior
|
61
|
+
constrain :self, :match_pattern, pattern, concerning: :top_level_domain_inclusion
|
62
|
+
end
|
63
|
+
alias allowing_tld having_top_level_domain
|
64
|
+
alias allowing_top_level_domain having_top_level_domain
|
65
|
+
alias having_tld having_top_level_domain
|
66
|
+
alias tld having_top_level_domain
|
67
|
+
alias with_tld having_top_level_domain
|
68
|
+
alias with_top_level_domain having_top_level_domain
|
69
|
+
|
70
|
+
# Constrain URIBehavior to exclude specific top-level domains
|
71
|
+
#
|
72
|
+
# Creates a constraint ensuring the email does not use any of the specified
|
73
|
+
# top-level domains (TLDs). Useful for blocking certain TLDs.
|
74
|
+
#
|
75
|
+
# @example
|
76
|
+
# type.not_having_top_level_domain("test")
|
77
|
+
# type.validate("example.com") # => true
|
78
|
+
# type.validate("example.test") # => false
|
79
|
+
#
|
80
|
+
# @param top_level_domains [Array<String>] List of forbidden TLDs
|
81
|
+
# @return [self] self for method chaining
|
82
|
+
# @rbs (*String top_level_domains) -> Behavior
|
83
|
+
def not_having_top_level_domain(*top_level_domains)
|
84
|
+
pattern = /\.(#{top_level_domains.map { |t| Regexp.escape(t) }.join('|')})\z/i
|
85
|
+
top_level_domains = @constraints.prepare :self, :match_pattern, pattern
|
86
|
+
# @type self: Object & Behavior
|
87
|
+
constrain :self, :not, top_level_domains, concerning: :top_level_domain_exclusion
|
88
|
+
end
|
89
|
+
alias forbidding_tld not_having_top_level_domain
|
90
|
+
alias forbidding_top_level_domain not_having_top_level_domain
|
91
|
+
alias not_having_tld not_having_top_level_domain
|
92
|
+
alias not_tld not_having_top_level_domain
|
93
|
+
alias not_top_level_domain not_having_top_level_domain
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -105,6 +105,8 @@ module Domainic
|
|
105
105
|
#
|
106
106
|
# @see Constraint::Set#add
|
107
107
|
#
|
108
|
+
# @deprecated Use {#intrinsically_constrain} instead
|
109
|
+
#
|
108
110
|
# @return [void]
|
109
111
|
# @rbs (
|
110
112
|
# Type::accessor accessor,
|
@@ -113,7 +115,10 @@ module Domainic
|
|
113
115
|
# **untyped options
|
114
116
|
# ) -> void
|
115
117
|
def intrinsic(...)
|
116
|
-
|
118
|
+
warn 'Domainic::Type::Behavior.intrinsic is deprecated and will be remove in a future release. Use ' \
|
119
|
+
"Domainic::Type::Behavior.intrinsically_constrain instead.\n" \
|
120
|
+
"Called from: #{caller_locations(1..1)&.first}"
|
121
|
+
intrinsically_constrain(...)
|
117
122
|
end
|
118
123
|
|
119
124
|
# Get the set of intrinsic constraints for this type.
|
@@ -124,6 +129,21 @@ module Domainic
|
|
124
129
|
@intrinsic_constraints ||= Constraint::Set.new
|
125
130
|
end
|
126
131
|
|
132
|
+
# Add an intrinsic constraint to this type.
|
133
|
+
#
|
134
|
+
# @see Constraint::Set#add
|
135
|
+
#
|
136
|
+
# @return [void]
|
137
|
+
# @rbs (
|
138
|
+
# Type::accessor accessor,
|
139
|
+
# String | Symbol constraint_type,
|
140
|
+
# ?untyped expectation,
|
141
|
+
# **untyped options
|
142
|
+
# ) -> void
|
143
|
+
def intrinsically_constrain(...)
|
144
|
+
intrinsic_constraints.add(...)
|
145
|
+
end
|
146
|
+
|
127
147
|
# Delegate unknown methods to a new instance.
|
128
148
|
#
|
129
149
|
# @return [Object] The result of calling the method on a new instance
|
@@ -78,9 +78,15 @@ types:
|
|
78
78
|
anything:
|
79
79
|
constant: Domainic::Type::AnythingType
|
80
80
|
require_path: domainic/type/types/specification/anything_type
|
81
|
+
cuid:
|
82
|
+
constant: Domainic::Type::CUIDType
|
83
|
+
require_path: domainic/type/types/identifier/cuid_type
|
81
84
|
duck:
|
82
85
|
constant: Domainic::Type::DuckType
|
83
86
|
require_path: domainic/type/types/specification/duck_type
|
87
|
+
email_address:
|
88
|
+
constant: Domainic::Type::EmailAddressType
|
89
|
+
require_path: domainic/type/types/network/email_address_type
|
84
90
|
enum:
|
85
91
|
constant: Domainic::Type::EnumType
|
86
92
|
require_path: domainic/type/types/specification/enum_type
|
@@ -90,6 +96,9 @@ types:
|
|
90
96
|
hash:
|
91
97
|
constant: Domainic::Type::HashType
|
92
98
|
require_path: domainic/type/types/core/hash_type
|
99
|
+
hostname:
|
100
|
+
constant: Domainic::Type::HostnameType
|
101
|
+
require_path: domainic/type/types/network/hostname_type
|
93
102
|
instance_type:
|
94
103
|
constant: Domainic::Type::InstanceType
|
95
104
|
require_path: domainic/type/types/specialized/instance_type
|
@@ -105,6 +114,12 @@ types:
|
|
105
114
|
union:
|
106
115
|
constant: Domainic::Type::UnionType
|
107
116
|
require_path: domainic/type/types/specification/union_type
|
117
|
+
uri:
|
118
|
+
constant: Domainic::Type::URIType
|
119
|
+
require_path: domainic/type/types/network/uri_type
|
120
|
+
uuid:
|
121
|
+
constant: Domainic::Type::UUIDType
|
122
|
+
require_path: domainic/type/types/identifier/uuid_type
|
108
123
|
void:
|
109
124
|
constant: Domainic::Type::VoidType
|
110
125
|
require_path: domainic/type/types/specification/void_type
|
@@ -103,6 +103,36 @@ module Domainic
|
|
103
103
|
end
|
104
104
|
alias _Bool? _Boolean?
|
105
105
|
|
106
|
+
# Creates a CUIDType instance
|
107
|
+
#
|
108
|
+
# @example
|
109
|
+
# type = _CUID.v2
|
110
|
+
#
|
111
|
+
# @param options [Hash] additional configuration options
|
112
|
+
#
|
113
|
+
# @return [Domainic::Type::CUIDType] the created type
|
114
|
+
# @rbs (**__todo__ options) -> CUIDType
|
115
|
+
def _CUID(**options)
|
116
|
+
require 'domainic/type/types/identifier/cuid_type'
|
117
|
+
Domainic::Type::CUIDType.new(**options)
|
118
|
+
end
|
119
|
+
alias _Cuid _CUID
|
120
|
+
|
121
|
+
# Creates a nilable CUIDType instance.
|
122
|
+
#
|
123
|
+
# @example
|
124
|
+
# _CUID? === "la6m1dv00000gv25zp9ru12g" # => true
|
125
|
+
# _CUID? === nil # => true
|
126
|
+
#
|
127
|
+
# @param options [Hash] additional configuration options
|
128
|
+
#
|
129
|
+
# @return [Domainic::Type::UnionType] the created type (CUIDType or NilClass)
|
130
|
+
# @rbs (**__todo__ options) -> UnionType
|
131
|
+
def _CUID?(**options)
|
132
|
+
_Nilable(_CUID(**options))
|
133
|
+
end
|
134
|
+
alias _Cuid? _CUID?
|
135
|
+
|
106
136
|
# Creates a DuckType instance.
|
107
137
|
#
|
108
138
|
# DuckType allows specifying behavior based on method availability.
|
@@ -122,6 +152,38 @@ module Domainic
|
|
122
152
|
alias _Protocol _Duck
|
123
153
|
alias _RespondingTo _Duck
|
124
154
|
|
155
|
+
# Creates an EmailAddressType instance.
|
156
|
+
#
|
157
|
+
# EmailAddressType restricts values to valid email addresses.
|
158
|
+
#
|
159
|
+
# @example
|
160
|
+
# type = _EmailAddress.having_hostname('example.com')
|
161
|
+
#
|
162
|
+
# @param options [Hash] additional configuration options
|
163
|
+
#
|
164
|
+
# @return [Domainic::Type::EmailAddressType] the created type
|
165
|
+
# @rbs (**__todo__ options) -> EmailAddressType
|
166
|
+
def _EmailAddress(**options)
|
167
|
+
require 'domainic/type/types/network/email_address_type'
|
168
|
+
Domainic::Type::EmailAddressType.new(**options)
|
169
|
+
end
|
170
|
+
alias _Email _EmailAddress
|
171
|
+
|
172
|
+
# Creates a nilable EmailAddressType instance.
|
173
|
+
#
|
174
|
+
# @example
|
175
|
+
# _EmailAddress?.validate("user@example.com") # => true
|
176
|
+
# _EmailAddress?.validate(nil) # => true
|
177
|
+
#
|
178
|
+
# @param options [Hash] additional configuration options
|
179
|
+
#
|
180
|
+
# @return [Domainic::Type::UnionType] the created type (EmailAddress or NilClass)
|
181
|
+
# @rbs (**__todo__ options) -> UnionType
|
182
|
+
def _EmailAddress?(**options)
|
183
|
+
_Nilable(_EmailAddress(**options))
|
184
|
+
end
|
185
|
+
alias _Email? _EmailAddress?
|
186
|
+
|
125
187
|
# Creates an EnumType instance.
|
126
188
|
#
|
127
189
|
# EnumType restricts values to a specific set of literals.
|
@@ -218,6 +280,63 @@ module Domainic
|
|
218
280
|
end
|
219
281
|
alias _Map? _Hash?
|
220
282
|
|
283
|
+
# Creates a HostnameType instance.
|
284
|
+
#
|
285
|
+
# HostnameType restricts values to valid hostnames.
|
286
|
+
#
|
287
|
+
# @example
|
288
|
+
# type = _Hostname.matching('example.com')
|
289
|
+
#
|
290
|
+
# @param options [Hash] additional configuration options
|
291
|
+
#
|
292
|
+
# @return [Domainic::Type::HostnameType] the created type
|
293
|
+
# @rbs (**__todo__ options) -> HostnameType
|
294
|
+
def _Hostname(**options)
|
295
|
+
require 'domainic/type/types/network/hostname_type'
|
296
|
+
Domainic::Type::HostnameType.new(**options)
|
297
|
+
end
|
298
|
+
|
299
|
+
# Creates a nilable HostnameType instance.
|
300
|
+
#
|
301
|
+
# @example
|
302
|
+
# _Hostname?.validate("example.com") # => true
|
303
|
+
# _Hostname?.validate(nil) # => true
|
304
|
+
#
|
305
|
+
# @param options [Hash] additional configuration options
|
306
|
+
#
|
307
|
+
# @return [Domainic::Type::UnionType] the created type (Hostname or NilClass)
|
308
|
+
# @rbs (**__todo__ options) -> UnionType
|
309
|
+
def _Hostname?(**options)
|
310
|
+
_Nilable(_Hostname(**options))
|
311
|
+
end
|
312
|
+
|
313
|
+
# Creates a UnionType of IntegerType, UUIDType, and CUIDType
|
314
|
+
#
|
315
|
+
# @example
|
316
|
+
# _ID === 1234567890 # => true
|
317
|
+
# _ID === '123e4567-e89b-42d3-a456-426614174000' # => true
|
318
|
+
# _ID === 'la6m1dv00000gv25zp9ru12g' # => true
|
319
|
+
#
|
320
|
+
# @return [Domainic::Type::UnionType] the created type
|
321
|
+
# @rbs () -> UnionType
|
322
|
+
def _ID
|
323
|
+
_Union(_Integer, _UUID, _CUID)
|
324
|
+
end
|
325
|
+
|
326
|
+
# Creates a nilable UnionType of IntegerType, UUIDType, and CUIDType
|
327
|
+
#
|
328
|
+
# @example
|
329
|
+
# _ID === 1234567890 # => true
|
330
|
+
# _ID === '123e4567-e89b-42d3-a456-426614174000' # => true
|
331
|
+
# _ID === 'la6m1dv00000gv25zp9ru12g' # => true
|
332
|
+
# _ID === nil # => true
|
333
|
+
#
|
334
|
+
# @return [Domainic::Type::UnionType] the created type
|
335
|
+
# @rbs () -> UnionType
|
336
|
+
def _ID?
|
337
|
+
_Nilable(_ID)
|
338
|
+
end
|
339
|
+
|
221
340
|
# Create an InstanceType instance.
|
222
341
|
#
|
223
342
|
# @example
|
@@ -240,7 +359,7 @@ module Domainic
|
|
240
359
|
#
|
241
360
|
# @param options [Hash] additional configuration options
|
242
361
|
#
|
243
|
-
# @return [Domainic::Type::UnionType] the created type (
|
362
|
+
# @return [Domainic::Type::UnionType] the created type (InstanceType or NilClass)
|
244
363
|
# @rbs (**__todo__ options) -> UnionType
|
245
364
|
def _Instance?(**options)
|
246
365
|
_Nilable(_Instance(**options))
|
@@ -356,6 +475,36 @@ module Domainic
|
|
356
475
|
end
|
357
476
|
alias _Interned? _Symbol?
|
358
477
|
|
478
|
+
# Creates a UUIDType instance
|
479
|
+
#
|
480
|
+
# @example
|
481
|
+
# type = _UUID.v4_compact
|
482
|
+
#
|
483
|
+
# @param options [Hash] additional configuration options
|
484
|
+
#
|
485
|
+
# @return [Domainic::Type::UUIDType] the created type
|
486
|
+
# @rbs (**__todo__ options) -> UUIDType
|
487
|
+
def _UUID(**options)
|
488
|
+
require 'domainic/type/types/identifier/uuid_type'
|
489
|
+
Domainic::Type::UUIDType.new(**options)
|
490
|
+
end
|
491
|
+
alias _Uuid _UUID
|
492
|
+
|
493
|
+
# Creates a nilable UUIDType instance.
|
494
|
+
#
|
495
|
+
# @example
|
496
|
+
# _UUID? === '123e4567-e89b-42d3-a456-426614174000' # => true
|
497
|
+
# _UUID? === nil # => true
|
498
|
+
#
|
499
|
+
# @param options [Hash] additional configuration options
|
500
|
+
#
|
501
|
+
# @return [Domainic::Type::UnionType] the created type (UUIDType or NilClass)
|
502
|
+
# @rbs (**__todo__ options) -> UnionType
|
503
|
+
def _UUID?(**options)
|
504
|
+
_Nilable(_UUID(**options))
|
505
|
+
end
|
506
|
+
alias _Uuid? _UUID?
|
507
|
+
|
359
508
|
# Creates a UnionType instance.
|
360
509
|
#
|
361
510
|
# Allows combining multiple types into a single union type.
|
@@ -374,6 +523,38 @@ module Domainic
|
|
374
523
|
end
|
375
524
|
alias _Either _Union
|
376
525
|
|
526
|
+
# Creates a URIType instance.
|
527
|
+
#
|
528
|
+
# URIType restricts values to valid URIs.
|
529
|
+
#
|
530
|
+
# @example
|
531
|
+
# type = _URI.having_scheme('https')
|
532
|
+
#
|
533
|
+
# @param options [Hash] additional configuration options
|
534
|
+
#
|
535
|
+
# @return [Domainic::Type::URIType] the created type
|
536
|
+
# @rbs (**__todo__ options) -> URIType
|
537
|
+
def _Uri(**options)
|
538
|
+
require 'domainic/type/types/network/uri_type'
|
539
|
+
Domainic::Type::URIType.new(**options)
|
540
|
+
end
|
541
|
+
alias _Url _Uri
|
542
|
+
|
543
|
+
# Creates a nilable URIType instance.
|
544
|
+
#
|
545
|
+
# @example
|
546
|
+
# _Uri?.validate("https://example.com") # => true
|
547
|
+
# _Uri?.validate(nil) # => true
|
548
|
+
#
|
549
|
+
# @param options [Hash] additional configuration options
|
550
|
+
#
|
551
|
+
# @return [Domainic::Type::UnionType] the created type (URIType or NilClass)
|
552
|
+
# @rbs (**__todo__ options) -> UnionType
|
553
|
+
def _Uri?(**options)
|
554
|
+
_Nilable(_Uri(**options))
|
555
|
+
end
|
556
|
+
alias _Url? _Uri?
|
557
|
+
|
377
558
|
# Creates a VoidType instance.
|
378
559
|
#
|
379
560
|
# Represents an operation that returns no value.
|
@@ -42,7 +42,7 @@ module Domainic
|
|
42
42
|
include Behavior
|
43
43
|
include Behavior::EnumerableBehavior
|
44
44
|
|
45
|
-
|
45
|
+
intrinsically_constrain :self, :type, Array, abort_on_failure: true, description: :not_described
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|