activemodel 5.2.6 → 6.0.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -133
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  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 +39 -1
  10. data/lib/active_model/attribute_mutation_tracker.rb +1 -6
  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 +10 -22
  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 +2 -2
  18. data/lib/active_model/errors.rb +90 -11
  19. data/lib/active_model/gem_version.rb +4 -4
  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 +48 -55
  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 +1 -10
  26. data/lib/active_model/type/date.rb +1 -2
  27. data/lib/active_model/type/date_time.rb +3 -4
  28. data/lib/active_model/type/decimal.rb +4 -0
  29. data/lib/active_model/type/helpers.rb +0 -1
  30. data/lib/active_model/type/helpers/time_value.rb +19 -1
  31. data/lib/active_model/type/integer.rb +1 -6
  32. data/lib/active_model/type/registry.rb +2 -10
  33. data/lib/active_model/type/string.rb +2 -2
  34. data/lib/active_model/type/time.rb +0 -5
  35. data/lib/active_model/validations.rb +0 -2
  36. data/lib/active_model/validations/acceptance.rb +4 -8
  37. data/lib/active_model/validations/clusivity.rb +1 -1
  38. data/lib/active_model/validations/confirmation.rb +2 -2
  39. data/lib/active_model/validations/inclusion.rb +1 -1
  40. data/lib/active_model/validations/numericality.rb +9 -6
  41. data/lib/active_model/validations/validates.rb +2 -2
  42. data/lib/active_model/validator.rb +1 -1
  43. metadata +10 -11
  44. data/lib/active_model/type/helpers/timezone.rb +0 -19
@@ -40,7 +40,7 @@ module ActiveModel
40
40
  alias_method :to_str, :to_s
41
41
 
42
42
  def hex
43
- @value.unpack("H*")[0]
43
+ @value.unpack1("H*")
44
44
  end
45
45
 
46
46
  def ==(other)
@@ -14,16 +14,7 @@ module ActiveModel
14
14
  # - Empty strings are coerced to +nil+
15
15
  # - All other values will be coerced to +true+
16
16
  class Boolean < Value
