rbs_rails 0.3.0 → 0.7.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +18 -0
  3. data/.gitignore +3 -0
  4. data/.gitmodules +0 -0
  5. data/CHANGELOG.md +8 -0
  6. data/Gemfile +3 -2
  7. data/README.md +23 -43
  8. data/Rakefile +11 -2
  9. data/Steepfile +10 -1
  10. data/assets/sig/pg.rbs +5 -0
  11. data/assets/sig/que.rbs +4 -0
  12. data/assets/sig/queue_classic.rbs +4 -0
  13. data/assets/sig/rack.rbs +1 -0
  14. data/assets/sig/rails.rbs +1 -5
  15. data/assets/sig/sidekiq.rbs +4 -0
  16. data/assets/sig/sneakers.rbs +4 -0
  17. data/assets/sig/sucker_punch.rbs +4 -0
  18. data/bin/add-type-params.rb +7 -0
  19. data/bin/gem_rbs +94 -0
  20. data/bin/postprocess.rb +15 -6
  21. data/bin/rbs +29 -2
  22. data/bin/rbs-prototype-rb.rb +59 -6
  23. data/lib/rbs_rails.rb +4 -0
  24. data/lib/rbs_rails/active_record.rb +100 -50
  25. data/lib/rbs_rails/dependency_builder.rb +43 -0
  26. data/lib/rbs_rails/rake_task.rb +83 -0
  27. data/lib/rbs_rails/util.rb +25 -0
  28. data/lib/rbs_rails/version.rb +1 -1
  29. data/rbs_rails.gemspec +2 -1
  30. data/sig/fileutils.rbs +1 -0
  31. data/sig/rake.rbs +6 -0
  32. data/sig/rbs_rails/active_record.rbs +8 -2
  33. data/sig/rbs_rails/dependency_builder.rbs +9 -0
  34. data/sig/rbs_rails/rake_task.rbs +26 -0
  35. data/sig/rbs_rails/util.rbs +11 -0
  36. metadata +34 -13
  37. data/.travis.yml +0 -8
  38. data/assets/sig/action_controller.rbs +0 -49
  39. data/assets/sig/active_record.rbs +0 -137
  40. data/assets/sig/generated/actionpack.rbs +0 -11677
  41. data/assets/sig/generated/actionview.rbs +0 -10491
  42. data/assets/sig/generated/activemodel.rbs +0 -4139
  43. data/assets/sig/generated/activerecord-meta-programming.rbs +0 -98
  44. data/assets/sig/generated/activerecord.rbs +0 -24023
  45. data/assets/sig/generated/activesupport.rbs +0 -12207
  46. data/assets/sig/generated/railties.rbs +0 -4647
