data_model 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +11 -2
  3. data/.shadowenv.d/.gitignore +2 -0
  4. data/.shadowenv.d/550-ruby.lisp +37 -0
  5. data/.solargraph.yml +22 -0
  6. data/Gemfile.lock +38 -3
  7. data/Rakefile +0 -6
  8. data/Steepfile +27 -0
  9. data/data_model.gemspec +2 -2
  10. data/lib/data_model/boolean.rb +0 -2
  11. data/lib/data_model/builtin/array.rb +32 -25
  12. data/lib/data_model/builtin/big_decimal.rb +15 -14
  13. data/lib/data_model/builtin/boolean.rb +10 -7
  14. data/lib/data_model/builtin/date.rb +15 -12
  15. data/lib/data_model/builtin/float.rb +14 -13
  16. data/lib/data_model/builtin/hash.rb +100 -35
  17. data/lib/data_model/builtin/integer.rb +14 -13
  18. data/lib/data_model/builtin/numeric.rb +35 -0
  19. data/lib/data_model/builtin/object.rb +28 -0
  20. data/lib/data_model/builtin/or.rb +73 -0
  21. data/lib/data_model/builtin/string.rb +15 -16
  22. data/lib/data_model/builtin/symbol.rb +14 -13
  23. data/lib/data_model/builtin/time.rb +17 -14
  24. data/lib/data_model/builtin.rb +9 -9
  25. data/lib/data_model/error.rb +33 -33
  26. data/lib/data_model/errors.rb +107 -143
  27. data/lib/data_model/fixtures/array.rb +22 -9
  28. data/lib/data_model/fixtures/big_decimal.rb +9 -7
  29. data/lib/data_model/fixtures/boolean.rb +5 -5
  30. data/lib/data_model/fixtures/date.rb +13 -11
  31. data/lib/data_model/fixtures/example.rb +7 -7
  32. data/lib/data_model/fixtures/float.rb +9 -7
  33. data/lib/data_model/fixtures/hash.rb +22 -10
  34. data/lib/data_model/fixtures/integer.rb +9 -7
  35. data/lib/data_model/fixtures/numeric.rb +31 -0
  36. data/lib/data_model/fixtures/object.rb +27 -0
  37. data/lib/data_model/fixtures/or.rb +29 -0
  38. data/lib/data_model/fixtures/string.rb +15 -32
  39. data/lib/data_model/fixtures/symbol.rb +9 -7
  40. data/lib/data_model/fixtures/time.rb +13 -11
  41. data/lib/data_model/logging.rb +5 -8
  42. data/lib/data_model/model.rb +11 -8
  43. data/lib/data_model/registry.rb +129 -0
  44. data/lib/data_model/scanner.rb +24 -29
  45. data/lib/data_model/struct.rb +112 -0
  46. data/lib/data_model/testing/minitest.rb +33 -9
  47. data/lib/data_model/testing.rb +0 -2
  48. data/lib/data_model/type.rb +39 -23
  49. data/lib/data_model/version.rb +1 -3
  50. data/lib/data_model.rb +10 -19
  51. metadata +24 -21
  52. data/lib/data_model/type_registry.rb +0 -68
  53. data/sorbet/config +0 -4
  54. data/sorbet/rbi/annotations/rainbow.rbi +0 -269
  55. data/sorbet/rbi/gems/minitest@5.18.0.rbi +0 -1491
  56. data/sorbet/rbi/gems/zeitwerk.rbi +0 -196
  57. data/sorbet/rbi/gems/zeitwerk@2.6.7.rbi +0 -966
  58. data/sorbet/rbi/todo.rbi +0 -5
  59. data/sorbet/tapioca/config.yml +0 -13
  60. data/sorbet/tapioca/require.rb +0 -4
@@ -1,33 +1,37 @@
1
- # typed: strict
2
-
3
1
  module DataModel
