activemodel 5.2.2.1 → 6.0.2

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +144 -51
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -2
  5. data/lib/active_model.rb +1 -1
  6. data/lib/active_model/attribute.rb +3 -4
  7. data/lib/active_model/attribute/user_provided_default.rb +1 -2
  8. data/lib/active_model/attribute_assignment.rb +1 -1
  9. data/lib/active_model/attribute_methods.rb +54 -15
  10. data/lib/active_model/attribute_mutation_tracker.rb +88 -34
  11. data/lib/active_model/attribute_set.rb +2 -10
  12. data/lib/active_model/attribute_set/builder.rb +1 -3
  13. data/lib/active_model/attribute_set/yaml_encoder.rb +1 -2
  14. data/lib/active_model/attributes.rb +60 -33
  15. data/lib/active_model/callbacks.rb +10 -7
  16. data/lib/active_model/conversion.rb +1 -1
  17. data/lib/active_model/dirty.rb +36 -99
  18. data/lib/active_model/errors.rb +104 -20
  19. data/lib/active_model/gem_version.rb +3 -3
  20. data/lib/active_model/naming.rb +19 -3
  21. data/lib/active_model/railtie.rb +6 -0
  22. data/lib/active_model/secure_password.rb +47 -48
  23. data/lib/active_model/serializers/json.rb +10 -9
  24. data/lib/active_model/type/binary.rb +1 -1
  25. data/lib/active_model/type/boolean.rb +10 -1
  26. data/lib/active_model/type/date.rb +2 -5
  27. data/lib/active_model/type/date_time.rb +4 -7
  28. data/lib/active_model/type/float.rb +0 -2
  29. data/lib/active_model/type/helpers.rb +1 -0
  30. data/lib/active_model/type/helpers/accepts_multiparameter_time.rb +4 -0
  31. data/lib/active_model/type/helpers/numeric.rb +9 -2
  32. data/lib/active_model/type/helpers/time_value.rb +16 -15
  33. data/lib/active_model/type/helpers/timezone.rb +19 -0
  34. data/lib/active_model/type/integer.rb +7 -19
  35. data/lib/active_model/type/registry.rb +2 -10
  36. data/lib/active_model/type/string.rb +2 -2
  37. data/lib/active_model/type/time.rb +2 -1
  38. data/lib/active_model/validations.rb +0 -2
  39. data/lib/active_model/validations/acceptance.rb +33 -25
  40. data/lib/active_model/validations/clusivity.rb +1 -1
  41. data/lib/active_model/validations/confirmation.rb +2 -2
  42. data/lib/active_model/validations/inclusion.rb +1 -1
  43. data/lib/active_model/validations/length.rb +1 -1
  44. data/lib/active_model/validations/numericality.rb +20 -11
  45. data/lib/active_model/validations/validates.rb +2 -2
  46. data/lib/active_model/validator.rb +1 -1
  47. metadata +13 -9
@@ -32,7 +32,7 @@ module ActiveModel
32
32
  value = options[key]
33
33
 
34
34
  unless (value.is_a?(Integer) && value >= 0) || value == Float::INFINITY || value.is_a?(Symbol) || value.is_a?(Proc)
35
- raise ArgumentError, ":#{key} must be a nonnegative Integer, Infinity, Symbol, or Proc"
35
+ raise ArgumentError, ":#{key} must be a non-negative Integer, Infinity, Symbol, or Proc"
36
36
  end
37
37
  end
38
38
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bigdecimal/util"
4
+
3
5
  module ActiveModel
4
6
  module Validations
5
7
  class NumericalityValidator < EachValidator # :nodoc:
@@ -9,6 +11,8 @@ module ActiveModel
9
11
 
10
12
  RESERVED_OPTIONS = CHECKS.keys + [:only_integer]
11
13
 
14
+ INTEGER_REGEX = /\A[+-]?\d+\z/
15
+
12
16
  def check_validity!
13
17
  keys = CHECKS.keys - [:odd, :even]
14
18
  options.slice(*keys).each do |option, value|
@@ -49,11 +53,7 @@ module ActiveModel
49
53
  return
50
54
  end
51
55
 
52
- if raw_value.is_a?(Numeric)
53
- value = raw_value
54
- else
55
- value = parse_raw_value_as_a_number(raw_value)
56
- end
56
+ value = parse_as_number(raw_value)
57
57
 
58
58
  options.slice(*CHECKS.keys).each do |option, option_value|
59
59
  case option
@@ -69,6 +69,8 @@ module ActiveModel
69
69
  option_value = record.send(option_value)
70
70
  end
71
71
 
72
+ option_value = parse_as_number(option_value)
73
+
72
74
  unless value.send(CHECKS[option], option_value)
73
75
  record.errors.add(attr_name, option, filtered_options(value).merge!(count: option_value))
74
76
  end
@@ -79,22 +81,29 @@ module ActiveModel
79
81
  private
80
82
 
81
83
  def is_number?(raw_value)
82
- !parse_raw_value_as_a_number(raw_value).nil?
84
+ !parse_as_number(raw_value).nil?
83
85
  rescue ArgumentError, TypeError
