activemodel 4.2.11.3 → 5.0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +149 -56
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +8 -16
  5. data/lib/active_model/attribute_assignment.rb +52 -0
  6. data/lib/active_model/attribute_methods.rb +16 -16
  7. data/lib/active_model/callbacks.rb +3 -3
  8. data/lib/active_model/conversion.rb +5 -5
  9. data/lib/active_model/dirty.rb +41 -40
  10. data/lib/active_model/errors.rb +175 -68
  11. data/lib/active_model/forbidden_attributes_protection.rb +3 -2
  12. data/lib/active_model/gem_version.rb +5 -5
  13. data/lib/active_model/lint.rb +32 -28
  14. data/lib/active_model/locale/en.yml +2 -1
  15. data/lib/active_model/model.rb +3 -4
  16. data/lib/active_model/naming.rb +5 -4
  17. data/lib/active_model/secure_password.rb +2 -9
  18. data/lib/active_model/serialization.rb +36 -9
  19. data/lib/active_model/type/big_integer.rb +13 -0
  20. data/lib/active_model/type/binary.rb +50 -0
  21. data/lib/active_model/type/boolean.rb +21 -0
  22. data/lib/active_model/type/date.rb +54 -0
  23. data/lib/active_model/type/date_time.rb +44 -0
  24. data/lib/active_model/type/decimal.rb +66 -0
  25. data/lib/active_model/type/decimal_without_scale.rb +11 -0
  26. data/lib/active_model/type/float.rb +25 -0
  27. data/lib/active_model/type/helpers/accepts_multiparameter_time.rb +35 -0
  28. data/lib/active_model/type/helpers/mutable.rb +18 -0
  29. data/lib/active_model/type/helpers/numeric.rb +34 -0
  30. data/lib/active_model/type/helpers/time_value.rb +77 -0
  31. data/lib/active_model/type/helpers.rb +4 -0
  32. data/lib/active_model/type/immutable_string.rb +29 -0
  33. data/lib/active_model/type/integer.rb +66 -0
  34. data/lib/active_model/type/registry.rb +64 -0
  35. data/lib/active_model/type/string.rb +24 -0
  36. data/lib/active_model/type/text.rb +11 -0
  37. data/lib/active_model/type/time.rb +42 -0
  38. data/lib/active_model/type/unsigned_integer.rb +15 -0
  39. data/lib/active_model/type/value.rb +116 -0
  40. data/lib/active_model/type.rb +59 -0
  41. data/lib/active_model/validations/absence.rb +1 -1
  42. data/lib/active_model/validations/acceptance.rb +57 -9
  43. data/lib/active_model/validations/callbacks.rb +3 -3
  44. data/lib/active_model/validations/clusivity.rb +4 -3
  45. data/lib/active_model/validations/confirmation.rb +16 -4
  46. data/lib/active_model/validations/exclusion.rb +3 -1
  47. data/lib/active_model/validations/format.rb +1 -1
  48. data/lib/active_model/validations/helper_methods.rb +13 -0
  49. data/lib/active_model/validations/inclusion.rb +3 -3
  50. data/lib/active_model/validations/length.rb +49 -18
  51. data/lib/active_model/validations/numericality.rb +20 -11
  52. data/lib/active_model/validations/validates.rb +1 -1
  53. data/lib/active_model/validations/with.rb +0 -10
  54. data/lib/active_model/validations.rb +34 -1
  55. data/lib/active_model/validator.rb +5 -5
  56. data/lib/active_model/version.rb +1 -1
  57. data/lib/active_model.rb +4 -2
  58. metadata +31 -22
  59. data/lib/active_model/serializers/xml.rb +0 -238
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b7f6de69f52b72621f82ed10eb387eb88cc7dc4818a3dff7b82d10a3540102d1
4
- data.tar.gz: 2bbead6125859469e32d9b88d25f23f9e305d7ef41c7abe5a448a12677f6e5fd
3
+ metadata.gz: 037004e060b00ef9bdf166f1a123941008eac38445bf7b69de9e4325d27ad729
4
+ data.tar.gz: 323b17aae456ed4bd2e606dc308edee6cb3abc945d806fb753248e5bc4fe2f7d
5
5
  SHA512:
6
- metadata.gz: 4805edb11e6e7034bd7bc4fb398deee1fe458f3cb576bfe73dcbc37577d2363a3fbc98f8230dfd145b8db8af3d328dbab1de5a9923df839954e615220689849d
7
- data.tar.gz: 6da204b8c331e8c739d40ceb59f3e3d2b20c0f824f723599a852f750639b932cbb98ca6055dd28fab4f04e2ca2604dae129d9012b45ee31a20be3036a12ac7a8
6
+ metadata.gz: ad0dec431b9629aa031fbe36c6ae295f51a2d773fa9e325833189d177201c81c678aee6eb1298607a894a415dd0d1bd0f83e91f6edc7785b7b390af6c9e43b89
7
+ data.tar.gz: 7f5c74e105297822c1d10e088a6aa16641f5cefa6d3d71fde2a2d0e0495bf10565403cb8cd66c00cd241477bb80c997ba1d5a5be3b98ef3dbd8f3d4e142d6186
data/CHANGELOG.md CHANGED
@@ -1,143 +1,236 @@
1
- ## Rails 4.2.11.3 (May 15, 2020) ##
1
+ ## Rails 5.0.7.2 (March 11, 2019) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 4.2.11.2 (May 15, 2020) ##
6
+ ## Rails 5.0.7.1 (November 27, 2018) ##
7
7
 
8
8
  * No changes.
9
9
 
10
10
 
11
- ## Rails 4.2.11.1 (March 11, 2019) ##
11
+ ## Rails 5.0.7 (March 29, 2018) ##
12
12
 
13
13
  * No changes.
14
14
 
15
15
 
16
- ## Rails 4.2.11 (November 27, 2018) ##
16
+ ## Rails 5.0.6 (September 07, 2017) ##
17
17
 
18
18
  * No changes.
19
19
 
20
20
 
21
- ## Rails 4.2.10 (September 27, 2017) ##
21
+ ## Rails 5.0.6.rc1 (August 24, 2017) ##
22
22
 
23
23
  * No changes.
24
24
 
25
25
 
26
- ## Rails 4.2.9 (June 26, 2017) ##
26
+ ## Rails 5.0.5 (July 31, 2017) ##
27
27
 
28
28
  * No changes.
29
29
 
30
30
 
31
- ## Rails 4.2.8 (February 21, 2017) ##
31
+ ## Rails 5.0.5.rc2 (July 25, 2017) ##
32
32
 
33
33
  * No changes.
34
34
 
35
35
 
36
- ## Rails 4.2.7 (July 12, 2016) ##
36
+ ## Rails 5.0.5.rc1 (July 19, 2017) ##
37
37
 
38
38
  * No changes.
39
39
 
40
40
 
41
- ## Rails 4.2.6 (March 07, 2016) ##
41
+ ## Rails 5.0.4 (June 19, 2017) ##
42
42
 
43
- * No changes.
43
+ * Fix regression in numericality validator when comparing Decimal and Float input
44
+ values with more scale than the schema.
45
+
46
+ *Bradley Priest*
47
+
48
+
49
+ ## Rails 5.0.3 (May 12, 2017) ##
50
+
51
+ * The original string assigned to a model attribute is no longer incorrectly
52
+ frozen.
53
+
54
+ Fixes #24185, #28718.
55
+
56
+ *Matthew Draper*
57
+
58
+ * Avoid converting integer as a string into float.
44
59
 
60
+ *namusyaka*
45
61
 
46
- ## Rails 4.2.5.2 (February 26, 2016) ##
62
+
63
+ ## Rails 5.0.2 (March 01, 2017) ##
47
64
 
48
65
  * No changes.
49
66
 
50
67
 
51
- ## Rails 4.2.5.1 (January 25, 2015) ##
68
+ ## Rails 5.0.1 (December 21, 2016) ##
52
69
 
53
70
  * No changes.
54
71
 
55
72
 
56
- ## Rails 4.2.5 (November 12, 2015) ##
73
+ ## Rails 5.0.1.rc2 (December 10, 2016) ##
57
74
 
58
75
  * No changes.
59
76
 
60
77
 
61
- ## Rails 4.2.4 (August 24, 2015) ##
78
+ ## Rails 5.0.1.rc1 (December 01, 2016) ##
62
79
 
63
- * No Changes *
80
+ * Fix `Type::Date#serialize` to cast a value to a date object properly.
81
+ This casting fixes queries for finding records by date column.
64
82
 
83
+ Fixes #25354.
65
84
 
66
- ## Rails 4.2.3 (June 25, 2015) ##
85
+ *Ryuta Kamizono*
67
86
 