4
- # Error is a class that holds errors.
2
+ # Error is a class that holds errors. Errors are a tuple of [name, ctx]
3
+ # - name is a symbol that identifies the error
4
+ # - ctx is contextual information about the error which can be used to build an error message
5
+ #
6
+ # The error object is a structured way to store, modify, and add errors in that intermediary format.
7
+ # To turn an error into a human readable message, use #to_messages, which delegates to a registry
8
+ #
9
+ # Base errors are errors that are related to the object as a whole, and not to any specific child
10
+ # Child errors are errors that are related to a specific child of the object, which may or may not apply depending on the type
5
11
  class Error
6
- extend T::Sig
7
-
8
- TErrorList = T.type_alias { T::Array[TError] }
9
- TErrorMap = T.type_alias { T::Hash[Symbol, TErrorList] }
12
+ include Errors
10
13
 
11
- sig { void }
14
+ # Create a new error Object
15
+ # @return [Error] the new error object
12
16
  def initialize
13
- @base = T.let([], TErrorList)
14
- @children = T.let({}, TErrorMap)
17
+ @base = []
18
+ @children = {}
15
19
  end
16
20
 
17
21
  # errors related to the object as a whole
18
- sig { returns(TErrorList) }
22
+ # @return [Array<Array(Symbol, untyped)>] the base errors
19
23
  def base
20
24
  return @base
21
25
  end
22
26
 
23
27
  # errors related children
24
- sig { returns(TErrorMap) }
28
+ # @return [Hash{Symbol => Array<Array(Symbol, untyped)>}] the child errors
25
29
  def children
26
30
  return @children
27
31
  end
28
32
 
29
33
  # all errors
30
- sig { returns(TErrorMap) }
34
+ # @return [Hash{Symbol => Array<Array(Symbol, untyped)>}] all errors
31
35
  def all
32
36
  return children.merge(base:)
33
37
  end
@@ -35,7 +39,8 @@ module DataModel
35
39
  alias to_h all
36
40
 
37
41
  # Returns true if any errors are present.
38
- sig { params(blk: T.nilable(T.proc.params(error: TError).returns(T::Boolean))).returns(T::Boolean) }
42
+ # @param blk [Proc] an optional block to filter errors, takes an Array(Symbol, untyped) and returns boolean
43
+ # @return [Boolean] true if any errors are present
39
44
  def any?(&blk)
40
45
  if !blk
41
46
  return !@base.empty? || !@children.empty?
@@ -53,13 +58,16 @@ module DataModel
53
58
  return any
54
59
  end
55
60
 
56
- sig { returns(T::Boolean) }
61
+ # Returns true if no errors are present.
62
+ # @return [Boolean] true if no errors are present
57
63
  def empty?
58
64
  !any?
59
65
  end
60
66
 
61
67
  # Add an error to the error list.
62
- sig { params(err: TError, child: T.nilable(T.any(Symbol, T::Array[Symbol]))).void }
68
+ # @param err [Array(Symbol, untyped)] the error to add
69
+ # @param child [Symbol, Array(Symbol)] the child to add the error to. child can be an array of symbols to specify a path if nested
70
+ # @return [void]
63
71
  def add(err, child: nil)
64
72
  if child.is_a?(Array)
65
73
  child = child.join(".").to_sym
@@ -73,7 +81,10 @@ module DataModel
73
81
  errs.push(err)
74
82
  end
75
83
 
76
- sig { params(name: Symbol, child: Error).void }
84
+ # Merge another error object into this one for child Errors
85
+ # @param name [Symbol] the name of the child
86
+ # @param child [Error] the child error object
87
+ # @return [void]
77
88
  def merge_child(name, child)
78
89
  if !child.any?
79
90
  return
@@ -86,22 +97,11 @@ module DataModel
86
97
  end
87
98
  end
88
99
 
89
- sig { params(blk: T.proc.params(context: Object, type: Symbol).returns(Object)).void }
90
- def transform_context(&blk)
91
- for error in @base
92
- key, context = error
93
- error[1] = blk.call(context, key)
94
- end
95
- end
96
-
97
- sig { params(blk: T.proc.params(context: Object, type: Symbol).returns(Object)).void }
98
- def transform_child_context(&blk)
99
- for error_list in @children.values
100
- for error in error_list
101
- key, context = error
102
- error[1] = blk.call(context, key)
103
- end
104
- end
100
+ # Get human readable error messages from error tuples
101
+ # @param registry [Registry] the registry to use to get error messages
102
+ # @return [Hash{Symbol => Array[String]}] the error messages
103
+ def to_messages(registry: Registry.instance)
104
+ return registry.error_messages(self)
105
105
  end
