researchable-freedcamp-api 0.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 (55) hide show
  1. checksums.yaml +7 -0
  2. data/.bundle/config +2 -0
  3. data/.gitignore +1 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +69 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +39 -0
  8. data/Rakefile +12 -0
  9. data/bin/console +15 -0
  10. data/bin/setup +8 -0
  11. data/lib/researchable/freedcamp_api/create_task.rb +22 -0
  12. data/lib/researchable/freedcamp_api/endpoint.rb +34 -0
  13. data/lib/researchable/freedcamp_api/list_milestones.rb +1 -0
  14. data/lib/researchable/freedcamp_api/list_projects.rb +1 -0
  15. data/lib/researchable/freedcamp_api/list_tasks.rb +36 -0
  16. data/lib/researchable/freedcamp_api/sessions/session.rb +28 -0
  17. data/lib/researchable/freedcamp_api/sessions/signed_session.rb +128 -0
  18. data/lib/researchable/freedcamp_api/sessions.rb +17 -0
  19. data/lib/researchable/freedcamp_api/structs/signature.rb +11 -0
  20. data/lib/researchable/freedcamp_api/structs/task.rb +48 -0
  21. data/lib/researchable/freedcamp_api/structs.rb +8 -0
  22. data/lib/researchable/freedcamp_api/update_task.rb +27 -0
  23. data/lib/researchable/freedcamp_api/version.rb +8 -0
  24. data/lib/researchable/freedcamp_api.rb +21 -0
  25. data/lib/researchable-freedcamp-api.rb +6 -0
  26. data/output/62d1c67bf1eebc3456f9cc8879519700b2a0fc45 +1 -0
  27. data/researchable_freedcamp_api.gemspec +44 -0
  28. data/sorbet/config +3 -0
  29. data/sorbet/rbi/gems/active_interaction.rbi +304 -0
  30. data/sorbet/rbi/gems/activemodel.rbi +342 -0
  31. data/sorbet/rbi/gems/activesupport.rbi +1023 -0
  32. data/sorbet/rbi/gems/concurrent-ruby.rbi +1662 -0
  33. data/sorbet/rbi/gems/httparty.rbi +446 -0
  34. data/sorbet/rbi/gems/i18n.rbi +133 -0
  35. data/sorbet/rbi/gems/mime-types-data.rbi +17 -0
  36. data/sorbet/rbi/gems/mime-types.rbi +225 -0
  37. data/sorbet/rbi/gems/multi_xml.rbi +35 -0
  38. data/sorbet/rbi/gems/researchable-freedcamp-api.rbi +25 -0
  39. data/sorbet/rbi/gems/rspec-core.rbi +1915 -0
  40. data/sorbet/rbi/gems/rspec-expectations.rbi +1151 -0
  41. data/sorbet/rbi/gems/rspec-mocks.rbi +1110 -0
  42. data/sorbet/rbi/gems/rspec-support.rbi +280 -0
  43. data/sorbet/rbi/gems/rspec.rbi +15 -0
  44. data/sorbet/rbi/gems/tzinfo.rbi +586 -0
  45. data/sorbet/rbi/hidden-definitions/errors.txt +4251 -0
  46. data/sorbet/rbi/hidden-definitions/hidden.rbi +8306 -0
  47. data/sorbet/rbi/sorbet-typed/lib/activemodel/all/activemodel.rbi +715 -0
  48. data/sorbet/rbi/sorbet-typed/lib/activesupport/>=6/activesupport.rbi +37 -0
  49. data/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1850 -0
  50. data/sorbet/rbi/sorbet-typed/lib/httparty/all/httparty.rbi +566 -0
  51. data/sorbet/rbi/sorbet-typed/lib/minitest/all/minitest.rbi +108 -0
  52. data/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi +24 -0
  53. data/sorbet/rbi/todo.rbi +7 -0
  54. data/test.rb +41 -0
  55. metadata +198 -0