68
- * No Changes *
69
87
 
88
+ ## Rails 5.0.0 (June 30, 2016) ##
70
89
 
71
- ## Rails 4.2.2 (June 16, 2015) ##
90
+ * `Dirty`'s `*_changed?` methods now return an actual singleton, never `nil`, as in 4.2.
91
+ Fixes #24220.
72
92
 
73
- * No Changes *
93
+ *Sen-Zhang*
74
94
 
95
+ * Ensure that instances of `ActiveModel::Errors` can be marshalled.
96
+ Fixes #25165.
75
97
 
76
- ## Rails 4.2.1 (March 19, 2015) ##
98
+ *Sean Griffin*
77
99
 
78
- * No changes.
100
+ * Allow passing record being validated to the message proc to generate
101
+ customized error messages for that object using I18n helper.
79
102
 
103
+ *Prathamesh Sonpatki*
80
104
 
81
- ## Rails 4.2.0 (December 20, 2014) ##
105
+ * Validate multiple contexts on `valid?` and `invalid?` at once.
82
106
 
83
- * Passwords with spaces only allowed in `ActiveModel::SecurePassword`.
107
+ Example:
84
108
 
85
- Presence validation can be used to restore old behavior.
109
+ class Person
110
+ include ActiveModel::Validations
86
111
 
87
- *Yevhene Shemet*
112
+ attr_reader :name, :title
113
+ validates_presence_of :name, on: :create
114
+ validates_presence_of :title, on: :update
115
+ end
88
116
 
89
- * Validate options passed to `ActiveModel::Validations.validate`.
117
+ person = Person.new
118
+ person.valid?([:create, :update]) # => false
119
+ person.errors.messages # => {:name=>["can't be blank"], :title=>["can't be blank"]}
90
120
 
91
- Preventing, in many cases, the simple mistake of using `validate` instead of `validates`.
121
+ *Dmitry Polushkin*
92
122
 
93
- *Sonny Michaud*
123
+ * Add case_sensitive option for confirmation validator in models.
94
124
 
95
- * Deprecate `reset_#{attribute}` in favor of `restore_#{attribute}`.
125
+ *Akshat Sharma*
96
126
 
97
- These methods may cause confusion with the `reset_changes`, which has
98
- different behaviour.
127
+ * Ensure `method_missing` is called for methods passed to
128
+ `ActiveModel::Serialization#serializable_hash` that don't exist.
99
129
 
100
- *Rafael Mendonça França*
130
+ *Jay Elaraj*
101
131
 
102
- * Deprecate `ActiveModel::Dirty#reset_changes` in favor of `#clear_changes_information`.
132
+ * Remove `ActiveModel::Serializers::Xml` from core.
103
133
 
104
- Method's name is causing confusion with the `reset_#{attribute}` methods.
105
- While `reset_name` sets the value of the name attribute to previous value
106
- `reset_changes` only discards the changes.
134
+ *Zachary Scott*
107
135
 
108
- *Rafael Mendonça França*
136
+ * Add `ActiveModel::Dirty#[attr_name]_previously_changed?` and
137
+ `ActiveModel::Dirty#[attr_name]_previous_change` to improve access
138
+ to recorded changes after the model has been saved.
139
+
140
+ It makes the dirty-attributes query methods consistent before and after
141
+ saving.
142
+
143
+ *Fernando Tapia Rico*
144
+
145
+ * Deprecate the `:tokenizer` option for `validates_length_of`, in favor of
146
+ plain Ruby.
147
+
148
+ *Sean Griffin*
109
149
 
110
- * Added `restore_attributes` method to `ActiveModel::Dirty` API which restores
111
- the value of changed attributes to previous value.
150
+ * Deprecate `ActiveModel::Errors#add_on_empty` and `ActiveModel::Errors#add_on_blank`
151
+ with no replacement.
112
152
 
113
- *Igor G.*
153
+ *Wojciech Wnętrzak*
114
154
 
115
- * Allow proc and symbol as values for `only_integer` of `NumericalityValidator`
155
+ * Deprecate `ActiveModel::Errors#get`, `ActiveModel::Errors#set` and
156
+ `ActiveModel::Errors#[]=` methods that have inconsistent behavior.
116
157
 
117
- *Robin Mehner*
158
+ *Wojciech Wnętrzak*
118
159
 