106
106
  end
107
107
  end
@@ -1,83 +1,96 @@
1
- # typed: strict
2
-
3
1
  module DataModel
4
2
  # Provide Error building functionality as a mixin
5
3
  module Errors
6
- include Kernel
7
- extend T::Sig
8
-
9
- TTemporal = T.type_alias { T.any(::Date, ::Time, ::DateTime) }
4
+ extend self
10
5
 
11
6
  ## Constructors
12
7
 
13
8
  # Type error applies when a value is not of the expected type
14
- sig { params(cls: T.class_of(Object), value: Object).returns(TError) }
9
+ # @param cls [String, Array(String)] the expected class
10
+ # @param value [Object] the value that failed
11
+ # @return [Array(Symbol, untyped)] the error
15
12
  def type_error(cls, value)
16
13
  [:type, [cls, value]]
17
14
  end
18
15
 
19
16
  # Coerce error applies when a value cannot be coerced to the expected type
20
- sig { params(cls: T.class_of(Object), value: Object).returns(TError) }
17
+ # @param cls [String] the expected class
18
+ # @param value [Object] the value that failed
19
+ # @return [Array(Symbol, untyped)] the error
21
20
  def coerce_error(cls, value)
22
21
  [:coerce, [cls, value]]
23
22
  end
24
23
 
25
24
  # Missing error applies when a value is missing
26
- sig { params(cls: T.class_of(Object)).returns(TError) }
25
+ # @param cls [String, Array<String>] the expected class
26
+ # @return [Array(Symbol, untyped)] the error
27
27
  def missing_error(cls)
28
28
  [:missing, cls]
29
29
  end
30
30
 
31
31
  # Inclusion error applies when a value is not in a set of allowed values
32
- sig { params(set: T::Array[T.any(Symbol, String)]).returns(TError) }
32
+ # @param set [Array<Symbol, String>] the set of allowed values
33
+ # @return [Array(Symbol, untyped)] the error
33
34
  def inclusion_error(set)
34
35
  [:inclusion, set]
35
36
  end
36
37
 
37
38
  # Exclusive error applies when a value is in a set of disallowed values
38
- sig { params(set: T::Array[T.any(Symbol, String)]).returns(TError) }
39
+ # @param set [Array<Symbol, String>] the set of disallowed values
40
+ # @return [Array(Symbol, untyped)] the error
39
41
  def exclusion_error(set)
40
42
  [:exclusion, set]
41
43
  end
42
44
 
43
45
  # Blank error applies when a value is blank
44
- sig { returns(TError) }
46
+ # @return [Array(Symbol, untyped)] the error
45
47
  def blank_error
46
48
  [:blank, nil]
47
49
  end
48
50
 
49
51
  # Extra keys error applies when a hash has extra keys
50
- sig { params(keys: T::Array[Symbol]).returns(TError) }
52
+ # @param keys [Array<Symbol>] the extra keys
53
+ # @return [Array(Symbol, untyped)] the error
51
54
  def extra_keys_error(keys)
52
55
  [:extra_keys, keys]
53
56
  end
54
57
 
55
58
  # Min applies when value is less then the minimum
56
- sig { params(min: Numeric, val: Numeric).returns(TError) }
59
+ # @param min [Numeric] the minimum value
60
+ # @param val [Numeric] the value that failed
61
+ # @return [Array(Symbol, untyped)] the error
57
62
  def min_error(min, val)
58
63
  [:min, [min, val]]
59
64
  end
60
65
 
61
66
  # Max applies when value is less then the minimum
62
- sig { params(min: Numeric, val: Numeric).returns(TError) }
67
+ # @param min [Numeric] the minimum value
68
+ # @param val [Numeric] the value that failed
69
+ # @return [Array(Symbol, untyped)] the error
63
70
  def max_error(min, val)
64
71
  [:max, [min, val]]
65
72
  end
66
73
 
67
74
  # Earliest applies when value is earlier then earliest