@@ -0,0 +1,715 @@
1
+ # This file is autogenerated. Do not edit it by hand. Regenerate it with:
2
+ # srb rbi sorbet-typed
3
+ #
4
+ # If you would like to make changes to this file, great! Please upstream any changes you make here:
5
+ #
6
+ # https://github.com/sorbet/sorbet-typed/edit/master/lib/activemodel/all/activemodel.rbi
7
+ #
8
+ # typed: false
9
+
10
+ module ActiveModel::AttributeMethods
11
+ mixes_in_class_methods(::ActiveModel::AttributeMethods::ClassMethods)
12
+ end
13
+
14
+ module ActiveModel::AttributeMethods::ClassMethods; end
15
+
16
+ ActiveModel::AttributeMethods::AttrNames::DEF_SAFE_NAME = T.let(T.unsafe(nil), Regexp)
17
+
18
+ ActiveModel::AttributeMethods::CALL_COMPILABLE_REGEXP = T.let(T.unsafe(nil), Regexp)
19
+
20
+ ActiveModel::AttributeMethods::NAME_COMPILABLE_REGEXP = T.let(T.unsafe(nil), Regexp)
21
+
22
+ module ActiveModel::Conversion
23
+ mixes_in_class_methods(::ActiveModel::Conversion::ClassMethods)
24
+ end
25
+
26
+ module ActiveModel::Conversion::ClassMethods; end
27
+
28
+ module ActiveModel::Dirty
29
+ include(::ActiveModel::AttributeMethods)
30
+
31
+ sig { params(attr: Symbol, from: T.untyped, to: T.untyped).returns(T::Boolean) }
32
+ def attribute_changed?(attr, from: nil, to: nil); end
33
+
34
+ sig { params(attr_name: Symbol).returns(T::Boolean) }
35
+ def attribute_changed_in_place?(attr_name); end
36
+
37
+ sig { params(attr_name: Symbol, options: T.untyped).returns(T::Boolean) }
38
+ def attribute_previously_changed?(attr_name, **options); end
39
+
40
+ sig { returns(T::Boolean) }
41
+ def changed?; end
42
+
43
+ sig { returns(T::Hash[T.any(Symbol, String), T.untyped]) }
44
+ def previous_changes; end
45
+ end
46
+
47
+ class ActiveModel::ForbiddenAttributesError < ::StandardError
48
+ end
49
+
50
+ module ActiveModel::Model
51
+ include(::ActiveModel::AttributeAssignment)
52
+ extend(::ActiveSupport::Concern)
53
+
54
+ include(::ActiveSupport::Callbacks)
55
+ include(::ActiveModel::Validations::HelperMethods)
56
+ include(::ActiveModel::Validations)
57
+ include(::ActiveModel::Conversion)
58
+ end
59
+
60
+ module ActiveModel::Validations
61
+ extend(::ActiveSupport::Concern)
62
+
63
+ include(::ActiveSupport::Callbacks)
64
+ include(::ActiveModel::Validations::HelperMethods)
65
+
66
+ mixes_in_class_methods(::ActiveModel::Validations::ClassMethods)
67
+
68
+ # Returns the `Errors` object that holds all information about attribute
69
+ # error messages.
70
+ #
71
+ # ```ruby
72
+ # class Person
73
+ # include ActiveModel::Validations
74
+ #
75
+ # attr_accessor :name
76
+ # validates_presence_of :name
77
+ # end
78
+ #
79
+ # person = Person.new
80
+ # person.valid? # => false
81
+ # person.errors # => #<ActiveModel::Errors:0x007fe603816640 @messages={name:["can't be blank"]}>
82
+ # ```
83
+ sig { returns(ActiveModel::Errors) }
84
+ def errors; end
85
+
86
+ sig { params(context: T.untyped).returns(T::Boolean) }
87
+ def invalid?(context = T.unsafe(nil)); end
88
+
89
+ sig { params(context: T.untyped).returns(T::Boolean) }
90
+ def valid?(context = T.unsafe(nil)); end
91
+ end
92
+
93
+ module ActiveModel::Validations::ClassMethods
94
+ # https://github.com/rails/rails/blob/v5.2.3/activemodel/lib/active_model/validations.rb#L136-L154
95
+ sig do
96
+ params(
97
+ names: T.any(Symbol, String),
98
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
99
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
100
+ prepend: T::Boolean,
101
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
102
+ ).void
103
+ end
104
+ def validate(
105
+ *names,
106
+ if: nil,
107
+ on: nil,
108
+ prepend: false,
109
+ unless: nil
110
+ ); end
111
+
112
+ # https://github.com/rails/rails/blob/v5.2.3/activemodel/lib/active_model/validations/validates.rb#L75-L105
113
+ sig do
114
+ params(
115
+ names: T.any(Symbol, String), # a splat of at least one attribute name
116
+ absence: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
117
+ acceptance: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
118
+ allow_blank: T::Boolean,
119
+ allow_nil: T::Boolean,
120
+ confirmation: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
121
+ # `exclusion` and `inclusion` are tricky to type without better support
122
+ # for overloading and shapes. Value can be anything that responds to
123
+ # `include?` (e.g. (1..3)), or a hash having an `in` or `within` key,
124
+ # like { in: [1, 2, 3], ... }
125
+ exclusion: T::Enumerable[T.untyped],
126
+ # `format` hash must additionally contain either :with or :without keys.
127
+ # Alternatively, it can be a Regexp.
128
+ format: T.any(T::Hash[T.untyped, T.untyped], Regexp),
129
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
130
+ # `exclusion` and `inclusion` are tricky to type without better support
131
+ # for overloading and shapes. Value can be anything that responds to
132
+ # `include?` (e.g. (1..3)), or a hash having an `in` or `within` key,
133
+ # like { in: [1, 2, 3], ... }
134
+ inclusion: T::Enumerable[T.untyped],
135
+ # if Hash, must contain :in, :within, :maximum, :minimum, or :is keys
136
+ length: T.any(T::Range[T.untyped], T::Hash[T.untyped, T.untyped]),
137
+ numericality: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
138
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
139
+ presence: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
140
+ size: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
141
+ strict: T::Boolean,
142
+ uniqueness: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
143
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
144
+ kwargs: T.untyped
145
+ ).void
146
+ end
147
+ def validates(
148
+ *names,
149
+ absence: false,
150
+ acceptance: {},
151
+ allow_blank: false,
152
+ allow_nil: false,
153
+ confirmation: false,
154
+ exclusion: [],
155
+ format: {},
156
+ if: nil,
157
+ inclusion: [],
158
+ length: {},
159
+ numericality: false,
160
+ on: :_,
161
+ presence: false,
162
+ size: false,
163
+ strict: false,
164
+ uniqueness: false,
165
+ unless: :_,
166
+ **kwargs
167
+ )
168
+ end
169
+ end
170
+
171
+ ActiveModel::Validations::ClassMethods::VALID_OPTIONS_FOR_VALIDATE = T.let(T.unsafe(nil), T::Array[T.untyped])
172
+
173
+ module ActiveModel::SecurePassword
174
+ mixes_in_class_methods(::ActiveModel::SecurePassword::ClassMethods)
175
+ end
176
+
177
+ module ActiveModel::SecurePassword::ClassMethods; end
178
+
179
+ ActiveModel::SecurePassword::MAX_PASSWORD_LENGTH_ALLOWED = T.let(T.unsafe(nil), Integer)
180
+
181
+ class ActiveModel::Type::Value
182
+ extend T::Sig
183
+
184
+ sig { params(precision: T.untyped, limit: T.untyped, scale: T.untyped).void }
185
+ def initialize(precision: nil, limit: nil, scale: nil); end
186
+
187
+ sig { params(value: T.untyped).returns(T.untyped) }
188
+ def cast(value); end
189
+ end
190
+
191
+ class ActiveModel::Type::Boolean < ActiveModel::Type::Value
192
+ sig { params(arg0: T.untyped).returns(T.nilable(T::Boolean)) }
193
+ def cast(arg0); end
194
+ end
195
+
196
+ class ActiveModel::Type::ImmutableString < ActiveModel::Type::Value
197
+ sig { params(arg0: T.untyped).returns(T.nilable(String)) }
198
+ def cast(arg0); end
199
+ end
200
+ class ActiveModel::Type::String < ActiveModel::Type::ImmutableString; end
201
+
202
+ class ActiveModel::Type::Integer < ActiveModel::Type::Value
203
+ sig { params(arg0: T.untyped).returns(T.nilable(Integer)) }
204
+ def cast(arg0); end
205
+ end
206
+ class ActiveModel::Type::BigInteger < ActiveModel::Type::Integer; end
207
+
208
+ class ActiveModel::Type::Binary < ActiveModel::Type::Value
209
+ sig { params(arg0: T.untyped).returns(T.nilable(String)) }
210
+ def cast(arg0); end
211
+ end
212
+
213
+ class ActiveModel::Type::Decimal < ActiveModel::Type::Value
214
+ sig { params(arg0: T.untyped).returns(T.nilable(BigDecimal)) }
215
+ def cast(arg0); end
216
+ end
217
+
218
+ class ActiveModel::Type::Float < ActiveModel::Type::Value
219
+ sig { params(arg0: T.untyped).returns(T.nilable(Float)) }
220
+ def cast(arg0); end
221
+ end
222
+
223
+ class ActiveModel::Type::Date < ::ActiveModel::Type::Value
224
+ sig { params(arg0: T.untyped).returns(T.nilable(Date)) }
225
+ def cast(arg0); end
226
+ end
227
+
228
+ class ActiveModel::Type::DateTime < ::ActiveModel::Type::Value
229
+ sig { params(arg0: T.untyped).returns(T.nilable(DateTime)) }
230
+ def cast(arg0); end
231
+ end
232
+
233
+ module ActiveModel::Validations::Callbacks
234
+ mixes_in_class_methods(::ActiveModel::Validations::Callbacks::ClassMethods)
235
+ end
236
+
237
+ module ActiveModel::Validations::Callbacks::ClassMethods; end
238
+
239
+ module ActiveModel::Validations::HelperMethods
240
+ # A type alias for the in/within parameters on the
241
+ # validates_(inclusion/exclusion)_of methods.
242
+ InWithinType = T.type_alias do
243
+ T.nilable(
244
+ T.any(
245
+ Symbol,
246
+ String,
247
+ T::Array[T.any(String, Symbol)],
248
+ T::Range[Integer],
249
+ T::Array[T::Boolean],
250
+ T.proc.params(arg0: T.untyped).returns(T::Boolean)
251
+ )
252
+ )
253
+ end
254
+
255
+ module ClassMethods
256
+ sig do
257
+ params(
258
+ attr_names: T.any(String, Symbol),
259
+ message: String,
260
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
261
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
262
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
263
+ allow_nil: T::Boolean,
264
+ allow_blank: T::Boolean,
265
+ strict: T::Boolean
266
+ ).void
267
+ end
268
+ def validates_absence_of(
269
+ *attr_names,
270
+ message: 'must be blank',
271
+ if: nil,
272
+ unless: :_,
273
+ on: :_,
274
+ allow_nil: false,
275
+ allow_blank: false,
276
+ strict: false
277
+ ); end
278
+
279
+ sig do
280
+ params(
281
+ attr_names: T.any(String, Symbol),
282
+ message: String,
283
+ accept: T.untyped,
284
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
285
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
286
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
287
+ allow_nil: T::Boolean,
288
+ allow_blank: T::Boolean,
289
+ strict: T::Boolean
290
+ ).void
291
+ end
292
+ def validates_acceptance_of(
293
+ *attr_names,
294
+ message: 'must be accepted',
295
+ accept: ['1', true],
296
+ if: nil,
297
+ unless: :_,
298
+ on: :_,
299
+ allow_nil: false,
300
+ allow_blank: false,
301
+ strict: false
302
+ ); end
303
+
304
+ sig do
305
+ params(
306
+ attr_names: T.any(String, Symbol),
307
+ message: String,
308
+ case_sensitive: T::Boolean,
309
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
310
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
311
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
312
+ allow_nil: T::Boolean,
313
+ allow_blank: T::Boolean,
314
+ strict: T::Boolean
315
+ ).void
316
+ end
317
+ def validates_confirmation_of(
318
+ *attr_names,
319
+ message: "doesn't match %{translated_attribute_name}",
320
+ case_sensitive: true,
321
+ if: nil,
322
+ unless: :_,
323
+ on: :_,
324
+ allow_nil: false,
325
+ allow_blank: false,
326
+ strict: false
327
+ ); end
328
+
329
+ sig do
330
+ params(
331
+ attr_names: T.any(String, Symbol),
332
+ message: String,
333
+ in: InWithinType,
334
+ within: InWithinType,
335
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
336
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
337
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
338
+ allow_nil: T::Boolean,
339
+ allow_blank: T::Boolean,
340
+ strict: T::Boolean
341
+ ).void
342
+ end
343
+ def validates_exclusion_of(
344
+ *attr_names,
345
+ message: 'is reserved',
346
+ in: nil,
347
+ within: nil,
348
+ if: nil,
349
+ unless: :_,
350
+ on: :_,
351
+ allow_nil: false,
352
+ allow_blank: false,
353
+ strict: false
354
+ ); end
355
+
356
+ sig do
357
+ params(
358
+ attr_names: T.any(String, Symbol),
359
+ message: String,
360
+ with: T.untyped,
361
+ without: T.untyped,
362
+ multiline: T.untyped,
363
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
364
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
365
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
366
+ allow_nil: T::Boolean,
367
+ allow_blank: T::Boolean,
368
+ strict: T::Boolean
369
+ ).void
370
+ end
371
+ def validates_format_of(
372
+ *attr_names,
373
+ message: 'is invalid',
374
+ with: nil,
375
+ without: nil,
376
+ multiline: nil,
377
+ if: nil,
378
+ unless: :_,
379
+ on: :_,
380
+ allow_nil: false,
381
+ allow_blank: false,
382
+ strict: false
383
+ ); end
384
+
385
+ sig do
386
+ params(
387
+ attr_names: T.any(String, Symbol),
388
+ message: String,
389
+ in: InWithinType,
390
+ within: InWithinType,
391
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
392
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
393
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
394
+ allow_nil: T::Boolean,
395
+ allow_blank: T::Boolean,
396
+ strict: T::Boolean
397
+ ).void
398
+ end
399
+ def validates_inclusion_of(
400
+ *attr_names,
401
+ message: 'is not included in the list',
402
+ in: nil,
403
+ within: nil,
404
+ if: nil,
405
+ unless: :_,
406
+ on: :_,
407
+ allow_nil: false,
408
+ allow_blank: false,
409
+ strict: false
410
+ ); end
411
+
412
+ sig do
413
+ params(
414
+ attr_names: T.any(String, Symbol),
415
+ message: T.nilable(String),
416
+ minimum: T.nilable(Integer),
417
+ maximum: T.nilable(Integer),
418
+ is: T.nilable(Integer),
419
+ within: T.nilable(T::Range[Integer]),
420
+ in: T.nilable(T::Range[Integer]),
421
+ too_long: String,
422
+ too_short: String,
423
+ wrong_length: String,
424
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
425
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
426
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
427
+ allow_nil: T::Boolean,
428
+ allow_blank: T::Boolean,
429
+ strict: T::Boolean
430
+ ).void
431
+ end
432
+ def validates_length_of(
433
+ *attr_names,
434
+ message: nil,
435
+ minimum: nil,
436
+ maximum: nil,
437
+ is: nil,
438
+ within: nil,
439
+ in: nil,
440
+ too_long: 'is too long (maximum is %{count} characters)',
441
+ too_short: 'is too short (minimum is %{count} characters)',
442
+ wrong_length: 'is the wrong length (should be %{count} characters)',
443
+ if: nil,
444
+ unless: :_,
445
+ on: :_,
446
+ allow_nil: false,
447
+ allow_blank: false,
448
+ strict: false
449
+ ); end
450
+
451
+ # validates_size_of is an alias of validates_length_of
452
+ sig do
453
+ params(
454
+ attr_names: T.any(String, Symbol),
455
+ message: T.nilable(String),
456
+ minimum: T.nilable(Integer),
457
+ maximum: T.nilable(Integer),
458
+ is: T.nilable(Integer),
459
+ within: T.nilable(T::Range[Integer]),
460
+ in: T.nilable(T::Range[Integer]),
461
+ too_long: String,
462
+ too_short: String,
463
+ wrong_length: String,
464
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
465
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
466
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
467
+ allow_nil: T::Boolean,
468
+ allow_blank: T::Boolean,
469
+ strict: T::Boolean
470
+ ).void
471
+ end
472
+ def validates_size_of(
473
+ *attr_names,
474
+ message: nil,
475
+ minimum: nil,
476
+ maximum: nil,
477
+ is: nil,
478
+ within: nil,
479
+ in: nil,
480
+ too_long: 'is too long (maximum is %{count} characters)',
481
+ too_short: 'is too short (minimum is %{count} characters)',
482
+ wrong_length: 'is the wrong length (should be %{count} characters)',
483
+ if: nil,
484
+ unless: :_,
485
+ on: :_,
486
+ allow_nil: false,
487
+ allow_blank: false,
488
+ strict: false
489
+ ); end
490
+
491
+ # Create a type alias so we don't have to repeat this long type signature 6 times.
492
+ NumberComparatorType = T.type_alias {T.nilable(T.any(Integer, Float, T.proc.params(arg0: T.untyped).returns(T::Boolean), Symbol))}
493
+ sig do
494
+ params(
495
+ attr_names: T.any(String, Symbol),
496
+ message: String,
497
+ only_integer: T::Boolean,
498
+ greater_than: NumberComparatorType,
499
+ greater_than_or_equal_to: NumberComparatorType,
500
+ equal_to: NumberComparatorType,
501
+ less_than: NumberComparatorType,
502
+ less_than_or_equal_to: NumberComparatorType,
503
+ other_than: NumberComparatorType,
504
+ odd: T::Boolean,
505
+ even: T::Boolean,
506
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
507
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
508
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
509
+ allow_nil: T::Boolean,
510
+ allow_blank: T::Boolean,
511
+ strict: T::Boolean
512
+ ).void
513
+ end
514
+ def validates_numericality_of(
515
+ *attr_names,
516
+ message: 'is not a number',
517
+ only_integer: false,
518
+ greater_than: nil,
519
+ greater_than_or_equal_to: nil,
520
+ equal_to: nil,
521
+ less_than: nil,
522
+ less_than_or_equal_to: nil,
523
+ other_than: nil,
524
+ odd: false,
525
+ even: false,
526
+ if: nil,
527
+ unless: :_,
528
+ on: :_,
529
+ allow_nil: false,
530
+ allow_blank: false,
531
+ strict: false
532
+ ); end
533
+
534
+ sig do
535
+ params(
536
+ attr_names: T.any(String, Symbol),
537
+ message: String,
538
+ if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
539
+ unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
540
+ on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
541
+ allow_nil: T::Boolean,
542
+ allow_blank: T::Boolean,
543
+ strict: T::Boolean
544
+ ).void
545
+ end
546
+ def validates_presence_of(
547
+ *attr_names,
548
+ message: "can't be blank",
549
+ if: nil,
550
+ unless: :_,
551
+ on: :_,
552
+ allow_nil: false,
553
+ allow_blank: false,
554
+ strict: false
555
+ ); end
556
+ end
557
+
558
+ mixes_in_class_methods(ClassMethods)
559
+ end
560
+
561
+ ActiveModel::Validations::NumericalityValidator::CHECKS = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
562
+
563
+ ActiveModel::Validations::NumericalityValidator::HEXADECIMAL_REGEX = T.let(T.unsafe(nil), Regexp)
564
+
565
+ ActiveModel::Validations::NumericalityValidator::INTEGER_REGEX = T.let(T.unsafe(nil), Regexp)
566
+
567
+ ActiveModel::Validations::NumericalityValidator::RESERVED_OPTIONS = T.let(T.unsafe(nil), T::Array[T.untyped])
568
+
569
+ class ActiveModel::Errors
570
+ include Enumerable
571
+ Elem = type_member(fixed: T.untyped)
572
+
573
+ sig { params(key: T.any(String, Symbol)).returns(T::Array[String]) }
574
+ def [](key); end
575
+
576
+ def each(&blk); end
577
+
578
+ # Adds `message` to the error messages and used validator type to `details` on `attribute`.
579
+ # More than one error can be added to the same `attribute`.
580
+ # If no `message` is supplied, `:invalid` is assumed.
581
+ #
582
+ # ```ruby
583
+ # person.errors.add(:name)
584
+ # # => ["is invalid"]
585
+ # person.errors.add(:name, :not_implemented, message: "must be implemented")
586
+ # # => ["is invalid", "must be implemented"]
587
+ # ```
588
+ #
589
+ # ```ruby
590
+ # person.errors.messages
591
+ # # => {:name=>["is invalid", "must be implemented"]}
592
+ # ```
593
+ #
594
+ # ```ruby
595
+ # person.errors.details
596
+ # # => {:name=>[{error: :not_implemented}, {error: :invalid}]}
597
+ # ```
598
+ #
599
+ # If `message` is a symbol, it will be translated using the appropriate
600
+ # scope (see `generate_message`).
601
+ #
602
+ # If `message` is a proc, it will be called, allowing for things like
603
+ # `Time.now` to be used within an error.
604
+ #
605
+ # If the `:strict` option is set to `true`, it will raise
606
+ # ActiveModel::StrictValidationFailed instead of adding the error.
607
+ # `:strict` option can also be set to any other exception.
608
+ #
609
+ # ```ruby
610
+ # person.errors.add(:name, :invalid, strict: true)
611
+ # # => ActiveModel::StrictValidationFailed: Name is invalid
612
+ # person.errors.add(:name, :invalid, strict: NameIsInvalid)
613
+ # # => NameIsInvalid: Name is invalid
614
+ #
615
+ # person.errors.messages # => {}
616
+ # ```
617
+ #
618
+ # `attribute` should be set to `:base` if the error is not
619
+ # directly associated with a single attribute.
620
+ #
621
+ # ```ruby
622
+ # person.errors.add(:base, :name_or_email_blank,
623
+ # message: "either name or email must be present")
624
+ # person.errors.messages
625
+ # # => {:base=>["either name or email must be present"]}
626
+ # person.errors.details
627
+ # # => {:base=>[{error: :name_or_email_blank}]}
628
+ # ```
629
+ sig do
630
+ params(
631
+ attribute: T.any(Symbol, String),
632
+ message: T.any(String, Symbol),
633
+ options: T::Hash[T.untyped, T.untyped]
634
+ ).returns(T.untyped)
635
+ end
636
+ def add(attribute, message = :invalid, options = {}); end
637
+
638
+ # Returns `true` if an error on the attribute with the given message is
639
+ # present, or `false` otherwise. `message` is treated the same as for `add`.
640
+ #
641
+ # ```ruby
642
+ # person.errors.add :name, :blank
643
+ # person.errors.added? :name, :blank # => true
644
+ # person.errors.added? :name, "can't be blank" # => true
645
+ # ```
646
+ #
647
+ # If the error message requires options, then it returns `true` with
648
+ # the correct options, or `false` with incorrect or missing options.
649
+ #
650
+ # ```ruby
651
+ # person.errors.add :name, :too_long, { count: 25 }
652
+ # person.errors.added? :name, :too_long, count: 25 # => true
653
+ # person.errors.added? :name, "is too long (maximum is 25 characters)" # => true
654
+ # person.errors.added? :name, :too_long, count: 24 # => false
655
+ # person.errors.added? :name, :too_long # => false
656
+ # person.errors.added? :name, "is too long" # => false
657
+ # ```
658
+ sig do
659
+ params(
660
+ attribute: Symbol,
661
+ message: T.any(String, Symbol),
662
+ options: T::Hash[T.untyped, T.untyped]
663
+ ).returns(T::Boolean)
664
+ end
665
+ def added?(attribute, message = :invalid, options = {}); end
666
+
667
+ # Returns `true` if an error on the attribute with the given message is
668
+ # present, or `false` otherwise. `message` is treated the same as for `add`.
669
+ #
670
+ # ```ruby
671
+ # person.errors.add :age
672
+ # person.errors.add :name, :too_long, { count: 25 }
673
+ # person.errors.of_kind? :age # => true
674
+ # person.errors.of_kind? :name # => false
675
+ # person.errors.of_kind? :name, :too_long # => true
676
+ # person.errors.of_kind? :name, "is too long (maximum is 25 characters)" # => true
677
+ # person.errors.of_kind? :name, :not_too_long # => false
678
+ # person.errors.of_kind? :name, "is too long" # => false
679
+ # ```
680
+ sig do
681
+ params(
682
+ attribute: Symbol,
683
+ message: T.any(String, Symbol)
684
+ ).returns(T::Boolean)
685
+ end
686
+ def of_kind?(attribute, message = :invalid); end
687
+
688
+ # Returns all the full error messages in an array.
689
+ #
690
+ # ```ruby
691
+ # class Person
692
+ # validates_presence_of :name, :address, :email
693
+ # validates_length_of :name, in: 5..30
694
+ # end
695
+ #
696
+ # person = Person.create(address: '123 First St.')
697
+ # person.errors.full_messages
698
+ # # => ["Name is too short (minimum is 5 characters)", "Name can't be blank", "Email can't be blank"]
699
+ # ```
700
+ sig { returns(T::Array[String]) }
701
+ def full_messages; end
702
+
703
+ sig { returns(T::Hash[Symbol, T::Array[String]]) }
704
+ def messages; end
705
+
706
+ sig { params(args: T.untyped, block: T.untyped).returns(T::Boolean) }
707
+ def empty?(*args, &block); end
708
+
709
+ sig { params(full_messages: T::Boolean).returns(T::Hash[Symbol, T::Array[String]]) }
710
+ def to_hash(full_messages = false); end
711
+ end
712
+
713
+ ActiveModel::Errors::CALLBACKS_OPTIONS = T.let(T.unsafe(nil), T::Array[T.untyped])
714
+
715
+ ActiveModel::Errors::MESSAGE_OPTIONS = T.let(T.unsafe(nil), T::Array[T.untyped])