84
86
  false
85
87
  end
86
88
 
87
- def parse_raw_value_as_a_number(raw_value)
88
- return raw_value.to_i if is_integer?(raw_value)
89
- Kernel.Float(raw_value) unless is_hexadecimal_literal?(raw_value)
89
+ def parse_as_number(raw_value)
90
+ if raw_value.is_a?(Float)
91
+ raw_value.to_d
92
+ elsif raw_value.is_a?(Numeric)
93
+ raw_value
94
+ elsif is_integer?(raw_value)
95
+ raw_value.to_i
96
+ elsif !is_hexadecimal_literal?(raw_value)
97
+ Kernel.Float(raw_value).to_d
98
+ end
90
99
  end
91
100
 
92
101
  def is_integer?(raw_value)
93
- /\A[+-]?\d+\z/ === raw_value.to_s
102
+ INTEGER_REGEX.match?(raw_value.to_s)
94
103
  end
95
104
 
96
105
  def is_hexadecimal_literal?(raw_value)
97
- /\A0[xX]/ === raw_value
106
+ /\A0[xX]/.match?(raw_value.to_s)
98
107
  end
99
108
 
100
109
  def filtered_options(value)
@@ -63,7 +63,7 @@ module ActiveModel
63
63
  # and strings in shortcut form.
64
64
  #
65
65
  # validates :email, format: /@/
66
- # validates :gender, inclusion: %w(male female)
66
+ # validates :role, inclusion: %(admin contributor)
67
67
  # validates :password, length: 6..20
68
68
  #
69
69
  # When using shortcut form, ranges and arrays are passed to your
@@ -116,7 +116,7 @@ module ActiveModel
116
116
  key = "#{key.to_s.camelize}Validator"
117
117
 
118
118
  begin
119
- validator = key.include?("::".freeze) ? key.constantize : const_get(key)
119
+ validator = key.include?("::") ? key.constantize : const_get(key)
120
120
  rescue NameError
121
121
  raise ArgumentError, "Unknown validator: '#{key}'"
122
122
  end
@@ -90,7 +90,7 @@ module ActiveModel
90
90
  # class MyValidator < ActiveModel::Validator
91
91
  # def initialize(options={})
92
92
  # super
93
- # options[:class].send :attr_accessor, :custom_attribute
93
+ # options[:class].attr_accessor :custom_attribute
94
94
  # end
95
95
  # end
96
96
  class Validator
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.2.1
4
+ version: 6.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-13 00:00:00.000000000 Z
11
+ date: 2019-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 5.2.2.1
19
+ version: 6.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 5.2.2.1
26
+ version: 6.0.2
27
27
  description: A toolkit for building modeling frameworks like Active Record. Rich support
28
28
  for attributes, callbacks, validations, serialization, internationalization, and
29
29
  testing.
@@ -73,6 +73,7 @@ files:
73
73
  - lib/active_model/type/helpers/mutable.rb
74
74
  - lib/active_model/type/helpers/numeric.rb
75
75
  - lib/active_model/type/helpers/time_value.rb
76
+ - lib/active_model/type/helpers/timezone.rb
76
77
  - lib/active_model/type/immutable_string.rb
77
78
  - lib/active_model/type/integer.rb
78
79
  - lib/active_model/type/registry.rb
@@ -96,12 +97,15 @@ files:
96
97
  - lib/active_model/validations/with.rb
97
98
  - lib/active_model/validator.rb
98
99
  - lib/active_model/version.rb
99
- homepage: http://rubyonrails.org
100
+ homepage: https://rubyonrails.org
100
101
  licenses:
101
102
  - MIT
102
103
  metadata:
103
- source_code_uri: https://github.com/rails/rails/tree/v5.2.2.1/activemodel
104
- changelog_uri: https://github.com/rails/rails/blob/v5.2.2.1/activemodel/CHANGELOG.md
104
+ bug_tracker_uri: https://github.com/rails/rails/issues
105
+ changelog_uri: https://github.com/rails/rails/blob/v6.0.2/activemodel/CHANGELOG.md
106
+ documentation_uri: https://api.rubyonrails.org/v6.0.2/
107
+ mailing_list_uri: https://groups.google.com/forum/#!forum/rubyonrails-talk
108
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.2/activemodel
105
109
  post_install_message:
106
110
  rdoc_options: []
107
111
  require_paths:
@@ -110,14 +114,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
114
  requirements:
111
115
  - - ">="
112
116
  - !ruby/object:Gem::Version
113
- version: 2.2.2
117
+ version: 2.5.0
114
118
  required_rubygems_version: !ruby/object:Gem::Requirement
115
119
  requirements:
116
120
  - - ">="
117
121
  - !ruby/object:Gem::Version
118
122
  version: '0'
119
123
  requirements: []
120
- rubygems_version: 3.0.1
124
+ rubygems_version: 3.0.3
121
125
  signing_key:
122
126
  specification_version: 4
123
127
  summary: A toolkit for building modeling frameworks (part of Rails).