activemodel 5.1.7 → 5.2.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +32 -93
- data/README.rdoc +1 -1
- data/lib/active_model.rb +6 -1
- data/lib/active_model/attribute.rb +243 -0
- data/lib/active_model/attribute/user_provided_default.rb +30 -0
- data/lib/active_model/attribute_assignment.rb +8 -5
- data/lib/active_model/attribute_methods.rb +12 -10
- data/lib/active_model/attribute_mutation_tracker.rb +116 -0
- data/lib/active_model/attribute_set.rb +113 -0
- data/lib/active_model/attribute_set/builder.rb +124 -0
- data/lib/active_model/attribute_set/yaml_encoder.rb +41 -0
- data/lib/active_model/attributes.rb +108 -0
- data/lib/active_model/callbacks.rb +7 -2
- data/lib/active_model/conversion.rb +2 -0
- data/lib/active_model/dirty.rb +124 -57
- data/lib/active_model/errors.rb +32 -21
- data/lib/active_model/forbidden_attributes_protection.rb +2 -0
- data/lib/active_model/gem_version.rb +5 -3
- data/lib/active_model/lint.rb +2 -0
- data/lib/active_model/model.rb +2 -0
- data/lib/active_model/naming.rb +5 -3
- data/lib/active_model/railtie.rb +2 -0
- data/lib/active_model/secure_password.rb +5 -3
- data/lib/active_model/serialization.rb +2 -0
- data/lib/active_model/serializers/json.rb +3 -2
- data/lib/active_model/translation.rb +2 -0
- data/lib/active_model/type.rb +6 -0
- data/lib/active_model/type/big_integer.rb +2 -0
- data/lib/active_model/type/binary.rb +2 -0
- data/lib/active_model/type/boolean.rb +2 -0
- data/lib/active_model/type/date.rb +2 -0
- data/lib/active_model/type/date_time.rb +6 -0
- data/lib/active_model/type/decimal.rb +2 -0
- data/lib/active_model/type/float.rb +2 -0
- data/lib/active_model/type/helpers.rb +2 -0
- data/lib/active_model/type/helpers/accepts_multiparameter_time.rb +6 -0
- data/lib/active_model/type/helpers/mutable.rb +2 -0
- data/lib/active_model/type/helpers/numeric.rb +2 -0
- data/lib/active_model/type/helpers/time_value.rb +2 -1
- data/lib/active_model/type/immutable_string.rb +2 -0
- data/lib/active_model/type/integer.rb +3 -1
- data/lib/active_model/type/registry.rb +2 -0
- data/lib/active_model/type/string.rb +2 -0
- data/lib/active_model/type/time.rb +8 -4
- data/lib/active_model/type/value.rb +3 -1
- data/lib/active_model/validations.rb +7 -3
- data/lib/active_model/validations/absence.rb +2 -0
- data/lib/active_model/validations/acceptance.rb +2 -0
- data/lib/active_model/validations/callbacks.rb +11 -13
- data/lib/active_model/validations/clusivity.rb +2 -0
- data/lib/active_model/validations/confirmation.rb +3 -1
- data/lib/active_model/validations/exclusion.rb +2 -0
- data/lib/active_model/validations/format.rb +1 -0
- data/lib/active_model/validations/helper_methods.rb +2 -0
- data/lib/active_model/validations/inclusion.rb +2 -0
- data/lib/active_model/validations/length.rb +10 -2
- data/lib/active_model/validations/numericality.rb +3 -1
- data/lib/active_model/validations/presence.rb +1 -0
- data/lib/active_model/validations/validates.rb +4 -3
- data/lib/active_model/validations/with.rb +2 -0
- data/lib/active_model/validator.rb +6 -4
- data/lib/active_model/version.rb +2 -0
- metadata +17 -9
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
# Returns the version of the currently loaded \Active \Model as a <tt>Gem::Version</tt>
|
3
5
|
def self.gem_version
|
@@ -6,9 +8,9 @@ module ActiveModel
|
|
6
8
|
|
7
9
|
module VERSION
|
8
10
|
MAJOR = 5
|
9
|
-
MINOR =
|
10
|
-
TINY =
|
11
|
-
PRE =
|
11
|
+
MINOR = 2
|
12
|
+
TINY = 0
|
13
|
+
PRE = "beta1"
|
12
14
|
|
13
15
|
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
14
16
|
end
|
data/lib/active_model/lint.rb
CHANGED
data/lib/active_model/model.rb
CHANGED
data/lib/active_model/naming.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/hash/except"
|
2
4
|
require "active_support/core_ext/module/introspection"
|
3
|
-
require "active_support/core_ext/module/
|
5
|
+
require "active_support/core_ext/module/redefine_method"
|
4
6
|
|
5
7
|
module ActiveModel
|
6
8
|
class Name
|
@@ -47,7 +49,7 @@ module ActiveModel
|
|
47
49
|
# :method: <=>
|
48
50
|
#
|
49
51
|
# :call-seq:
|
50
|
-
#
|
52
|
+
# <=>(other)
|
51
53
|
#
|
52
54
|
# Equivalent to <tt>String#<=></tt>.
|
53
55
|
#
|
@@ -216,7 +218,7 @@ module ActiveModel
|
|
216
218
|
# provided method below, or rolling your own is required.
|
217
219
|
module Naming
|
218
220
|
def self.extended(base) #:nodoc:
|
219
|
-
base.
|
221
|
+
base.silence_redefinition_of_method :model_name
|
220
222
|
base.delegate :model_name, to: :class
|
221
223
|
end
|
222
224
|
|
data/lib/active_model/railtie.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module SecurePassword
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
|
-
# BCrypt hash function can handle maximum 72
|
6
|
-
# password of length more than 72
|
7
|
+
# BCrypt hash function can handle maximum 72 bytes, and if we pass
|
8
|
+
# password of length more than 72 bytes it ignores extra characters.
|
7
9
|
# Hence need to put a restriction on password length.
|
8
10
|
MAX_PASSWORD_LENGTH_ALLOWED = 72
|
9
11
|
|
@@ -18,7 +20,7 @@ module ActiveModel
|
|
18
20
|
#
|
19
21
|
# The following validations are added automatically:
|
20
22
|
# * Password must be present on creation
|
21
|
-
# * Password length should be less than or equal to 72
|
23
|
+
# * Password length should be less than or equal to 72 bytes
|
22
24
|
# * Confirmation of password (using a +password_confirmation+ attribute)
|
23
25
|
#
|
24
26
|
# If password confirmation validation is not needed, simply leave out the
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/json"
|
2
4
|
|
3
5
|
module ActiveModel
|
@@ -10,8 +12,7 @@ module ActiveModel
|
|
10
12
|
included do
|
11
13
|
extend ActiveModel::Naming
|
12
14
|
|
13
|
-
class_attribute :include_root_in_json, instance_writer: false
|
14
|
-
self.include_root_in_json = false
|
15
|
+
class_attribute :include_root_in_json, instance_writer: false, default: false
|
15
16
|
end
|
16
17
|
|
17
18
|
# Returns a hash representing the model. Some configuration can be
|
data/lib/active_model/type.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_model/type/helpers"
|
2
4
|
require "active_model/type/value"
|
3
5
|
|
@@ -30,6 +32,10 @@ module ActiveModel
|
|
30
32
|
def lookup(*args, **kwargs) # :nodoc:
|
31
33
|
registry.lookup(*args, **kwargs)
|
32
34
|
end
|
35
|
+
|
36
|
+
def default_value # :nodoc:
|
37
|
+
@default_value ||= Value.new
|
38
|
+
end
|
33
39
|
end
|
34
40
|
|
35
41
|
register(:big_integer, Type::BigInteger)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module Type
|
3
5
|
class DateTime < Value # :nodoc:
|
@@ -10,6 +12,10 @@ module ActiveModel
|
|
10
12
|
:datetime
|
11
13
|
end
|
12
14
|
|
15
|
+
def serialize(value)
|
16
|
+
super(cast(value))
|
17
|
+
end
|
18
|
+
|
13
19
|
private
|
14
20
|
|
15
21
|
def cast_value(value)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module Type
|
3
5
|
module Helpers # :nodoc: all
|
@@ -19,6 +21,10 @@ module ActiveModel
|
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
24
|
+
define_method(:value_constructed_by_mass_assignment?) do |value|
|
25
|
+
value.is_a?(Hash)
|
26
|
+
end
|
27
|
+
|
22
28
|
define_method(:value_from_multiparameter_assignment) do |values_hash|
|
23
29
|
defaults.each do |k, v|
|
24
30
|
values_hash[k] ||= v
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module Type
|
3
5
|
class Integer < Value # :nodoc:
|
4
6
|
include Helpers::Numeric
|
5
7
|
|
6
8
|
# Column storage size in bytes.
|
7
|
-
# 4 bytes means
|
9
|
+
# 4 bytes means an integer as opposed to smallint etc.
|
8
10
|
DEFAULT_LIMIT = 4
|
9
11
|
|
10
12
|
def initialize(*)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module Type
|
3
5
|
class Time < Value # :nodoc:
|
@@ -16,8 +18,6 @@ module ActiveModel
|
|
16
18
|
case value
|
17
19
|
when ::String
|
18
20
|
value = "2000-01-01 #{value}"
|
19
|
-
time_hash = ::Date._parse(value)
|
20
|
-
return if time_hash[:hour].nil?
|
21
21
|
when ::Time
|
22
22
|
value = value.change(year: 2000, day: 1, month: 1)
|
23
23
|
end
|
@@ -28,10 +28,14 @@ module ActiveModel
|
|
28
28
|
private
|
29
29
|
|
30
30
|
def cast_value(value)
|
31
|
-
return
|
31
|
+
return value unless value.is_a?(::String)
|
32
32
|
return if value.empty?
|
33
33
|
|
34
|
-
|
34
|
+
if value.start_with?("2000-01-01")
|
35
|
+
dummy_time_value = value
|
36
|
+
else
|
37
|
+
dummy_time_value = "2000-01-01 #{value}"
|
38
|
+
end
|
35
39
|
|
36
40
|
fast_string_to_time(dummy_time_value) || begin
|
37
41
|
time_hash = ::Date._parse(dummy_time_value)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module Type
|
3
5
|
class Value
|
@@ -84,7 +86,7 @@ module ActiveModel
|
|
84
86
|
false
|
85
87
|
end
|
86
88
|
|
87
|
-
def
|
89
|
+
def value_constructed_by_mass_assignment?(_value) # :nodoc:
|
88
90
|
false
|
89
91
|
end
|
90
92
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/array/extract_options"
|
2
4
|
require "active_support/core_ext/hash/keys"
|
3
5
|
require "active_support/core_ext/hash/except"
|
@@ -49,8 +51,7 @@ module ActiveModel
|
|
49
51
|
private :validation_context=
|
50
52
|
define_callbacks :validate, scope: :name
|
51
53
|
|
52
|
-
class_attribute :_validators, instance_writer: false
|
53
|
-
self._validators = Hash.new { |h, k| h[k] = [] }
|
54
|
+
class_attribute :_validators, instance_writer: false, default: Hash.new { |h, k| h[k] = [] }
|
54
55
|
end
|
55
56
|
|
56
57
|
module ClassMethods
|
@@ -147,6 +148,9 @@ module ActiveModel
|
|
147
148
|
# or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
148
149
|
# method, proc or string should return or evaluate to a +true+ or +false+
|
149
150
|
# value.
|
151
|
+
#
|
152
|
+
# NOTE: Calling +validate+ multiple times on the same method will overwrite previous definitions.
|
153
|
+
#
|
150
154
|
def validate(*args, &block)
|
151
155
|
options = args.extract_options!
|
152
156
|
|
@@ -432,4 +436,4 @@ module ActiveModel
|
|
432
436
|
end
|
433
437
|
end
|
434
438
|
|
435
|
-
Dir[File.
|
439
|
+
Dir[File.expand_path("validations/*.rb", __dir__)].each { |file| require file }
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module Validations
|
3
5
|
# == Active \Model \Validation \Callbacks
|
@@ -52,16 +54,14 @@ module ActiveModel
|
|
52
54
|
# person.valid? # => true
|
53
55
|
# person.name # => "bob"
|
54
56
|
def before_validation(*args, &block)
|
55
|
-
options = args.
|
56
|
-
|
57
|
-
|
58
|
-
|
57
|
+
options = args.last
|
58
|
+
if options.is_a?(Hash) && options[:on]
|
59
|
+
options[:if] = Array(options[:if])
|
60
|
+
options[:on] = Array(options[:on])
|
59
61
|
options[:if].unshift ->(o) {
|
60
|
-
|
62
|
+
options[:on].include? o.validation_context
|
61
63
|
}
|
62
64
|
end
|
63
|
-
|
64
|
-
args << options
|
65
65
|
set_callback(:validation, :before, *args, &block)
|
66
66
|
end
|
67
67
|
|
@@ -95,15 +95,13 @@ module ActiveModel
|
|
95
95
|
options = args.extract_options!
|
96
96
|
options[:prepend] = true
|
97
97
|
options[:if] = Array(options[:if])
|
98
|
-
|
99
|
-
|
98
|
+
if options[:on]
|
99
|
+
options[:on] = Array(options[:on])
|
100
100
|
options[:if].unshift ->(o) {
|
101
|
-
|
101
|
+
options[:on].include? o.validation_context
|
102
102
|
}
|
103
103
|
end
|
104
|
-
|
105
|
-
args << options
|
106
|
-
set_callback(:validation, :after, *args, &block)
|
104
|
+
set_callback(:validation, :after, *(args << options), &block)
|
107
105
|
end
|
108
106
|
end
|
109
107
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveModel
|
2
4
|
module Validations
|
3
5
|
class ConfirmationValidator < EachValidator # :nodoc:
|
@@ -7,7 +9,7 @@ module ActiveModel
|
|
7
9
|
end
|
8
10
|
|
9
11
|
def validate_each(record, attribute, value)
|
10
|
-
|
12
|
+
unless (confirmed = record.send("#{attribute}_confirmation")).nil?
|
11
13
|
unless confirmation_value_equal?(record, attribute, value, confirmed)
|
12
14
|
human_attribute_name = record.class.human_attribute_name(attribute)
|
13
15
|
record.errors.add(:"#{attribute}_confirmation", :confirmation, options.except(:case_sensitive).merge!(attribute: human_attribute_name))
|