68
- sig { params(earliest: TTemporal, val: TTemporal).returns(TError) }
75
+ # @param earliest [Date, Time] the earliest value
76
+ # @param val [Date, Time] the value that failed
77
+ # @return [Array(Symbol, untyped)] the error
69
78
  def earliest_error(earliest, val)
70
79
  [:earliest, [earliest, val]]
71
80
  end
72
81
 
73
82
  # Latest applies when value is earlier then earliest
74
- sig { params(latest: TTemporal, val: TTemporal).returns(TError) }
83
+ # @param latest [Date, Time] the latest value
84
+ # @param val [Date, Time] the value that failed
85
+ # @return [Array(Symbol, untyped)] the error
75
86
  def latest_error(latest, val)
76
87
  [:latest, [latest, val]]
77
88
  end
78
89
 
79
90
  # Format applies when value does not match a format
80
- sig { params(format: Object, val: String).returns(TError) }
91
+ # @param format [Object] the format
92
+ # @param val [String] the value that failed
93
+ # @return [Array(Symbol, untyped)] the error
81
94
  def format_error(format, val)
82
95
  [:format, [format, val]]
83
96
  end
@@ -85,212 +98,163 @@ module DataModel
85
98
  ## Messages
86
99
 
87
100
  # Generate a message for a type error
88
- sig { params(cls: T.class_of(Object), value: Object).returns(String) }
101
+ # @param cls [String] the expected class
102
+ # @param value [Object] the value that failed
103
+ # @return [String] the message
89
104
  def type_error_message(cls, value)
90
- "#{value.inspect} is not a #{cls.name}, it is a #{value.class.name}"
105
+ names = Array(cls).join(" or ")
106
+ "#{value.inspect} is not a #{names}, it is a #{value.class.name}"
91
107
  end
92
108
 
93
109
  # Generate a message for a coerce error
94
- sig { params(cls: T.class_of(Object), value: Object).returns(String) }
110
+ # @param cls [String] the expected class
111
+ # @param value [Object] the value that failed
112
+ # @return [String] the message
95
113
  def coerce_error_message(cls, value)
96
- "cannot be coerced to #{cls.name}, it is a #{value.class.name}"
114
+ names = Array(cls).join(" or ")
115
+ "cannot be coerced to #{names}, it is a #{value.class.name}"
97
116
  end
98
117
 
99
118
  # Generate a message for a missing error
100
- sig { params(cls: T.class_of(Object)).returns(String) }
119
+ # @param cls [String, Array<String>] the expected class
120
+ # @return [String] the message
101
121
  def missing_error_message(cls)
102
- "missing value, expected a #{cls.name}"
122
+ names = Array(cls).join(" or ")
123
+ "missing value, expected a #{names}"
103
124
  end
104
125
 
105
126
  # Generate a message for an inclusion error
106
- sig { params(set: T::Array[Symbol]).returns(String) }
127
+ # @param set [Array<Symbol, String>] the set of allowed values
128
+ # @return [String] the message
107
129
  def inclusion_error_message(set)
108
130
  "must be one of #{set.join(', ')}"
109
131
  end
110
132
 
111
133
  # Generate a message for an exclusion error
112
- sig { params(set: T::Array[Symbol]).returns(String) }
134
+ # @param set [Array<Symbol, String>] the set of disallowed values
135
+ # @return [String] the message
113
136
  def exclusion_error_message(set)
114
137
  "must not be one of #{set.join(', ')}"
115
138
  end
116
139
 
117
140
  # Generate a message for a blank error
118
- sig { returns(String) }
141
+ # @return [String] the message
119
142
  def blank_error_message
120
143
  "cannot be blank"
121
144
  end
122
145
 
123
146
  # Generate a message for an extra keys error
124
- sig { params(keys: T::Array[Symbol]).returns(String) }
147
+ # @param keys [Array<Symbol>] the extra keys
148
+ # @return [String] the message
125
149
  def extra_keys_error_message(keys)
126
150
  "more elements found in closed hash then specified children: #{keys.join(', ')}"
127
151
  end
128
152
 
129
153
  # Generate a message for a min error