17
- FALSE_VALUES = [
18
- false, 0,
19
- "0", :"0",
20
- "f", :f,
21
- "F", :F,
22
- "false", :false,
23
- "FALSE", :FALSE,
24
- "off", :off,
25
- "OFF", :OFF,
26
- ].to_set.freeze
17
+ FALSE_VALUES = [false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"].to_set
27
18
 
28
19
  def type # :nodoc:
29
20
  :boolean
@@ -3,7 +3,6 @@
3
3
  module ActiveModel
4
4
  module Type
5
5
  class Date < Value # :nodoc:
6
- include Helpers::Timezone
7
6
  include Helpers::AcceptsMultiparameterTime.new
8
7
 
9
8
  def type
@@ -50,7 +49,7 @@ module ActiveModel
50
49
 
51
50
  def value_from_multiparameter_assignment(*)
52
51
  time = super
53
- time && new_date(time.year, time.mon, time.mday)
52
+ time && time.to_date
54
53
  end
55
54
  end
56
55
  end
@@ -3,7 +3,6 @@
3
3
  module ActiveModel
4
4
  module Type
5
5
  class DateTime < Value # :nodoc:
6
- include Helpers::Timezone
7
6
  include Helpers::TimeValue
8
7
  include Helpers::AcceptsMultiparameterTime.new(
9
8
  defaults: { 4 => 0, 5 => 0 }
@@ -40,9 +39,9 @@ module ActiveModel
40
39
  end
41
40
 
42
41
  def value_from_multiparameter_assignment(values_hash)
43
- missing_parameter = (1..3).detect { |key| !values_hash.key?(key) }
44
- if missing_parameter
45
- raise ArgumentError, missing_parameter
42
+ missing_parameters = (1..3).select { |key| !values_hash.key?(key) }
43
+ if missing_parameters.any?
44
+ raise ArgumentError, "Provided hash #{values_hash} doesn't contain necessary keys: #{missing_parameters}"
46
45
  end
47
46
  super
48
47
  end
@@ -12,6 +12,10 @@ module ActiveModel
12
12
  :decimal
13
13
  end
14
14
 
15
+ def serialize(value)
16
+ cast(value)
17
+ end
18
+
15
19
  def type_cast_for_schema(value)
16
20
  value.to_s.inspect
17
21
  end
@@ -4,4 +4,3 @@ require "active_model/type/helpers/accepts_multiparameter_time"
4
4
  require "active_model/type/helpers/numeric"
5
5
  require "active_model/type/helpers/mutable"
6
6
  require "active_model/type/helpers/time_value"
7
- require "active_model/type/helpers/timezone"
@@ -21,6 +21,18 @@ module ActiveModel
21
21
  value
22
22
  end
23
23
 
24
+ def is_utc?
25
+ ::Time.zone_default.nil? || ::Time.zone_default =~ "UTC"
26
+ end
27
+
28
+ def default_timezone
29
+ if is_utc?
30
+ :utc
31
+ else
32
+ :local
33
+ end
34
+ end
35
+
24
36
  def apply_seconds_precision(value)
25
37
  return value unless precision && value.respond_to?(:usec)
26
38
  number_of_insignificant_digits = 6 - precision
@@ -58,7 +70,13 @@ module ActiveModel
58
70
  # Doesn't handle time zones.
59
71
  def fast_string_to_time(string)
60
72
  if string =~ ISO_DATETIME
61
- microsec = ($7.to_r * 1_000_000).to_i
73
+ microsec_part = $7
74
+ if microsec_part && microsec_part.start_with?(".") && microsec_part.length == 7
75
+ microsec_part[0] = ""
76
+ microsec = microsec_part.to_i
77
+ else
78
+ microsec = (microsec_part.to_r * 1_000_000).to_i
79
+ end
62
80
  new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
63
81
  end
64
82
  end
@@ -31,13 +31,8 @@ module ActiveModel
31
31
  result
32
32
  end
33
33
 
34
- # TODO Change this to private once we've dropped Ruby 2.2 support.
35
- # Workaround for Ruby 2.2 "private attribute?" warning.
36
- protected
37
-
38
- attr_reader :range
39
-
40
34
  private
35
+ attr_reader :range
41
36
 
42
37
  def cast_value(value)
43
38
  case value
@@ -23,13 +23,8 @@ module ActiveModel
23
23
  end
24
24
  end
25
25
 
26
- # TODO Change this to private once we've dropped Ruby 2.2 support.
27
- # Workaround for Ruby 2.2 "private attribute?" warning.
28
- protected
29
-
30
- attr_reader :registrations
31
-
32
26
  private
27
+ attr_reader :registrations
33
28
 
34
29
  def registration_klass
35
30
  Registration
@@ -59,10 +54,7 @@ module ActiveModel
59
54
  type_name == name
60
55
  end
61
56
 
62
- # TODO Change this to private once we've dropped Ruby 2.2 support.
63
- # Workaround for Ruby 2.2 "private attribute?" warning.
64
- protected
65
-
57
+ private
66
58
  attr_reader :name, :block
67
59
  end
68
60
  end
@@ -16,8 +16,8 @@ module ActiveModel
16
16
  def cast_value(value)
17
17
  case value
18
18
  when ::String then ::String.new(value)
19
- when true then "t".freeze
20
- when false then "f".freeze
19
+ when true then "t"
20
+ when false then "f"
21
21
  else value.to_s
22
22
  end
23
23
  end
@@ -3,7 +3,6 @@
3
3
  module ActiveModel
4
4
  module Type
5
5
  class Time < Value # :nodoc:
6
- include Helpers::Timezone
7
6
  include Helpers::TimeValue
8
7
  include Helpers::AcceptsMultiparameterTime.new(
9
8
  defaults: { 1 => 1970, 2 => 1, 3 => 1, 4 => 0, 5 => 0 }
@@ -13,10 +12,6 @@ module ActiveModel
13
12
  :time
14
13
  end
15
14
 
16
- def serialize(value)
17
- super(cast(value))
18
- end
19
-
20
15
  def user_input_in_time_zone(value)
21
16
  return unless value.present?
22
17
 
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/core_ext/array/extract_options"
4
- require "active_support/core_ext/hash/keys"
5
- require "active_support/core_ext/hash/except"
6
4
 
7
5
  module ActiveModel
8
6
  # == Active \Model \Validations
@@ -54,17 +54,13 @@ module ActiveModel
54
54
  def define_on(klass)
55
55
  attr_readers = attributes.reject { |name| klass.attribute_method?(name) }
56
56
  attr_writers = attributes.reject { |name| klass.attribute_method?("#{name}=") }
57
- klass.send(:attr_reader, *attr_readers)
58
- klass.send(:attr_writer, *attr_writers)
57
+ klass.define_attribute_methods
58
+ klass.attr_reader(*attr_readers)
59
+ klass.attr_writer(*attr_writers)
59
60
  end
60
61
 
61
- # TODO Change this to private once we've dropped Ruby 2.2 support.
62
- # Workaround for Ruby 2.2 "private attribute?" warning.
63
- protected
64
-
65
- attr_reader :attributes
66
-
67
62
  private
63
+ attr_reader :attributes
68
64
 
69
65
  def convert_to_reader_name(method_name)
70
66
  method_name.to_s.chomp("=")
@@ -32,7 +32,7 @@ module ActiveModel
32
32
  @delimiter ||= options[:in] || options[:within]
33
33
  end
34
34
 
35
- # In Ruby 2.2 <tt>Range#include?</tt> on non-number-or-time-ish ranges checks all
35
+ # After Ruby 2.2, <tt>Range#include?</tt> on non-number-or-time-ish ranges checks all
36
36
  # possible values in the range for equality, which is slower but more accurate.
37
37
  # <tt>Range#cover?</tt> uses the previous logic of comparing a value with the range
38
38
  # endpoints, which is fast but is only accurate on Numeric, Time, Date,
@@ -19,11 +19,11 @@ module ActiveModel
19
19
 
20
20
  private
21
21
  def setup!(klass)
22
- klass.send(:attr_reader, *attributes.map do |attribute|
22
+ klass.attr_reader(*attributes.map do |attribute|
23
23
  :"#{attribute}_confirmation" unless klass.method_defined?(:"#{attribute}_confirmation")
24
24
  end.compact)
25
25
 
26
- klass.send(:attr_writer, *attributes.map do |attribute|
26
+ klass.attr_writer(*attributes.map do |attribute|
27
27
  :"#{attribute}_confirmation" unless klass.method_defined?(:"#{attribute}_confirmation=")
28
28
  end.compact)
29
29
  end
@@ -19,7 +19,7 @@ module ActiveModel
19
19
  # particular enumerable object.
20
20
  #
21
21
  # class Person < ActiveRecord::Base
22
- # validates_inclusion_of :gender, in: %w( m f )
22
+ # validates_inclusion_of :role, in: %w( admin contributor )
23
23
  # validates_inclusion_of :age, in: 0..99
24
24
  # validates_inclusion_of :format, in: %w( jpg gif png ), message: "extension %{value} is not included in the list"
25
25
  # validates_inclusion_of :states, in: ->(person) { STATES[person.country] }
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bigdecimal/util"
4
-
5
3
  module ActiveModel
6
4
  module Validations
7
5
  class NumericalityValidator < EachValidator # :nodoc:
@@ -12,6 +10,7 @@ module ActiveModel
12
10
  RESERVED_OPTIONS = CHECKS.keys + [:only_integer]
13
11
 
14
12
  INTEGER_REGEX = /\A[+-]?\d+\z/
13
+ DECIMAL_REGEX = /\A[+-]?\d+\.?\d*(e|e[+-])?\d+\z/
15
14
 
16
15
  def check_validity!
17
16
  keys = CHECKS.keys - [:odd, :even]
@@ -93,17 +92,21 @@ module ActiveModel
93
92
  raw_value
94
93
  elsif is_integer?(raw_value)
95
94
  raw_value.to_i
96
- elsif !is_hexadecimal_literal?(raw_value)
97
- Kernel.Float(raw_value).to_d
95
+ elsif is_decimal?(raw_value) && !is_hexadecimal_literal?(raw_value)
96
+ BigDecimal(raw_value)
98
97
  end
99
98
  end
100
99
 
101
100
  def is_integer?(raw_value)
102
- INTEGER_REGEX === raw_value.to_s
101
+ INTEGER_REGEX.match?(raw_value.to_s)
102
+ end
103
+
104
+ def is_decimal?(raw_value)
105
+ DECIMAL_REGEX.match?(raw_value.to_s)
103
106
  end
104
107
 
105
108
  def is_hexadecimal_literal?(raw_value)
106
- /\A0[xX]/ === raw_value.to_s
109
+ /\A0[xX]/.match?(raw_value)
107
110
  end
108
111
 
109
112
  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.6
4
+ version: 6.0.0.beta1
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: 2021-05-05 00:00:00.000000000 Z
11
+ date: 2019-01-18 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.6
19
+ version: 6.0.0.beta1
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.6
26
+ version: 6.0.0.beta1
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,7 +73,6 @@ 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
77
76
  - lib/active_model/type/immutable_string.rb
78
77
  - lib/active_model/type/integer.rb
79
78
  - lib/active_model/type/registry.rb
@@ -101,8 +100,8 @@ homepage: http://rubyonrails.org
101
100
  licenses:
102
101
  - MIT
103
102
  metadata:
104
- source_code_uri: https://github.com/rails/rails/tree/v5.2.6/activemodel
105
- changelog_uri: https://github.com/rails/rails/blob/v5.2.6/activemodel/CHANGELOG.md
103
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.0.beta1/activemodel
104
+ changelog_uri: https://github.com/rails/rails/blob/v6.0.0.beta1/activemodel/CHANGELOG.md
106
105
  post_install_message:
107
106
  rdoc_options: []
108
107
  require_paths:
@@ -111,14 +110,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
110
  requirements:
112
111
  - - ">="
113
112
  - !ruby/object:Gem::Version
114
- version: 2.2.2
113
+ version: 2.5.0
115
114
  required_rubygems_version: !ruby/object:Gem::Requirement
116
115
  requirements:
117
- - - ">="
116
+ - - ">"
118
117
  - !ruby/object:Gem::Version
119
- version: '0'
118
+ version: 1.3.1
120
119
  requirements: []
121
- rubygems_version: 3.1.6
120
+ rubygems_version: 3.0.1
122
121
  signing_key:
123
122
  specification_version: 4
124
123
  summary: A toolkit for building modeling frameworks (part of Rails).
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/core_ext/time/zones"
4
-
5
- module ActiveModel
6
- module Type
7
- module Helpers # :nodoc: all
8
- module Timezone
9
- def is_utc?
10
- ::Time.zone_default.nil? || ::Time.zone_default =~ "UTC"
11
- end
12
-
13
- def default_timezone
14
- is_utc? ? :utc : :local
15
- end
16
- end
17
- end
18
- end
19
- end