@@ -1,4139 +0,0 @@
1
- module ActiveModel
2
- module AttributeAssignment
3
- include ActiveModel::ForbiddenAttributesProtection
4
-
5
- # Allows you to set all the attributes by passing in a hash of attributes with
6
- # keys matching the attribute names.
7
- #
8
- # If the passed hash responds to <tt>permitted?</tt> method and the return value
9
- # of this method is +false+ an <tt>ActiveModel::ForbiddenAttributesError</tt>
10
- # exception is raised.
11
- #
12
- # class Cat
13
- # include ActiveModel::AttributeAssignment
14
- # attr_accessor :name, :status
15
- # end
16
- #
17
- # cat = Cat.new
18
- # cat.assign_attributes(name: "Gorby", status: "yawning")
19
- # cat.name # => 'Gorby'
20
- # cat.status # => 'yawning'
21
- # cat.assign_attributes(status: "sleeping")
22
- # cat.name # => 'Gorby'
23
- # cat.status # => 'sleeping'
24
- def assign_attributes: (untyped new_attributes) -> (nil | untyped)
25
-
26
- def _assign_attributes: (untyped attributes) -> untyped
27
-
28
- def _assign_attribute: (untyped k, untyped v) -> untyped
29
- end
30
- end
31
-
32
- module ActiveModel
33
- # Raised when an attribute is not defined.
34
- #
35
- # class User < ActiveRecord::Base
36
- # has_many :pets
37
- # end
38
- #
39
- # user = User.first
40
- # user.pets.select(:id).first.user_id
41
- # # => ActiveModel::MissingAttributeError: missing attribute: user_id
42
- class MissingAttributeError[T] < NoMethodError[T]
43
- end
44
-
45
- # == Active \Model \Attribute \Methods
46
- #
47
- # Provides a way to add prefixes and suffixes to your methods as
48
- # well as handling the creation of <tt>ActiveRecord::Base</tt>-like
49
- # class methods such as +table_name+.
50
- #
51
- # The requirements to implement <tt>ActiveModel::AttributeMethods</tt> are to:
52
- #
53
- # * <tt>include ActiveModel::AttributeMethods</tt> in your class.
54
- # * Call each of its methods you want to add, such as +attribute_method_suffix+
55
- # or +attribute_method_prefix+.
56
- # * Call +define_attribute_methods+ after the other methods are called.
57
- # * Define the various generic +_attribute+ methods that you have declared.
58
- # * Define an +attributes+ method which returns a hash with each
59
- # attribute name in your model as hash key and the attribute value as hash value.
60
- # Hash keys must be strings.
61
- #
62
- # A minimal implementation could be:
63
- #
64
- # class Person
65
- # include ActiveModel::AttributeMethods
66
- #
67
- # attribute_method_affix prefix: 'reset_', suffix: '_to_default!'
68
- # attribute_method_suffix '_contrived?'
69
- # attribute_method_prefix 'clear_'
70
- # define_attribute_methods :name
71
- #
72
- # attr_accessor :name
73
- #
74
- # def attributes
75
- # { 'name' => @name }
76
- # end
77
- #
78
- # private
79
- #
80
- # def attribute_contrived?(attr)
81
- # true
82
- # end
83
- #
84
- # def clear_attribute(attr)
85
- # send("#{attr}=", nil)
86
- # end
87
- #
88
- # def reset_attribute_to_default!(attr)
89
- # send("#{attr}=", 'Default Name')
90
- # end
91
- # end
92
- module AttributeMethods
93
- extend ActiveSupport::Concern
94
-
95
- NAME_COMPILABLE_REGEXP: untyped
96
-
97
- CALL_COMPILABLE_REGEXP: untyped
98
-
99
- module ClassMethods
100
- # Declares a method available for all attributes with the given prefix.
101
- # Uses +method_missing+ and <tt>respond_to?</tt> to rewrite the method.
102
- #
103
- # #{prefix}#{attr}(*args, &block)
104
- #
105
- # to
106
- #
107
- # #{prefix}attribute(#{attr}, *args, &block)
108
- #
109
- # An instance method <tt>#{prefix}attribute</tt> must exist and accept
110
- # at least the +attr+ argument.
111
- #
112
- # class Person
113
- # include ActiveModel::AttributeMethods
114
- #
115
- # attr_accessor :name
116
- # attribute_method_prefix 'clear_'
117
- # define_attribute_methods :name
118
- #
119
- # private
120
- #
121
- # def clear_attribute(attr)
122
- # send("#{attr}=", nil)
123
- # end
124
- # end
125
- #
126
- # person = Person.new
127
- # person.name = 'Bob'
128
- # person.name # => "Bob"
129
- # person.clear_name
130
- # person.name # => nil
131
- def attribute_method_prefix: (*untyped prefixes) -> untyped
132
-
133
- # Declares a method available for all attributes with the given suffix.
134
- # Uses +method_missing+ and <tt>respond_to?</tt> to rewrite the method.
135
- #
136
- # #{attr}#{suffix}(*args, &block)
137
- #
138
- # to
139
- #
140
- # attribute#{suffix}(#{attr}, *args, &block)
141
- #
142
- # An <tt>attribute#{suffix}</tt> instance method must exist and accept at
143
- # least the +attr+ argument.
144
- #
145
- # class Person
146
- # include ActiveModel::AttributeMethods
147
- #
148
- # attr_accessor :name
149
- # attribute_method_suffix '_short?'
150
- # define_attribute_methods :name
151
- #
152
- # private
153
- #
154
- # def attribute_short?(attr)
155
- # send(attr).length < 5
156
- # end
157
- # end
158
- #
159
- # person = Person.new
160
- # person.name = 'Bob'
161
- # person.name # => "Bob"
162
- # person.name_short? # => true
163
- def attribute_method_suffix: (*untyped suffixes) -> untyped
164
-
165
- # Declares a method available for all attributes with the given prefix
166
- # and suffix. Uses +method_missing+ and <tt>respond_to?</tt> to rewrite
167
- # the method.
168
- #
169
- # #{prefix}#{attr}#{suffix}(*args, &block)
170
- #
171
- # to
172
- #
173
- # #{prefix}attribute#{suffix}(#{attr}, *args, &block)
174
- #
175
- # An <tt>#{prefix}attribute#{suffix}</tt> instance method must exist and
176
- # accept at least the +attr+ argument.
177
- #
178
- # class Person
179
- # include ActiveModel::AttributeMethods
180
- #
181
- # attr_accessor :name
182
- # attribute_method_affix prefix: 'reset_', suffix: '_to_default!'
183
- # define_attribute_methods :name
184
- #
185
- # private
186
- #
187
- # def reset_attribute_to_default!(attr)
188
- # send("#{attr}=", 'Default Name')
189
- # end
190
- # end
191
- #
192
- # person = Person.new
193
- # person.name # => 'Gem'
194
- # person.reset_name_to_default!
195
- # person.name # => 'Default Name'
196
- def attribute_method_affix: (*untyped affixes) -> untyped
197
-
198
- # Allows you to make aliases for attributes.
199
- #
200
- # class Person
201
- # include ActiveModel::AttributeMethods
202
- #
203
- # attr_accessor :name
204
- # attribute_method_suffix '_short?'
205
- # define_attribute_methods :name
206
- #
207
- # alias_attribute :nickname, :name
208
- #
209
- # private
210
- #
211
- # def attribute_short?(attr)
212
- # send(attr).length < 5
213
- # end
214
- # end
215
- #
216
- # person = Person.new
217
- # person.name = 'Bob'
218
- # person.name # => "Bob"
219
- # person.nickname # => "Bob"
220
- # person.name_short? # => true
221
- # person.nickname_short? # => true
222
- def alias_attribute: (untyped new_name, untyped old_name) -> untyped
223
-
224
- # Is +new_name+ an alias?
225
- def attribute_alias?: (untyped new_name) -> untyped
226
-
227
- # Returns the original name for the alias +name+
228
- def attribute_alias: (untyped name) -> untyped
229
-
230
- # Declares the attributes that should be prefixed and suffixed by
231
- # <tt>ActiveModel::AttributeMethods</tt>.
232
- #
233
- # To use, pass attribute names (as strings or symbols). Be sure to declare
234
- # +define_attribute_methods+ after you define any prefix, suffix or affix
235
- # methods, or they will not hook in.
236
- #
237
- # class Person
238
- # include ActiveModel::AttributeMethods
239
- #
240
- # attr_accessor :name, :age, :address
241
- # attribute_method_prefix 'clear_'
242
- #
243
- # # Call to define_attribute_methods must appear after the
244
- # # attribute_method_prefix, attribute_method_suffix or
245
- # # attribute_method_affix declarations.
246
- # define_attribute_methods :name, :age, :address
247
- #
248
- # private
249
- #
250
- # def clear_attribute(attr)
251
- # send("#{attr}=", nil)
252
- # end
253
- # end
254
- def define_attribute_methods: (*untyped attr_names) -> untyped
255
-
256
- # Declares an attribute that should be prefixed and suffixed by
257
- # <tt>ActiveModel::AttributeMethods</tt>.
258
- #
259
- # To use, pass an attribute name (as string or symbol). Be sure to declare
260
- # +define_attribute_method+ after you define any prefix, suffix or affix
261
- # method, or they will not hook in.
262
- #
263
- # class Person
264
- # include ActiveModel::AttributeMethods
265
- #
266
- # attr_accessor :name
267
- # attribute_method_suffix '_short?'
268
- #
269
- # # Call to define_attribute_method must appear after the
270
- # # attribute_method_prefix, attribute_method_suffix or
271
- # # attribute_method_affix declarations.
272
- # define_attribute_method :name
273
- #
274
- # private
275
- #
276
- # def attribute_short?(attr)
277
- # send(attr).length < 5
278
- # end
279
- # end
280
- #
281
- # person = Person.new
282
- # person.name = 'Bob'
283
- # person.name # => "Bob"
284
- # person.name_short? # => true
285
- def define_attribute_method: (untyped attr_name) -> untyped
286
-
287
- # Removes all the previously dynamically defined methods from the class.
288
- #
289
- # class Person
290
- # include ActiveModel::AttributeMethods
291
- #
292
- # attr_accessor :name
293
- # attribute_method_suffix '_short?'
294
- # define_attribute_method :name
295
- #
296
- # private
297
- #
298
- # def attribute_short?(attr)
299
- # send(attr).length < 5
300
- # end
301
- # end
302
- #
303
- # person = Person.new
304
- # person.name = 'Bob'
305
- # person.name_short? # => true
306
- #
307
- # Person.undefine_attribute_methods
308
- #
309
- # person.name_short? # => NoMethodError
310
- def undefine_attribute_methods: () -> untyped
311
-
312
- def generated_attribute_methods: () -> untyped
313
-
314
- def instance_method_already_implemented?: (untyped method_name) -> untyped
315
-
316
- # The methods +method_missing+ and +respond_to?+ of this module are
317
- # invoked often in a typical rails, both of which invoke the method
318
- # +matched_attribute_method+. The latter method iterates through an
319
- # array doing regular expression matches, which results in a lot of
320
- # object creations. Most of the time it returns a +nil+ match. As the
321
- # match result is always the same given a +method_name+, this cache is
322
- # used to alleviate the GC, which ultimately also speeds up the app
323
- # significantly (in our case our test suite finishes 10% faster with
324
- # this cache).
325
- def attribute_method_matchers_cache: () -> untyped
326
-
327
- def attribute_method_matchers_matching: (untyped method_name) -> untyped
328
-
329
- # Define a method `name` in `mod` that dispatches to `send`
330
- # using the given `extra` args. This falls back on `define_method`
331
- # and `send` if the given names cannot be compiled.
332
- def define_proxy_call: (untyped include_private, untyped mod, untyped name, untyped target, *untyped extra) -> untyped
333
-
334
- class AttributeMethodMatcher
335
- # nodoc:
336
- attr_reader prefix: untyped
337
-
338
- # nodoc:
339
- attr_reader suffix: untyped
340
-
341
- # nodoc:
342
- attr_reader target: untyped
343
-
344
- class AttributeMethodMatch < ::Struct[untyped]
345
- attr_accessor target(): untyped
346
-
347
- attr_accessor attr_name(): untyped
348
- end
349
-
350
- def initialize: (?::Hash[untyped, untyped] options) -> untyped
351
-
352
- def match: (untyped method_name) -> untyped
353
-
354
- def method_name: (untyped attr_name) -> untyped
355
-
356
- def plain?: () -> untyped
357
- end
358
- end
359
-
360
- # Allows access to the object attributes, which are held in the hash
361
- # returned by <tt>attributes</tt>, as though they were first-class
362
- # methods. So a +Person+ class with a +name+ attribute can for example use
363
- # <tt>Person#name</tt> and <tt>Person#name=</tt> and never directly use
364
- # the attributes hash -- except for multiple assignments with
365
- # <tt>ActiveRecord::Base#attributes=</tt>.
366
- #
367
- # It's also possible to instantiate related objects, so a <tt>Client</tt>
368
- # class belonging to the +clients+ table with a +master_id+ foreign key
369
- # can instantiate master through <tt>Client#master</tt>.
370
- def method_missing: (untyped method, *untyped args) { () -> untyped } -> untyped
371
-
372
- # +attribute_missing+ is like +method_missing+, but for attributes. When
373
- # +method_missing+ is called we check to see if there is a matching
374
- # attribute method. If so, we tell +attribute_missing+ to dispatch the
375
- # attribute. This method can be overloaded to customize the behavior.
376
- def attribute_missing: (untyped match, *untyped args) { () -> untyped } -> untyped
377
-
378
- def respond_to?: (untyped method, ?bool include_private_methods) -> untyped
379
-
380
- def attribute_method?: (untyped attr_name) -> untyped
381
-
382
- # Returns a struct representing the matching attribute method.
383
- # The struct's attributes are prefix, base and suffix.
384
- def matched_attribute_method: (untyped method_name) -> untyped
385
-
386
- def missing_attribute: (untyped attr_name, untyped stack) -> untyped
387
-
388
- def _read_attribute: (untyped attr) -> untyped
389
-
390
- module AttrNames
391
- # :nodoc:
392
- DEF_SAFE_NAME: untyped
393
-
394
- # We want to generate the methods via module_eval rather than
395
- # define_method, because define_method is slower on dispatch.
396
- # Evaluating many similar methods may use more memory as the instruction
397
- # sequences are duplicated and cached (in MRI). define_method may
398
- # be slower on dispatch, but if you're careful about the closure
399
- # created, then define_method will consume much less memory.
400
- #
401
- # But sometimes the database might return columns with
402
- # characters that are not allowed in normal method names (like
403
- # 'my_column(omg)'. So to work around this we first define with
404
- # the __temp__ identifier, and then use alias method to rename
405
- # it to what we want.
406
- #
407
- # We are also defining a constant to hold the frozen string of
408
- # the attribute name. Using a constant means that we do not have
409
- # to allocate an object on each call to the attribute method.
410
- # Making it frozen means that it doesn't get duped when used to
411
- # key the @attributes in read_attribute.
412
- def self.define_attribute_accessor_method: (untyped mod, untyped attr_name, ?writer: bool writer) { (untyped, untyped) -> untyped } -> untyped
413
- end
414
- end
415
- end
416
-
417
- module ActiveModel
418
- class AttributeMutationTracker
419
- # :nodoc:
420
- OPTION_NOT_GIVEN: untyped
421
-
422
- def initialize: (untyped attributes, ?untyped forced_changes) -> untyped
423
-
424
- def changed_attribute_names: () -> untyped
425
-
426
- def changed_values: () -> untyped
427
-
428
- def changes: () -> untyped
429
-
430
- def change_to_attribute: (untyped attr_name) -> untyped
431
-
432
- def any_changes?: () -> untyped
433
-
434
- def changed?: (untyped attr_name, ?to: untyped to, ?from: untyped from) -> untyped
435
-
436
- def changed_in_place?: (untyped attr_name) -> untyped
437
-
438
- def forget_change: (untyped attr_name) -> untyped
439
-
440
- def original_value: (untyped attr_name) -> untyped
441
-
442
- def force_change: (untyped attr_name) -> untyped
443
-
444
- attr_reader attributes: untyped
445
-
446
- attr_reader forced_changes: untyped
447
-
448
- def attr_names: () -> untyped
449
-
450
- def attribute_changed?: (untyped attr_name) -> untyped
451
-
452
- def fetch_value: (untyped attr_name) -> untyped
453
- end
454
-
455
- class ForcedMutationTracker < AttributeMutationTracker
456
- # :nodoc:
457
- def initialize: (untyped attributes, ?::Hash[untyped, untyped] forced_changes) -> untyped
458
-
459
- def changed_in_place?: (untyped attr_name) -> ::FalseClass
460
-
461
- def change_to_attribute: (untyped attr_name) -> untyped
462
-
463
- def forget_change: (untyped attr_name) -> untyped
464
-
465
- def original_value: (untyped attr_name) -> untyped
466
-
467
- def force_change: (untyped attr_name) -> untyped
468
-
469
- def finalize_changes: () -> untyped
470
-
471
- attr_reader finalized_changes: untyped
472
-
473
- def attr_names: () -> untyped
474
-
475
- def attribute_changed?: (untyped attr_name) -> untyped
476
-
477
- def fetch_value: (untyped attr_name) -> untyped
478
-
479
- def clone_value: (untyped attr_name) -> untyped
480
- end
481
-
482
- class NullMutationTracker
483
- # :nodoc:
484
- include Singleton
485
-
486
- def changed_attribute_names: () -> ::Array[untyped]
487
-
488
- def changed_values: () -> ::Hash[untyped, untyped]
489
-
490
- def changes: () -> ::Hash[untyped, untyped]
491
-
492
- def change_to_attribute: (untyped attr_name) -> nil
493
-
494
- def any_changes?: () -> ::FalseClass
495
-
496
- def changed?: (untyped attr_name) -> ::FalseClass
497
-
498
- def changed_in_place?: (untyped attr_name) -> ::FalseClass
499
-
500
- def original_value: (untyped attr_name) -> nil
501
- end
502
- end
503
-
504
- module ActiveModel
505
- class Attribute
506
- def self.from_database: (untyped name, untyped value, untyped `type`) -> FromDatabase
507
-
508
- def self.from_user: (untyped name, untyped value, untyped `type`, ?untyped? original_attribute) -> FromUser
509
-
510
- def self.with_cast_value: (untyped name, untyped value, untyped `type`) -> WithCastValue
511
-
512
- def self.null: (untyped name) -> Null
513
-
514
- def self.uninitialized: (untyped name, untyped `type`) -> Uninitialized
515
-
516
- attr_reader name: untyped
517
-
518
- attr_reader value_before_type_cast: untyped
519
-
520
- attr_reader type: untyped
521
-
522
- # This method should not be called directly.
523
- # Use #from_database or #from_user
524
- def initialize: (untyped name, untyped value_before_type_cast, untyped `type`, ?untyped? original_attribute) -> untyped
525
-
526
- def value: () -> untyped
527
-
528
- def original_value: () -> untyped
529
-
530
- def value_for_database: () -> untyped
531
-
532
- def changed?: () -> untyped
533
-
534
- def changed_in_place?: () -> untyped
535
-
536
- def forgetting_assignment: () -> untyped
537
-
538
- def with_value_from_user: (untyped value) -> untyped
539
-
540
- def with_value_from_database: (untyped value) -> untyped
541
-
542
- def with_cast_value: (untyped value) -> untyped
543
-
544
- def with_type: (untyped `type`) -> untyped
545
-
546
- def type_cast: () -> untyped
547
-
548
- def initialized?: () -> ::TrueClass
549
-
550
- def came_from_user?: () -> ::FalseClass
551
-
552
- def has_been_read?: () -> untyped
553
-
554
- def ==: (untyped other) -> untyped
555
-
556
- def hash: () -> untyped
557
-
558
- def init_with: (untyped coder) -> untyped
559
-
560
- def encode_with: (untyped coder) -> untyped
561
-
562
- def original_value_for_database: () -> untyped
563
-
564
- attr_reader original_attribute: untyped
565
-
566
- def initialize_dup: (untyped other) -> untyped
567
-
568
- def changed_from_assignment?: () -> untyped
569
-
570
- def _original_value_for_database: () -> untyped
571
-
572
- class FromDatabase < Attribute
573
- # :nodoc:
574
- def type_cast: (untyped value) -> untyped
575
-
576
- def _original_value_for_database: () -> untyped
577
- end
578
-
579
- class FromUser < Attribute
580
- # :nodoc:
581
- def type_cast: (untyped value) -> untyped
582
-
583
- def came_from_user?: () -> untyped
584
- end
585
-
586
- class WithCastValue < Attribute
587
- # :nodoc:
588
- def type_cast: (untyped value) -> untyped
589
-
590
- def changed_in_place?: () -> ::FalseClass
591
- end
592
-
593
- class Null < Attribute
594
- # :nodoc:
595
- def initialize: (untyped name) -> untyped
596
-
597
- def type_cast: () -> nil
598
-
599
- def with_type: (untyped `type`) -> untyped
600
-
601
- def with_value_from_database: (untyped value) -> untyped
602
- end
603
-
604
- class Uninitialized < Attribute
605
- # :nodoc:
606
- UNINITIALIZED_ORIGINAL_VALUE: untyped
607
-
608
- def initialize: (untyped name, untyped `type`) -> untyped
609
-
610
- def value: () { (untyped) -> untyped } -> untyped
611
-
612
- def original_value: () -> untyped
613
-
614
- def value_for_database: () -> nil
615
-
616
- def initialized?: () -> ::FalseClass
617
-
618
- def forgetting_assignment: () -> untyped
619
-
620
- def with_type: (untyped `type`) -> untyped
621
- end
622
- end
623
- end
624
-
625
- module ActiveModel
626
- class AttributeSet
627
- class Builder
628
- # :nodoc:
629
- # :nodoc:
630
- attr_reader types: untyped
631
-
632
- # :nodoc:
633
- # :nodoc:
634
- attr_reader default_attributes: untyped
635
-
636
- def initialize: (untyped types, ?::Hash[untyped, untyped] default_attributes) -> untyped
637
-
638
- def build_from_database: (?::Hash[untyped, untyped] values, ?::Hash[untyped, untyped] additional_types) -> AttributeSet
639
- end
640
- end
641
-
642
- class LazyAttributeHash
643
- def initialize: (untyped types, untyped values, untyped additional_types, untyped default_attributes, ?::Hash[untyped, untyped] delegate_hash) -> untyped
644
-
645
- def key?: (untyped key) -> untyped
646
-
647
- def []: (untyped key) -> untyped
648
-
649
- def []=: (untyped key, untyped value) -> untyped
650
-
651
- def deep_dup: () -> untyped
652
-
653
- def initialize_dup: (untyped _) -> untyped
654
-
655
- def select: () { (untyped, untyped) -> untyped } -> untyped
656
-
657
- def ==: (untyped other) -> untyped
658
-
659
- def marshal_dump: () -> ::Array[untyped]
660
-
661
- def marshal_load: (untyped values) -> untyped
662
-
663
- def materialize: () -> untyped
664
-
665
- attr_reader types: untyped
666
-
667
- attr_reader values: untyped
668
-
669
- attr_reader additional_types: untyped
670
-
671
- attr_reader delegate_hash: untyped
672
-
673
- attr_reader default_attributes: untyped
674
-
675
- def assign_default_value: (untyped name) -> untyped
676
- end
677
- end
678
-
679
- module ActiveModel
680
- class AttributeSet
681
- def initialize: (untyped attributes) -> untyped
682
-
683
- def []: (untyped name) -> untyped
684
-
685
- def []=: (untyped name, untyped value) -> untyped
686
-
687
- def values_before_type_cast: () -> untyped
688
-
689
- def to_hash: () -> untyped
690
-
691
- def key?: (untyped name) -> untyped
692
-
693
- def keys: () -> untyped
694
-
695
- def fetch_value: (untyped name) { () -> untyped } -> untyped
696
-
697
- def write_from_database: (untyped name, untyped value) -> untyped
698
-
699
- def write_from_user: (untyped name, untyped value) -> untyped
700
-
701
- def write_cast_value: (untyped name, untyped value) -> untyped
702
-
703
- def freeze: () -> untyped
704
-
705
- def deep_dup: () -> untyped
706
-
707
- def initialize_dup: (untyped _) -> untyped
708
-
709
- def initialize_clone: (untyped _) -> untyped
710
-
711
- def reset: (untyped key) -> untyped
712
-
713
- def accessed: () -> untyped
714
-
715
- def map: () { () -> untyped } -> AttributeSet
716
-
717
- def ==: (untyped other) -> untyped
718
-
719
- attr_reader attributes: untyped
720
-
721
- def initialized_attributes: () -> untyped
722
- end
723
- end
724
-
725
- module ActiveModel
726
- class AttributeSet
727
- class YAMLEncoder
728
- # Attempts to do more intelligent YAML dumping of an
729
- # ActiveModel::AttributeSet to reduce the size of the resulting string
730
- # :nodoc:
731
- def initialize: (untyped default_types) -> untyped
732
-
733
- def encode: (untyped attribute_set, untyped coder) -> untyped
734
-
735
- def decode: (untyped coder) -> untyped
736
-
737
- attr_reader default_types: untyped
738
- end
739
- end
740
- end
741
-
742
- module ActiveModel
743
- module Attributes
744
- # nodoc:
745
- extend ActiveSupport::Concern
746
-
747
- include ActiveModel::AttributeMethods
748
-
749
- extend ::ActiveModel::AttributeMethods::ClassMethods
750
-
751
- module ClassMethods
752
- def attribute: (untyped name, ?untyped `type`, **untyped options) -> untyped
753
-
754
- # Returns an array of attribute names as strings
755
- #
756
- # class Person
757
- # include ActiveModel::Attributes
758
- #
759
- # attribute :name, :string
760
- # attribute :age, :integer
761
- # end
762
- #
763
- # Person.attribute_names
764
- # # => ["name", "age"]
765
- def attribute_names: () -> untyped
766
-
767
- def define_method_attribute=: (untyped name) -> untyped
768
-
769
- NO_DEFAULT_PROVIDED: untyped
770
-
771
- def define_default_attribute: (untyped name, untyped value, untyped `type`) -> untyped
772
- end
773
-
774
- def initialize: () -> untyped
775
-
776
- # Returns a hash of all the attributes with their names as keys and the values of the attributes as values.
777
- #
778
- # class Person
779
- # include ActiveModel::Model
780
- # include ActiveModel::Attributes
781
- #
782
- # attribute :name, :string
783
- # attribute :age, :integer
784
- # end
785
- #
786
- # person = Person.new(name: 'Francesco', age: 22)
787
- # person.attributes
788
- # # => {"name"=>"Francesco", "age"=>22}
789
- def attributes: () -> untyped
790
-
791
- # Returns an array of attribute names as strings
792
- #
793
- # class Person
794
- # include ActiveModel::Attributes
795
- #
796
- # attribute :name, :string
797
- # attribute :age, :integer
798
- # end
799
- #
800
- # person = Person.new
801
- # person.attribute_names
802
- # # => ["name", "age"]
803
- def attribute_names: () -> untyped
804
-
805
- def write_attribute: (untyped attr_name, untyped value) -> untyped
806
-
807
- def attribute: (untyped attr_name) -> untyped
808
-
809
- # Dispatch target for <tt>*=</tt> attribute methods.
810
- def attribute=: (untyped attribute_name, untyped value) -> untyped
811
- end
812
- end
813
-
814
- module ActiveModel
815
- class Attribute
816
- class UserProvidedDefault < FromUser
817
- # :nodoc:
818
- # :nodoc:
819
- def initialize: (untyped name, untyped value, untyped `type`, untyped database_default) -> untyped
820
-
821
- def value_before_type_cast: () -> untyped
822
-
823
- def with_type: (untyped `type`) -> untyped
824
-
825
- def marshal_dump: () -> untyped
826
-
827
- def marshal_load: (untyped values) -> untyped
828
-
829
- attr_reader user_provided_value: untyped
830
- end
831
- end
832
- end
833
-
834
- module ActiveModel
835
- # == Active \Model \Callbacks
836
- #
837
- # Provides an interface for any class to have Active Record like callbacks.
838
- #
839
- # Like the Active Record methods, the callback chain is aborted as soon as
840
- # one of the methods throws +:abort+.
841
- #
842
- # First, extend ActiveModel::Callbacks from the class you are creating:
843
- #
844
- # class MyModel
845
- # extend ActiveModel::Callbacks
846
- # end
847
- #
848
- # Then define a list of methods that you want callbacks attached to:
849
- #
850
- # define_model_callbacks :create, :update
851
- #
852
- # This will provide all three standard callbacks (before, around and after)
853
- # for both the <tt>:create</tt> and <tt>:update</tt> methods. To implement,
854
- # you need to wrap the methods you want callbacks on in a block so that the
855
- # callbacks get a chance to fire:
856
- #
857
- # def create
858
- # run_callbacks :create do
859
- # # Your create action methods here
860
- # end
861
- # end
862
- #
863
- # Then in your class, you can use the +before_create+, +after_create+ and
864
- # +around_create+ methods, just as you would in an Active Record model.
865
- #
866
- # before_create :action_before_create
867
- #
868
- # def action_before_create
869
- # # Your code here
870
- # end
871
- #
872
- # When defining an around callback remember to yield to the block, otherwise
873
- # it won't be executed:
874
- #
875
- # around_create :log_status
876
- #
877
- # def log_status
878
- # puts 'going to call the block...'
879
- # yield
880
- # puts 'block successfully called.'
881
- # end
882
- #
883
- # You can choose to have only specific callbacks by passing a hash to the
884
- # +define_model_callbacks+ method.
885
- #
886
- # define_model_callbacks :create, only: [:after, :before]
887
- #
888
- # Would only create the +after_create+ and +before_create+ callback methods in
889
- # your class.
890
- #
891
- # NOTE: Calling the same callback multiple times will overwrite previous callback definitions.
892
- #
893
- module Callbacks
894
- def self.extended: (untyped base) -> untyped
895
-
896
- # define_model_callbacks accepts the same options +define_callbacks+ does,
897
- # in case you want to overwrite a default. Besides that, it also accepts an
898
- # <tt>:only</tt> option, where you can choose if you want all types (before,
899
- # around or after) or just some.
900
- #
901
- # define_model_callbacks :initializer, only: :after
902
- #
903
- # Note, the <tt>only: <type></tt> hash will apply to all callbacks defined
904
- # on that method call. To get around this you can call the define_model_callbacks
905
- # method as many times as you need.
906
- #
907
- # define_model_callbacks :create, only: :after
908
- # define_model_callbacks :update, only: :before
909
- # define_model_callbacks :destroy, only: :around
910
- #
911
- # Would create +after_create+, +before_update+ and +around_destroy+ methods
912
- # only.
913
- #
914
- # You can pass in a class to before_<type>, after_<type> and around_<type>,
915
- # in which case the callback will call that class's <action>_<type> method
916
- # passing the object that the callback is being called on.
917
- #
918
- # class MyModel
919
- # extend ActiveModel::Callbacks
920
- # define_model_callbacks :create
921
- #
922
- # before_create AnotherClass
923
- # end
924
- #
925
- # class AnotherClass
926
- # def self.before_create( obj )
927
- # # obj is the MyModel instance that the callback is being called on
928
- # end
929
- # end
930
- #
931
- # NOTE: +method_name+ passed to define_model_callbacks must not end with
932
- # <tt>!</tt>, <tt>?</tt> or <tt>=</tt>.
933
- def define_model_callbacks: (*untyped callbacks) -> untyped
934
-
935
- def _define_before_model_callback: (untyped klass, untyped callback) -> untyped
936
-
937
- def _define_around_model_callback: (untyped klass, untyped callback) -> untyped
938
-
939
- def _define_after_model_callback: (untyped klass, untyped callback) -> untyped
940
- end
941
- end
942
-
943
- module ActiveModel
944
- # == Active \Model \Conversion
945
- #
946
- # Handles default conversions: to_model, to_key, to_param, and to_partial_path.
947
- #
948
- # Let's take for example this non-persisted object.
949
- #
950
- # class ContactMessage
951
- # include ActiveModel::Conversion
952
- #
953
- # # ContactMessage are never persisted in the DB
954
- # def persisted?
955
- # false
956
- # end
957
- # end
958
- #
959
- # cm = ContactMessage.new
960
- # cm.to_model == cm # => true
961
- # cm.to_key # => nil
962
- # cm.to_param # => nil
963
- # cm.to_partial_path # => "contact_messages/contact_message"
964
- module Conversion
965
- extend ActiveSupport::Concern
966
-
967
- # If your object is already designed to implement all of the \Active \Model
968
- # you can use the default <tt>:to_model</tt> implementation, which simply
969
- # returns +self+.
970
- #
971
- # class Person
972
- # include ActiveModel::Conversion
973
- # end
974
- #
975
- # person = Person.new
976
- # person.to_model == person # => true
977
- #
978
- # If your model does not act like an \Active \Model object, then you should
979
- # define <tt>:to_model</tt> yourself returning a proxy object that wraps
980
- # your object with \Active \Model compliant methods.
981
- def to_model: () -> untyped
982
-
983
- # Returns an Array of all key attributes if any of the attributes is set, whether or not
984
- # the object is persisted. Returns +nil+ if there are no key attributes.
985
- #
986
- # class Person
987
- # include ActiveModel::Conversion
988
- # attr_accessor :id
989
- #
990
- # def initialize(id)
991
- # @id = id
992
- # end
993
- # end
994
- #
995
- # person = Person.new(1)
996
- # person.to_key # => [1]
997
- def to_key: () -> untyped
998
-
999
- # Returns a +string+ representing the object's key suitable for use in URLs,
1000
- # or +nil+ if <tt>persisted?</tt> is +false+.
1001
- #
1002
- # class Person
1003
- # include ActiveModel::Conversion
1004
- # attr_accessor :id
1005
- #
1006
- # def initialize(id)
1007
- # @id = id
1008
- # end
1009
- #
1010
- # def persisted?
1011
- # true
1012
- # end
1013
- # end
1014
- #
1015
- # person = Person.new(1)
1016
- # person.to_param # => "1"
1017
- def to_param: () -> untyped
1018
-
1019
- # Returns a +string+ identifying the path associated with the object.
1020
- # ActionPack uses this to find a suitable partial to represent the object.
1021
- #
1022
- # class Person
1023
- # include ActiveModel::Conversion
1024
- # end
1025
- #
1026
- # person = Person.new
1027
- # person.to_partial_path # => "people/person"
1028
- def to_partial_path: () -> untyped
1029
-
1030
- module ClassMethods
1031
- def _to_partial_path: () -> untyped
1032
- end
1033
- end
1034
- end
1035
-
1036
- module ActiveModel
1037
- # == Active \Model \Dirty
1038
- #
1039
- # Provides a way to track changes in your object in the same way as
1040
- # Active Record does.
1041
- #
1042
- # The requirements for implementing ActiveModel::Dirty are:
1043
- #
1044
- # * <tt>include ActiveModel::Dirty</tt> in your object.
1045
- # * Call <tt>define_attribute_methods</tt> passing each method you want to
1046
- # track.
1047
- # * Call <tt>[attr_name]_will_change!</tt> before each change to the tracked
1048
- # attribute.
1049
- # * Call <tt>changes_applied</tt> after the changes are persisted.
1050
- # * Call <tt>clear_changes_information</tt> when you want to reset the changes
1051
- # information.
1052
- # * Call <tt>restore_attributes</tt> when you want to restore previous data.
1053
- #
1054
- # A minimal implementation could be:
1055
- #
1056
- # class Person
1057
- # include ActiveModel::Dirty
1058
- #
1059
- # define_attribute_methods :name
1060
- #
1061
- # def initialize
1062
- # @name = nil
1063
- # end
1064
- #
1065
- # def name
1066
- # @name
1067
- # end
1068
- #
1069
- # def name=(val)
1070
- # name_will_change! unless val == @name
1071
- # @name = val
1072
- # end
1073
- #
1074
- # def save
1075
- # # do persistence work
1076
- #
1077
- # changes_applied
1078
- # end
1079
- #
1080
- # def reload!
1081
- # # get the values from the persistence layer
1082
- #
1083
- # clear_changes_information
1084
- # end
1085
- #
1086
- # def rollback!
1087
- # restore_attributes
1088
- # end
1089
- # end
1090
- #
1091
- # A newly instantiated +Person+ object is unchanged:
1092
- #
1093
- # person = Person.new
1094
- # person.changed? # => false
1095
- #
1096
- # Change the name:
1097
- #
1098
- # person.name = 'Bob'
1099
- # person.changed? # => true
1100
- # person.name_changed? # => true
1101
- # person.name_changed?(from: nil, to: "Bob") # => true
1102
- # person.name_was # => nil
1103
- # person.name_change # => [nil, "Bob"]
1104
- # person.name = 'Bill'
1105
- # person.name_change # => [nil, "Bill"]
1106
- #
1107
- # Save the changes:
1108
- #
1109
- # person.save
1110
- # person.changed? # => false
1111
- # person.name_changed? # => false
1112
- #
1113
- # Reset the changes:
1114
- #
1115
- # person.previous_changes # => {"name" => [nil, "Bill"]}
1116
- # person.name_previously_changed? # => true
1117
- # person.name_previous_change # => [nil, "Bill"]
1118
- # person.reload!
1119
- # person.previous_changes # => {}
1120
- #
1121
- # Rollback the changes:
1122
- #
1123
- # person.name = "Uncle Bob"
1124
- # person.rollback!
1125
- # person.name # => "Bill"
1126
- # person.name_changed? # => false
1127
- #
1128
- # Assigning the same value leaves the attribute unchanged:
1129
- #
1130
- # person.name = 'Bill'
1131
- # person.name_changed? # => false
1132
- # person.name_change # => nil
1133
- #
1134
- # Which attributes have changed?
1135
- #
1136
- # person.name = 'Bob'
1137
- # person.changed # => ["name"]
1138
- # person.changes # => {"name" => ["Bill", "Bob"]}
1139
- #
1140
- # If an attribute is modified in-place then make use of
1141
- # <tt>[attribute_name]_will_change!</tt> to mark that the attribute is changing.
1142
- # Otherwise \Active \Model can't track changes to in-place attributes. Note
1143
- # that Active Record can detect in-place modifications automatically. You do
1144
- # not need to call <tt>[attribute_name]_will_change!</tt> on Active Record models.
1145
- #
1146
- # person.name_will_change!
1147
- # person.name_change # => ["Bill", "Bill"]
1148
- # person.name << 'y'
1149
- # person.name_change # => ["Bill", "Billy"]
1150
- module Dirty
1151
- extend ActiveSupport::Concern
1152
-
1153
- include ActiveModel::AttributeMethods
1154
-
1155
- extend ::ActiveModel::AttributeMethods::ClassMethods
1156
-
1157
- def initialize_dup: (untyped other) -> untyped
1158
-
1159
- # Clears dirty data and moves +changes+ to +previously_changed+ and
1160
- # +mutations_from_database+ to +mutations_before_last_save+ respectively.
1161
- def changes_applied: () -> untyped
1162
-
1163
- # Returns +true+ if any of the attributes has unsaved changes, +false+ otherwise.
1164
- #
1165
- # person.changed? # => false
1166
- # person.name = 'bob'
1167
- # person.changed? # => true
1168
- def changed?: () -> untyped
1169
-
1170
- # Returns an array with the name of the attributes with unsaved changes.
1171
- #
1172
- # person.changed # => []
1173
- # person.name = 'bob'
1174
- # person.changed # => ["name"]
1175
- def changed: () -> untyped
1176
-
1177
- def attribute_changed?: (untyped attr_name, **untyped options) -> untyped
1178
-
1179
- def attribute_was: (untyped attr_name) -> untyped
1180
-
1181
- def attribute_previously_changed?: (untyped attr_name) -> untyped
1182
-
1183
- # Restore all previous data of the provided attributes.
1184
- def restore_attributes: (?untyped attr_names) -> untyped
1185
-
1186
- # Clears all dirty data: current changes and previous changes.
1187
- def clear_changes_information: () -> untyped
1188
-
1189
- def clear_attribute_changes: (untyped attr_names) -> untyped
1190
-
1191
- # Returns a hash of the attributes with unsaved changes indicating their original
1192
- # values like <tt>attr => original value</tt>.
1193
- #
1194
- # person.name # => "bob"
1195
- # person.name = 'robert'
1196
- # person.changed_attributes # => {"name" => "bob"}
1197
- def changed_attributes: () -> untyped
1198
-
1199
- # Returns a hash of changed attributes indicating their original
1200
- # and new values like <tt>attr => [original value, new value]</tt>.
1201
- #
1202
- # person.changes # => {}
1203
- # person.name = 'bob'
1204
- # person.changes # => { "name" => ["bill", "bob"] }
1205
- def changes: () -> untyped
1206
-
1207
- # Returns a hash of attributes that were changed before the model was saved.
1208
- #
1209
- # person.name # => "bob"
1210
- # person.name = 'robert'
1211
- # person.save
1212
- # person.previous_changes # => {"name" => ["bob", "robert"]}
1213
- def previous_changes: () -> untyped
1214
-
1215
- def attribute_changed_in_place?: (untyped attr_name) -> untyped
1216
-
1217
- def clear_attribute_change: (untyped attr_name) -> untyped
1218
-
1219
- def mutations_from_database: () -> untyped
1220
-
1221
- def forget_attribute_assignments: () -> untyped
1222
-
1223
- def mutations_before_last_save: () -> untyped
1224
-
1225
- # Dispatch target for <tt>*_change</tt> attribute methods.
1226
- def attribute_change: (untyped attr_name) -> untyped
1227
-
1228
- # Dispatch target for <tt>*_previous_change</tt> attribute methods.
1229
- def attribute_previous_change: (untyped attr_name) -> untyped
1230
-
1231
- # Dispatch target for <tt>*_will_change!</tt> attribute methods.
1232
- def attribute_will_change!: (untyped attr_name) -> untyped
1233
-
1234
- # Dispatch target for <tt>restore_*!</tt> attribute methods.
1235
- def restore_attribute!: (untyped attr_name) -> untyped
1236
- end
1237
- end
1238
-
1239
- module ActiveModel
1240
- # == Active \Model \Errors
1241
- #
1242
- # Provides a modified +Hash+ that you can include in your object
1243
- # for handling error messages and interacting with Action View helpers.
1244
- #
1245
- # A minimal implementation could be:
1246
- #
1247
- # class Person
1248
- # # Required dependency for ActiveModel::Errors
1249
- # extend ActiveModel::Naming
1250
- #
1251
- # def initialize
1252
- # @errors = ActiveModel::Errors.new(self)
1253
- # end
1254
- #
1255
- # attr_accessor :name
1256
- # attr_reader :errors
1257
- #
1258
- # def validate!
1259
- # errors.add(:name, :blank, message: "cannot be nil") if name.nil?
1260
- # end
1261
- #
1262
- # # The following methods are needed to be minimally implemented
1263
- #
1264
- # def read_attribute_for_validation(attr)
1265
- # send(attr)
1266
- # end
1267
- #
1268
- # def self.human_attribute_name(attr, options = {})
1269
- # attr
1270
- # end
1271
- #
1272
- # def self.lookup_ancestors
1273
- # [self]
1274
- # end
1275
- # end
1276
- #
1277
- # The last three methods are required in your object for +Errors+ to be
1278
- # able to generate error messages correctly and also handle multiple
1279
- # languages. Of course, if you extend your object with <tt>ActiveModel::Translation</tt>
1280
- # you will not need to implement the last two. Likewise, using
1281
- # <tt>ActiveModel::Validations</tt> will handle the validation related methods
1282
- # for you.
1283
- #
1284
- # The above allows you to do:
1285
- #
1286
- # person = Person.new
1287
- # person.validate! # => ["cannot be nil"]
1288
- # person.errors.full_messages # => ["name cannot be nil"]
1289
- # # etc..
1290
- class Errors
1291
- include Enumerable[untyped, untyped]
1292
-
1293
- CALLBACKS_OPTIONS: ::Array[untyped]
1294
-
1295
- MESSAGE_OPTIONS: ::Array[untyped]
1296
-
1297
- attr_accessor i18n_customize_full_message: untyped
1298
-
1299
- attr_reader messages: untyped
1300
-
1301
- attr_reader details: untyped
1302
-
1303
- # Pass in the instance of the object that is using the errors object.
1304
- #
1305
- # class Person
1306
- # def initialize
1307
- # @errors = ActiveModel::Errors.new(self)
1308
- # end
1309
- # end
1310
- def initialize: (untyped base) -> untyped
1311
-
1312
- def initialize_dup: (untyped other) -> untyped
1313
-
1314
- def copy!: (untyped other) -> untyped
1315
-
1316
- # Merges the errors from <tt>other</tt>.
1317
- #
1318
- # other - The ActiveModel::Errors instance.
1319
- #
1320
- # Examples
1321
- #
1322
- # person.errors.merge!(other)
1323
- def merge!: (untyped other) -> untyped
1324
-
1325
- # Removes all errors except the given keys. Returns a hash containing the removed errors.
1326
- #
1327
- # person.errors.keys # => [:name, :age, :gender, :city]
1328
- # person.errors.slice!(:age, :gender) # => { :name=>["cannot be nil"], :city=>["cannot be nil"] }
1329
- # person.errors.keys # => [:age, :gender]
1330
- def slice!: (*untyped keys) -> untyped
1331
-
1332
- # Clear the error messages.
1333
- #
1334
- # person.errors.full_messages # => ["name cannot be nil"]
1335
- # person.errors.clear
1336
- # person.errors.full_messages # => []
1337
- def clear: () -> untyped
1338
-
1339
- # Returns +true+ if the error messages include an error for the given key
1340
- # +attribute+, +false+ otherwise.
1341
- #
1342
- # person.errors.messages # => {:name=>["cannot be nil"]}
1343
- # person.errors.include?(:name) # => true
1344
- # person.errors.include?(:age) # => false
1345
- def include?: (untyped attribute) -> untyped
1346
-
1347
- # Delete messages for +key+. Returns the deleted messages.
1348
- #
1349
- # person.errors[:name] # => ["cannot be nil"]
1350
- # person.errors.delete(:name) # => ["cannot be nil"]
1351
- # person.errors[:name] # => []
1352
- def delete: (untyped key) -> untyped
1353
-
1354
- # When passed a symbol or a name of a method, returns an array of errors
1355
- # for the method.
1356
- #
1357
- # person.errors[:name] # => ["cannot be nil"]
1358
- # person.errors['name'] # => ["cannot be nil"]
1359
- def []: (untyped attribute) -> untyped
1360
-
1361
- # Iterates through each error key, value pair in the error messages hash.
1362
- # Yields the attribute and the error for that attribute. If the attribute
1363
- # has more than one error message, yields once for each error message.
1364
- #
1365
- # person.errors.add(:name, :blank, message: "can't be blank")
1366
- # person.errors.each do |attribute, error|
1367
- # # Will yield :name and "can't be blank"
1368
- # end
1369
- #
1370
- # person.errors.add(:name, :not_specified, message: "must be specified")
1371
- # person.errors.each do |attribute, error|
1372
- # # Will yield :name and "can't be blank"
1373
- # # then yield :name and "must be specified"
1374
- # end
1375
- def each: () { (untyped, untyped) -> untyped } -> untyped
1376
-
1377
- # Returns the number of error messages.
1378
- #
1379
- # person.errors.add(:name, :blank, message: "can't be blank")
1380
- # person.errors.size # => 1
1381
- # person.errors.add(:name, :not_specified, message: "must be specified")
1382
- # person.errors.size # => 2
1383
- def size: () -> untyped
1384
-
1385
- # Returns all message values.
1386
- #
1387
- # person.errors.messages # => {:name=>["cannot be nil", "must be specified"]}
1388
- # person.errors.values # => [["cannot be nil", "must be specified"]]
1389
- def values: () -> untyped
1390
-
1391
- # Returns all message keys.
1392
- #
1393
- # person.errors.messages # => {:name=>["cannot be nil", "must be specified"]}
1394
- # person.errors.keys # => [:name]
1395
- def keys: () -> untyped
1396
-
1397
- # Returns +true+ if no errors are found, +false+ otherwise.
1398
- # If the error message is a string it can be empty.
1399
- #
1400
- # person.errors.full_messages # => ["name cannot be nil"]
1401
- # person.errors.empty? # => false
1402
- def empty?: () -> untyped
1403
-
1404
- # Returns an xml formatted representation of the Errors hash.
1405
- #
1406
- # person.errors.add(:name, :blank, message: "can't be blank")
1407
- # person.errors.add(:name, :not_specified, message: "must be specified")
1408
- # person.errors.to_xml
1409
- # # =>
1410
- # # <?xml version=\"1.0\" encoding=\"UTF-8\"?>
1411
- # # <errors>
1412
- # # <error>name can't be blank</error>
1413
- # # <error>name must be specified</error>
1414
- # # </errors>
1415
- def to_xml: (?::Hash[untyped, untyped] options) -> untyped
1416
-
1417
- # Returns a Hash that can be used as the JSON representation for this
1418
- # object. You can pass the <tt>:full_messages</tt> option. This determines
1419
- # if the json object should contain full messages or not (false by default).
1420
- #
1421
- # person.errors.as_json # => {:name=>["cannot be nil"]}
1422
- # person.errors.as_json(full_messages: true) # => {:name=>["name cannot be nil"]}
1423
- def as_json: (?untyped? options) -> untyped
1424
-
1425
- # Returns a Hash of attributes with their error messages. If +full_messages+
1426
- # is +true+, it will contain full messages (see +full_message+).
1427
- #
1428
- # person.errors.to_hash # => {:name=>["cannot be nil"]}
1429
- # person.errors.to_hash(true) # => {:name=>["name cannot be nil"]}
1430
- def to_hash: (?bool full_messages) -> untyped
1431
-
1432
- # Adds +message+ to the error messages and used validator type to +details+ on +attribute+.
1433
- # More than one error can be added to the same +attribute+.
1434
- # If no +message+ is supplied, <tt>:invalid</tt> is assumed.
1435
- #
1436
- # person.errors.add(:name)
1437
- # # => ["is invalid"]
1438
- # person.errors.add(:name, :not_implemented, message: "must be implemented")
1439
- # # => ["is invalid", "must be implemented"]
1440
- #
1441
- # person.errors.messages
1442
- # # => {:name=>["is invalid", "must be implemented"]}
1443
- #
1444
- # person.errors.details
1445
- # # => {:name=>[{error: :not_implemented}, {error: :invalid}]}
1446
- #
1447
- # If +message+ is a symbol, it will be translated using the appropriate
1448
- # scope (see +generate_message+).
1449
- #
1450
- # If +message+ is a proc, it will be called, allowing for things like
1451
- # <tt>Time.now</tt> to be used within an error.
1452
- #
1453
- # If the <tt>:strict</tt> option is set to +true+, it will raise
1454
- # ActiveModel::StrictValidationFailed instead of adding the error.
1455
- # <tt>:strict</tt> option can also be set to any other exception.
1456
- #
1457
- # person.errors.add(:name, :invalid, strict: true)
1458
- # # => ActiveModel::StrictValidationFailed: Name is invalid
1459
- # person.errors.add(:name, :invalid, strict: NameIsInvalid)
1460
- # # => NameIsInvalid: Name is invalid
1461
- #
1462
- # person.errors.messages # => {}
1463
- #
1464
- # +attribute+ should be set to <tt>:base</tt> if the error is not
1465
- # directly associated with a single attribute.
1466
- #
1467
- # person.errors.add(:base, :name_or_email_blank,
1468
- # message: "either name or email must be present")
1469
- # person.errors.messages
1470
- # # => {:base=>["either name or email must be present"]}
1471
- # person.errors.details
1472
- # # => {:base=>[{error: :name_or_email_blank}]}
1473
- def add: (untyped attribute, ?::Symbol message, ?::Hash[untyped, untyped] options) -> untyped
1474
-
1475
- # Returns +true+ if an error on the attribute with the given message is
1476
- # present, or +false+ otherwise. +message+ is treated the same as for +add+.
1477
- #
1478
- # person.errors.add :name, :blank
1479
- # person.errors.added? :name, :blank # => true
1480
- # person.errors.added? :name, "can't be blank" # => true
1481
- #
1482
- # If the error message requires options, then it returns +true+ with
1483
- # the correct options, or +false+ with incorrect or missing options.
1484
- #
1485
- # person.errors.add :name, :too_long, { count: 25 }
1486
- # person.errors.added? :name, :too_long, count: 25 # => true
1487
- # person.errors.added? :name, "is too long (maximum is 25 characters)" # => true
1488
- # person.errors.added? :name, :too_long, count: 24 # => false
1489
- # person.errors.added? :name, :too_long # => false
1490
- # person.errors.added? :name, "is too long" # => false
1491
- def added?: (untyped attribute, ?::Symbol message, ?::Hash[untyped, untyped] options) -> untyped
1492
-
1493
- # Returns +true+ if an error on the attribute with the given message is
1494
- # present, or +false+ otherwise. +message+ is treated the same as for +add+.
1495
- #
1496
- # person.errors.add :age
1497
- # person.errors.add :name, :too_long, { count: 25 }
1498
- # person.errors.of_kind? :age # => true
1499
- # person.errors.of_kind? :name # => false
1500
- # person.errors.of_kind? :name, :too_long # => true
1501
- # person.errors.of_kind? :name, "is too long (maximum is 25 characters)" # => true
1502
- # person.errors.of_kind? :name, :not_too_long # => false
1503
- # person.errors.of_kind? :name, "is too long" # => false
1504
- def of_kind?: (untyped attribute, ?::Symbol message) -> untyped
1505
-
1506
- # Returns all the full error messages in an array.
1507
- #
1508
- # class Person
1509
- # validates_presence_of :name, :address, :email
1510
- # validates_length_of :name, in: 5..30
1511
- # end
1512
- #
1513
- # person = Person.create(address: '123 First St.')
1514
- # person.errors.full_messages
1515
- # # => ["Name is too short (minimum is 5 characters)", "Name can't be blank", "Email can't be blank"]
1516
- def full_messages: () -> untyped
1517
-
1518
- # Returns all the full error messages for a given attribute in an array.
1519
- #
1520
- # class Person
1521
- # validates_presence_of :name, :email
1522
- # validates_length_of :name, in: 5..30
1523
- # end
1524
- #
1525
- # person = Person.create()
1526
- # person.errors.full_messages_for(:name)
1527
- # # => ["Name is too short (minimum is 5 characters)", "Name can't be blank"]
1528
- def full_messages_for: (untyped attribute) -> untyped
1529
-
1530
- # Returns a full message for a given attribute.
1531
- #
1532
- # person.errors.full_message(:name, 'is invalid') # => "Name is invalid"
1533
- #
1534
- # The `"%{attribute} %{message}"` error format can be overridden with either
1535
- #
1536
- # * <tt>activemodel.errors.models.person/contacts/addresses.attributes.street.format</tt>
1537
- # * <tt>activemodel.errors.models.person/contacts/addresses.format</tt>
1538
- # * <tt>activemodel.errors.models.person.attributes.name.format</tt>
1539
- # * <tt>activemodel.errors.models.person.format</tt>
1540
- # * <tt>errors.format</tt>
1541
- def full_message: (untyped attribute, untyped message) -> untyped
1542
-
1543
- # Translates an error message in its default scope
1544
- # (<tt>activemodel.errors.messages</tt>).
1545
- #
1546
- # Error messages are first looked up in <tt>activemodel.errors.models.MODEL.attributes.ATTRIBUTE.MESSAGE</tt>,
1547
- # if it's not there, it's looked up in <tt>activemodel.errors.models.MODEL.MESSAGE</tt> and if
1548
- # that is not there also, it returns the translation of the default message
1549
- # (e.g. <tt>activemodel.errors.messages.MESSAGE</tt>). The translated model
1550
- # name, translated attribute name and the value are available for
1551
- # interpolation.
1552
- #
1553
- # When using inheritance in your models, it will check all the inherited
1554
- # models too, but only if the model itself hasn't been found. Say you have
1555
- # <tt>class Admin < User; end</tt> and you wanted the translation for
1556
- # the <tt>:blank</tt> error message for the <tt>title</tt> attribute,
1557
- # it looks for these translations:
1558
- #
1559
- # * <tt>activemodel.errors.models.admin.attributes.title.blank</tt>
1560
- # * <tt>activemodel.errors.models.admin.blank</tt>
1561
- # * <tt>activemodel.errors.models.user.attributes.title.blank</tt>
1562
- # * <tt>activemodel.errors.models.user.blank</tt>
1563
- # * any default you provided through the +options+ hash (in the <tt>activemodel.errors</tt> scope)
1564
- # * <tt>activemodel.errors.messages.blank</tt>
1565
- # * <tt>errors.attributes.title.blank</tt>
1566
- # * <tt>errors.messages.blank</tt>
1567
- def generate_message: (untyped attribute, ?::Symbol `type`, ?::Hash[untyped, untyped] options) -> untyped
1568
-
1569
- def marshal_dump: () -> ::Array[untyped]
1570
-
1571
- def marshal_load: (untyped array) -> untyped
1572
-
1573
- def init_with: (untyped coder) -> untyped
1574
-
1575
- def normalize_message: (untyped attribute, untyped message, untyped options) -> untyped
1576
-
1577
- def normalize_detail: (untyped message, untyped options) -> untyped
1578
-
1579
- def without_default_proc: (untyped hash) -> untyped
1580
-
1581
- def apply_default_array: (untyped hash) -> untyped
1582
- end
1583
-
1584
- # Raised when a validation cannot be corrected by end users and are considered
1585
- # exceptional.
1586
- #
1587
- # class Person
1588
- # include ActiveModel::Validations
1589
- #
1590
- # attr_accessor :name
1591
- #
1592
- # validates_presence_of :name, strict: true
1593
- # end
1594
- #
1595
- # person = Person.new
1596
- # person.name = nil
1597
- # person.valid?
1598
- # # => ActiveModel::StrictValidationFailed: Name can't be blank
1599
- class StrictValidationFailed < StandardError
1600
- end
1601
-
1602
- # Raised when attribute values are out of range.
1603
- class RangeError < ::RangeError
1604
- end
1605
-
1606
- # Raised when unknown attributes are supplied via mass assignment.
1607
- #
1608
- # class Person
1609
- # include ActiveModel::AttributeAssignment
1610
- # include ActiveModel::Validations
1611
- # end
1612
- #
1613
- # person = Person.new
1614
- # person.assign_attributes(name: 'Gorby')
1615
- # # => ActiveModel::UnknownAttributeError: unknown attribute 'name' for Person.
1616
- class UnknownAttributeError[T] < NoMethodError[T]
1617
- attr_reader record: untyped
1618
-
1619
- attr_reader attribute: untyped
1620
-
1621
- def initialize: (untyped record, untyped attribute) -> untyped
1622
- end
1623
- end
1624
-
1625
- module ActiveModel
1626
- # Raised when forbidden attributes are used for mass assignment.
1627
- #
1628
- # class Person < ActiveRecord::Base
1629
- # end
1630
- #
1631
- # params = ActionController::Parameters.new(name: 'Bob')
1632
- # Person.new(params)
1633
- # # => ActiveModel::ForbiddenAttributesError
1634
- #
1635
- # params.permit!
1636
- # Person.new(params)
1637
- # # => #<Person id: nil, name: "Bob">
1638
- class ForbiddenAttributesError < StandardError
1639
- end
1640
-
1641
- module ForbiddenAttributesProtection
1642
- def sanitize_for_mass_assignment: (untyped attributes) -> untyped
1643
- end
1644
- end
1645
-
1646
- module ActiveModel
1647
- # Returns the version of the currently loaded \Active \Model as a <tt>Gem::Version</tt>
1648
- def self.gem_version: () -> Gem::Version
1649
-
1650
- module VERSION
1651
- MAJOR: ::Integer
1652
-
1653
- MINOR: ::Integer
1654
-
1655
- TINY: ::Integer
1656
-
1657
- PRE: ::String
1658
-
1659
- STRING: untyped
1660
- end
1661
- end
1662
-
1663
- module ActiveModel
1664
- module Lint
1665
- # == Active \Model \Lint \Tests
1666
- #
1667
- # You can test whether an object is compliant with the Active \Model API by
1668
- # including <tt>ActiveModel::Lint::Tests</tt> in your TestCase. It will
1669
- # include tests that tell you whether your object is fully compliant,
1670
- # or if not, which aspects of the API are not implemented.
1671
- #
1672
- # Note an object is not required to implement all APIs in order to work
1673
- # with Action Pack. This module only intends to provide guidance in case
1674
- # you want all features out of the box.
1675
- #
1676
- # These tests do not attempt to determine the semantic correctness of the
1677
- # returned values. For instance, you could implement <tt>valid?</tt> to
1678
- # always return +true+, and the tests would pass. It is up to you to ensure
1679
- # that the values are semantically meaningful.
1680
- #
1681
- # Objects you pass in are expected to return a compliant object from a call
1682
- # to <tt>to_model</tt>. It is perfectly fine for <tt>to_model</tt> to return
1683
- # +self+.
1684
- module Tests
1685
- # Passes if the object's model responds to <tt>to_key</tt> and if calling
1686
- # this method returns +nil+ when the object is not persisted.
1687
- # Fails otherwise.
1688
- #
1689
- # <tt>to_key</tt> returns an Enumerable of all (primary) key attributes
1690
- # of the model, and is used to a generate unique DOM id for the object.
1691
- def test_to_key: () -> untyped
1692
-
1693
- # Passes if the object's model responds to <tt>to_param</tt> and if
1694
- # calling this method returns +nil+ when the object is not persisted.
1695
- # Fails otherwise.
1696
- #
1697
- # <tt>to_param</tt> is used to represent the object's key in URLs.
1698
- # Implementers can decide to either raise an exception or provide a
1699
- # default in case the record uses a composite primary key. There are no
1700
- # tests for this behavior in lint because it doesn't make sense to force
1701
- # any of the possible implementation strategies on the implementer.
1702
- def test_to_param: () -> untyped
1703
-
1704
- # Passes if the object's model responds to <tt>to_partial_path</tt> and if
1705
- # calling this method returns a string. Fails otherwise.
1706
- #
1707
- # <tt>to_partial_path</tt> is used for looking up partials. For example,
1708
- # a BlogPost model might return "blog_posts/blog_post".
1709
- def test_to_partial_path: () -> untyped
1710
-
1711
- # Passes if the object's model responds to <tt>persisted?</tt> and if
1712
- # calling this method returns either +true+ or +false+. Fails otherwise.
1713
- #
1714
- # <tt>persisted?</tt> is used when calculating the URL for an object.
1715
- # If the object is not persisted, a form for that object, for instance,
1716
- # will route to the create action. If it is persisted, a form for the
1717
- # object will route to the update action.
1718
- def test_persisted?: () -> untyped
1719
-
1720
- # Passes if the object's model responds to <tt>model_name</tt> both as
1721
- # an instance method and as a class method, and if calling this method
1722
- # returns a string with some convenience methods: <tt>:human</tt>,
1723
- # <tt>:singular</tt> and <tt>:plural</tt>.
1724
- #
1725
- # Check ActiveModel::Naming for more information.
1726
- def test_model_naming: () -> untyped
1727
-
1728
- # Passes if the object's model responds to <tt>errors</tt> and if calling
1729
- # <tt>[](attribute)</tt> on the result of this method returns an array.
1730
- # Fails otherwise.
1731
- #
1732
- # <tt>errors[attribute]</tt> is used to retrieve the errors of a model
1733
- # for a given attribute. If errors are present, the method should return
1734
- # an array of strings that are the errors for the attribute in question.
1735
- # If localization is used, the strings should be localized for the current
1736
- # locale. If no error is present, the method should return an empty array.
1737
- def test_errors_aref: () -> untyped
1738
-
1739
- def model: () -> untyped
1740
-
1741
- def assert_boolean: (untyped result, untyped name) -> untyped
1742
- end
1743
- end
1744
- end
1745
-
1746
- module ActiveModel
1747
- # == Active \Model \Basic \Model
1748
- #
1749
- # Includes the required interface for an object to interact with
1750
- # Action Pack and Action View, using different Active Model modules.
1751
- # It includes model name introspections, conversions, translations and
1752
- # validations. Besides that, it allows you to initialize the object with a
1753
- # hash of attributes, pretty much like Active Record does.
1754
- #
1755
- # A minimal implementation could be:
1756
- #
1757
- # class Person
1758
- # include ActiveModel::Model
1759
- # attr_accessor :name, :age
1760
- # end
1761
- #
1762
- # person = Person.new(name: 'bob', age: '18')
1763
- # person.name # => "bob"
1764
- # person.age # => "18"
1765
- #
1766
- # Note that, by default, <tt>ActiveModel::Model</tt> implements <tt>persisted?</tt>
1767
- # to return +false+, which is the most common case. You may want to override
1768
- # it in your class to simulate a different scenario:
1769
- #
1770
- # class Person
1771
- # include ActiveModel::Model
1772
- # attr_accessor :id, :name
1773
- #
1774
- # def persisted?
1775
- # self.id == 1
1776
- # end
1777
- # end
1778
- #
1779
- # person = Person.new(id: 1, name: 'bob')
1780
- # person.persisted? # => true
1781
- #
1782
- # Also, if for some reason you need to run code on <tt>initialize</tt>, make
1783
- # sure you call +super+ if you want the attributes hash initialization to
1784
- # happen.
1785
- #
1786
- # class Person
1787
- # include ActiveModel::Model
1788
- # attr_accessor :id, :name, :omg
1789
- #
1790
- # def initialize(attributes={})
1791
- # super
1792
- # @omg ||= true
1793
- # end
1794
- # end
1795
- #
1796
- # person = Person.new(id: 1, name: 'bob')
1797
- # person.omg # => true
1798
- #
1799
- # For more detailed information on other functionalities available, please
1800
- # refer to the specific modules included in <tt>ActiveModel::Model</tt>
1801
- # (see below).
1802
- module Model
1803
- extend ActiveSupport::Concern
1804
-
1805
- include ActiveModel::AttributeAssignment
1806
-
1807
- include ActiveModel::Validations
1808
-
1809
- extend ::ActiveModel::Validations::ClassMethods
1810
-
1811
- include ActiveModel::Conversion
1812
-
1813
- extend ::ActiveModel::Conversion::ClassMethods
1814
-
1815
- extend ActiveModel::Naming
1816
-
1817
- extend ActiveModel::Translation
1818
-
1819
- # Initializes a new model with the given +params+.
1820
- #
1821
- # class Person
1822
- # include ActiveModel::Model
1823
- # attr_accessor :name, :age
1824
- # end
1825
- #
1826
- # person = Person.new(name: 'bob', age: '18')
1827
- # person.name # => "bob"
1828
- # person.age # => "18"
1829
- def initialize: (?::Hash[untyped, untyped] attributes) -> untyped
1830
-
1831
- # Indicates if the model is persisted. Default is +false+.
1832
- #
1833
- # class Person
1834
- # include ActiveModel::Model
1835
- # attr_accessor :id, :name
1836
- # end
1837
- #
1838
- # person = Person.new(id: 1, name: 'bob')
1839
- # person.persisted? # => false
1840
- def persisted?: () -> ::FalseClass
1841
- end
1842
- end
1843
-
1844
- module ActiveModel
1845
- class Name
1846
- include Comparable
1847
-
1848
- attr_reader singular: untyped
1849
-
1850
- attr_reader plural: untyped
1851
-
1852
- attr_reader element: untyped
1853
-
1854
- attr_reader collection: untyped
1855
-
1856
- attr_reader singular_route_key: untyped
1857
-
1858
- attr_reader route_key: untyped
1859
-
1860
- attr_reader param_key: untyped
1861
-
1862
- attr_reader i18n_key: untyped
1863
-
1864
- attr_reader name: untyped
1865
-
1866
- # Returns a new ActiveModel::Name instance. By default, the +namespace+
1867
- # and +name+ option will take the namespace and name of the given class
1868
- # respectively.
1869
- #
1870
- # module Foo
1871
- # class Bar
1872
- # end
1873
- # end
1874
- #
1875
- # ActiveModel::Name.new(Foo::Bar).to_s
1876
- # # => "Foo::Bar"
1877
- def initialize: (untyped klass, ?untyped? namespace, ?untyped? name) -> untyped
1878
-
1879
- # Transform the model name into a more human format, using I18n. By default,
1880
- # it will underscore then humanize the class name.
1881
- #
1882
- # class BlogPost
1883
- # extend ActiveModel::Naming
1884
- # end
1885
- #
1886
- # BlogPost.model_name.human # => "Blog post"
1887
- #
1888
- # Specify +options+ with additional translating options.
1889
- def human: (?::Hash[untyped, untyped] options) -> untyped
1890
-
1891
- def _singularize: (untyped string) -> untyped
1892
- end
1893
-
1894
- # == Active \Model \Naming
1895
- #
1896
- # Creates a +model_name+ method on your object.
1897
- #
1898
- # To implement, just extend ActiveModel::Naming in your object:
1899
- #
1900
- # class BookCover
1901
- # extend ActiveModel::Naming
1902
- # end
1903
- #
1904
- # BookCover.model_name.name # => "BookCover"
1905
- # BookCover.model_name.human # => "Book cover"
1906
- #
1907
- # BookCover.model_name.i18n_key # => :book_cover
1908
- # BookModule::BookCover.model_name.i18n_key # => :"book_module/book_cover"
1909
- #
1910
- # Providing the functionality that ActiveModel::Naming provides in your object
1911
- # is required to pass the \Active \Model Lint test. So either extending the
1912
- # provided method below, or rolling your own is required.
1913
- module Naming
1914
- def self.extended: (untyped base) -> untyped
1915
-
1916
- # Returns an ActiveModel::Name object for module. It can be
1917
- # used to retrieve all kinds of naming-related information
1918
- # (See ActiveModel::Name for more information).
1919
- #
1920
- # class Person
1921
- # extend ActiveModel::Naming
1922
- # end
1923
- #
1924
- # Person.model_name.name # => "Person"
1925
- # Person.model_name.class # => ActiveModel::Name
1926
- # Person.model_name.singular # => "person"
1927
- # Person.model_name.plural # => "people"
1928
- def model_name: () -> untyped
1929
-
1930
- # Returns the plural class name of a record or class.
1931
- #
1932
- # ActiveModel::Naming.plural(post) # => "posts"
1933
- # ActiveModel::Naming.plural(Highrise::Person) # => "highrise_people"
1934
- def self.plural: (untyped record_or_class) -> untyped
1935
-
1936
- # Returns the singular class name of a record or class.
1937
- #
1938
- # ActiveModel::Naming.singular(post) # => "post"
1939
- # ActiveModel::Naming.singular(Highrise::Person) # => "highrise_person"
1940
- def self.singular: (untyped record_or_class) -> untyped
1941
-
1942
- # Identifies whether the class name of a record or class is uncountable.
1943
- #
1944
- # ActiveModel::Naming.uncountable?(Sheep) # => true
1945
- # ActiveModel::Naming.uncountable?(Post) # => false
1946
- def self.uncountable?: (untyped record_or_class) -> untyped
1947
-
1948
- # Returns string to use while generating route names. It differs for
1949
- # namespaced models regarding whether it's inside isolated engine.
1950
- #
1951
- # # For isolated engine:
1952
- # ActiveModel::Naming.singular_route_key(Blog::Post) # => "post"
1953
- #
1954
- # # For shared engine:
1955
- # ActiveModel::Naming.singular_route_key(Blog::Post) # => "blog_post"
1956
- def self.singular_route_key: (untyped record_or_class) -> untyped
1957
-
1958
- # Returns string to use while generating route names. It differs for
1959
- # namespaced models regarding whether it's inside isolated engine.
1960
- #
1961
- # # For isolated engine:
1962
- # ActiveModel::Naming.route_key(Blog::Post) # => "posts"
1963
- #
1964
- # # For shared engine:
1965
- # ActiveModel::Naming.route_key(Blog::Post) # => "blog_posts"
1966
- #
1967
- # The route key also considers if the noun is uncountable and, in
1968
- # such cases, automatically appends _index.
1969
- def self.route_key: (untyped record_or_class) -> untyped
1970
-
1971
- # Returns string to use for params names. It differs for
1972
- # namespaced models regarding whether it's inside isolated engine.
1973
- #
1974
- # # For isolated engine:
1975
- # ActiveModel::Naming.param_key(Blog::Post) # => "post"
1976
- #
1977
- # # For shared engine:
1978
- # ActiveModel::Naming.param_key(Blog::Post) # => "blog_post"
1979
- def self.param_key: (untyped record_or_class) -> untyped
1980
-
1981
- def self.model_name_from_record_or_class: (untyped record_or_class) -> untyped
1982
- end
1983
- end
1984
-
1985
- module ActiveModel
1986
- class Railtie < Rails::Railtie
1987
- end
1988
- end
1989
-
1990
- module ActiveModel
1991
- extend ActiveSupport::Autoload
1992
-
1993
- module Serializers
1994
- extend ActiveSupport::Autoload
1995
- end
1996
-
1997
- def self.eager_load!: () -> untyped
1998
- end
1999
-
2000
- module ActiveModel
2001
- module SecurePassword
2002
- extend ActiveSupport::Concern
2003
-
2004
- # BCrypt hash function can handle maximum 72 bytes, and if we pass
2005
- # password of length more than 72 bytes it ignores extra characters.
2006
- # Hence need to put a restriction on password length.
2007
- MAX_PASSWORD_LENGTH_ALLOWED: ::Integer
2008
-
2009
- attr_accessor min_cost: untyped
2010
-
2011
- module ClassMethods
2012
- # Adds methods to set and authenticate against a BCrypt password.
2013
- # This mechanism requires you to have a +XXX_digest+ attribute.
2014
- # Where +XXX+ is the attribute name of your desired password.
2015
- #
2016
- # The following validations are added automatically:
2017
- # * Password must be present on creation
2018
- # * Password length should be less than or equal to 72 bytes
2019
- # * Confirmation of password (using a +XXX_confirmation+ attribute)
2020
- #
2021
- # If confirmation validation is not needed, simply leave out the
2022
- # value for +XXX_confirmation+ (i.e. don't provide a form field for
2023
- # it). When this attribute has a +nil+ value, the validation will not be
2024
- # triggered.
2025
- #
2026
- # For further customizability, it is possible to suppress the default
2027
- # validations by passing <tt>validations: false</tt> as an argument.
2028
- #
2029
- # Add bcrypt (~> 3.1.7) to Gemfile to use #has_secure_password:
2030
- #
2031
- # gem 'bcrypt', '~> 3.1.7'
2032
- #
2033
- # Example using Active Record (which automatically includes ActiveModel::SecurePassword):
2034
- #
2035
- # # Schema: User(name:string, password_digest:string, recovery_password_digest:string)
2036
- # class User < ActiveRecord::Base
2037
- # has_secure_password
2038
- # has_secure_password :recovery_password, validations: false
2039
- # end
2040
- #
2041
- # user = User.new(name: 'david', password: '', password_confirmation: 'nomatch')
2042
- # user.save # => false, password required
2043
- # user.password = 'mUc3m00RsqyRe'
2044
- # user.save # => false, confirmation doesn't match
2045
- # user.password_confirmation = 'mUc3m00RsqyRe'
2046
- # user.save # => true
2047
- # user.recovery_password = "42password"
2048
- # user.recovery_password_digest # => "$2a$04$iOfhwahFymCs5weB3BNH/uXkTG65HR.qpW.bNhEjFP3ftli3o5DQC"
2049
- # user.save # => true
2050
- # user.authenticate('notright') # => false
2051
- # user.authenticate('mUc3m00RsqyRe') # => user
2052
- # user.authenticate_recovery_password('42password') # => user
2053
- # User.find_by(name: 'david').try(:authenticate, 'notright') # => false
2054
- # User.find_by(name: 'david').try(:authenticate, 'mUc3m00RsqyRe') # => user
2055
- def has_secure_password: (?::Symbol attribute, ?validations: bool validations) -> untyped
2056
- end
2057
-
2058
- class InstanceMethodsOnActivation < Module
2059
- def initialize: (untyped attribute) -> untyped
2060
- end
2061
- end
2062
- end
2063
-
2064
- module ActiveModel
2065
- # == Active \Model \Serialization
2066
- #
2067
- # Provides a basic serialization to a serializable_hash for your objects.
2068
- #
2069
- # A minimal implementation could be:
2070
- #
2071
- # class Person
2072
- # include ActiveModel::Serialization
2073
- #
2074
- # attr_accessor :name
2075
- #
2076
- # def attributes
2077
- # {'name' => nil}
2078
- # end
2079
- # end
2080
- #
2081
- # Which would provide you with:
2082
- #
2083
- # person = Person.new
2084
- # person.serializable_hash # => {"name"=>nil}
2085
- # person.name = "Bob"
2086
- # person.serializable_hash # => {"name"=>"Bob"}
2087
- #
2088
- # An +attributes+ hash must be defined and should contain any attributes you
2089
- # need to be serialized. Attributes must be strings, not symbols.
2090
- # When called, serializable hash will use instance methods that match the name
2091
- # of the attributes hash's keys. In order to override this behavior, take a look
2092
- # at the private method +read_attribute_for_serialization+.
2093
- #
2094
- # ActiveModel::Serializers::JSON module automatically includes
2095
- # the <tt>ActiveModel::Serialization</tt> module, so there is no need to
2096
- # explicitly include <tt>ActiveModel::Serialization</tt>.
2097
- #
2098
- # A minimal implementation including JSON would be:
2099
- #
2100
- # class Person
2101
- # include ActiveModel::Serializers::JSON
2102
- #
2103
- # attr_accessor :name
2104
- #
2105
- # def attributes
2106
- # {'name' => nil}
2107
- # end
2108
- # end
2109
- #
2110
- # Which would provide you with:
2111
- #
2112
- # person = Person.new
2113
- # person.serializable_hash # => {"name"=>nil}
2114
- # person.as_json # => {"name"=>nil}
2115
- # person.to_json # => "{\"name\":null}"
2116
- #
2117
- # person.name = "Bob"
2118
- # person.serializable_hash # => {"name"=>"Bob"}
2119
- # person.as_json # => {"name"=>"Bob"}
2120
- # person.to_json # => "{\"name\":\"Bob\"}"
2121
- #
2122
- # Valid options are <tt>:only</tt>, <tt>:except</tt>, <tt>:methods</tt> and
2123
- # <tt>:include</tt>. The following are all valid examples:
2124
- #
2125
- # person.serializable_hash(only: 'name')
2126
- # person.serializable_hash(include: :address)
2127
- # person.serializable_hash(include: { address: { only: 'city' }})
2128
- module Serialization
2129
- # Returns a serialized hash of your object.
2130
- #
2131
- # class Person
2132
- # include ActiveModel::Serialization
2133
- #
2134
- # attr_accessor :name, :age
2135
- #
2136
- # def attributes
2137
- # {'name' => nil, 'age' => nil}
2138
- # end
2139
- #
2140
- # def capitalized_name
2141
- # name.capitalize
2142
- # end
2143
- # end
2144
- #
2145
- # person = Person.new
2146
- # person.name = 'bob'
2147
- # person.age = 22
2148
- # person.serializable_hash # => {"name"=>"bob", "age"=>22}
2149
- # person.serializable_hash(only: :name) # => {"name"=>"bob"}
2150
- # person.serializable_hash(except: :name) # => {"age"=>22}
2151
- # person.serializable_hash(methods: :capitalized_name)
2152
- # # => {"name"=>"bob", "age"=>22, "capitalized_name"=>"Bob"}
2153
- #
2154
- # Example with <tt>:include</tt> option
2155
- #
2156
- # class User
2157
- # include ActiveModel::Serializers::JSON
2158
- # attr_accessor :name, :notes # Emulate has_many :notes
2159
- # def attributes
2160
- # {'name' => nil}
2161
- # end
2162
- # end
2163
- #
2164
- # class Note
2165
- # include ActiveModel::Serializers::JSON
2166
- # attr_accessor :title, :text
2167
- # def attributes
2168
- # {'title' => nil, 'text' => nil}
2169
- # end
2170
- # end
2171
- #
2172
- # note = Note.new
2173
- # note.title = 'Battle of Austerlitz'
2174
- # note.text = 'Some text here'
2175
- #
2176
- # user = User.new
2177
- # user.name = 'Napoleon'
2178
- # user.notes = [note]
2179
- #
2180
- # user.serializable_hash
2181
- # # => {"name" => "Napoleon"}
2182
- # user.serializable_hash(include: { notes: { only: 'title' }})
2183
- # # => {"name" => "Napoleon", "notes" => [{"title"=>"Battle of Austerlitz"}]}
2184
- def serializable_hash: (?untyped? options) -> untyped
2185
-
2186
- def serializable_add_includes: (?::Hash[untyped, untyped] options) { (untyped, untyped, untyped) -> untyped } -> (nil | untyped)
2187
- end
2188
- end
2189
-
2190
- module ActiveModel
2191
- module Serializers
2192
- # == Active \Model \JSON \Serializer
2193
- module JSON
2194
- extend ActiveSupport::Concern
2195
-
2196
- include ActiveModel::Serialization
2197
-
2198
- extend ActiveModel::Naming
2199
-
2200
- # Returns a hash representing the model. Some configuration can be
2201
- # passed through +options+.
2202
- #
2203
- # The option <tt>include_root_in_json</tt> controls the top-level behavior
2204
- # of +as_json+. If +true+, +as_json+ will emit a single root node named
2205
- # after the object's type. The default value for <tt>include_root_in_json</tt>
2206
- # option is +false+.
2207
- #
2208
- # user = User.find(1)
2209
- # user.as_json
2210
- # # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
2211
- # # "created_at" => "2006-08-01T17:27:133.000Z", "awesome" => true}
2212
- #
2213
- # ActiveRecord::Base.include_root_in_json = true
2214
- #
2215
- # user.as_json
2216
- # # => { "user" => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
2217
- # # "created_at" => "2006-08-01T17:27:13.000Z", "awesome" => true } }
2218
- #
2219
- # This behavior can also be achieved by setting the <tt>:root</tt> option
2220
- # to +true+ as in:
2221
- #
2222
- # user = User.find(1)
2223
- # user.as_json(root: true)
2224
- # # => { "user" => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
2225
- # # "created_at" => "2006-08-01T17:27:13.000Z", "awesome" => true } }
2226
- #
2227
- # Without any +options+, the returned Hash will include all the model's
2228
- # attributes.
2229
- #
2230
- # user = User.find(1)
2231
- # user.as_json
2232
- # # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
2233
- # # "created_at" => "2006-08-01T17:27:13.000Z", "awesome" => true}
2234
- #
2235
- # The <tt>:only</tt> and <tt>:except</tt> options can be used to limit
2236
- # the attributes included, and work similar to the +attributes+ method.
2237
- #
2238
- # user.as_json(only: [:id, :name])
2239
- # # => { "id" => 1, "name" => "Konata Izumi" }
2240
- #
2241
- # user.as_json(except: [:id, :created_at, :age])
2242
- # # => { "name" => "Konata Izumi", "awesome" => true }
2243
- #
2244
- # To include the result of some method calls on the model use <tt>:methods</tt>:
2245
- #
2246
- # user.as_json(methods: :permalink)
2247
- # # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
2248
- # # "created_at" => "2006-08-01T17:27:13.000Z", "awesome" => true,
2249
- # # "permalink" => "1-konata-izumi" }
2250
- #
2251
- # To include associations use <tt>:include</tt>:
2252
- #
2253
- # user.as_json(include: :posts)
2254
- # # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
2255
- # # "created_at" => "2006-08-01T17:27:13.000Z", "awesome" => true,
2256
- # # "posts" => [ { "id" => 1, "author_id" => 1, "title" => "Welcome to the weblog" },
2257
- # # { "id" => 2, "author_id" => 1, "title" => "So I was thinking" } ] }
2258
- #
2259
- # Second level and higher order associations work as well:
2260
- #
2261
- # user.as_json(include: { posts: {
2262
- # include: { comments: {
2263
- # only: :body } },
2264
- # only: :title } })
2265
- # # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
2266
- # # "created_at" => "2006-08-01T17:27:13.000Z", "awesome" => true,
2267
- # # "posts" => [ { "comments" => [ { "body" => "1st post!" }, { "body" => "Second!" } ],
2268
- # # "title" => "Welcome to the weblog" },
2269
- # # { "comments" => [ { "body" => "Don't think too hard" } ],
2270
- # # "title" => "So I was thinking" } ] }
2271
- def as_json: (?untyped? options) -> untyped
2272
-
2273
- # Sets the model +attributes+ from a JSON string. Returns +self+.
2274
- #
2275
- # class Person
2276
- # include ActiveModel::Serializers::JSON
2277
- #
2278
- # attr_accessor :name, :age, :awesome
2279
- #
2280
- # def attributes=(hash)
2281
- # hash.each do |key, value|
2282
- # send("#{key}=", value)
2283
- # end
2284
- # end
2285
- #
2286
- # def attributes
2287
- # instance_values
2288
- # end
2289
- # end
2290
- #
2291
- # json = { name: 'bob', age: 22, awesome:true }.to_json
2292
- # person = Person.new
2293
- # person.from_json(json) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob">
2294
- # person.name # => "bob"
2295
- # person.age # => 22
2296
- # person.awesome # => true
2297
- #
2298
- # The default value for +include_root+ is +false+. You can change it to
2299
- # +true+ if the given JSON string includes a single root node.
2300
- #
2301
- # json = { person: { name: 'bob', age: 22, awesome:true } }.to_json
2302
- # person = Person.new
2303
- # person.from_json(json, true) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob">
2304
- # person.name # => "bob"
2305
- # person.age # => 22
2306
- # person.awesome # => true
2307
- def from_json: (untyped json, ?untyped include_root) -> untyped
2308
- end
2309
- end
2310
- end
2311
-
2312
- module ActiveModel
2313
- # == Active \Model \Translation
2314
- #
2315
- # Provides integration between your object and the Rails internationalization
2316
- # (i18n) framework.
2317
- #
2318
- # A minimal implementation could be:
2319
- #
2320
- # class TranslatedPerson
2321
- # extend ActiveModel::Translation
2322
- # end
2323
- #
2324
- # TranslatedPerson.human_attribute_name('my_attribute')
2325
- # # => "My attribute"
2326
- #
2327
- # This also provides the required class methods for hooking into the
2328
- # Rails internationalization API, including being able to define a
2329
- # class based +i18n_scope+ and +lookup_ancestors+ to find translations in
2330
- # parent classes.
2331
- module Translation
2332
- include ActiveModel::Naming
2333
-
2334
- # Returns the +i18n_scope+ for the class. Overwrite if you want custom lookup.
2335
- def i18n_scope: () -> :activemodel
2336
-
2337
- # When localizing a string, it goes through the lookup returned by this
2338
- # method, which is used in ActiveModel::Name#human,
2339
- # ActiveModel::Errors#full_messages and
2340
- # ActiveModel::Translation#human_attribute_name.
2341
- def lookup_ancestors: () -> untyped
2342
-
2343
- # Transforms attribute names into a more human format, such as "First name"
2344
- # instead of "first_name".
2345
- #
2346
- # Person.human_attribute_name("first_name") # => "First name"
2347
- #
2348
- # Specify +options+ with additional translating options.
2349
- def human_attribute_name: (untyped attribute, ?::Hash[untyped, untyped] options) -> untyped
2350
- end
2351
- end
2352
-
2353
- module ActiveModel
2354
- module Type
2355
- class BigInteger < Integer
2356
- def max_value: () -> untyped
2357
- end
2358
- end
2359
- end
2360
-
2361
- module ActiveModel
2362
- module Type
2363
- class Binary < Value
2364
- # :nodoc:
2365
- def `type`: () -> :binary
2366
-
2367
- def binary?: () -> ::TrueClass
2368
-
2369
- def cast: (untyped value) -> untyped
2370
-
2371
- def serialize: (untyped value) -> (nil | Data)
2372
-
2373
- def changed_in_place?: (untyped raw_old_value, untyped value) -> untyped
2374
-
2375
- class Data
2376
- # :nodoc:
2377
- def initialize: (untyped value) -> untyped
2378
-
2379
- def to_s: () -> untyped
2380
-
2381
- def hex: () -> untyped
2382
-
2383
- def ==: (untyped other) -> untyped
2384
- end
2385
- end
2386
- end
2387
- end
2388
-
2389
- module ActiveModel
2390
- module Type
2391
- # == Active \Model \Type \Boolean
2392
- #
2393
- # A class that behaves like a boolean type, including rules for coercion of user input.
2394
- #
2395
- # === Coercion
2396
- # Values set from user input will first be coerced into the appropriate ruby type.
2397
- # Coercion behavior is roughly mapped to Ruby's boolean semantics.
2398
- #
2399
- # - "false", "f" , "0", +0+ or any other value in +FALSE_VALUES+ will be coerced to +false+
2400
- # - Empty strings are coerced to +nil+
2401
- # - All other values will be coerced to +true+
2402
- class Boolean < Value
2403
- FALSE_VALUES: untyped
2404
-
2405
- def `type`: () -> :boolean
2406
-
2407
- def serialize: (untyped value) -> untyped
2408
-
2409
- def cast_value: (untyped value) -> untyped
2410
- end
2411
- end
2412
- end
2413
-
2414
- module ActiveModel
2415
- module Type
2416
- class Date < Value
2417
- # :nodoc:
2418
- include Helpers::Timezone
2419
-
2420
- def `type`: () -> :date
2421
-
2422
- def type_cast_for_schema: (untyped value) -> untyped
2423
-
2424
- def cast_value: (untyped value) -> untyped
2425
-
2426
- ISO_DATE: untyped
2427
-
2428
- def fast_string_to_date: (untyped string) -> untyped
2429
-
2430
- def fallback_string_to_date: (untyped string) -> untyped
2431
-
2432
- def new_date: (untyped year, untyped mon, untyped mday) -> untyped
2433
-
2434
- def value_from_multiparameter_assignment: () -> untyped
2435
- end
2436
- end
2437
- end
2438
-
2439
- module ActiveModel
2440
- module Type
2441
- class DateTime < Value
2442
- # :nodoc:
2443
- include Helpers::Timezone
2444
-
2445
- include Helpers::TimeValue
2446
-
2447
- def `type`: () -> :datetime
2448
-
2449
- def cast_value: (untyped value) -> (untyped | nil)
2450
-
2451
- # '0.123456' -> 123456
2452
- # '1.123456' -> 123456
2453
- def microseconds: (untyped time) -> untyped
2454
-
2455
- def fallback_string_to_time: (untyped string) -> untyped
2456
-
2457
- def value_from_multiparameter_assignment: (untyped values_hash) -> untyped
2458
- end
2459
- end
2460
- end
2461
-
2462
- module ActiveModel
2463
- module Type
2464
- class Decimal < Value
2465
- # :nodoc:
2466
- include Helpers::Numeric
2467
-
2468
- BIGDECIMAL_PRECISION: ::Integer
2469
-
2470
- def `type`: () -> :decimal
2471
-
2472
- def type_cast_for_schema: (untyped value) -> untyped
2473
-
2474
- def cast_value: (untyped value) -> untyped
2475
-
2476
- def convert_float_to_big_decimal: (untyped value) -> untyped
2477
-
2478
- def float_precision: () -> untyped
2479
-
2480
- def apply_scale: (untyped value) -> untyped
2481
- end
2482
- end
2483
- end
2484
-
2485
- module ActiveModel
2486
- module Type
2487
- class Float < Value
2488
- # :nodoc:
2489
- include Helpers::Numeric
2490
-
2491
- def `type`: () -> :float
2492
-
2493
- def type_cast_for_schema: (untyped value) -> ("::Float::NAN" | untyped)
2494
-
2495
- def cast_value: (untyped value) -> untyped
2496
- end
2497
- end
2498
- end
2499
-
2500
- module ActiveModel
2501
- module Type
2502
- module Helpers
2503
- # :nodoc: all
2504
- class AcceptsMultiparameterTime < Module
2505
- def initialize: (?defaults: ::Hash[untyped, untyped] defaults) -> (nil | untyped)
2506
- end
2507
- end
2508
- end
2509
- end
2510
-
2511
- module ActiveModel
2512
- module Type
2513
- module Helpers
2514
- # :nodoc: all
2515
- module Mutable
2516
- def cast: (untyped value) -> untyped
2517
-
2518
- # +raw_old_value+ will be the `_before_type_cast` version of the
2519
- # value (likely a string). +new_value+ will be the current, type
2520
- # cast value.
2521
- def changed_in_place?: (untyped raw_old_value, untyped new_value) -> untyped
2522
- end
2523
- end
2524
- end
2525
- end
2526
-
2527
- module ActiveModel
2528
- module Type
2529
- module Helpers
2530
- # :nodoc: all
2531
- module Numeric
2532
- def serialize: (untyped value) -> untyped
2533
-
2534
- def cast: (untyped value) -> untyped
2535
-
2536
- def changed?: (untyped old_value, untyped _new_value, untyped new_value_before_type_cast) -> untyped
2537
-
2538
- def number_to_non_number?: (untyped old_value, untyped new_value_before_type_cast) -> untyped
2539
-
2540
- def non_numeric_string?: (untyped value) -> untyped
2541
-
2542
- NUMERIC_REGEX: untyped
2543
- end
2544
- end
2545
- end
2546
- end
2547
-
2548
- module ActiveModel
2549
- module Type
2550
- module Helpers
2551
- # :nodoc: all
2552
- module TimeValue
2553
- def serialize: (untyped value) -> untyped
2554
-
2555
- def apply_seconds_precision: (untyped value) -> untyped
2556
-
2557
- def type_cast_for_schema: (untyped value) -> untyped
2558
-
2559
- def user_input_in_time_zone: (untyped value) -> untyped
2560
-
2561
- def new_time: (untyped year, untyped mon, untyped mday, untyped hour, untyped min, untyped sec, untyped microsec, ?untyped? offset) -> (nil | untyped)
2562
-
2563
- ISO_DATETIME: untyped
2564
-
2565
- # Doesn't handle time zones.
2566
- def fast_string_to_time: (untyped string) -> untyped
2567
- end
2568
- end
2569
- end
2570
- end
2571
-
2572
- module ActiveModel
2573
- module Type
2574
- module Helpers
2575
- # :nodoc: all
2576
- module Timezone
2577
- def is_utc?: () -> untyped
2578
-
2579
- def default_timezone: () -> untyped
2580
- end
2581
- end
2582
- end
2583
- end
2584
-
2585
- module ActiveModel
2586
- module Type
2587
- class ImmutableString < Value
2588
- # :nodoc:
2589
- def `type`: () -> :string
2590
-
2591
- def serialize: (untyped value) -> untyped
2592
-
2593
- def cast_value: (untyped value) -> untyped
2594
- end
2595
- end
2596
- end
2597
-
2598
- module ActiveModel
2599
- module Type
2600
- class Integer < Value
2601
- # :nodoc:
2602
- include Helpers::Numeric
2603
-
2604
- # Column storage size in bytes.
2605
- # 4 bytes means an integer as opposed to smallint etc.
2606
- DEFAULT_LIMIT: ::Integer
2607
-
2608
- def initialize: () -> untyped
2609
-
2610
- def `type`: () -> :integer
2611
-
2612
- def deserialize: (untyped value) -> (nil | untyped)
2613
-
2614
- def serialize: (untyped value) -> (nil | untyped)
2615
-
2616
- attr_reader range: untyped
2617
-
2618
- def cast_value: (untyped value) -> untyped
2619
-
2620
- def ensure_in_range: (untyped value) -> untyped
2621
-
2622
- def max_value: () -> untyped
2623
-
2624
- def min_value: () -> untyped
2625
-
2626
- def _limit: () -> untyped
2627
- end
2628
- end
2629
- end
2630
-
2631
- module ActiveModel
2632
- module Type
2633
- attr_accessor registry: untyped
2634
-
2635
- # Add a new type to the registry, allowing it to be gotten through ActiveModel::Type#lookup
2636
- def self.register: (untyped type_name, ?untyped? klass, **untyped options) { () -> untyped } -> untyped
2637
-
2638
- def self.lookup: (*untyped args, **untyped kwargs) -> untyped
2639
-
2640
- def self.default_value: () -> untyped
2641
- end
2642
- end
2643
-
2644
- module ActiveModel
2645
- # :stopdoc:
2646
- module Type
2647
- class Registry
2648
- def initialize: () -> untyped
2649
-
2650
- def register: (untyped type_name, ?untyped? klass, **untyped options) { () -> untyped } -> untyped
2651
-
2652
- def lookup: (untyped symbol, *untyped args, **untyped kwargs) -> untyped
2653
-
2654
- attr_reader registrations: untyped
2655
-
2656
- def registration_klass: () -> untyped
2657
-
2658
- def find_registration: (untyped symbol, *untyped args) -> untyped
2659
- end
2660
-
2661
- class Registration
2662
- # Options must be taken because of https://bugs.ruby-lang.org/issues/10856
2663
- def initialize: (untyped name, untyped block) -> untyped
2664
-
2665
- def call: (untyped _registry, *untyped args, **untyped kwargs) -> untyped
2666
-
2667
- def matches?: (untyped type_name, *untyped args, **untyped kwargs) -> untyped
2668
-
2669
- attr_reader name: untyped
2670
-
2671
- attr_reader block: untyped
2672
- end
2673
- end
2674
- end
2675
-
2676
- module ActiveModel
2677
- module Type
2678
- class String < ImmutableString
2679
- # :nodoc:
2680
- def changed_in_place?: (untyped raw_old_value, untyped new_value) -> untyped
2681
-
2682
- def cast_value: (untyped value) -> untyped
2683
- end
2684
- end
2685
- end
2686
-
2687
- module ActiveModel
2688
- module Type
2689
- class Time < Value
2690
- # :nodoc:
2691
- include Helpers::Timezone
2692
-
2693
- include Helpers::TimeValue
2694
-
2695
- def `type`: () -> :time
2696
-
2697
- def user_input_in_time_zone: (untyped value) -> (nil | untyped)
2698
-
2699
- def cast_value: (untyped value) -> (untyped | nil)
2700
- end
2701
- end
2702
- end
2703
-
2704
- module ActiveModel
2705
- module Type
2706
- class Value
2707
- attr_reader precision: untyped
2708
-
2709
- attr_reader scale: untyped
2710
-
2711
- attr_reader limit: untyped
2712
-
2713
- def initialize: (?scale: untyped? scale, ?limit: untyped? limit, ?precision: untyped? precision) -> untyped
2714
-
2715
- def `type`: () -> nil
2716
-
2717
- # Converts a value from database input to the appropriate ruby type. The
2718
- # return value of this method will be returned from
2719
- # ActiveRecord::AttributeMethods::Read#read_attribute. The default
2720
- # implementation just calls Value#cast.
2721
- #
2722
- # +value+ The raw input, as provided from the database.
2723
- def deserialize: (untyped value) -> untyped
2724
-
2725
- # Type casts a value from user input (e.g. from a setter). This value may
2726
- # be a string from the form builder, or a ruby object passed to a setter.
2727
- # There is currently no way to differentiate between which source it came
2728
- # from.
2729
- #
2730
- # The return value of this method will be returned from
2731
- # ActiveRecord::AttributeMethods::Read#read_attribute. See also:
2732
- # Value#cast_value.
2733
- #
2734
- # +value+ The raw input, as provided to the attribute setter.
2735
- def cast: (untyped value) -> untyped
2736
-
2737
- # Casts a value from the ruby type to a type that the database knows how
2738
- # to understand. The returned value from this method should be a
2739
- # +String+, +Numeric+, +Date+, +Time+, +Symbol+, +true+, +false+, or
2740
- # +nil+.
2741
- def serialize: (untyped value) -> untyped
2742
-
2743
- def type_cast_for_schema: (untyped value) -> untyped
2744
-
2745
- def binary?: () -> ::FalseClass
2746
-
2747
- # Determines whether a value has changed for dirty checking. +old_value+
2748
- # and +new_value+ will always be type-cast. Types should not need to
2749
- # override this method.
2750
- def changed?: (untyped old_value, untyped new_value, untyped _new_value_before_type_cast) -> untyped
2751
-
2752
- # Determines whether the mutable value has been modified since it was
2753
- # read. Returns +false+ by default. If your type returns an object
2754
- # which could be mutated, you should override this method. You will need
2755
- # to either:
2756
- #
2757
- # - pass +new_value+ to Value#serialize and compare it to
2758
- # +raw_old_value+
2759
- #
2760
- # or
2761
- #
2762
- # - pass +raw_old_value+ to Value#deserialize and compare it to
2763
- # +new_value+
2764
- #
2765
- # +raw_old_value+ The original value, before being passed to
2766
- # +deserialize+.
2767
- #
2768
- # +new_value+ The current value, after type casting.
2769
- def changed_in_place?: (untyped raw_old_value, untyped new_value) -> ::FalseClass
2770
-
2771
- def value_constructed_by_mass_assignment?: (untyped _value) -> ::FalseClass
2772
-
2773
- def force_equality?: (untyped _value) -> ::FalseClass
2774
-
2775
- def map: (untyped value) { (untyped) -> untyped } -> untyped
2776
-
2777
- def ==: (untyped other) -> untyped
2778
-
2779
- def hash: () -> untyped
2780
-
2781
- def assert_valid_value: () -> nil
2782
-
2783
- def cast_value: (untyped value) -> untyped
2784
- end
2785
- end
2786
- end
2787
-
2788
- module ActiveModel
2789
- module Validations
2790
- class AbsenceValidator < EachValidator
2791
- # == \Active \Model Absence Validator
2792
- # nodoc:
2793
- def validate_each: (untyped record, untyped attr_name, untyped value) -> untyped
2794
- end
2795
-
2796
- module HelperMethods
2797
- # Validates that the specified attributes are blank (as defined by
2798
- # Object#present?). Happens by default on save.
2799
- #
2800
- # class Person < ActiveRecord::Base
2801
- # validates_absence_of :first_name
2802
- # end
2803
- #
2804
- # The first_name attribute must be in the object and it must be blank.
2805
- #
2806
- # Configuration options:
2807
- # * <tt>:message</tt> - A custom error message (default is: "must be blank").
2808
- #
2809
- # There is also a list of default options supported by every validator:
2810
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
2811
- # See <tt>ActiveModel::Validations#validates</tt> for more information
2812
- def validates_absence_of: (*untyped attr_names) -> untyped
2813
- end
2814
- end
2815
- end
2816
-
2817
- module ActiveModel
2818
- module Validations
2819
- class AcceptanceValidator < EachValidator
2820
- # :nodoc:
2821
- def initialize: (untyped options) -> untyped
2822
-
2823
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
2824
-
2825
- def setup!: (untyped klass) -> untyped
2826
-
2827
- def acceptable_option?: (untyped value) -> untyped
2828
-
2829
- class LazilyDefineAttributes < Module
2830
- def initialize: (untyped attributes) -> untyped
2831
-
2832
- def included: (untyped klass) -> untyped
2833
-
2834
- def matches?: (untyped method_name) -> untyped
2835
-
2836
- def define_on: (untyped klass) -> untyped
2837
-
2838
- def ==: (untyped other) -> untyped
2839
-
2840
- attr_reader attributes: untyped
2841
- end
2842
- end
2843
-
2844
- module HelperMethods
2845
- # Encapsulates the pattern of wanting to validate the acceptance of a
2846
- # terms of service check box (or similar agreement).
2847
- #
2848
- # class Person < ActiveRecord::Base
2849
- # validates_acceptance_of :terms_of_service
2850
- # validates_acceptance_of :eula, message: 'must be abided'
2851
- # end
2852
- #
2853
- # If the database column does not exist, the +terms_of_service+ attribute
2854
- # is entirely virtual. This check is performed only if +terms_of_service+
2855
- # is not +nil+ and by default on save.
2856
- #
2857
- # Configuration options:
2858
- # * <tt>:message</tt> - A custom error message (default is: "must be
2859
- # accepted").
2860
- # * <tt>:accept</tt> - Specifies a value that is considered accepted.
2861
- # Also accepts an array of possible values. The default value is
2862
- # an array ["1", true], which makes it easy to relate to an HTML
2863
- # checkbox. This should be set to, or include, +true+ if you are validating
2864
- # a database column, since the attribute is typecast from "1" to +true+
2865
- # before validation.
2866
- #
2867
- # There is also a list of default options supported by every validator:
2868
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
2869
- # See <tt>ActiveModel::Validations#validates</tt> for more information.
2870
- def validates_acceptance_of: (*untyped attr_names) -> untyped
2871
- end
2872
- end
2873
- end
2874
-
2875
- module ActiveModel
2876
- module Validations
2877
- # == Active \Model \Validation \Callbacks
2878
- #
2879
- # Provides an interface for any class to have +before_validation+ and
2880
- # +after_validation+ callbacks.
2881
- #
2882
- # First, include ActiveModel::Validations::Callbacks from the class you are
2883
- # creating:
2884
- #
2885
- # class MyModel
2886
- # include ActiveModel::Validations::Callbacks
2887
- #
2888
- # before_validation :do_stuff_before_validation
2889
- # after_validation :do_stuff_after_validation
2890
- # end
2891
- #
2892
- # Like other <tt>before_*</tt> callbacks if +before_validation+ throws
2893
- # +:abort+ then <tt>valid?</tt> will not be called.
2894
- module Callbacks
2895
- extend ActiveSupport::Concern
2896
-
2897
- include ActiveSupport::Callbacks
2898
-
2899
- extend ::ActiveSupport::Callbacks::ClassMethods
2900
-
2901
- module ClassMethods
2902
- # Defines a callback that will get called right before validation.
2903
- #
2904
- # class Person
2905
- # include ActiveModel::Validations
2906
- # include ActiveModel::Validations::Callbacks
2907
- #
2908
- # attr_accessor :name
2909
- #
2910
- # validates_length_of :name, maximum: 6
2911
- #
2912
- # before_validation :remove_whitespaces
2913
- #
2914
- # private
2915
- #
2916
- # def remove_whitespaces
2917
- # name.strip!
2918
- # end
2919
- # end
2920
- #
2921
- # person = Person.new
2922
- # person.name = ' bob '
2923
- # person.valid? # => true
2924
- # person.name # => "bob"
2925
- def before_validation: (*untyped args) { () -> untyped } -> untyped
2926
-
2927
- # Defines a callback that will get called right after validation.
2928
- #
2929
- # class Person
2930
- # include ActiveModel::Validations
2931
- # include ActiveModel::Validations::Callbacks
2932
- #
2933
- # attr_accessor :name, :status
2934
- #
2935
- # validates_presence_of :name
2936
- #
2937
- # after_validation :set_status
2938
- #
2939
- # private
2940
- #
2941
- # def set_status
2942
- # self.status = errors.empty?
2943
- # end
2944
- # end
2945
- #
2946
- # person = Person.new
2947
- # person.name = ''
2948
- # person.valid? # => false
2949
- # person.status # => false
2950
- # person.name = 'bob'
2951
- # person.valid? # => true
2952
- # person.status # => true
2953
- def after_validation: (*untyped args) { () -> untyped } -> untyped
2954
- end
2955
-
2956
- # Overwrite run validations to include callbacks.
2957
- def run_validations!: () -> untyped
2958
- end
2959
- end
2960
- end
2961
-
2962
- module ActiveModel
2963
- module Validations
2964
- module Clusivity
2965
- # nodoc:
2966
- ERROR_MESSAGE: ::String
2967
-
2968
- def check_validity!: () -> untyped
2969
-
2970
- def include?: (untyped record, untyped value) -> untyped
2971
-
2972
- def delimiter: () -> untyped
2973
-
2974
- # After Ruby 2.2, <tt>Range#include?</tt> on non-number-or-time-ish ranges checks all
2975
- # possible values in the range for equality, which is slower but more accurate.
2976
- # <tt>Range#cover?</tt> uses the previous logic of comparing a value with the range
2977
- # endpoints, which is fast but is only accurate on Numeric, Time, Date,
2978
- # or DateTime ranges.
2979
- def inclusion_method: (untyped enumerable) -> untyped
2980
- end
2981
- end
2982
- end
2983
-
2984
- module ActiveModel
2985
- module Validations
2986
- class ConfirmationValidator < EachValidator
2987
- # :nodoc:
2988
- def initialize: (untyped options) -> untyped
2989
-
2990
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
2991
-
2992
- def setup!: (untyped klass) -> untyped
2993
-
2994
- def confirmation_value_equal?: (untyped record, untyped attribute, untyped value, untyped confirmed) -> untyped
2995
- end
2996
-
2997
- module HelperMethods
2998
- # Encapsulates the pattern of wanting to validate a password or email
2999
- # address field with a confirmation.
3000
- #
3001
- # Model:
3002
- # class Person < ActiveRecord::Base
3003
- # validates_confirmation_of :user_name, :password
3004
- # validates_confirmation_of :email_address,
3005
- # message: 'should match confirmation'
3006
- # end
3007
- #
3008
- # View:
3009
- # <%= password_field "person", "password" %>
3010
- # <%= password_field "person", "password_confirmation" %>
3011
- #
3012
- # The added +password_confirmation+ attribute is virtual; it exists only
3013
- # as an in-memory attribute for validating the password. To achieve this,
3014
- # the validation adds accessors to the model for the confirmation
3015
- # attribute.
3016
- #
3017
- # NOTE: This check is performed only if +password_confirmation+ is not
3018
- # +nil+. To require confirmation, make sure to add a presence check for
3019
- # the confirmation attribute:
3020
- #
3021
- # validates_presence_of :password_confirmation, if: :password_changed?
3022
- #
3023
- # Configuration options:
3024
- # * <tt>:message</tt> - A custom error message (default is: "doesn't match
3025
- # <tt>%{translated_attribute_name}</tt>").
3026
- # * <tt>:case_sensitive</tt> - Looks for an exact match. Ignored by
3027
- # non-text columns (+true+ by default).
3028
- #
3029
- # There is also a list of default options supported by every validator:
3030
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
3031
- # See <tt>ActiveModel::Validations#validates</tt> for more information
3032
- def validates_confirmation_of: (*untyped attr_names) -> untyped
3033
- end
3034
- end
3035
- end
3036
-
3037
- module ActiveModel
3038
- module Validations
3039
- class ExclusionValidator < EachValidator
3040
- # :nodoc:
3041
- include Clusivity
3042
-
3043
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
3044
- end
3045
-
3046
- module HelperMethods
3047
- # Validates that the value of the specified attribute is not in a
3048
- # particular enumerable object.
3049
- #
3050
- # class Person < ActiveRecord::Base
3051
- # validates_exclusion_of :username, in: %w( admin superuser ), message: "You don't belong here"
3052
- # validates_exclusion_of :age, in: 30..60, message: 'This site is only for under 30 and over 60'
3053
- # validates_exclusion_of :format, in: %w( mov avi ), message: "extension %{value} is not allowed"
3054
- # validates_exclusion_of :password, in: ->(person) { [person.username, person.first_name] },
3055
- # message: 'should not be the same as your username or first name'
3056
- # validates_exclusion_of :karma, in: :reserved_karmas
3057
- # end
3058
- #
3059
- # Configuration options:
3060
- # * <tt>:in</tt> - An enumerable object of items that the value shouldn't
3061
- # be part of. This can be supplied as a proc, lambda or symbol which returns an
3062
- # enumerable. If the enumerable is a numerical, time or datetime range the test
3063
- # is performed with <tt>Range#cover?</tt>, otherwise with <tt>include?</tt>. When
3064
- # using a proc or lambda the instance under validation is passed as an argument.
3065
- # * <tt>:within</tt> - A synonym(or alias) for <tt>:in</tt>
3066
- # <tt>Range#cover?</tt>, otherwise with <tt>include?</tt>.
3067
- # * <tt>:message</tt> - Specifies a custom error message (default is: "is
3068
- # reserved").
3069
- #
3070
- # There is also a list of default options supported by every validator:
3071
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
3072
- # See <tt>ActiveModel::Validations#validates</tt> for more information
3073
- def validates_exclusion_of: (*untyped attr_names) -> untyped
3074
- end
3075
- end
3076
- end
3077
-
3078
- module ActiveModel
3079
- module Validations
3080
- class FormatValidator < EachValidator
3081
- # :nodoc:
3082
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
3083
-
3084
- def check_validity!: () -> untyped
3085
-
3086
- def option_call: (untyped record, untyped name) -> untyped
3087
-
3088
- def record_error: (untyped record, untyped attribute, untyped name, untyped value) -> untyped
3089
-
3090
- def check_options_validity: (untyped name) -> untyped
3091
-
3092
- def regexp_using_multiline_anchors?: (untyped regexp) -> untyped
3093
- end
3094
-
3095
- module HelperMethods
3096
- # Validates whether the value of the specified attribute is of the correct
3097
- # form, going by the regular expression provided. You can require that the
3098
- # attribute matches the regular expression:
3099
- #
3100
- # class Person < ActiveRecord::Base
3101
- # validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create
3102
- # end
3103
- #
3104
- # Alternatively, you can require that the specified attribute does _not_
3105
- # match the regular expression:
3106
- #
3107
- # class Person < ActiveRecord::Base
3108
- # validates_format_of :email, without: /NOSPAM/
3109
- # end
3110
- #
3111
- # You can also provide a proc or lambda which will determine the regular
3112
- # expression that will be used to validate the attribute.
3113
- #
3114
- # class Person < ActiveRecord::Base
3115
- # # Admin can have number as a first letter in their screen name
3116
- # validates_format_of :screen_name,
3117
- # with: ->(person) { person.admin? ? /\A[a-z0-9][a-z0-9_\-]*\z/i : /\A[a-z][a-z0-9_\-]*\z/i }
3118
- # end
3119
- #
3120
- # Note: use <tt>\A</tt> and <tt>\z</tt> to match the start and end of the
3121
- # string, <tt>^</tt> and <tt>$</tt> match the start/end of a line.
3122
- #
3123
- # Due to frequent misuse of <tt>^</tt> and <tt>$</tt>, you need to pass
3124
- # the <tt>multiline: true</tt> option in case you use any of these two
3125
- # anchors in the provided regular expression. In most cases, you should be
3126
- # using <tt>\A</tt> and <tt>\z</tt>.
3127
- #
3128
- # You must pass either <tt>:with</tt> or <tt>:without</tt> as an option.
3129
- # In addition, both must be a regular expression or a proc or lambda, or
3130
- # else an exception will be raised.
3131
- #
3132
- # Configuration options:
3133
- # * <tt>:message</tt> - A custom error message (default is: "is invalid").
3134
- # * <tt>:with</tt> - Regular expression that if the attribute matches will
3135
- # result in a successful validation. This can be provided as a proc or
3136
- # lambda returning regular expression which will be called at runtime.
3137
- # * <tt>:without</tt> - Regular expression that if the attribute does not
3138
- # match will result in a successful validation. This can be provided as
3139
- # a proc or lambda returning regular expression which will be called at
3140
- # runtime.
3141
- # * <tt>:multiline</tt> - Set to true if your regular expression contains
3142
- # anchors that match the beginning or end of lines as opposed to the
3143
- # beginning or end of the string. These anchors are <tt>^</tt> and <tt>$</tt>.
3144
- #
3145
- # There is also a list of default options supported by every validator:
3146
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
3147
- # See <tt>ActiveModel::Validations#validates</tt> for more information
3148
- def validates_format_of: (*untyped attr_names) -> untyped
3149
- end
3150
- end
3151
- end
3152
-
3153
- module ActiveModel
3154
- module Validations
3155
- module HelperMethods
3156
- def _merge_attributes: (untyped attr_names) -> untyped
3157
- end
3158
- end
3159
- end
3160
-
3161
- module ActiveModel
3162
- module Validations
3163
- class InclusionValidator < EachValidator
3164
- # :nodoc:
3165
- include Clusivity
3166
-
3167
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
3168
- end
3169
-
3170
- module HelperMethods
3171
- # Validates whether the value of the specified attribute is available in a
3172
- # particular enumerable object.
3173
- #
3174
- # class Person < ActiveRecord::Base
3175
- # validates_inclusion_of :role, in: %w( admin contributor )
3176
- # validates_inclusion_of :age, in: 0..99
3177
- # validates_inclusion_of :format, in: %w( jpg gif png ), message: "extension %{value} is not included in the list"
3178
- # validates_inclusion_of :states, in: ->(person) { STATES[person.country] }
3179
- # validates_inclusion_of :karma, in: :available_karmas
3180
- # end
3181
- #
3182
- # Configuration options:
3183
- # * <tt>:in</tt> - An enumerable object of available items. This can be
3184
- # supplied as a proc, lambda or symbol which returns an enumerable. If the
3185
- # enumerable is a numerical, time or datetime range the test is performed
3186
- # with <tt>Range#cover?</tt>, otherwise with <tt>include?</tt>. When using
3187
- # a proc or lambda the instance under validation is passed as an argument.
3188
- # * <tt>:within</tt> - A synonym(or alias) for <tt>:in</tt>
3189
- # * <tt>:message</tt> - Specifies a custom error message (default is: "is
3190
- # not included in the list").
3191
- #
3192
- # There is also a list of default options supported by every validator:
3193
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
3194
- # See <tt>ActiveModel::Validations#validates</tt> for more information
3195
- def validates_inclusion_of: (*untyped attr_names) -> untyped
3196
- end
3197
- end
3198
- end
3199
-
3200
- module ActiveModel
3201
- module Validations
3202
- class LengthValidator < EachValidator
3203
- # :nodoc:
3204
- MESSAGES: untyped
3205
-
3206
- CHECKS: untyped
3207
-
3208
- RESERVED_OPTIONS: ::Array[untyped]
3209
-
3210
- def initialize: (untyped options) -> untyped
3211
-
3212
- def check_validity!: () -> untyped
3213
-
3214
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
3215
-
3216
- def skip_nil_check?: (untyped key) -> untyped
3217
- end
3218
-
3219
- module HelperMethods
3220
- # Validates that the specified attributes match the length restrictions
3221
- # supplied. Only one constraint option can be used at a time apart from
3222
- # +:minimum+ and +:maximum+ that can be combined together:
3223
- #
3224
- # class Person < ActiveRecord::Base
3225
- # validates_length_of :first_name, maximum: 30
3226
- # validates_length_of :last_name, maximum: 30, message: "less than 30 if you don't mind"
3227
- # validates_length_of :fax, in: 7..32, allow_nil: true
3228
- # validates_length_of :phone, in: 7..32, allow_blank: true
3229
- # validates_length_of :user_name, within: 6..20, too_long: 'pick a shorter name', too_short: 'pick a longer name'
3230
- # validates_length_of :zip_code, minimum: 5, too_short: 'please enter at least 5 characters'
3231
- # validates_length_of :smurf_leader, is: 4, message: "papa is spelled with 4 characters... don't play me."
3232
- # validates_length_of :words_in_essay, minimum: 100, too_short: 'Your essay must be at least 100 words.'
3233
- #
3234
- # private
3235
- #
3236
- # def words_in_essay
3237
- # essay.scan(/\w+/)
3238
- # end
3239
- # end
3240
- #
3241
- # Constraint options:
3242
- #
3243
- # * <tt>:minimum</tt> - The minimum size of the attribute.
3244
- # * <tt>:maximum</tt> - The maximum size of the attribute. Allows +nil+ by
3245
- # default if not used with +:minimum+.
3246
- # * <tt>:is</tt> - The exact size of the attribute.
3247
- # * <tt>:within</tt> - A range specifying the minimum and maximum size of
3248
- # the attribute.
3249
- # * <tt>:in</tt> - A synonym (or alias) for <tt>:within</tt>.
3250
- #
3251
- # Other options:
3252
- #
3253
- # * <tt>:allow_nil</tt> - Attribute may be +nil+; skip validation.
3254
- # * <tt>:allow_blank</tt> - Attribute may be blank; skip validation.
3255
- # * <tt>:too_long</tt> - The error message if the attribute goes over the
3256
- # maximum (default is: "is too long (maximum is %{count} characters)").
3257
- # * <tt>:too_short</tt> - The error message if the attribute goes under the
3258
- # minimum (default is: "is too short (minimum is %{count} characters)").
3259
- # * <tt>:wrong_length</tt> - The error message if using the <tt>:is</tt>
3260
- # method and the attribute is the wrong size (default is: "is the wrong
3261
- # length (should be %{count} characters)").
3262
- # * <tt>:message</tt> - The error message to use for a <tt>:minimum</tt>,
3263
- # <tt>:maximum</tt>, or <tt>:is</tt> violation. An alias of the appropriate
3264
- # <tt>too_long</tt>/<tt>too_short</tt>/<tt>wrong_length</tt> message.
3265
- #
3266
- # There is also a list of default options supported by every validator:
3267
- # +:if+, +:unless+, +:on+ and +:strict+.
3268
- # See <tt>ActiveModel::Validations#validates</tt> for more information
3269
- def validates_length_of: (*untyped attr_names) -> untyped
3270
- end
3271
- end
3272
- end
3273
-
3274
- module ActiveModel
3275
- module Validations
3276
- class NumericalityValidator < EachValidator
3277
- # :nodoc:
3278
- CHECKS: untyped
3279
-
3280
- RESERVED_OPTIONS: untyped
3281
-
3282
- INTEGER_REGEX: untyped
3283
-
3284
- HEXADECIMAL_REGEX: untyped
3285
-
3286
- def check_validity!: () -> untyped
3287
-
3288
- def validate_each: (untyped record, untyped attr_name, untyped value) -> (nil | untyped)
3289
-
3290
- def is_number?: (untyped raw_value) -> untyped
3291
-
3292
- def parse_as_number: (untyped raw_value) -> untyped
3293
-
3294
- def is_integer?: (untyped raw_value) -> untyped
3295
-
3296
- def is_hexadecimal_literal?: (untyped raw_value) -> untyped
3297
-
3298
- def filtered_options: (untyped value) -> untyped
3299
-
3300
- def allow_only_integer?: (untyped record) -> untyped
3301
-
3302
- def record_attribute_changed_in_place?: (untyped record, untyped attr_name) -> untyped
3303
- end
3304
-
3305
- module HelperMethods
3306
- # Validates whether the value of the specified attribute is numeric by
3307
- # trying to convert it to a float with Kernel.Float (if <tt>only_integer</tt>
3308
- # is +false+) or applying it to the regular expression <tt>/\A[\+\-]?\d+\z/</tt>
3309
- # (if <tt>only_integer</tt> is set to +true+).
3310
- #
3311
- # class Person < ActiveRecord::Base
3312
- # validates_numericality_of :value, on: :create
3313
- # end
3314
- #
3315
- # Configuration options:
3316
- # * <tt>:message</tt> - A custom error message (default is: "is not a number").
3317
- # * <tt>:only_integer</tt> - Specifies whether the value has to be an
3318
- # integer, e.g. an integral value (default is +false+).
3319
- # * <tt>:allow_nil</tt> - Skip validation if attribute is +nil+ (default is
3320
- # +false+). Notice that for Integer and Float columns empty strings are
3321
- # converted to +nil+.
3322
- # * <tt>:greater_than</tt> - Specifies the value must be greater than the
3323
- # supplied value.
3324
- # * <tt>:greater_than_or_equal_to</tt> - Specifies the value must be
3325
- # greater than or equal the supplied value.
3326
- # * <tt>:equal_to</tt> - Specifies the value must be equal to the supplied
3327
- # value.
3328
- # * <tt>:less_than</tt> - Specifies the value must be less than the
3329
- # supplied value.
3330
- # * <tt>:less_than_or_equal_to</tt> - Specifies the value must be less
3331
- # than or equal the supplied value.
3332
- # * <tt>:other_than</tt> - Specifies the value must be other than the
3333
- # supplied value.
3334
- # * <tt>:odd</tt> - Specifies the value must be an odd number.
3335
- # * <tt>:even</tt> - Specifies the value must be an even number.
3336
- #
3337
- # There is also a list of default options supported by every validator:
3338
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+ .
3339
- # See <tt>ActiveModel::Validations#validates</tt> for more information
3340
- #
3341
- # The following checks can also be supplied with a proc or a symbol which
3342
- # corresponds to a method:
3343
- #
3344
- # * <tt>:greater_than</tt>
3345
- # * <tt>:greater_than_or_equal_to</tt>
3346
- # * <tt>:equal_to</tt>
3347
- # * <tt>:less_than</tt>
3348
- # * <tt>:less_than_or_equal_to</tt>
3349
- # * <tt>:only_integer</tt>
3350
- #
3351
- # For example:
3352
- #
3353
- # class Person < ActiveRecord::Base
3354
- # validates_numericality_of :width, less_than: ->(person) { person.height }
3355
- # validates_numericality_of :width, greater_than: :minimum_weight
3356
- # end
3357
- def validates_numericality_of: (*untyped attr_names) -> untyped
3358
- end
3359
- end
3360
- end
3361
-
3362
- module ActiveModel
3363
- module Validations
3364
- class PresenceValidator < EachValidator
3365
- # :nodoc:
3366
- def validate_each: (untyped record, untyped attr_name, untyped value) -> untyped
3367
- end
3368
-
3369
- module HelperMethods
3370
- # Validates that the specified attributes are not blank (as defined by
3371
- # Object#blank?). Happens by default on save.
3372
- #
3373
- # class Person < ActiveRecord::Base
3374
- # validates_presence_of :first_name
3375
- # end
3376
- #
3377
- # The first_name attribute must be in the object and it cannot be blank.
3378
- #
3379
- # If you want to validate the presence of a boolean field (where the real
3380
- # values are +true+ and +false+), you will want to use
3381
- # <tt>validates_inclusion_of :field_name, in: [true, false]</tt>.
3382
- #
3383
- # This is due to the way Object#blank? handles boolean values:
3384
- # <tt>false.blank? # => true</tt>.
3385
- #
3386
- # Configuration options:
3387
- # * <tt>:message</tt> - A custom error message (default is: "can't be blank").
3388
- #
3389
- # There is also a list of default options supported by every validator:
3390
- # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
3391
- # See <tt>ActiveModel::Validations#validates</tt> for more information
3392
- def validates_presence_of: (*untyped attr_names) -> untyped
3393
- end
3394
- end
3395
- end
3396
-
3397
- module ActiveModel
3398
- # == Active \Model \Validations
3399
- #
3400
- # Provides a full validation framework to your objects.
3401
- #
3402
- # A minimal implementation could be:
3403
- #
3404
- # class Person
3405
- # include ActiveModel::Validations
3406
- #
3407
- # attr_accessor :first_name, :last_name
3408
- #
3409
- # validates_each :first_name, :last_name do |record, attr, value|
3410
- # record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
3411
- # end
3412
- # end
3413
- #
3414
- # Which provides you with the full standard validation stack that you
3415
- # know from Active Record:
3416
- #
3417
- # person = Person.new
3418
- # person.valid? # => true
3419
- # person.invalid? # => false
3420
- #
3421
- # person.first_name = 'zoolander'
3422
- # person.valid? # => false
3423
- # person.invalid? # => true
3424
- # person.errors.messages # => {first_name:["starts with z."]}
3425
- #
3426
- # Note that <tt>ActiveModel::Validations</tt> automatically adds an +errors+
3427
- # method to your instances initialized with a new <tt>ActiveModel::Errors</tt>
3428
- # object, so there is no need for you to do this manually.
3429
- module Validations
3430
- extend ActiveSupport::Concern
3431
-
3432
- extend ActiveModel::Naming
3433
-
3434
- extend ActiveModel::Callbacks
3435
-
3436
- extend ActiveModel::Translation
3437
-
3438
- extend HelperMethods
3439
-
3440
- include HelperMethods
3441
-
3442
- attr_accessor validation_context: untyped
3443
-
3444
- module ClassMethods
3445
- # Validates each attribute against a block.
3446
- #
3447
- # class Person
3448
- # include ActiveModel::Validations
3449
- #
3450
- # attr_accessor :first_name, :last_name
3451
- #
3452
- # validates_each :first_name, :last_name, allow_blank: true do |record, attr, value|
3453
- # record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
3454
- # end
3455
- # end
3456
- #
3457
- # Options:
3458
- # * <tt>:on</tt> - Specifies the contexts where this validation is active.
3459
- # Runs in all validation contexts by default +nil+. You can pass a symbol
3460
- # or an array of symbols. (e.g. <tt>on: :create</tt> or
3461
- # <tt>on: :custom_validation_context</tt> or
3462
- # <tt>on: [:create, :custom_validation_context]</tt>)
3463
- # * <tt>:allow_nil</tt> - Skip validation if attribute is +nil+.
3464
- # * <tt>:allow_blank</tt> - Skip validation if attribute is blank.
3465
- # * <tt>:if</tt> - Specifies a method, proc or string to call to determine
3466
- # if the validation should occur (e.g. <tt>if: :allow_validation</tt>,
3467
- # or <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method,
3468
- # proc or string should return or evaluate to a +true+ or +false+ value.
3469
- # * <tt>:unless</tt> - Specifies a method, proc or string to call to
3470
- # determine if the validation should not occur (e.g. <tt>unless: :skip_validation</tt>,
3471
- # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The
3472
- # method, proc or string should return or evaluate to a +true+ or +false+
3473
- # value.
3474
- def validates_each: (*untyped attr_names) { () -> untyped } -> untyped
3475
-
3476
- VALID_OPTIONS_FOR_VALIDATE: untyped
3477
-
3478
- # Adds a validation method or block to the class. This is useful when
3479
- # overriding the +validate+ instance method becomes too unwieldy and
3480
- # you're looking for more descriptive declaration of your validations.
3481
- #
3482
- # This can be done with a symbol pointing to a method:
3483
- #
3484
- # class Comment
3485
- # include ActiveModel::Validations
3486
- #
3487
- # validate :must_be_friends
3488
- #
3489
- # def must_be_friends
3490
- # errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
3491
- # end
3492
- # end
3493
- #
3494
- # With a block which is passed with the current record to be validated:
3495
- #
3496
- # class Comment
3497
- # include ActiveModel::Validations
3498
- #
3499
- # validate do |comment|
3500
- # comment.must_be_friends
3501
- # end
3502
- #
3503
- # def must_be_friends
3504
- # errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
3505
- # end
3506
- # end
3507
- #
3508
- # Or with a block where self points to the current record to be validated:
3509
- #
3510
- # class Comment
3511
- # include ActiveModel::Validations
3512
- #
3513
- # validate do
3514
- # errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
3515
- # end
3516
- # end
3517
- #
3518
- # Note that the return value of validation methods is not relevant.
3519
- # It's not possible to halt the validate callback chain.
3520
- #
3521
- # Options:
3522
- # * <tt>:on</tt> - Specifies the contexts where this validation is active.
3523
- # Runs in all validation contexts by default +nil+. You can pass a symbol
3524
- # or an array of symbols. (e.g. <tt>on: :create</tt> or
3525
- # <tt>on: :custom_validation_context</tt> or
3526
- # <tt>on: [:create, :custom_validation_context]</tt>)
3527
- # * <tt>:if</tt> - Specifies a method, proc or string to call to determine
3528
- # if the validation should occur (e.g. <tt>if: :allow_validation</tt>,
3529
- # or <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method,
3530
- # proc or string should return or evaluate to a +true+ or +false+ value.
3531
- # * <tt>:unless</tt> - Specifies a method, proc or string to call to
3532
- # determine if the validation should not occur (e.g. <tt>unless: :skip_validation</tt>,
3533
- # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The
3534
- # method, proc or string should return or evaluate to a +true+ or +false+
3535
- # value.
3536
- #
3537
- # NOTE: Calling +validate+ multiple times on the same method will overwrite previous definitions.
3538
- #
3539
- def validate: (*untyped args) { () -> untyped } -> untyped
3540
-
3541
- # List all validators that are being used to validate the model using
3542
- # +validates_with+ method.
3543
- #
3544
- # class Person
3545
- # include ActiveModel::Validations
3546
- #
3547
- # validates_with MyValidator
3548
- # validates_with OtherValidator, on: :create
3549
- # validates_with StrictValidator, strict: true
3550
- # end
3551
- #
3552
- # Person.validators
3553
- # # => [
3554
- # # #<MyValidator:0x007fbff403e808 @options={}>,
3555
- # # #<OtherValidator:0x007fbff403d930 @options={on: :create}>,
3556
- # # #<StrictValidator:0x007fbff3204a30 @options={strict:true}>
3557
- # # ]
3558
- def validators: () -> untyped
3559
-
3560
- # Clears all of the validators and validations.
3561
- #
3562
- # Note that this will clear anything that is being used to validate
3563
- # the model for both the +validates_with+ and +validate+ methods.
3564
- # It clears the validators that are created with an invocation of
3565
- # +validates_with+ and the callbacks that are set by an invocation
3566
- # of +validate+.
3567
- #
3568
- # class Person
3569
- # include ActiveModel::Validations
3570
- #
3571
- # validates_with MyValidator
3572
- # validates_with OtherValidator, on: :create
3573
- # validates_with StrictValidator, strict: true
3574
- # validate :cannot_be_robot
3575
- #
3576
- # def cannot_be_robot
3577
- # errors.add(:base, 'A person cannot be a robot') if person_is_robot
3578
- # end
3579
- # end
3580
- #
3581
- # Person.validators
3582
- # # => [
3583
- # # #<MyValidator:0x007fbff403e808 @options={}>,
3584
- # # #<OtherValidator:0x007fbff403d930 @options={on: :create}>,
3585
- # # #<StrictValidator:0x007fbff3204a30 @options={strict:true}>
3586
- # # ]
3587
- #
3588
- # If one runs <tt>Person.clear_validators!</tt> and then checks to see what
3589
- # validators this class has, you would obtain:
3590
- #
3591
- # Person.validators # => []
3592
- #
3593
- # Also, the callback set by <tt>validate :cannot_be_robot</tt> will be erased
3594
- # so that:
3595
- #
3596
- # Person._validate_callbacks.empty? # => true
3597
- #
3598
- def clear_validators!: () -> untyped
3599
-
3600
- # List all validators that are being used to validate a specific attribute.
3601
- #
3602
- # class Person
3603
- # include ActiveModel::Validations
3604
- #
3605
- # attr_accessor :name , :age
3606
- #
3607
- # validates_presence_of :name
3608
- # validates_inclusion_of :age, in: 0..99
3609
- # end
3610
- #
3611
- # Person.validators_on(:name)
3612
- # # => [
3613
- # # #<ActiveModel::Validations::PresenceValidator:0x007fe604914e60 @attributes=[:name], @options={}>,
3614
- # # ]
3615
- def validators_on: (*untyped attributes) -> untyped
3616
-
3617
- # Returns +true+ if +attribute+ is an attribute method, +false+ otherwise.
3618
- #
3619
- # class Person
3620
- # include ActiveModel::Validations
3621
- #
3622
- # attr_accessor :name
3623
- # end
3624
- #
3625
- # User.attribute_method?(:name) # => true
3626
- # User.attribute_method?(:age) # => false
3627
- def attribute_method?: (untyped attribute) -> untyped
3628
-
3629
- def inherited: (untyped base) -> untyped
3630
- end
3631
-
3632
- def initialize_dup: (untyped other) -> untyped
3633
-
3634
- # Returns the +Errors+ object that holds all information about attribute
3635
- # error messages.
3636
- #
3637
- # class Person
3638
- # include ActiveModel::Validations
3639
- #
3640
- # attr_accessor :name
3641
- # validates_presence_of :name
3642
- # end
3643
- #
3644
- # person = Person.new
3645
- # person.valid? # => false
3646
- # person.errors # => #<ActiveModel::Errors:0x007fe603816640 @messages={name:["can't be blank"]}>
3647
- def errors: () -> untyped
3648
-
3649
- # Runs all the specified validations and returns +true+ if no errors were
3650
- # added otherwise +false+.
3651
- #
3652
- # class Person
3653
- # include ActiveModel::Validations
3654
- #
3655
- # attr_accessor :name
3656
- # validates_presence_of :name
3657
- # end
3658
- #
3659
- # person = Person.new
3660
- # person.name = ''
3661
- # person.valid? # => false
3662
- # person.name = 'david'
3663
- # person.valid? # => true
3664
- #
3665
- # Context can optionally be supplied to define which callbacks to test
3666
- # against (the context is defined on the validations using <tt>:on</tt>).
3667
- #
3668
- # class Person
3669
- # include ActiveModel::Validations
3670
- #
3671
- # attr_accessor :name
3672
- # validates_presence_of :name, on: :new
3673
- # end
3674
- #
3675
- # person = Person.new
3676
- # person.valid? # => true
3677
- # person.valid?(:new) # => false
3678
- def valid?: (?untyped? context) -> untyped
3679
-
3680
- # Performs the opposite of <tt>valid?</tt>. Returns +true+ if errors were
3681
- # added, +false+ otherwise.
3682
- #
3683
- # class Person
3684
- # include ActiveModel::Validations
3685
- #
3686
- # attr_accessor :name
3687
- # validates_presence_of :name
3688
- # end
3689
- #
3690
- # person = Person.new
3691
- # person.name = ''
3692
- # person.invalid? # => true
3693
- # person.name = 'david'
3694
- # person.invalid? # => false
3695
- #
3696
- # Context can optionally be supplied to define which callbacks to test
3697
- # against (the context is defined on the validations using <tt>:on</tt>).
3698
- #
3699
- # class Person
3700
- # include ActiveModel::Validations
3701
- #
3702
- # attr_accessor :name
3703
- # validates_presence_of :name, on: :new
3704
- # end
3705
- #
3706
- # person = Person.new
3707
- # person.invalid? # => false
3708
- # person.invalid?(:new) # => true
3709
- def invalid?: (?untyped? context) -> untyped
3710
-
3711
- # Runs all the validations within the specified context. Returns +true+ if
3712
- # no errors are found, raises +ValidationError+ otherwise.
3713
- #
3714
- # Validations with no <tt>:on</tt> option will run no matter the context. Validations with
3715
- # some <tt>:on</tt> option will only run in the specified context.
3716
- def validate!: (?untyped? context) -> untyped
3717
-
3718
- def run_validations!: () -> untyped
3719
-
3720
- def raise_validation_error: () -> untyped
3721
- end
3722
-
3723
- # = Active Model ValidationError
3724
- #
3725
- # Raised by <tt>validate!</tt> when the model is invalid. Use the
3726
- # +model+ method to retrieve the record which did not validate.
3727
- #
3728
- # begin
3729
- # complex_operation_that_internally_calls_validate!
3730
- # rescue ActiveModel::ValidationError => invalid
3731
- # puts invalid.model.errors
3732
- # end
3733
- class ValidationError < StandardError
3734
- attr_reader model: untyped
3735
-
3736
- def initialize: (untyped model) -> untyped
3737
- end
3738
- end
3739
-
3740
- module ActiveModel
3741
- module Validations
3742
- module ClassMethods
3743
- # This method is a shortcut to all default validators and any custom
3744
- # validator classes ending in 'Validator'. Note that Rails default
3745
- # validators can be overridden inside specific classes by creating
3746
- # custom validator classes in their place such as PresenceValidator.
3747
- #
3748
- # Examples of using the default rails validators:
3749
- #
3750
- # validates :terms, acceptance: true
3751
- # validates :password, confirmation: true
3752
- # validates :username, exclusion: { in: %w(admin superuser) }
3753
- # validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
3754
- # validates :age, inclusion: { in: 0..9 }
3755
- # validates :first_name, length: { maximum: 30 }
3756
- # validates :age, numericality: true
3757
- # validates :username, presence: true
3758
- #
3759
- # The power of the +validates+ method comes when using custom validators
3760
- # and default validators in one call for a given attribute.
3761
- #
3762
- # class EmailValidator < ActiveModel::EachValidator
3763
- # def validate_each(record, attribute, value)
3764
- # record.errors.add attribute, (options[:message] || "is not an email") unless
3765
- # value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
3766
- # end
3767
- # end
3768
- #
3769
- # class Person
3770
- # include ActiveModel::Validations
3771
- # attr_accessor :name, :email
3772
- #
3773
- # validates :name, presence: true, length: { maximum: 100 }
3774
- # validates :email, presence: true, email: true
3775
- # end
3776
- #
3777
- # Validator classes may also exist within the class being validated
3778
- # allowing custom modules of validators to be included as needed.
3779
- #
3780
- # class Film
3781
- # include ActiveModel::Validations
3782
- #
3783
- # class TitleValidator < ActiveModel::EachValidator
3784
- # def validate_each(record, attribute, value)
3785
- # record.errors.add attribute, "must start with 'the'" unless value =~ /\Athe/i
3786
- # end
3787
- # end
3788
- #
3789
- # validates :name, title: true
3790
- # end
3791
- #
3792
- # Additionally validator classes may be in another namespace and still
3793
- # used within any class.
3794
- #
3795
- # validates :name, :'film/title' => true
3796
- #
3797
- # The validators hash can also handle regular expressions, ranges, arrays
3798
- # and strings in shortcut form.
3799
- #
3800
- # validates :email, format: /@/
3801
- # validates :role, inclusion: %(admin contributor)
3802
- # validates :password, length: 6..20
3803
- #
3804
- # When using shortcut form, ranges and arrays are passed to your
3805
- # validator's initializer as <tt>options[:in]</tt> while other types
3806
- # including regular expressions and strings are passed as <tt>options[:with]</tt>.
3807
- #
3808
- # There is also a list of options that could be used along with validators:
3809
- #
3810
- # * <tt>:on</tt> - Specifies the contexts where this validation is active.
3811
- # Runs in all validation contexts by default +nil+. You can pass a symbol
3812
- # or an array of symbols. (e.g. <tt>on: :create</tt> or
3813
- # <tt>on: :custom_validation_context</tt> or
3814
- # <tt>on: [:create, :custom_validation_context]</tt>)
3815
- # * <tt>:if</tt> - Specifies a method, proc or string to call to determine
3816
- # if the validation should occur (e.g. <tt>if: :allow_validation</tt>,
3817
- # or <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method,
3818
- # proc or string should return or evaluate to a +true+ or +false+ value.
3819
- # * <tt>:unless</tt> - Specifies a method, proc or string to call to determine
3820
- # if the validation should not occur (e.g. <tt>unless: :skip_validation</tt>,
3821
- # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The
3822
- # method, proc or string should return or evaluate to a +true+ or
3823
- # +false+ value.
3824
- # * <tt>:allow_nil</tt> - Skip validation if the attribute is +nil+.
3825
- # * <tt>:allow_blank</tt> - Skip validation if the attribute is blank.
3826
- # * <tt>:strict</tt> - If the <tt>:strict</tt> option is set to true
3827
- # will raise ActiveModel::StrictValidationFailed instead of adding the error.
3828
- # <tt>:strict</tt> option can also be set to any other exception.
3829
- #
3830
- # Example:
3831
- #
3832
- # validates :password, presence: true, confirmation: true, if: :password_required?
3833
- # validates :token, length: 24, strict: TokenLengthException
3834
- #
3835
- #
3836
- # Finally, the options +:if+, +:unless+, +:on+, +:allow_blank+, +:allow_nil+, +:strict+
3837
- # and +:message+ can be given to one specific validator, as a hash:
3838
- #
3839
- # validates :password, presence: { if: :password_required?, message: 'is forgotten.' }, confirmation: true
3840
- def validates: (*untyped attributes) -> untyped
3841
-
3842
- # This method is used to define validations that cannot be corrected by end
3843
- # users and are considered exceptional. So each validator defined with bang
3844
- # or <tt>:strict</tt> option set to <tt>true</tt> will always raise
3845
- # <tt>ActiveModel::StrictValidationFailed</tt> instead of adding error
3846
- # when validation fails. See <tt>validates</tt> for more information about
3847
- # the validation itself.
3848
- #
3849
- # class Person
3850
- # include ActiveModel::Validations
3851
- #
3852
- # attr_accessor :name
3853
- # validates! :name, presence: true
3854
- # end
3855
- #
3856
- # person = Person.new
3857
- # person.name = ''
3858
- # person.valid?
3859
- # # => ActiveModel::StrictValidationFailed: Name can't be blank
3860
- def validates!: (*untyped attributes) -> untyped
3861
-
3862
- # When creating custom validators, it might be useful to be able to specify
3863
- # additional default keys. This can be done by overwriting this method.
3864
- def _validates_default_keys: () -> ::Array[:if | :unless | :on | :allow_blank | :allow_nil | :strict]
3865
-
3866
- def _parse_validates_options: (untyped options) -> untyped
3867
- end
3868
- end
3869
- end
3870
-
3871
- module ActiveModel
3872
- module Validations
3873
- class WithValidator < EachValidator
3874
- # :nodoc:
3875
- def validate_each: (untyped record, untyped attr, untyped val) -> untyped
3876
- end
3877
-
3878
- module ClassMethods
3879
- # Passes the record off to the class or classes specified and allows them
3880
- # to add errors based on more complex conditions.
3881
- #
3882
- # class Person
3883
- # include ActiveModel::Validations
3884
- # validates_with MyValidator
3885
- # end
3886
- #
3887
- # class MyValidator < ActiveModel::Validator
3888
- # def validate(record)
3889
- # if some_complex_logic
3890
- # record.errors.add :base, 'This record is invalid'
3891
- # end
3892
- # end
3893
- #
3894
- # private
3895
- # def some_complex_logic
3896
- # # ...
3897
- # end
3898
- # end
3899
- #
3900
- # You may also pass it multiple classes, like so:
3901
- #
3902
- # class Person
3903
- # include ActiveModel::Validations
3904
- # validates_with MyValidator, MyOtherValidator, on: :create
3905
- # end
3906
- #
3907
- # Configuration options:
3908
- # * <tt>:on</tt> - Specifies the contexts where this validation is active.
3909
- # Runs in all validation contexts by default +nil+. You can pass a symbol
3910
- # or an array of symbols. (e.g. <tt>on: :create</tt> or
3911
- # <tt>on: :custom_validation_context</tt> or
3912
- # <tt>on: [:create, :custom_validation_context]</tt>)
3913
- # * <tt>:if</tt> - Specifies a method, proc or string to call to determine
3914
- # if the validation should occur (e.g. <tt>if: :allow_validation</tt>,
3915
- # or <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>).
3916
- # The method, proc or string should return or evaluate to a +true+ or
3917
- # +false+ value.
3918
- # * <tt>:unless</tt> - Specifies a method, proc or string to call to
3919
- # determine if the validation should not occur
3920
- # (e.g. <tt>unless: :skip_validation</tt>, or
3921
- # <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>).
3922
- # The method, proc or string should return or evaluate to a +true+ or
3923
- # +false+ value.
3924
- # * <tt>:strict</tt> - Specifies whether validation should be strict.
3925
- # See <tt>ActiveModel::Validations#validates!</tt> for more information.
3926
- #
3927
- # If you pass any additional configuration options, they will be passed
3928
- # to the class and available as +options+:
3929
- #
3930
- # class Person
3931
- # include ActiveModel::Validations
3932
- # validates_with MyValidator, my_custom_key: 'my custom value'
3933
- # end
3934
- #
3935
- # class MyValidator < ActiveModel::Validator
3936
- # def validate(record)
3937
- # options[:my_custom_key] # => "my custom value"
3938
- # end
3939
- # end
3940
- def validates_with: (*untyped args) { () -> untyped } -> untyped
3941
- end
3942
-
3943
- # Passes the record off to the class or classes specified and allows them
3944
- # to add errors based on more complex conditions.
3945
- #
3946
- # class Person
3947
- # include ActiveModel::Validations
3948
- #
3949
- # validate :instance_validations
3950
- #
3951
- # def instance_validations
3952
- # validates_with MyValidator
3953
- # end
3954
- # end
3955
- #
3956
- # Please consult the class method documentation for more information on
3957
- # creating your own validator.
3958
- #
3959
- # You may also pass it multiple classes, like so:
3960
- #
3961
- # class Person
3962
- # include ActiveModel::Validations
3963
- #
3964
- # validate :instance_validations, on: :create
3965
- #
3966
- # def instance_validations
3967
- # validates_with MyValidator, MyOtherValidator
3968
- # end
3969
- # end
3970
- #
3971
- # Standard configuration options (<tt>:on</tt>, <tt>:if</tt> and
3972
- # <tt>:unless</tt>), which are available on the class version of
3973
- # +validates_with+, should instead be placed on the +validates+ method
3974
- # as these are applied and tested in the callback.
3975
- #
3976
- # If you pass any additional configuration options, they will be passed
3977
- # to the class and available as +options+, please refer to the
3978
- # class version of this method for more information.
3979
- def validates_with: (*untyped args) { () -> untyped } -> untyped
3980
- end
3981
- end
3982
-
3983
- module ActiveModel
3984
- # == Active \Model \Validator
3985
- #
3986
- # A simple base class that can be used along with
3987
- # ActiveModel::Validations::ClassMethods.validates_with
3988
- #
3989
- # class Person
3990
- # include ActiveModel::Validations
3991
- # validates_with MyValidator
3992
- # end
3993
- #
3994
- # class MyValidator < ActiveModel::Validator
3995
- # def validate(record)
3996
- # if some_complex_logic
3997
- # record.errors.add(:base, "This record is invalid")
3998
- # end
3999
- # end
4000
- #
4001
- # private
4002
- # def some_complex_logic
4003
- # # ...
4004
- # end
4005
- # end
4006
- #
4007
- # Any class that inherits from ActiveModel::Validator must implement a method
4008
- # called +validate+ which accepts a +record+.
4009
- #
4010
- # class Person
4011
- # include ActiveModel::Validations
4012
- # validates_with MyValidator
4013
- # end
4014
- #
4015
- # class MyValidator < ActiveModel::Validator
4016
- # def validate(record)
4017
- # record # => The person instance being validated
4018
- # options # => Any non-standard options passed to validates_with
4019
- # end
4020
- # end
4021
- #
4022
- # To cause a validation error, you must add to the +record+'s errors directly
4023
- # from within the validators message.
4024
- #
4025
- # class MyValidator < ActiveModel::Validator
4026
- # def validate(record)
4027
- # record.errors.add :base, "This is some custom error message"
4028
- # record.errors.add :first_name, "This is some complex validation"
4029
- # # etc...
4030
- # end
4031
- # end
4032
- #
4033
- # To add behavior to the initialize method, use the following signature:
4034
- #
4035
- # class MyValidator < ActiveModel::Validator
4036
- # def initialize(options)
4037
- # super
4038
- # @my_custom_field = options[:field_name] || :first_name
4039
- # end
4040
- # end
4041
- #
4042
- # Note that the validator is initialized only once for the whole application
4043
- # life cycle, and not on each validation run.
4044
- #
4045
- # The easiest way to add custom validators for validating individual attributes
4046
- # is with the convenient <tt>ActiveModel::EachValidator</tt>.
4047
- #
4048
- # class TitleValidator < ActiveModel::EachValidator
4049
- # def validate_each(record, attribute, value)
4050
- # record.errors.add attribute, 'must be Mr., Mrs., or Dr.' unless %w(Mr. Mrs. Dr.).include?(value)
4051
- # end
4052
- # end
4053
- #
4054
- # This can now be used in combination with the +validates+ method
4055
- # (see <tt>ActiveModel::Validations::ClassMethods.validates</tt> for more on this).
4056
- #
4057
- # class Person
4058
- # include ActiveModel::Validations
4059
- # attr_accessor :title
4060
- #
4061
- # validates :title, presence: true, title: true
4062
- # end
4063
- #
4064
- # It can be useful to access the class that is using that validator when there are prerequisites such
4065
- # as an +attr_accessor+ being present. This class is accessible via <tt>options[:class]</tt> in the constructor.
4066
- # To setup your validator override the constructor.
4067
- #
4068
- # class MyValidator < ActiveModel::Validator
4069
- # def initialize(options={})
4070
- # super
4071
- # options[:class].attr_accessor :custom_attribute
4072
- # end
4073
- # end
4074
- class Validator
4075
- attr_reader options: untyped
4076
-
4077
- # Returns the kind of the validator.
4078
- #
4079
- # PresenceValidator.kind # => :presence
4080
- # AcceptanceValidator.kind # => :acceptance
4081
- def self.kind: () -> untyped
4082
-
4083
- # Accepts options that will be made available through the +options+ reader.
4084
- def initialize: (?::Hash[untyped, untyped] options) -> untyped
4085
-
4086
- # Returns the kind for this validator.
4087
- #
4088
- # PresenceValidator.new(attributes: [:username]).kind # => :presence
4089
- # AcceptanceValidator.new(attributes: [:terms]).kind # => :acceptance
4090
- def kind: () -> untyped
4091
-
4092
- # Override this method in subclasses with validation logic, adding errors
4093
- # to the records +errors+ array where necessary.
4094
- def validate: (untyped record) -> untyped
4095
- end
4096
-
4097
- class EachValidator < Validator
4098
- # +EachValidator+ is a validator which iterates through the attributes given
4099
- # in the options hash invoking the <tt>validate_each</tt> method passing in the
4100
- # record, attribute and value.
4101
- #
4102
- # All \Active \Model validations are built on top of this validator.
4103
- # nodoc:
4104
- attr_reader attributes: untyped
4105
-
4106
- # Returns a new validator instance. All options will be available via the
4107
- # +options+ reader, however the <tt>:attributes</tt> option will be removed
4108
- # and instead be made available through the +attributes+ reader.
4109
- def initialize: (untyped options) -> untyped
4110
-
4111
- # Performs validation on the supplied record. By default this will call
4112
- # +validate_each+ to determine validity therefore subclasses should
4113
- # override +validate_each+ with validation logic.
4114
- def validate: (untyped record) -> untyped
4115
-
4116
- # Override this method in subclasses with the validation logic, adding
4117
- # errors to the records +errors+ array where necessary.
4118
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
4119
-
4120
- # Hook method that gets called by the initializer allowing verification
4121
- # that the arguments supplied are valid. You could for example raise an
4122
- # +ArgumentError+ when invalid options are supplied.
4123
- def check_validity!: () -> nil
4124
- end
4125
-
4126
- class BlockValidator < EachValidator
4127
- # +BlockValidator+ is a special +EachValidator+ which receives a block on initialization
4128
- # and call this block for each attribute being validated. +validates_each+ uses this validator.
4129
- # nodoc:
4130
- def initialize: (untyped options) { () -> untyped } -> untyped
4131
-
4132
- def validate_each: (untyped record, untyped attribute, untyped value) -> untyped
4133
- end
4134
- end
4135
-
4136
- module ActiveModel
4137
- # Returns the version of the currently loaded \Active \Model as a <tt>Gem::Version</tt>
4138
- def self.version: () -> untyped
4139
- end