130
- sig { params(min: Numeric, val: Numeric).returns(String) }
154
+ # @param min [Numeric] the minimum value
155
+ # @param val [Numeric] the value that failed
156
+ # @return [String] the message
131
157
  def min_error_message(min, val)
132
158
  "value is less than the minimum of #{min}, it is #{val}"
133
159
  end
134
160
 
135
161
  # Generate a message for a min error
136
- sig { params(max: Numeric, val: Numeric).returns(String) }
162
+ # @param max [Numeric] the maximum value
163
+ # @param val [Numeric] the value that failed
164
+ # @return [String] the message
137
165
  def max_error_message(max, val)
138
166
  "value is more than the maximum of #{max}, it is #{val}"
139
167
  end
140
168
 
141
169
  # Generate a message for a value that occurs earlier then the specified earliest point
142
- sig { params(earliest: TTemporal, val: TTemporal).returns(String) }
170
+ # @param earliest [Date, Time] the earliest value
171
+ # @param val [Date, Time] the value that failed
172
+ # @return [String] the message
143
173
  def early_error_message(earliest, val)
144
174
  "value #{val} is before #{earliest}"
145
175
  end
146
176
 
147
177
  # Generate a message for a value that occurs later then the specified latest point
148
- sig { params(latest: TTemporal, val: TTemporal).returns(String) }
178
+ # @param latest [Date, Time] the latest value
179
+ # @param val [Date, Time] the value that failed
180
+ # @return [String] the message
149
181
  def late_error_message(latest, val)
150
182
  "value #{val} is after #{latest}"
151
183
  end
152
184
 
153
185
  # Generate a message for a value that does not match the format
154
- sig { params(format: Object, val: String).returns(String) }
186
+ # @param format [Object] the format
187
+ # @param val [String] the value that failed
188
+ # @return [String] the message
155
189
  def format_error_message(format, val)
156
190
  "value #{val} does not match format #{format}"
157
191
  end
158
192
 
159
- ## API
160
- # TODO: split this file
161
-
162
- TErrorMessageBuilder = T.type_alias { T.proc.params(ctx: T.untyped).returns(String) }
163
-
164
- # Register a custom error message for use with custom errors
165
- sig { params(type: Symbol, block: TErrorMessageBuilder).void }
166
- def register_error_message(type, &block)
167
- error_message_builders[type] = block
168
- end
169
-
170
- TErrorMessages = T.type_alias { T::Hash[Symbol, TErrorMessageBuilder] }
171
- TClassValueCtx = T.type_alias { [T.class_of(Object), Object] }
172
- TClassCtx = T.type_alias { T.class_of(Object) }
173
- TSetCtx = T.type_alias { T::Array[Symbol] }
174
- TWithinCtx = T.type_alias { [Numeric, Numeric] }
175
- TWithinTemporalCtx = T.type_alias { [TTemporal, TTemporal] }
176
- TFormatCtx = T.type_alias { [Object, String] }
193
+ # Builders
177
194
 
178
195
  # Get the error message builders
