activemodel 6.0.0.beta1 → 6.0.0.beta2
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 +4 -4
- data/CHANGELOG.md +47 -0
- data/lib/active_model/gem_version.rb +1 -1
- data/lib/active_model/type/date.rb +2 -5
- data/lib/active_model/type/date_time.rb +1 -4
- data/lib/active_model/type/decimal.rb +0 -4
- data/lib/active_model/type/float.rb +0 -2
- data/lib/active_model/type/helpers.rb +1 -0
- data/lib/active_model/type/helpers/accepts_multiparameter_time.rb +4 -0
- data/lib/active_model/type/helpers/numeric.rb +9 -2
- data/lib/active_model/type/helpers/time_value.rb +0 -12
- data/lib/active_model/type/helpers/timezone.rb +19 -0
- data/lib/active_model/type/integer.rb +5 -17
- data/lib/active_model/type/time.rb +2 -1
- data/lib/active_model/validations/length.rb +1 -1
- data/lib/active_model/validations/numericality.rb +5 -8
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbb3fa68163e411fcb037eada5a704a71587d3926088d115dcc5bf2db1b95c30
|
4
|
+
data.tar.gz: 71bc2a8ae24f2d44e88ae0a4a9a02631dd01148c0b698fca2cd971db9465c0bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1eda3fdc7cbc1f14d26cb6615a00cc597622c006619ef988430218ec97081880dde6067e1d1e672f36812d19a39b23475841d0ff6fece86454e836abdff7b892
|
7
|
+
data.tar.gz: 9ef29b02bfc1454aa06d99a29db09bdcd5f3cc08e44637fe94b881f738b701b3766613536e28371899edab2485dd63ecc6bc477a52b4c7ad2e25e31ad9c2e286
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
2
|
+
|
3
|
+
* Fix date value when casting a multiparameter date hash to not convert
|
4
|
+
from Gregorian date to Julian date.
|
5
|
+
|
6
|
+
Before:
|
7
|
+
|
8
|
+
Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
|
9
|
+
=> #<Day id: nil, day: "0001-01-03", created_at: nil, updated_at: nil>
|
10
|
+
|
11
|
+
After:
|
12
|
+
|
13
|
+
Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
|
14
|
+
=> #<Day id: nil, day: "0001-01-01", created_at: nil, updated_at: nil>
|
15
|
+
|
16
|
+
Fixes #28521.
|
17
|
+
|
18
|
+
*Sayan Chakraborty*
|
19
|
+
|
20
|
+
* Fix year value when casting a multiparameter time hash.
|
21
|
+
|
22
|
+
When assigning a hash to a time attribute that's missing a year component
|
23
|
+
(e.g. a `time_select` with `:ignore_date` set to `true`) then the year
|
24
|
+
defaults to 1970 instead of the expected 2000. This results in the attribute
|
25
|
+
changing as a result of the save.
|
26
|
+
|
27
|
+
Before:
|
28
|
+
```
|
29
|
+
event = Event.new(start_time: { 4 => 20, 5 => 30 })
|
30
|
+
event.start_time # => 1970-01-01 20:30:00 UTC
|
31
|
+
event.save
|
32
|
+
event.reload
|
33
|
+
event.start_time # => 2000-01-01 20:30:00 UTC
|
34
|
+
```
|
35
|
+
|
36
|
+
After:
|
37
|
+
```
|
38
|
+
event = Event.new(start_time: { 4 => 20, 5 => 30 })
|
39
|
+
event.start_time # => 2000-01-01 20:30:00 UTC
|
40
|
+
event.save
|
41
|
+
event.reload
|
42
|
+
event.start_time # => 2000-01-01 20:30:00 UTC
|
43
|
+
```
|
44
|
+
|
45
|
+
*Andrew White*
|
46
|
+
|
47
|
+
|
1
48
|
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
2
49
|
|
3
50
|
* Add `ActiveModel::Errors#of_kind?`.
|
@@ -3,16 +3,13 @@
|
|
3
3
|
module ActiveModel
|
4
4
|
module Type
|
5
5
|
class Date < Value # :nodoc:
|
6
|
+
include Helpers::Timezone
|
6
7
|
include Helpers::AcceptsMultiparameterTime.new
|
7
8
|
|
8
9
|
def type
|
9
10
|
:date
|
10
11
|
end
|
11
12
|
|
12
|
-
def serialize(value)
|
13
|
-
cast(value)
|
14
|
-
end
|
15
|
-
|
16
13
|
def type_cast_for_schema(value)
|
17
14
|
value.to_s(:db).inspect
|
18
15
|
end
|
@@ -49,7 +46,7 @@ module ActiveModel
|
|
49
46
|
|
50
47
|
def value_from_multiparameter_assignment(*)
|
51
48
|
time = super
|
52
|
-
time && time.
|
49
|
+
time && new_date(time.year, time.mon, time.mday)
|
53
50
|
end
|
54
51
|
end
|
55
52
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module ActiveModel
|
4
4
|
module Type
|
5
5
|
class DateTime < Value # :nodoc:
|
6
|
+
include Helpers::Timezone
|
6
7
|
include Helpers::TimeValue
|
7
8
|
include Helpers::AcceptsMultiparameterTime.new(
|
8
9
|
defaults: { 4 => 0, 5 => 0 }
|
@@ -12,10 +13,6 @@ module ActiveModel
|
|
12
13
|
:datetime
|
13
14
|
end
|
14
15
|
|
15
|
-
def serialize(value)
|
16
|
-
super(cast(value))
|
17
|
-
end
|
18
|
-
|
19
16
|
private
|
20
17
|
|
21
18
|
def cast_value(value)
|
@@ -5,6 +5,10 @@ module ActiveModel
|
|
5
5
|
module Helpers # :nodoc: all
|
6
6
|
class AcceptsMultiparameterTime < Module
|
7
7
|
def initialize(defaults: {})
|
8
|
+
define_method(:serialize) do |value|
|
9
|
+
super(cast(value))
|
10
|
+
end
|
11
|
+
|
8
12
|
define_method(:cast) do |value|
|
9
13
|
if value.is_a?(Hash)
|
10
14
|
value_from_multiparameter_assignment(value)
|
@@ -4,6 +4,10 @@ module ActiveModel
|
|
4
4
|
module Type
|
5
5
|
module Helpers # :nodoc: all
|
6
6
|
module Numeric
|
7
|
+
def serialize(value)
|
8
|
+
cast(value)
|
9
|
+
end
|
10
|
+
|
7
11
|
def cast(value)
|
8
12
|
value = \
|
9
13
|
case value
|
@@ -22,15 +26,18 @@ module ActiveModel
|
|
22
26
|
private
|
23
27
|
|
24
28
|
def number_to_non_number?(old_value, new_value_before_type_cast)
|
25
|
-
old_value != nil && non_numeric_string?(new_value_before_type_cast)
|
29
|
+
old_value != nil && non_numeric_string?(new_value_before_type_cast.to_s)
|
26
30
|
end
|
27
31
|
|
28
32
|
def non_numeric_string?(value)
|
29
33
|
# 'wibble'.to_i will give zero, we want to make sure
|
30
34
|
# that we aren't marking int zero to string zero as
|
31
35
|
# changed.
|
32
|
-
|
36
|
+
!NUMERIC_REGEX.match?(value)
|
33
37
|
end
|
38
|
+
|
39
|
+
NUMERIC_REGEX = /\A\s*[+-]?\d/
|
40
|
+
private_constant :NUMERIC_REGEX
|
34
41
|
end
|
35
42
|
end
|
36
43
|
end
|
@@ -21,18 +21,6 @@ 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
|
-
|
36
24
|
def apply_seconds_precision(value)
|
37
25
|
return value unless precision && value.respond_to?(:usec)
|
38
26
|
number_of_insignificant_digits = 6 - precision
|
@@ -0,0 +1,19 @@
|
|
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
|
@@ -18,35 +18,23 @@ module ActiveModel
|
|
18
18
|
:integer
|
19
19
|
end
|
20
20
|
|
21
|
-
def deserialize(value)
|
22
|
-
return if value.nil?
|
23
|
-
value.to_i
|
24
|
-
end
|
25
|
-
|
26
21
|
def serialize(value)
|
27
|
-
|
28
|
-
|
29
|
-
ensure_in_range(result)
|
30
|
-
end
|
31
|
-
result
|
22
|
+
return if value.is_a?(::String) && non_numeric_string?(value)
|
23
|
+
ensure_in_range(super)
|
32
24
|
end
|
33
25
|
|
34
26
|
private
|
35
27
|
attr_reader :range
|
36
28
|
|
37
29
|
def cast_value(value)
|
38
|
-
|
39
|
-
when true then 1
|
40
|
-
when false then 0
|
41
|
-
else
|
42
|
-
value.to_i rescue nil
|
43
|
-
end
|
30
|
+
value.to_i rescue nil
|
44
31
|
end
|
45
32
|
|
46
33
|
def ensure_in_range(value)
|
47
|
-
|
34
|
+
if value && !range.cover?(value)
|
48
35
|
raise ActiveModel::RangeError, "#{value} is out of range for #{self.class} with limit #{_limit} bytes"
|
49
36
|
end
|
37
|
+
value
|
50
38
|
end
|
51
39
|
|
52
40
|
def max_value
|
@@ -3,9 +3,10 @@
|
|
3
3
|
module ActiveModel
|
4
4
|
module Type
|
5
5
|
class Time < Value # :nodoc:
|
6
|
+
include Helpers::Timezone
|
6
7
|
include Helpers::TimeValue
|
7
8
|
include Helpers::AcceptsMultiparameterTime.new(
|
8
|
-
defaults: { 1 =>
|
9
|
+
defaults: { 1 => 2000, 2 => 1, 3 => 1, 4 => 0, 5 => 0 }
|
9
10
|
)
|
10
11
|
|
11
12
|
def type
|
@@ -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
|
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:
|
@@ -10,7 +12,6 @@ module ActiveModel
|
|
10
12
|
RESERVED_OPTIONS = CHECKS.keys + [:only_integer]
|
11
13
|
|
12
14
|
INTEGER_REGEX = /\A[+-]?\d+\z/
|
13
|
-
DECIMAL_REGEX = /\A[+-]?\d+\.?\d*(e|e[+-])?\d+\z/
|
14
15
|
|
15
16
|
def check_validity!
|
16
17
|
keys = CHECKS.keys - [:odd, :even]
|
@@ -92,8 +93,8 @@ module ActiveModel
|
|
92
93
|
raw_value
|
93
94
|
elsif is_integer?(raw_value)
|
94
95
|
raw_value.to_i
|
95
|
-
elsif
|
96
|
-
|
96
|
+
elsif !is_hexadecimal_literal?(raw_value)
|
97
|
+
Kernel.Float(raw_value).to_d
|
97
98
|
end
|
98
99
|
end
|
99
100
|
|
@@ -101,12 +102,8 @@ module ActiveModel
|
|
101
102
|
INTEGER_REGEX.match?(raw_value.to_s)
|
102
103
|
end
|
103
104
|
|
104
|
-
def is_decimal?(raw_value)
|
105
|
-
DECIMAL_REGEX.match?(raw_value.to_s)
|
106
|
-
end
|
107
|
-
|
108
105
|
def is_hexadecimal_literal?(raw_value)
|
109
|
-
/\A0[xX]/.match?(raw_value)
|
106
|
+
/\A0[xX]/.match?(raw_value.to_s)
|
110
107
|
end
|
111
108
|
|
112
109
|
def filtered_options(value)
|
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: 6.0.0.
|
4
|
+
version: 6.0.0.beta2
|
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-
|
11
|
+
date: 2019-02-25 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: 6.0.0.
|
19
|
+
version: 6.0.0.beta2
|
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: 6.0.0.
|
26
|
+
version: 6.0.0.beta2
|
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
|
@@ -100,8 +101,8 @@ homepage: http://rubyonrails.org
|
|
100
101
|
licenses:
|
101
102
|
- MIT
|
102
103
|
metadata:
|
103
|
-
source_code_uri: https://github.com/rails/rails/tree/v6.0.0.
|
104
|
-
changelog_uri: https://github.com/rails/rails/blob/v6.0.0.
|
104
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.0.0.beta2/activemodel
|
105
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.0.0.beta2/activemodel/CHANGELOG.md
|
105
106
|
post_install_message:
|
106
107
|
rdoc_options: []
|
107
108
|
require_paths:
|