119
- * `has_secure_password` now verifies that the given password is less than 72
120
- characters if validations are enabled.
160
+ * Allow symbol as values for `tokenize` of `LengthValidator`.
121
161
 
122
- Fixes #14591.
162
+ *Kensuke Naito*
123
163
 
124
- *Akshay Vishnoi*
164
+ * Assigning an unknown attribute key to an `ActiveModel` instance during initialization
165
+ will now raise `ActiveModel::AttributeAssignment::UnknownAttributeError` instead of
166
+ `NoMethodError`.
125
167
 
126
- * Remove deprecated `Validator#setup` without replacement.
168
+ Example:
127
169
 
128
- See #10716.
170
+ User.new(foo: 'some value')
171
+ # => ActiveModel::AttributeAssignment::UnknownAttributeError: unknown attribute 'foo' for User.
129
172
 
130
- *Kuldeep Aggarwal*
173
+ *Eugene Gilburg*
131
174
 
132
- * Add plural and singular form for length validator's default messages.
175
+ * Extracted `ActiveRecord::AttributeAssignment` to `ActiveModel::AttributeAssignment`
176
+ allowing to use it for any object as an includable module.
133
177
 
134
- *Abd ar-Rahman Hamid*
178
+ Example:
179
+
180
+ class Cat
181
+ include ActiveModel::AttributeAssignment
182
+ attr_accessor :name, :status
183
+ end
184
+
185
+ cat = Cat.new
186
+ cat.assign_attributes(name: "Gorby", status: "yawning")
187
+ cat.name # => 'Gorby'
188
+ cat.status # => 'yawning'
189
+ cat.assign_attributes(status: "sleeping")
190
+ cat.name # => 'Gorby'
191
+ cat.status # => 'sleeping'
192
+
193
+ *Bogdan Gusiev*
194
+
195
+ * Add `ActiveModel::Errors#details`
196
+
197
+ To be able to return type of used validator, one can now call `details`
198
+ on errors instance.
199
+
200
+ Example:
201
+
202
+ class User < ActiveRecord::Base
203
+ validates :name, presence: true
204
+ end
205
+
206
+ user = User.new; user.valid?; user.errors.details
207
+ => {name: [{error: :blank}]}
208
+
209
+ *Wojciech Wnętrzak*
210
+
211
+ * Change `validates_acceptance_of` to accept `true` by default besides `'1'`.
212
+
213
+ The default for `validates_acceptance_of` is now `'1'` and `true`.
214
+ In the past, only `"1"` was the default and you were required to pass
215
+ `accept: true` separately.
216
+
217
+ *mokhan*
218
+
219
+ * Remove deprecated `ActiveModel::Dirty#reset_#{attribute}` and
220
+ `ActiveModel::Dirty#reset_changes`.
221
+
222
+ *Rafael Mendonça França*
135
223
 
136
- * Introduce `validate` as an alias for `valid?`.
224
+ * Change the way in which callback chains can be halted.
137
225
 
138
- This is more intuitive when you want to run validations but don't care about
139
- the return value.
226
+ The preferred method to halt a callback chain from now on is to explicitly
227
+ `throw(:abort)`.
228
+ In the past, returning `false` in an Active Model `before_` callback had
229
+ the side effect of halting the callback chain.
230
+ This is not recommended anymore and, depending on the value of the
231
+ `ActiveSupport.halt_callback_chains_on_return_false` option, will
232
+ either not work at all or display a deprecation warning.
140
233
 
141
- *Henrik Nyh*
234
+ *claudiob*
142
235
 