179
- sig { returns(TErrorMessages) }
180
- def error_message_builders
181
- if @error_messages.nil?
182
- @error_messages ||= T.let({}, T.nilable(TErrorMessages))
183
-
184
- # wire up defaults
185
-
186
- register_error_message(:type) do |ctx|
187
- cls, val = T.let(ctx, TClassValueCtx)
196
+ # @return [Hash{Symbol => Proc}] the error message builders
197
+ def error_messages
198
+ return {
199
+ type: lambda do |ctx|
200
+ cls, val = ctx
188
201
  type_error_message(cls, val)
189
- end
202
+ end,
190
203
 
191
- register_error_message(:coerce) do |ctx|
192
- cls, val = T.let(ctx, TClassValueCtx)
193
- coerce_error_message(cls, val)
194
- end
204
+ coerce: lambda do |ctx|
205
+ cls, val = ctx
206
+ type_error_message(cls, val)
207
+ end,
195
208
 
196
- register_error_message(:missing) do |ctx|
197
- cls = T.let(ctx, TClassCtx)
209
+ missing: lambda do |ctx|
210
+ cls = ctx
198
211
  missing_error_message(cls)
199
- end
212
+ end,
200
213
 
201
- register_error_message(:inclusion) do |ctx|
202
- set = T.let(ctx, TSetCtx)
214
+ inclusion: lambda do |ctx|
215
+ set = ctx
203
216
  inclusion_error_message(set)
204
- end
217
+ end,
205
218
 
206
- register_error_message(:exclusion) do |ctx|
207
- set = T.let(ctx, TSetCtx)
219
+ exclusion: lambda do |ctx|
220
+ set = ctx
208
221
  exclusion_error_message(set)
209
- end
222
+ end,
210
223
 
211
- register_error_message(:extra_keys) do |ctx|
212
- set = T.let(ctx, TSetCtx)
224
+ extra_keys: lambda do |ctx|
225
+ set = ctx
213
226
  extra_keys_error_message(set)
214
- end
227
+ end,
215
228
 
216
- register_error_message(:min) do |ctx|
217
- min, val = T.let(ctx, TWithinCtx)
229
+ min: lambda do |ctx|
230
+ min, val = ctx
218
231
  min_error_message(min, val)
219
- end
232
+ end,
220
233
 
221
- register_error_message(:max) do |ctx|
222
- max, val = T.let(ctx, TWithinCtx)
234
+ max: lambda do |ctx|
235
+ max, val = ctx
223
236
  max_error_message(max, val)
224
- end
237
+ end,
225
238
 
226
- register_error_message(:earliest) do |ctx|
227
- earliest, val = T.let(ctx, TWithinTemporalCtx)
239
+ earliest: lambda do |ctx|
240
+ earliest, val = ctx
228
241
  early_error_message(earliest, val)
229
- end
242
+ end,
230
243
 
231
- register_error_message(:latest) do |ctx|
232
- latest, val = T.let(ctx, TWithinTemporalCtx)
244
+ latest: lambda do |ctx|
245
+ latest, val = ctx
233
246
  late_error_message(latest, val)
234
- end
247
+ end,
235
248
 
236
- register_error_message(:blank) do
249
+ blank: lambda do
237
250
  blank_error_message
238
- end
251
+ end,
239
252
 
240
- register_error_message(:format) do |ctx|
241
- format, val = T.let(ctx, TFormatCtx)
253
+ format: lambda do |ctx|
254
+ format, val = ctx
242
255
  format_error_message(format, val)
243
256
  end
244
- end
245
-
246
- @error_messages
247
- end
248
-
249
- # Build the error message for a given error
250
- sig { params(error: TError).returns(String) }
251
- def error_message(error)
252
- type = T.let(error[0], Symbol)
253
- ctx = T.let(error[1], T.untyped)
254
-
255
- builder = error_message_builders[type]
256
-
257
- if builder.nil?
258
- raise "no error message builder for #{type}"
259
- end
260
-
261
- builder.call(ctx)
262
- end
263
-
264
- # TODO: separate builders from other use cases for this mixin
265
- # Build error messages from error object
266
- sig { params(error: Error).returns(T::Hash[Symbol, T::Array[String]]) }
267
- def error_messages(error)
268
- error.to_h.transform_values do |error_list|
269
- error_list.map { |e| error_message(e) }
270
- end
271
- end
272
-
273
- sig { params(error: Error, from: T.class_of(Object), to: T.class_of(Object)).void }
274
- def set_error_class(error, from, to)
275
- error.transform_context do |ctx, type|
276
- case type
277
- when :type, :coerce
278
- cls, val = T.cast(ctx, TClassValueCtx)
279
- if cls == from
280
- [to, val]
281
- else
282
- [cls, val]
283
- end
284
- when :missing
285
- if ctx == from
286
- [to, val]
287
- else
288
- [cls, val]
289
- end
290
- else
291
- [cls, val]
292
- end
293
- end
257
+ }
294
258
  end
295
259
  end
296
260
  end
@@ -1,12 +1,22 @@
1
- # typed: strict
2
-
3
1
  module DataModel
2
+ # test fixtures for array type
4
3
  module Fixtures::Array
5
4
  extend self
6
- extend T::Sig
7
5
  include Fixtures
8
6
 
