activemodel 5.0.7.2 → 5.1.0.beta1
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +15 -219
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/active_model.rb +11 -12
- data/lib/active_model/attribute_assignment.rb +11 -11
- data/lib/active_model/attribute_methods.rb +13 -15
- data/lib/active_model/callbacks.rb +19 -20
- data/lib/active_model/conversion.rb +12 -3
- data/lib/active_model/dirty.rb +14 -14
- data/lib/active_model/errors.rb +27 -103
- data/lib/active_model/forbidden_attributes_protection.rb +1 -1
- data/lib/active_model/gem_version.rb +3 -3
- data/lib/active_model/lint.rb +0 -1
- data/lib/active_model/model.rb +3 -4
- data/lib/active_model/naming.rb +9 -10
- data/lib/active_model/secure_password.rb +1 -1
- data/lib/active_model/serialization.rb +2 -2
- data/lib/active_model/serializers/json.rb +2 -2
- data/lib/active_model/translation.rb +2 -3
- data/lib/active_model/type.rb +15 -19
- data/lib/active_model/type/big_integer.rb +4 -4
- data/lib/active_model/type/binary.rb +1 -1
- data/lib/active_model/type/boolean.rb +20 -9
- data/lib/active_model/type/date.rb +25 -25
- data/lib/active_model/type/date_time.rb +21 -21
- data/lib/active_model/type/decimal.rb +35 -39
- data/lib/active_model/type/float.rb +17 -8
- data/lib/active_model/type/helpers.rb +4 -4
- data/lib/active_model/type/helpers/accepts_multiparameter_time.rb +2 -2
- data/lib/active_model/type/helpers/mutable.rb +2 -2
- data/lib/active_model/type/helpers/numeric.rb +18 -17
- data/lib/active_model/type/helpers/time_value.rb +23 -23
- data/lib/active_model/type/immutable_string.rb +9 -8
- data/lib/active_model/type/integer.rb +23 -21
- data/lib/active_model/type/registry.rb +12 -8
- data/lib/active_model/type/string.rb +1 -6
- data/lib/active_model/type/time.rb +15 -11
- data/lib/active_model/type/value.rb +6 -6
- data/lib/active_model/validations.rb +9 -12
- data/lib/active_model/validations/absence.rb +1 -1
- data/lib/active_model/validations/acceptance.rb +41 -40
- data/lib/active_model/validations/callbacks.rb +4 -7
- data/lib/active_model/validations/clusivity.rb +7 -7
- data/lib/active_model/validations/confirmation.rb +15 -16
- data/lib/active_model/validations/exclusion.rb +1 -2
- data/lib/active_model/validations/format.rb +24 -24
- data/lib/active_model/validations/inclusion.rb +1 -2
- data/lib/active_model/validations/length.rb +6 -42
- data/lib/active_model/validations/numericality.rb +3 -11
- data/lib/active_model/validations/presence.rb +1 -2
- data/lib/active_model/validations/validates.rb +6 -6
- data/lib/active_model/validations/with.rb +4 -2
- data/lib/active_model/validator.rb +5 -6
- data/lib/active_model/version.rb +1 -1
- metadata +8 -11
- data/lib/active_model/test_case.rb +0 -4
- data/lib/active_model/type/decimal_without_scale.rb +0 -11
- data/lib/active_model/type/text.rb +0 -11
- data/lib/active_model/type/unsigned_integer.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2722a2216da7e44da498eddfe9cd283628ff4876
|
4
|
+
data.tar.gz: f7d850f4021cf5f4fd5e4209f9359d645bf1d69f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ce16354bc976631475e670f614393ab7859e2cbd32e1348f6d5c58b714ae336af91312b4fcbc3b90346e616c96ab1e03caf8ada1d48a1760aaa49350751c8eb
|
7
|
+
data.tar.gz: b1a4b60136a4a1df7147359ba25f4fb15d366234e65cfb6f965cc8007d7d72289c02a3a9798249ae9216378d74022af18db6ad948469b95e9dacd8952638b3f1
|
data/CHANGELOG.md
CHANGED
@@ -1,236 +1,32 @@
|
|
1
|
-
## Rails 5.0.
|
1
|
+
## Rails 5.1.0.beta1 (February 23, 2017) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Remove deprecated behavior that halts callbacks when the return is false.
|
4
4
|
|
5
|
+
*Rafael Mendonça França*
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
* No changes.
|
9
|
-
|
10
|
-
|
11
|
-
## Rails 5.0.7 (March 29, 2018) ##
|
12
|
-
|
13
|
-
* No changes.
|
14
|
-
|
15
|
-
|
16
|
-
## Rails 5.0.6 (September 07, 2017) ##
|
17
|
-
|
18
|
-
* No changes.
|
19
|
-
|
20
|
-
|
21
|
-
## Rails 5.0.6.rc1 (August 24, 2017) ##
|
22
|
-
|
23
|
-
* No changes.
|
24
|
-
|
25
|
-
|
26
|
-
## Rails 5.0.5 (July 31, 2017) ##
|
27
|
-
|
28
|
-
* No changes.
|
29
|
-
|
30
|
-
|
31
|
-
## Rails 5.0.5.rc2 (July 25, 2017) ##
|
32
|
-
|
33
|
-
* No changes.
|
34
|
-
|
35
|
-
|
36
|
-
## Rails 5.0.5.rc1 (July 19, 2017) ##
|
37
|
-
|
38
|
-
* No changes.
|
39
|
-
|
40
|
-
|
41
|
-
## Rails 5.0.4 (June 19, 2017) ##
|
42
|
-
|
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.
|
59
|
-
|
60
|
-
*namusyaka*
|
61
|
-
|
62
|
-
|
63
|
-
## Rails 5.0.2 (March 01, 2017) ##
|
64
|
-
|
65
|
-
* No changes.
|
66
|
-
|
67
|
-
|
68
|
-
## Rails 5.0.1 (December 21, 2016) ##
|
69
|
-
|
70
|
-
* No changes.
|
71
|
-
|
72
|
-
|
73
|
-
## Rails 5.0.1.rc2 (December 10, 2016) ##
|
74
|
-
|
75
|
-
* No changes.
|
76
|
-
|
77
|
-
|
78
|
-
## Rails 5.0.1.rc1 (December 01, 2016) ##
|
79
|
-
|
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.
|
82
|
-
|
83
|
-
Fixes #25354.
|
84
|
-
|
85
|
-
*Ryuta Kamizono*
|
86
|
-
|
87
|
-
|
88
|
-
## Rails 5.0.0 (June 30, 2016) ##
|
89
|
-
|
90
|
-
* `Dirty`'s `*_changed?` methods now return an actual singleton, never `nil`, as in 4.2.
|
91
|
-
Fixes #24220.
|
92
|
-
|
93
|
-
*Sen-Zhang*
|
94
|
-
|
95
|
-
* Ensure that instances of `ActiveModel::Errors` can be marshalled.
|
96
|
-
Fixes #25165.
|
97
|
-
|
98
|
-
*Sean Griffin*
|
99
|
-
|
100
|
-
* Allow passing record being validated to the message proc to generate
|
101
|
-
customized error messages for that object using I18n helper.
|
102
|
-
|
103
|
-
*Prathamesh Sonpatki*
|
104
|
-
|
105
|
-
* Validate multiple contexts on `valid?` and `invalid?` at once.
|
106
|
-
|
107
|
-
Example:
|
108
|
-
|
109
|
-
class Person
|
110
|
-
include ActiveModel::Validations
|
111
|
-
|
112
|
-
attr_reader :name, :title
|
113
|
-
validates_presence_of :name, on: :create
|
114
|
-
validates_presence_of :title, on: :update
|
115
|
-
end
|
116
|
-
|
117
|
-
person = Person.new
|
118
|
-
person.valid?([:create, :update]) # => false
|
119
|
-
person.errors.messages # => {:name=>["can't be blank"], :title=>["can't be blank"]}
|
120
|
-
|
121
|
-
*Dmitry Polushkin*
|
122
|
-
|
123
|
-
* Add case_sensitive option for confirmation validator in models.
|
124
|
-
|
125
|
-
*Akshat Sharma*
|
126
|
-
|
127
|
-
* Ensure `method_missing` is called for methods passed to
|
128
|
-
`ActiveModel::Serialization#serializable_hash` that don't exist.
|
129
|
-
|
130
|
-
*Jay Elaraj*
|
131
|
-
|
132
|
-
* Remove `ActiveModel::Serializers::Xml` from core.
|
133
|
-
|
134
|
-
*Zachary Scott*
|
135
|
-
|
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*
|
149
|
-
|
150
|
-
* Deprecate `ActiveModel::Errors#add_on_empty` and `ActiveModel::Errors#add_on_blank`
|
151
|
-
with no replacement.
|
152
|
-
|
153
|
-
*Wojciech Wnętrzak*
|
154
|
-
|
155
|
-
* Deprecate `ActiveModel::Errors#get`, `ActiveModel::Errors#set` and
|
156
|
-
`ActiveModel::Errors#[]=` methods that have inconsistent behavior.
|
157
|
-
|
158
|
-
*Wojciech Wnętrzak*
|
159
|
-
|
160
|
-
* Allow symbol as values for `tokenize` of `LengthValidator`.
|
161
|
-
|
162
|
-
*Kensuke Naito*
|
163
|
-
|
164
|
-
* Assigning an unknown attribute key to an `ActiveModel` instance during initialization
|
165
|
-
will now raise `ActiveModel::AttributeAssignment::UnknownAttributeError` instead of
|
166
|
-
`NoMethodError`.
|
167
|
-
|
168
|
-
Example:
|
169
|
-
|
170
|
-
User.new(foo: 'some value')
|
171
|
-
# => ActiveModel::AttributeAssignment::UnknownAttributeError: unknown attribute 'foo' for User.
|
172
|
-
|
173
|
-
*Eugene Gilburg*
|
174
|
-
|
175
|
-
* Extracted `ActiveRecord::AttributeAssignment` to `ActiveModel::AttributeAssignment`
|
176
|
-
allowing to use it for any object as an includable module.
|
177
|
-
|
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*
|
7
|
+
* Remove unused `ActiveModel::TestCase` class.
|
194
8
|
|
195
|
-
*
|
9
|
+
*Yuji Yaginuma*
|
196
10
|
|
197
|
-
|
198
|
-
on errors instance.
|
11
|
+
* Moved DecimalWithoutScale, Text, and UnsignedInteger from Active Model to Active Record
|
199
12
|
|
200
|
-
|
13
|
+
*Iain Beeston*
|
201
14
|
|
202
|
-
|
203
|
-
validates :name, presence: true
|
204
|
-
end
|
15
|
+
* Allow indifferent access in `ActiveModel::Errors`.
|
205
16
|
|
206
|
-
|
207
|
-
=> {name: [{error: :blank}]}
|
17
|
+
`#include?`, `#has_key?`, `#key?`, `#delete` and `#full_messages_for`.
|
208
18
|
|
209
|
-
*
|
19
|
+
*Kenichi Kamiya*
|
210
20
|
|
211
|
-
*
|
21
|
+
* Removed deprecated `:tokenizer` in the length validator.
|
212
22
|
|
213
|
-
|
214
|
-
In the past, only `"1"` was the default and you were required to pass
|
215
|
-
`accept: true` separately.
|
23
|
+
*Rafael Mendonça França*
|
216
24
|
|
217
|
-
|
25
|
+
* Removed deprecated methods in `ActiveModel::Errors`.
|
218
26
|
|
219
|
-
|
220
|
-
`ActiveModel::Dirty#reset_changes`.
|
27
|
+
`#get`, `#set`, `[]=`, `add_on_empty` and `add_on_blank`.
|
221
28
|
|
222
29
|
*Rafael Mendonça França*
|
223
30
|
|
224
|
-
* Change the way in which callback chains can be halted.
|
225
|
-
|
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.
|
233
|
-
|
234
|
-
*claudiob*
|
235
31
|
|
236
|
-
Please check [
|
32
|
+
Please check [5-0-stable](https://github.com/rails/rails/blob/5-0-stable/activemodel/CHANGELOG.md) for previous changes.
|
data/MIT-LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -239,7 +239,7 @@ The latest version of Active Model can be installed with RubyGems:
|
|
239
239
|
|
240
240
|
Source code can be downloaded as part of the Rails project on GitHub
|
241
241
|
|
242
|
-
* https://github.com/rails/rails/tree/
|
242
|
+
* https://github.com/rails/rails/tree/master/activemodel
|
243
243
|
|
244
244
|
|
245
245
|
== License
|
data/lib/active_model.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2004-
|
2
|
+
# Copyright (c) 2004-2017 David Heinemeier Hansson
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -21,37 +21,36 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
24
|
+
require "active_support"
|
25
|
+
require "active_support/rails"
|
26
|
+
require "active_model/version"
|
27
27
|
|
28
28
|
module ActiveModel
|
29
29
|
extend ActiveSupport::Autoload
|
30
30
|
|
31
31
|
autoload :AttributeAssignment
|
32
32
|
autoload :AttributeMethods
|
33
|
-
autoload :BlockValidator,
|
33
|
+
autoload :BlockValidator, "active_model/validator"
|
34
34
|
autoload :Callbacks
|
35
35
|
autoload :Conversion
|
36
36
|
autoload :Dirty
|
37
|
-
autoload :EachValidator,
|
37
|
+
autoload :EachValidator, "active_model/validator"
|
38
38
|
autoload :ForbiddenAttributesProtection
|
39
39
|
autoload :Lint
|
40
40
|
autoload :Model
|
41
|
-
autoload :Name,
|
41
|
+
autoload :Name, "active_model/naming"
|
42
42
|
autoload :Naming
|
43
43
|
autoload :SecurePassword
|
44
44
|
autoload :Serialization
|
45
|
-
autoload :TestCase
|
46
45
|
autoload :Translation
|
47
46
|
autoload :Validations
|
48
47
|
autoload :Validator
|
49
48
|
|
50
49
|
eager_autoload do
|
51
50
|
autoload :Errors
|
52
|
-
autoload :RangeError,
|
53
|
-
autoload :StrictValidationFailed,
|
54
|
-
autoload :UnknownAttributeError,
|
51
|
+
autoload :RangeError, "active_model/errors"
|
52
|
+
autoload :StrictValidationFailed, "active_model/errors"
|
53
|
+
autoload :UnknownAttributeError, "active_model/errors"
|
55
54
|
end
|
56
55
|
|
57
56
|
module Serializers
|
@@ -69,5 +68,5 @@ module ActiveModel
|
|
69
68
|
end
|
70
69
|
|
71
70
|
ActiveSupport.on_load(:i18n) do
|
72
|
-
I18n.load_path << File.dirname(__FILE__) +
|
71
|
+
I18n.load_path << File.dirname(__FILE__) + "/active_model/locale/en.yml"
|
73
72
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/core_ext/hash/keys"
|
2
2
|
|
3
3
|
module ActiveModel
|
4
4
|
module AttributeAssignment
|
@@ -35,18 +35,18 @@ module ActiveModel
|
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
def _assign_attributes(attributes)
|
39
|
+
attributes.each do |k, v|
|
40
|
+
_assign_attribute(k, v)
|
41
|
+
end
|
41
42
|
end
|
42
|
-
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
49
50
|
end
|
50
|
-
end
|
51
51
|
end
|
52
52
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "concurrent/map"
|
2
|
+
require "mutex_m"
|
3
3
|
|
4
4
|
module ActiveModel
|
5
5
|
# Raised when an attribute is not defined.
|
@@ -289,7 +289,7 @@ module ActiveModel
|
|
289
289
|
generate_method = "define_method_#{matcher.method_missing_target}"
|
290
290
|
|
291
291
|
if respond_to?(generate_method, true)
|
292
|
-
send(generate_method, attr_name)
|
292
|
+
send(generate_method, attr_name.to_s)
|
293
293
|
else
|
294
294
|
define_proxy_call true, generated_attribute_methods, method_name, matcher.method_missing_target, attr_name.to_s
|
295
295
|
end
|
@@ -334,12 +334,11 @@ module ActiveModel
|
|
334
334
|
}.tap { |mod| include mod }
|
335
335
|
end
|
336
336
|
|
337
|
-
|
338
|
-
def instance_method_already_implemented?(method_name)
|
337
|
+
private
|
338
|
+
def instance_method_already_implemented?(method_name)
|
339
339
|
generated_attribute_methods.method_defined?(method_name)
|
340
340
|
end
|
341
341
|
|
342
|
-
private
|
343
342
|
# The methods +method_missing+ and +respond_to?+ of this module are
|
344
343
|
# invoked often in a typical rails, both of which invoke the method
|
345
344
|
# +matched_attribute_method+. The latter method iterates through an
|
@@ -349,11 +348,11 @@ module ActiveModel
|
|
349
348
|
# used to alleviate the GC, which ultimately also speeds up the app
|
350
349
|
# significantly (in our case our test suite finishes 10% faster with
|
351
350
|
# this cache).
|
352
|
-
def attribute_method_matchers_cache
|
351
|
+
def attribute_method_matchers_cache
|
353
352
|
@attribute_method_matchers_cache ||= Concurrent::Map.new(initial_capacity: 4)
|
354
353
|
end
|
355
354
|
|
356
|
-
def attribute_method_matchers_matching(method_name)
|
355
|
+
def attribute_method_matchers_matching(method_name)
|
357
356
|
attribute_method_matchers_cache.compute_if_absent(method_name) do
|
358
357
|
# Must try to match prefixes/suffixes first, or else the matcher with no prefix/suffix
|
359
358
|
# will match every time.
|
@@ -365,8 +364,8 @@ module ActiveModel
|
|
365
364
|
# Define a method `name` in `mod` that dispatches to `send`
|
366
365
|
# using the given `extra` args. This falls back on `define_method`
|
367
366
|
# and `send` if the given names cannot be compiled.
|
368
|
-
def define_proxy_call(include_private, mod, name, send, *extra)
|
369
|
-
defn = if name
|
367
|
+
def define_proxy_call(include_private, mod, name, send, *extra)
|
368
|
+
defn = if NAME_COMPILABLE_REGEXP.match?(name)
|
370
369
|
"def #{name}(*args)"
|
371
370
|
else
|
372
371
|
"define_method(:'#{name}') do |*args|"
|
@@ -374,7 +373,7 @@ module ActiveModel
|
|
374
373
|
|
375
374
|
extra = (extra.map!(&:inspect) << "*args").join(", ".freeze)
|
376
375
|
|
377
|
-
target = if send
|
376
|
+
target = if CALL_COMPILABLE_REGEXP.match?(send)
|
378
377
|
"#{"self." unless include_private}#{send}(#{extra})"
|
379
378
|
else
|
380
379
|
"send(:'#{send}', #{extra})"
|
@@ -393,7 +392,7 @@ module ActiveModel
|
|
393
392
|
AttributeMethodMatch = Struct.new(:target, :attr_name, :method_name)
|
394
393
|
|
395
394
|
def initialize(options = {})
|
396
|
-
@prefix, @suffix = options.fetch(:prefix,
|
395
|
+
@prefix, @suffix = options.fetch(:prefix, ""), options.fetch(:suffix, "")
|
397
396
|
@regex = /^(?:#{Regexp.escape(@prefix)})(.*)(?:#{Regexp.escape(@suffix)})$/
|
398
397
|
@method_missing_target = "#{@prefix}attribute#{@suffix}"
|
399
398
|
@method_name = "#{prefix}%s#{suffix}"
|
@@ -458,12 +457,11 @@ module ActiveModel
|
|
458
457
|
end
|
459
458
|
end
|
460
459
|
|
461
|
-
|
462
|
-
def attribute_method?(attr_name)
|
460
|
+
private
|
461
|
+
def attribute_method?(attr_name)
|
463
462
|
respond_to_without_attributes?(:attributes) && attributes.include?(attr_name)
|
464
463
|
end
|
465
464
|
|
466
|
-
private
|
467
465
|
# Returns a struct representing the matching attribute method.
|
468
466
|
# The struct's attributes are prefix, base and suffix.
|
469
467
|
def matched_attribute_method(method_name)
|