activemodel 6.0.0.beta1 → 6.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|