9
- sig { returns(Example) }
7
+ # a simple array of any types
8
+ # @return [Example] the example
9
+ def any_array
10
+ Example.new(
11
+ [:array],
12
+ variants: {
13
+ mixed: ["a", 2, [], ::Object.new]
14
+ },
15
+ )
16
+ end
17
+
18
+ # a simple array of strings example
19
+ # @return [Example] the example
10
20
  def string_array
11
21
  Example.new(
12
22
  [:array, :string],
@@ -16,12 +26,13 @@ module DataModel
16
26
  number: [1, ["1"]],
17
27
  missing: nil,
18
28
  numbers: [[1, 2, 3], ["1", "2", "3"]],
19
- other_type: Object.new
29
+ other_type: ::Object.new
20
30
  },
21
31
  )
22
32
  end
23
33
 
24
- sig { returns(Example) }
34
+ # a simple array of strings that wraps single values
35
+ # @return [Example] the example
25
36
  def wrapping_string_array
26
37
  Example.new(
27
38
  [:array, { wrap_single_value: true }, :string],
@@ -31,12 +42,13 @@ module DataModel
31
42
  number: [1, ["1"]],
32
43
  missing: nil,
33
44
  numbers: [[1, 2, 3], ["1", "2", "3"]],
34
- other_type: Object.new
45
+ other_type: ::Object.new
35
46
  },
36
47
  )
37
48
  end
38
49
 
39
- sig { returns(Example) }
50
+ # an optional example
51
+ # @return [Example] the example
40
52
  def optional_string_array
41
53
  Example.new(
42
54
  [:array, { optional: true }, :string],
@@ -47,7 +59,8 @@ module DataModel
47
59
  )
48
60
  end
49
61
 
50
- sig { returns(Example) }
62
+ # an array of optional strings
63
+ # @return [Example] the example
51
64
  def array_optional_string
52
65
  Example.new(
53
66
  [:array, [:string, { optional: true }]],
@@ -1,14 +1,13 @@
1
- # typed: strict
2
-
3
1
  require "bigdecimal/util"
4
2
 
5
3
  module DataModel
4
+ # test fixtures for BigDecimal
6
5
  module Fixtures::BigDecimal
7
6
  include Fixtures
8
- extend T::Sig
9
7
  extend self
10
8
 
11
- sig { returns(Example) }
9
+ # a simple decimal example
10
+ # @return [Example] the example
12
11
  def simple
13
12
  Example.new(
14
13
  [:decimal],
@@ -20,7 +19,8 @@ module DataModel
20
19
  )
21
20
  end
22
21
 
23
- sig { returns(Example) }
22
+ # a decimal example that is optional
23
+ # @return [Example] the example
24
24
  def optional
25
25
  Example.new(
26
26
  [:decimal, { optional: true }],
@@ -30,7 +30,8 @@ module DataModel
30
30
  )
31
31
  end
32
32
 
33
- sig { returns(Example) }
33
+ # a decimal example that has a restriction on the minimum value
34
+ # @return [Example] the example
34
35
  def min
35
36
  Example.new(
36
37
  [:decimal, { min: 5 }],
@@ -41,7 +42,8 @@ module DataModel
41
42
  )
42
43
  end
43
44
 
44
- sig { returns(Example) }
45
+ # a decimal example that has a restriction on the maximum value
46
+ # @return [Example] the example
45
47
  def max
46
48
  Example.new(
47
49
  [:decimal, { max: 5 }],
@@ -1,12 +1,11 @@
1
- # typed: strict
2
-
3
1
  module DataModel
2
+ # test fixtures for boolean type
4
3
  module Fixtures::Boolean
5
- extend T::Sig
6
4
  extend self
7
5
  include Fixtures
8
6
 
9
- sig { returns(Example) }
7
+ # a simple boolean example
8
+ # @return [Example] the example
10
9
  def simple
11
10
  Example.new(
12
11
  [:boolean],
@@ -19,7 +18,8 @@ module DataModel
19
18
  )
20
19
  end
21
20
 
22
- sig { returns(Example) }
21
+ # a boolean example that is optional
22
+ # @return [Example] the example
23
23
  def optional
24
24
  Example.new(
25
25
  [:boolean, { optional: true }],