143
- Please check [4-1-stable](https://github.com/rails/rails/blob/4-1-stable/activemodel/CHANGELOG.md) for previous changes.
236
+ Please check [4-2-stable](https://github.com/rails/rails/blob/4-2-stable/activemodel/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2014 David Heinemeier Hansson
1
+ Copyright (c) 2004-2016 David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -49,7 +49,7 @@ behavior out of the box:
49
49
  send("#{attr}=", nil)
50
50
  end
51
51
  end
52
-
52
+
53
53
  person = Person.new
54
54
  person.clear_name
55
55
  person.clear_age
@@ -132,7 +132,7 @@ behavior out of the box:
132
132
  "Name"
133
133
  end
134
134
  end
135
-
135
+
136
136
  person = Person.new
137
137
  person.name = nil
138
138
  person.validate!
@@ -154,8 +154,8 @@ behavior out of the box:
154
154
 
155
155
  * Making objects serializable
156
156
 
157
- ActiveModel::Serialization provides a standard interface for your object
158
- to provide +to_json+ or +to_xml+ serialization.
157
+ <tt>ActiveModel::Serialization</tt> provides a standard interface for your object
158
+ to provide +to_json+ serialization.
159
159
 
160
160
  class SerialPerson
161
161
  include ActiveModel::Serialization
@@ -177,13 +177,6 @@ behavior out of the box:
177
177
  s = SerialPerson.new
178
178
  s.to_json # => "{\"name\":null}"
179
179
 
180
- class SerialPerson
181
- include ActiveModel::Serializers::Xml
182
- end
183
-
184
- s = SerialPerson.new
185
- s.to_xml # => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<serial-person...
186
-
187
180
  {Learn more}[link:classes/ActiveModel/Serialization.html]
188
181
 
189
182
  * Internationalization (i18n) support
@@ -216,10 +209,10 @@ behavior out of the box:
216
209
  {Learn more}[link:classes/ActiveModel/Validations.html]
217
210
 
218
211
  * Custom validators
219
-
212
+
220
213
  class HasNameValidator < ActiveModel::Validator
221
214
  def validate(record)
222
- record.errors[:name] = "must exist" if record.name.blank?
215
+ record.errors.add(:name, "must exist") if record.name.blank?
223
216
  end
224
217
  end
225
218
 
@@ -242,11 +235,11 @@ behavior out of the box:
242
235
 
243
236
  The latest version of Active Model can be installed with RubyGems:
244
237
 
245
- % [sudo] gem install activemodel
238
+ $ gem install activemodel
246
239
 
247
240
  Source code can be downloaded as part of the Rails project on GitHub
248
241
 
249
- * https://github.com/rails/rails/tree/4-2-stable/activemodel
242
+ * https://github.com/rails/rails/tree/5-0-stable/activemodel
250
243
 
251
244
 
252
245
  == License
@@ -269,4 +262,3 @@ Bug reports can be filed for the Ruby on Rails project here:
269
262
  Feature requests should be discussed on the rails-core mailing list here:
270
263
 
271
264
  * https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
272
-
@@ -0,0 +1,52 @@
1
+ require 'active_support/core_ext/hash/keys'
2
+
3
+ module ActiveModel
4
+ module AttributeAssignment
5
+ include ActiveModel::ForbiddenAttributesProtection
6
+
7
+ # Allows you to set all the attributes by passing in a hash of attributes with
8
+ # keys matching the attribute names.
9
+ #
10
+ # If the passed hash responds to <tt>permitted?</tt> method and the return value
11
+ # of this method is +false+ an <tt>ActiveModel::ForbiddenAttributesError</tt>
12
+ # exception is raised.
13
+ #
14
+ # class Cat
15
+ # include ActiveModel::AttributeAssignment
16
+ # attr_accessor :name, :status
17
+ # end
18
+ #
19
+ # cat = Cat.new
20
+ # cat.assign_attributes(name: "Gorby", status: "yawning")
21
+ # cat.name # => 'Gorby'
22
+ # cat.status => 'yawning'
23
+ # cat.assign_attributes(status: "sleeping")
24
+ # cat.name # => 'Gorby'
25
+ # cat.status => 'sleeping'
26
+ def assign_attributes(new_attributes)
27
+ if !new_attributes.respond_to?(:stringify_keys)
28
+ raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
29
+ end
30
+ return if new_attributes.nil? || new_attributes.empty?
31
+
32
+ attributes = new_attributes.stringify_keys
33
+ _assign_attributes(sanitize_for_mass_assignment(attributes))
34
+ end
35
+
36
+ private
37
+
38
+ def _assign_attributes(attributes)
39
+ attributes.each do |k, v|
40
+ _assign_attribute(k, v)
41
+ end
42
+ end
43
+
44
+ def _assign_attribute(k, v)
45
+ if respond_to?("#{k}=")
46
+ public_send("#{k}=", v)
47
+ else
48
+ raise UnknownAttributeError.new(self, k)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,4 +1,4 @@
1
- require 'thread_safe'
1
+ require 'concurrent/map'
2
2
  require 'mutex_m'
3
3
 
4
4
  module ActiveModel
@@ -23,7 +23,7 @@ module ActiveModel
23
23
  # The requirements to implement <tt>ActiveModel::AttributeMethods</tt> are to:
24
24
  #
25
25
  # * <tt>include ActiveModel::AttributeMethods</tt> in your class.
26
- # * Call each of its method you want to add, such as +attribute_method_suffix+
26
+ # * Call each of its methods you want to add, such as +attribute_method_suffix+
27
27
  # or +attribute_method_prefix+.
28
28
  # * Call +define_attribute_methods+ after the other methods are called.
29
29
  # * Define the various generic +_attribute+ methods that you have declared.
@@ -225,9 +225,9 @@ module ActiveModel
225
225
  end
226
226
 
227
227
  # Declares the attributes that should be prefixed and suffixed by
228
- # ActiveModel::AttributeMethods.
228
+ # <tt>ActiveModel::AttributeMethods</tt>.
229
229
  #
230
- # To use, pass attribute names (as strings or symbols), be sure to declare
230
+ # To use, pass attribute names (as strings or symbols). Be sure to declare
231
231
  # +define_attribute_methods+ after you define any prefix, suffix or affix
232
232
  # methods, or they will not hook in.
233
233
  #
@@ -239,7 +239,7 @@ module ActiveModel
239
239
  #
240
240
  # # Call to define_attribute_methods must appear after the
241
241
  # # attribute_method_prefix, attribute_method_suffix or
242
- # # attribute_method_affix declares.
242
+ # # attribute_method_affix declarations.
243
243
  # define_attribute_methods :name, :age, :address
244
244
  #
245
245
  # private
@@ -253,9 +253,9 @@ module ActiveModel
253
253
  end
254
254
 
255
255
  # Declares an attribute that should be prefixed and suffixed by
256
- # ActiveModel::AttributeMethods.
256
+ # <tt>ActiveModel::AttributeMethods</tt>.
257
257
  #
258
- # To use, pass an attribute name (as string or symbol), be sure to declare
258
+ # To use, pass an attribute name (as string or symbol). Be sure to declare
259
259
  # +define_attribute_method+ after you define any prefix, suffix or affix
260
260
  # method, or they will not hook in.
261
261
  #
@@ -267,7 +267,7 @@ module ActiveModel
267
267
  #
268
268
  # # Call to define_attribute_method must appear after the
269
269
  # # attribute_method_prefix, attribute_method_suffix or
270
- # # attribute_method_affix declares.
270
+ # # attribute_method_affix declarations.
271
271
  # define_attribute_method :name
272
272
  #
273
273
  # private
@@ -342,7 +342,7 @@ module ActiveModel
342
342
  private
343
343
  # The methods +method_missing+ and +respond_to?+ of this module are
344
344
  # invoked often in a typical rails, both of which invoke the method
345
- # +match_attribute_method?+. The latter method iterates through an
345
+ # +matched_attribute_method+. The latter method iterates through an
346
346
  # array doing regular expression matches, which results in a lot of
347
347
  # object creations. Most of the time it returns a +nil+ match. As the
348
348
  # match result is always the same given a +method_name+, this cache is
@@ -350,7 +350,7 @@ module ActiveModel
350
350
  # significantly (in our case our test suite finishes 10% faster with
351
351
  # this cache).
352
352
  def attribute_method_matchers_cache #:nodoc:
353
- @attribute_method_matchers_cache ||= ThreadSafe::Cache.new(initial_capacity: 4)
353
+ @attribute_method_matchers_cache ||= Concurrent::Map.new(initial_capacity: 4)
354
354
  end
355
355
 
356
356
  def attribute_method_matchers_matching(method_name) #:nodoc:
@@ -363,7 +363,7 @@ module ActiveModel
363
363
  end
364
364
 
365
365
  # Define a method `name` in `mod` that dispatches to `send`
366
- # using the given `extra` args. This fallbacks `define_method`
366
+ # using the given `extra` args. This falls back on `define_method`
367
367
  # and `send` if the given names cannot be compiled.
368
368
  def define_proxy_call(include_private, mod, name, send, *extra) #:nodoc:
369
369
  defn = if name =~ NAME_COMPILABLE_REGEXP
@@ -372,7 +372,7 @@ module ActiveModel
372
372
  "define_method(:'#{name}') do |*args|"
373
373
  end
374
374
 
375
- extra = (extra.map!(&:inspect) << "*args").join(", ")
375
+ extra = (extra.map!(&:inspect) << "*args").join(", ".freeze)
376
376
 
377
377
  target = if send =~ CALL_COMPILABLE_REGEXP
378
378
  "#{"self." unless include_private}#{send}(#{extra})"
@@ -419,7 +419,7 @@ module ActiveModel
419
419
  # returned by <tt>attributes</tt>, as though they were first-class
420
420
  # methods. So a +Person+ class with a +name+ attribute can for example use
421
421
  # <tt>Person#name</tt> and <tt>Person#name=</tt> and never directly use
422
- # the attributes hash -- except for multiple assigns with
422
+ # the attributes hash -- except for multiple assignments with
423
423
  # <tt>ActiveRecord::Base#attributes=</tt>.
424
424
  #
425
425
  # It's also possible to instantiate related objects, so a <tt>Client</tt>
@@ -429,7 +429,7 @@ module ActiveModel
429
429
  if respond_to_without_attributes?(method, true)
430
430
  super
431
431
  else
432
- match = match_attribute_method?(method.to_s)
432
+ match = matched_attribute_method(method.to_s)
433
433
  match ? attribute_missing(match, *args, &block) : super
434
434
  end
435
435
  end
@@ -454,7 +454,7 @@ module ActiveModel
454
454
  # but found among all methods. Which means that the given method is private.
455
455
  false
456
456
  else
457
- !match_attribute_method?(method.to_s).nil?
457
+ !matched_attribute_method(method.to_s).nil?
458
458
  end
459
459
  end
460
460
 
@@ -466,7 +466,7 @@ module ActiveModel
466
466
  private
467
467
  # Returns a struct representing the matching attribute method.
468
468
  # The struct's attributes are prefix, base and suffix.
469
- def match_attribute_method?(method_name)
469
+ def matched_attribute_method(method_name)
470
470
  matches = self.class.send(:attribute_method_matchers_matching, method_name)
471
471
  matches.detect { |match| attribute_method?(match.attr_name) }
472
472
  end
@@ -6,7 +6,7 @@ module ActiveModel
6
6
  # Provides an interface for any class to have Active Record like callbacks.
7
7
  #
8
8
  # Like the Active Record methods, the callback chain is aborted as soon as
9
- # one of the methods in the chain returns +false+.
9
+ # one of the methods throws +:abort+.
10
10
  #
11
11
  # First, extend ActiveModel::Callbacks from the class you are creating:
12
12
  #
@@ -49,7 +49,7 @@ module ActiveModel
49
49
  # puts 'block successfully called.'
50
50
  # end
51
51
  #
52
- # You can choose not to have all three callbacks by passing a hash to the
52
+ # You can choose to have only specific callbacks by passing a hash to the
53
53
  # +define_model_callbacks+ method.
54
54
  #
55
55
  # define_model_callbacks :create, only: [:after, :before]
@@ -103,7 +103,7 @@ module ActiveModel
103
103
  def define_model_callbacks(*callbacks)
104
104
  options = callbacks.extract_options!
105
105
  options = {
106
- terminator: ->(_,result) { result == false },
106
+ terminator: deprecated_false_terminator,
107
107
  skip_after_callbacks_if_terminated: true,
108
108
  scope: [:kind, :name],
109
109
  only: [:before, :around, :after]
@@ -22,7 +22,7 @@ module ActiveModel
22
22
  module Conversion
23
23
  extend ActiveSupport::Concern
24
24
 
25
- # If your object is already designed to implement all of the Active Model
25
+ # If your object is already designed to implement all of the \Active \Model
26
26
  # you can use the default <tt>:to_model</tt> implementation, which simply
27
27
  # returns +self+.
28
28
  #
@@ -33,15 +33,15 @@ module ActiveModel
33
33
  # person = Person.new
34
34
  # person.to_model == person # => true
35
35
  #
36
- # If your model does not act like an Active Model object, then you should
36
+ # If your model does not act like an \Active \Model object, then you should
37
37
  # define <tt>:to_model</tt> yourself returning a proxy object that wraps
38
- # your object with Active Model compliant methods.
38
+ # your object with \Active \Model compliant methods.
39
39
  def to_model
40
40
  self
41
41
  end
42
42
 
43
- # Returns an Array of all key attributes if any is set, regardless if
44
- # the object is persisted or not. Returns +nil+ if there are no key attributes.
43
+ # Returns an Array of all key attributes if any of the attributes is set, whether or not
44
+ # the object is persisted. Returns +nil+ if there are no key attributes.
45
45
  #
46
46
  # class Person
47
47
  # include ActiveModel::Conversion