activesupport 4.2.8 → 5.2.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +424 -373
- data/MIT-LICENSE +2 -2
- data/README.rdoc +4 -5
- data/lib/active_support/all.rb +5 -3
- data/lib/active_support/array_inquirer.rb +48 -0
- data/lib/active_support/backtrace_cleaner.rb +7 -5
- data/lib/active_support/benchmarkable.rb +6 -4
- data/lib/active_support/builder.rb +3 -1
- data/lib/active_support/cache/file_store.rb +41 -35
- data/lib/active_support/cache/mem_cache_store.rb +91 -91
- data/lib/active_support/cache/memory_store.rb +27 -30
- data/lib/active_support/cache/null_store.rb +7 -8
- data/lib/active_support/cache/redis_cache_store.rb +466 -0
- data/lib/active_support/cache/strategy/local_cache.rb +67 -34
- data/lib/active_support/cache/strategy/local_cache_middleware.rb +10 -9
- data/lib/active_support/cache.rb +287 -196
- data/lib/active_support/callbacks.rb +640 -590
- data/lib/active_support/concern.rb +11 -5
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +17 -0
- data/lib/active_support/concurrency/share_lock.rb +227 -0
- data/lib/active_support/configurable.rb +8 -5
- data/lib/active_support/core_ext/array/access.rb +29 -1
- data/lib/active_support/core_ext/array/conversions.rb +22 -18
- data/lib/active_support/core_ext/array/extract_options.rb +2 -0
- data/lib/active_support/core_ext/array/grouping.rb +11 -18
- data/lib/active_support/core_ext/array/inquiry.rb +19 -0
- data/lib/active_support/core_ext/array/prepend_and_append.rb +5 -3
- data/lib/active_support/core_ext/array/wrap.rb +7 -4
- data/lib/active_support/core_ext/array.rb +9 -6
- data/lib/active_support/core_ext/benchmark.rb +3 -1
- data/lib/active_support/core_ext/big_decimal/conversions.rb +10 -12
- data/lib/active_support/core_ext/big_decimal.rb +3 -1
- data/lib/active_support/core_ext/class/attribute.rb +41 -22
- data/lib/active_support/core_ext/class/attribute_accessors.rb +3 -1
- data/lib/active_support/core_ext/class/subclasses.rb +20 -6
- data/lib/active_support/core_ext/class.rb +4 -3
- data/lib/active_support/core_ext/date/acts_like.rb +3 -1
- data/lib/active_support/core_ext/date/blank.rb +14 -0
- data/lib/active_support/core_ext/date/calculations.rb +11 -9
- data/lib/active_support/core_ext/date/conversions.rb +25 -23
- data/lib/active_support/core_ext/date/zones.rb +4 -2
- data/lib/active_support/core_ext/date.rb +6 -4
- data/lib/active_support/core_ext/date_and_time/calculations.rb +170 -58
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +4 -17
- data/lib/active_support/core_ext/date_and_time/zones.rb +12 -12
- data/lib/active_support/core_ext/date_time/acts_like.rb +4 -2
- data/lib/active_support/core_ext/date_time/blank.rb +14 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +29 -16
- data/lib/active_support/core_ext/date_time/compatibility.rb +14 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +16 -12
- data/lib/active_support/core_ext/date_time.rb +7 -5
- data/lib/active_support/core_ext/digest/uuid.rb +7 -5
- data/lib/active_support/core_ext/digest.rb +3 -0
- data/lib/active_support/core_ext/enumerable.rb +101 -33
- data/lib/active_support/core_ext/file/atomic.rb +38 -31
- data/lib/active_support/core_ext/file.rb +3 -1
- data/lib/active_support/core_ext/hash/compact.rb +14 -9
- data/lib/active_support/core_ext/hash/conversions.rb +62 -41
- data/lib/active_support/core_ext/hash/deep_merge.rb +9 -13
- data/lib/active_support/core_ext/hash/except.rb +11 -8
- data/lib/active_support/core_ext/hash/indifferent_access.rb +4 -3
- data/lib/active_support/core_ext/hash/keys.rb +33 -27
- data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
- data/lib/active_support/core_ext/hash/slice.rb +8 -8
- data/lib/active_support/core_ext/hash/transform_values.rb +14 -5
- data/lib/active_support/core_ext/hash.rb +11 -9
- data/lib/active_support/core_ext/integer/inflections.rb +3 -1
- data/lib/active_support/core_ext/integer/multiple.rb +2 -0
- data/lib/active_support/core_ext/integer/time.rb +11 -18
- data/lib/active_support/core_ext/integer.rb +5 -3
- data/lib/active_support/core_ext/kernel/agnostics.rb +2 -0
- data/lib/active_support/core_ext/kernel/concern.rb +5 -1
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -84
- data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
- data/lib/active_support/core_ext/kernel.rb +6 -5
- data/lib/active_support/core_ext/load_error.rb +3 -22
- data/lib/active_support/core_ext/marshal.rb +8 -8
- data/lib/active_support/core_ext/module/aliasing.rb +6 -44
- data/lib/active_support/core_ext/module/anonymous.rb +12 -1
- data/lib/active_support/core_ext/module/attr_internal.rb +8 -9
- data/lib/active_support/core_ext/module/attribute_accessors.rb +43 -40
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +150 -0
- data/lib/active_support/core_ext/module/concerning.rb +11 -12
- data/lib/active_support/core_ext/module/delegation.rb +99 -29
- data/lib/active_support/core_ext/module/deprecation.rb +4 -2
- data/lib/active_support/core_ext/module/introspection.rb +9 -9
- data/lib/active_support/core_ext/module/reachable.rb +5 -2
- data/lib/active_support/core_ext/module/redefine_method.rb +49 -0
- data/lib/active_support/core_ext/module/remove_method.rb +8 -3
- data/lib/active_support/core_ext/module.rb +14 -11
- data/lib/active_support/core_ext/name_error.rb +22 -2
- data/lib/active_support/core_ext/numeric/bytes.rb +22 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +78 -81
- data/lib/active_support/core_ext/numeric/inquiry.rb +28 -0
- data/lib/active_support/core_ext/numeric/time.rb +35 -23
- data/lib/active_support/core_ext/numeric.rb +6 -3
- data/lib/active_support/core_ext/object/acts_like.rb +12 -1
- data/lib/active_support/core_ext/object/blank.rb +27 -2
- data/lib/active_support/core_ext/object/conversions.rb +6 -4
- data/lib/active_support/core_ext/object/deep_dup.rb +13 -4
- data/lib/active_support/core_ext/object/duplicable.rb +41 -14
- data/lib/active_support/core_ext/object/inclusion.rb +5 -3
- data/lib/active_support/core_ext/object/instance_variables.rb +3 -1
- data/lib/active_support/core_ext/object/json.rb +49 -19
- data/lib/active_support/core_ext/object/to_param.rb +3 -1
- data/lib/active_support/core_ext/object/to_query.rb +10 -5
- data/lib/active_support/core_ext/object/try.rb +69 -21
- data/lib/active_support/core_ext/object/with_options.rb +16 -3
- data/lib/active_support/core_ext/object.rb +14 -13
- data/lib/active_support/core_ext/range/compare_range.rb +61 -0
- data/lib/active_support/core_ext/range/conversions.rb +27 -7
- data/lib/active_support/core_ext/range/each.rb +19 -17
- data/lib/active_support/core_ext/range/include_range.rb +2 -22
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +23 -0
- data/lib/active_support/core_ext/range/overlaps.rb +2 -0
- data/lib/active_support/core_ext/range.rb +7 -4
- data/lib/active_support/core_ext/regexp.rb +6 -0
- data/lib/active_support/core_ext/securerandom.rb +25 -0
- data/lib/active_support/core_ext/string/access.rb +8 -6
- data/lib/active_support/core_ext/string/behavior.rb +3 -1
- data/lib/active_support/core_ext/string/conversions.rb +7 -4
- data/lib/active_support/core_ext/string/exclude.rb +2 -0
- data/lib/active_support/core_ext/string/filters.rb +6 -5
- data/lib/active_support/core_ext/string/indent.rb +6 -4
- data/lib/active_support/core_ext/string/inflections.rb +61 -24
- data/lib/active_support/core_ext/string/inquiry.rb +3 -1
- data/lib/active_support/core_ext/string/multibyte.rb +15 -7
- data/lib/active_support/core_ext/string/output_safety.rb +34 -38
- data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -0
- data/lib/active_support/core_ext/string/strip.rb +4 -5
- data/lib/active_support/core_ext/string/zones.rb +4 -2
- data/lib/active_support/core_ext/string.rb +15 -13
- data/lib/active_support/core_ext/time/acts_like.rb +3 -1
- data/lib/active_support/core_ext/time/calculations.rb +88 -52
- data/lib/active_support/core_ext/time/compatibility.rb +12 -1
- data/lib/active_support/core_ext/time/conversions.rb +20 -13
- data/lib/active_support/core_ext/time/zones.rb +41 -7
- data/lib/active_support/core_ext/time.rb +7 -6
- data/lib/active_support/core_ext/uri.rb +6 -8
- data/lib/active_support/core_ext.rb +3 -1
- data/lib/active_support/current_attributes.rb +195 -0
- data/lib/active_support/dependencies/autoload.rb +2 -0
- data/lib/active_support/dependencies/interlock.rb +57 -0
- data/lib/active_support/dependencies.rb +152 -161
- data/lib/active_support/deprecation/behaviors.rb +44 -11
- data/lib/active_support/deprecation/constant_accessor.rb +52 -0
- data/lib/active_support/deprecation/instance_delegator.rb +17 -2
- data/lib/active_support/deprecation/method_wrappers.rb +66 -20
- data/lib/active_support/deprecation/proxy_wrappers.rb +56 -28
- data/lib/active_support/deprecation/reporting.rb +32 -12
- data/lib/active_support/deprecation.rb +12 -9
- data/lib/active_support/descendants_tracker.rb +2 -0
- data/lib/active_support/digest.rb +20 -0
- data/lib/active_support/duration/iso8601_parser.rb +125 -0
- data/lib/active_support/duration/iso8601_serializer.rb +55 -0
- data/lib/active_support/duration.rb +314 -38
- data/lib/active_support/encrypted_configuration.rb +49 -0
- data/lib/active_support/encrypted_file.rb +99 -0
- data/lib/active_support/evented_file_update_checker.rb +205 -0
- data/lib/active_support/execution_wrapper.rb +128 -0
- data/lib/active_support/executor.rb +8 -0
- data/lib/active_support/file_update_checker.rb +63 -37
- data/lib/active_support/gem_version.rb +5 -3
- data/lib/active_support/gzip.rb +7 -5
- data/lib/active_support/hash_with_indifferent_access.rb +127 -28
- data/lib/active_support/i18n.rb +8 -6
- data/lib/active_support/i18n_railtie.rb +37 -13
- data/lib/active_support/inflections.rb +13 -11
- data/lib/active_support/inflector/inflections.rb +61 -12
- data/lib/active_support/inflector/methods.rb +163 -136
- data/lib/active_support/inflector/transliterate.rb +48 -27
- data/lib/active_support/inflector.rb +7 -5
- data/lib/active_support/json/decoding.rb +16 -13
- data/lib/active_support/json/encoding.rb +11 -58
- data/lib/active_support/json.rb +4 -2
- data/lib/active_support/key_generator.rb +25 -25
- data/lib/active_support/lazy_load_hooks.rb +50 -20
- data/lib/active_support/locale/en.yml +2 -0
- data/lib/active_support/log_subscriber/test_helper.rb +14 -12
- data/lib/active_support/log_subscriber.rb +13 -10
- data/lib/active_support/logger.rb +19 -7
- data/lib/active_support/logger_silence.rb +6 -4
- data/lib/active_support/logger_thread_safe_level.rb +7 -5
- data/lib/active_support/message_encryptor.rb +168 -53
- data/lib/active_support/message_verifier.rb +150 -17
- data/lib/active_support/messages/metadata.rb +71 -0
- data/lib/active_support/messages/rotation_configuration.rb +22 -0
- data/lib/active_support/messages/rotator.rb +56 -0
- data/lib/active_support/multibyte/chars.rb +36 -23
- data/lib/active_support/multibyte/unicode.rb +100 -96
- data/lib/active_support/multibyte.rb +4 -2
- data/lib/active_support/notifications/fanout.rb +11 -9
- data/lib/active_support/notifications/instrumenter.rb +27 -7
- data/lib/active_support/notifications.rb +11 -7
- data/lib/active_support/number_helper/number_converter.rb +13 -11
- data/lib/active_support/number_helper/number_to_currency_converter.rb +9 -9
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +9 -3
- data/lib/active_support/number_helper/number_to_human_converter.rb +11 -9
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +9 -8
- data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +13 -4
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +23 -56
- data/lib/active_support/number_helper/rounding_helper.rb +66 -0
- data/lib/active_support/number_helper.rb +94 -68
- data/lib/active_support/option_merger.rb +3 -1
- data/lib/active_support/ordered_hash.rb +6 -4
- data/lib/active_support/ordered_options.rb +23 -5
- data/lib/active_support/per_thread_registry.rb +9 -4
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/rails.rb +16 -8
- data/lib/active_support/railtie.rb +43 -9
- data/lib/active_support/reloader.rb +131 -0
- data/lib/active_support/rescuable.rb +108 -53
- data/lib/active_support/security_utils.rb +15 -11
- data/lib/active_support/string_inquirer.rb +11 -3
- data/lib/active_support/subscriber.rb +21 -16
- data/lib/active_support/tagged_logging.rb +14 -11
- data/lib/active_support/test_case.rb +19 -47
- data/lib/active_support/testing/assertions.rb +137 -20
- data/lib/active_support/testing/autorun.rb +4 -2
- data/lib/active_support/testing/constant_lookup.rb +2 -1
- data/lib/active_support/testing/declarative.rb +3 -1
- data/lib/active_support/testing/deprecation.rb +14 -10
- data/lib/active_support/testing/file_fixtures.rb +36 -0
- data/lib/active_support/testing/isolation.rb +34 -25
- data/lib/active_support/testing/method_call_assertions.rb +43 -0
- data/lib/active_support/testing/setup_and_teardown.rb +13 -8
- data/lib/active_support/testing/stream.rb +44 -0
- data/lib/active_support/testing/tagged_logging.rb +3 -1
- data/lib/active_support/testing/time_helpers.rb +91 -23
- data/lib/active_support/time.rb +14 -12
- data/lib/active_support/time_with_zone.rb +182 -40
- data/lib/active_support/values/time_zone.rb +196 -61
- data/lib/active_support/values/unicode_tables.dat +0 -0
- data/lib/active_support/version.rb +3 -1
- data/lib/active_support/xml_mini/jdom.rb +116 -114
- data/lib/active_support/xml_mini/libxml.rb +17 -16
- data/lib/active_support/xml_mini/libxmlsax.rb +16 -18
- data/lib/active_support/xml_mini/nokogiri.rb +15 -15
- data/lib/active_support/xml_mini/nokogirisax.rb +15 -16
- data/lib/active_support/xml_mini/rexml.rb +11 -9
- data/lib/active_support/xml_mini.rb +37 -37
- data/lib/active_support.rb +12 -11
- metadata +54 -25
- data/lib/active_support/concurrency/latch.rb +0 -27
- data/lib/active_support/core_ext/big_decimal/yaml_conversions.rb +0 -16
- data/lib/active_support/core_ext/class/delegating_attributes.rb +0 -45
- data/lib/active_support/core_ext/date_time/zones.rb +0 -6
- data/lib/active_support/core_ext/kernel/debugger.rb +0 -10
- data/lib/active_support/core_ext/module/method_transplanting.rb +0 -13
- data/lib/active_support/core_ext/module/qualified_const.rb +0 -52
- data/lib/active_support/core_ext/object/itself.rb +0 -15
- data/lib/active_support/core_ext/struct.rb +0 -6
- data/lib/active_support/core_ext/thread.rb +0 -86
- data/lib/active_support/core_ext/time/marshal.rb +0 -30
data/CHANGELOG.md
CHANGED
@@ -1,627 +1,678 @@
|
|
1
|
-
## Rails
|
2
|
-
|
3
|
-
* Make `getlocal` and `getutc` always return instances of `Time` for
|
4
|
-
`ActiveSupport::TimeWithZone` and `DateTime`. This eliminates a possible
|
5
|
-
stack level too deep error in `to_time` where `ActiveSupport::TimeWithZone`
|
6
|
-
was wrapping a `DateTime` instance. As a consequence of this the internal
|
7
|
-
time value in `ActiveSupport::TimeWithZone` is now always an instance of
|
8
|
-
`Time` in the UTC timezone, whether that's as the UTC time directly or
|
9
|
-
a representation of the local time in the timezone. There should be no
|
10
|
-
consequences of this internal change and if there are it's a bug due to
|
11
|
-
leaky abstractions.
|
1
|
+
## Rails 5.2.6 (May 05, 2021) ##
|
12
2
|
|
13
|
-
|
3
|
+
* No changes.
|
14
4
|
|
15
|
-
* Add `DateTime#subsec` to return the fraction of a second as a `Rational`.
|
16
5
|
|
17
|
-
|
6
|
+
## Rails 5.2.5 (March 26, 2021) ##
|
18
7
|
|
19
|
-
*
|
20
|
-
`ActiveSupport::TimeWithZone` and `Time`.
|
8
|
+
* No changes.
|
21
9
|
|
22
|
-
*Andrew White*
|
23
10
|
|
24
|
-
|
25
|
-
local timezone. Also aliased to `getlocal`.
|
11
|
+
## Rails 5.2.4.6 (May 05, 2021) ##
|
26
12
|
|
27
|
-
|
13
|
+
* No changes.
|
28
14
|
|
29
|
-
* Add `Time#sec_fraction` to return the fraction of a second as a `Rational`.
|
30
15
|
|
31
|
-
|
16
|
+
## Rails 5.2.4.5 (February 10, 2021) ##
|
32
17
|
|
33
|
-
*
|
34
|
-
how `to_time` handles timezones. In Ruby 2.4+ the behavior will change
|
35
|
-
from converting to the local system timezone, to preserving the timezone
|
36
|
-
of the receiver. This config option defaults to false so that apps made
|
37
|
-
with earlier versions of Rails are not affected when upgrading, e.g:
|
18
|
+
* No changes.
|
38
19
|
|
39
|
-
>> ENV['TZ'] = 'US/Eastern'
|
40
20
|
|
41
|
-
|
42
|
-
=> "2016-04-23T06:23:12.000-04:00"
|
21
|
+
## Rails 5.2.4.4 (September 09, 2020) ##
|
43
22
|
|
44
|
-
|
23
|
+
* No changes.
|
45
24
|
|
46
|
-
>> "2016-04-23T10:23:12.000Z".to_time
|
47
|
-
=> "2016-04-23T10:23:12.000Z"
|
48
25
|
|
49
|
-
|
26
|
+
## Rails 5.2.4.3 (May 18, 2020) ##
|
50
27
|
|
51
|
-
|
28
|
+
* [CVE-2020-8165] Deprecate Marshal.load on raw cache read in RedisCacheStore
|
52
29
|
|
53
|
-
*
|
30
|
+
* [CVE-2020-8165] Avoid Marshal.load on raw cache value in MemCacheStore
|
54
31
|
|
55
|
-
|
56
|
-
versions of Rails to aid migration, e.g. run Rails 4.2 and 5.0 variants
|
57
|
-
of your application at the same time to carry out A/B testing.
|
32
|
+
## Rails 5.2.4.2 (March 19, 2020) ##
|
58
33
|
|
59
|
-
|
60
|
-
change in 3aa26cf didn't meet this criteria because the Psych loader
|
61
|
-
checks for the existence of `init_with` before setting the instance
|
62
|
-
variables and the wrapping behavior of `ActiveSupport::TimeWithZone`
|
63
|
-
tries to see if the `Time` instance responds to `init_with` before the
|
64
|
-
`@time` variable is set.
|
34
|
+
* No changes.
|
65
35
|
|
66
|
-
To fix this we backported just the `init_with` behavior from the change
|
67
|
-
in 3aa26cf. If the revived instance is then written out to YAML again
|
68
|
-
it will revert to the default Rails 4.2 behavior of converting it to
|
69
|
-
a UTC timestamp string.
|
70
36
|
|
71
|
-
|
37
|
+
## Rails 5.2.4.1 (December 18, 2019) ##
|
72
38
|
|
73
|
-
|
39
|
+
* No changes.
|
74
40
|
|
75
|
-
* Fix `ActiveSupport::TimeWithZone#in` across DST boundaries.
|
76
41
|
|
77
|
-
|
78
|
-
method `Time#since` via `method_missing`. It is now aliased to
|
79
|
-
the DST aware `ActiveSupport::TimeWithZone#since` which handles
|
80
|
-
transitions across DST boundaries, e.g:
|
42
|
+
## Rails 5.2.4 (November 27, 2019) ##
|
81
43
|
|
82
|
-
|
44
|
+
* Make ActiveSupport::Logger Fiber-safe. Fixes #36752.
|
83
45
|
|
84
|
-
|
85
|
-
|
46
|
+
Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
|
47
|
+
to make log level local to Ruby Fibers in addition to Threads.
|
86
48
|
|
87
|
-
|
88
|
-
# => Sun, 06 Nov 2016 01:00:00 EST -05:00
|
49
|
+
Example:
|
89
50
|
|
90
|
-
|
51
|
+
logger = ActiveSupport::Logger.new(STDOUT)
|
52
|
+
logger.level = 1
|
53
|
+
p "Main is debug? #{logger.debug?}"
|
91
54
|
|
92
|
-
|
55
|
+
Fiber.new {
|
56
|
+
logger.local_level = 0
|
57
|
+
p "Thread is debug? #{logger.debug?}"
|
58
|
+
}.resume
|
93
59
|
|
60
|
+
p "Main is debug? #{logger.debug?}"
|
94
61
|
|
95
|
-
|
62
|
+
Before:
|
96
63
|
|
97
|
-
|
98
|
-
|
99
|
-
|
64
|
+
Main is debug? false
|
65
|
+
Thread is debug? true
|
66
|
+
Main is debug? true
|
100
67
|
|
101
|
-
|
68
|
+
After:
|
102
69
|
|
103
|
-
|
104
|
-
|
70
|
+
Main is debug? false
|
71
|
+
Thread is debug? true
|
72
|
+
Main is debug? false
|
105
73
|
|
106
|
-
*
|
74
|
+
*Alexander Varnin*
|
107
75
|
|
108
|
-
* Fixed a problem with ActiveSupport::SafeBuffer.titleize calling capitalize
|
109
|
-
on nil.
|
110
76
|
|
111
|
-
|
77
|
+
## Rails 5.2.3 (March 27, 2019) ##
|
112
78
|
|
113
|
-
*
|
114
|
-
since the app started. Removes UTC offset caching, reducing performance,
|
115
|
-
but this is still relatively quick and isn't in any hot paths.
|
79
|
+
* Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
|
116
80
|
|
117
|
-
|
81
|
+
`assoc` can now be called with either a string or a symbol.
|
118
82
|
|
119
|
-
*
|
120
|
-
which resolves to a different name.
|
83
|
+
*Stefan Schüßler*
|
121
84
|
|
122
|
-
|
85
|
+
* Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.
|
123
86
|
|
87
|
+
*Keenan Brock*
|
124
88
|
|
125
|
-
|
89
|
+
* Allow Range#=== and Range#cover? on Range
|
126
90
|
|
127
|
-
|
91
|
+
`Range#cover?` can now accept a range argument like `Range#include?` and
|
92
|
+
`Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved
|
93
|
+
into a new file, with these two methods.
|
128
94
|
|
95
|
+
*utilum*
|
129
96
|
|
130
|
-
|
97
|
+
* If the same block is `included` multiple times for a Concern, an exception is no longer raised.
|
131
98
|
|
132
|
-
*
|
99
|
+
*Mark J. Titorenko*, *Vlad Bokov*
|
133
100
|
|
134
101
|
|
135
|
-
## Rails
|
102
|
+
## Rails 5.2.2.1 (March 11, 2019) ##
|
136
103
|
|
137
104
|
* No changes.
|
138
105
|
|
139
106
|
|
140
|
-
## Rails
|
107
|
+
## Rails 5.2.2 (December 04, 2018) ##
|
141
108
|
|
142
|
-
* Fix
|
143
|
-
|
144
|
-
twz.eql?(twz.dup) => true
|
109
|
+
* Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
|
110
|
+
would not act as alias for `#symbolize_keys`.
|
145
111
|
|
146
|
-
|
112
|
+
*Nick Weiland*
|
147
113
|
|
148
|
-
|
114
|
+
* Improve the logic that detects non-autoloaded constants.
|
149
115
|
|
150
|
-
*
|
116
|
+
*Jan Habermann*, *Xavier Noria*
|
151
117
|
|
152
|
-
|
118
|
+
* Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
|
153
119
|
|
120
|
+
URI.unescape("\xe3\x83\x90") # => "バ"
|
121
|
+
URI.unescape("%E3%83%90") # => "バ"
|
122
|
+
URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
|
154
123
|
|
155
|
-
|
124
|
+
*Ashe Connor*, *Aaron Patterson*
|
156
125
|
|
157
|
-
* Fix a `SystemStackError` when encoding an `Enumerable` with `json` gem and
|
158
|
-
with the Active Support JSON encoder loaded.
|
159
126
|
|
160
|
-
|
127
|
+
## Rails 5.2.1.1 (November 27, 2018) ##
|
161
128
|
|
162
|
-
|
129
|
+
* No changes.
|
163
130
|
|
164
|
-
* Fix not calling `#default` on `HashWithIndifferentAcess#to_hash` when only
|
165
|
-
`default_proc` is set, which could raise.
|
166
131
|
|
167
|
-
|
132
|
+
## Rails 5.2.1 (August 07, 2018) ##
|
168
133
|
|
169
|
-
*
|
134
|
+
* Redis cache store: `delete_matched` no longer blocks the Redis server.
|
135
|
+
(Switches from evaled Lua to a batched SCAN + DEL loop.)
|
170
136
|
|
171
|
-
*
|
137
|
+
*Gleb Mazovetskiy*
|
172
138
|
|
139
|
+
* Fix bug where `ActiveSupport::Timezone.all` would fail when tzinfo data for
|
140
|
+
any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
|
173
141
|
|
174
|
-
|
142
|
+
*Dominik Sander*
|
175
143
|
|
176
|
-
* Fix
|
144
|
+
* Fix bug where `ActiveSupport::Cache` will massively inflate the storage
|
145
|
+
size when compression is enabled (which is true by default). This patch
|
146
|
+
does not attempt to repair existing data: please manually flush the cache
|
147
|
+
to clear out the problematic entries.
|
177
148
|
|
178
|
-
*
|
149
|
+
*Godfrey Chan*
|
179
150
|
|
180
|
-
*
|
151
|
+
* Fix `ActiveSupport::Cache#read_multi` bug with local cache enabled that was
|
152
|
+
returning instances of `ActiveSupport::Cache::Entry` instead of the raw values.
|
181
153
|
|
182
|
-
*
|
154
|
+
*Jason Lee*
|
183
155
|
|
184
156
|
|
185
|
-
## Rails
|
157
|
+
## Rails 5.2.0 (April 09, 2018) ##
|
186
158
|
|
187
|
-
*
|
159
|
+
* Caching: MemCache and Redis `read_multi` and `fetch_multi` speedup.
|
160
|
+
Read from the local in-memory cache before consulting the backend.
|
188
161
|
|
189
|
-
|
162
|
+
*Gabriel Sobrinho*
|
190
163
|
|
191
|
-
|
164
|
+
* Return all mappings for a timezone identifier in `country_zones`.
|
192
165
|
|
193
|
-
|
166
|
+
Some timezones like `Europe/London` have multiple mappings in
|
167
|
+
`ActiveSupport::TimeZone::MAPPING` so return all of them instead
|
168
|
+
of the first one found by using `Hash#value`. e.g:
|
194
169
|
|
195
|
-
|
170
|
+
# Before
|
171
|
+
ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh"]
|
196
172
|
|
197
|
-
|
173
|
+
# After
|
174
|
+
ActiveSupport::TimeZone.country_zones("GB") # => ["Edinburgh", "London"]
|
198
175
|
|
176
|
+
Fixes #31668.
|
199
177
|
|
200
|
-
|
178
|
+
*Andrew White*
|
201
179
|
|
202
|
-
*
|
203
|
-
string.
|
180
|
+
* Add support for connection pooling on RedisCacheStore.
|
204
181
|
|
205
|
-
*
|
182
|
+
*fatkodima*
|
206
183
|
|
207
|
-
*
|
208
|
-
|
184
|
+
* Support hash as first argument in `assert_difference`. This allows to specify multiple
|
185
|
+
numeric differences in the same assertion.
|
209
186
|
|
210
|
-
|
187
|
+
assert_difference ->{ Article.count } => 1, ->{ Post.count } => 2
|
211
188
|
|
212
|
-
|
213
|
-
YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => true
|
214
|
-
YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => false
|
215
|
-
YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => 1
|
216
|
-
YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => 1.1
|
189
|
+
*Julien Meichelbeck*
|
217
190
|
|
218
|
-
|
191
|
+
* Add missing instrumentation for `read_multi` in `ActiveSupport::Cache::Store`.
|
219
192
|
|
220
|
-
|
221
|
-
YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => "true"
|
222
|
-
YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => "false"
|
223
|
-
YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => "1"
|
224
|
-
YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => "1.1"
|
193
|
+
*Ignatius Reza Lesmana*
|
225
194
|
|
226
|
-
|
195
|
+
* `assert_changes` will always assert that the expression changes,
|
196
|
+
regardless of `from:` and `to:` argument combinations.
|
227
197
|
|
228
|
-
*
|
198
|
+
*Daniel Ma*
|
229
199
|
|
230
|
-
|
200
|
+
* Use SHA-1 to generate non-sensitive digests, such as the ETag header.
|
231
201
|
|
232
|
-
|
233
|
-
|
202
|
+
Enabled by default for new apps; upgrading apps can opt in by setting
|
203
|
+
`config.active_support.use_sha1_digests = true`.
|
234
204
|
|
235
|
-
*
|
205
|
+
*Dmitri Dolguikh*, *Eugene Kenny*
|
236
206
|
|
207
|
+
* Changed default behaviour of `ActiveSupport::SecurityUtils.secure_compare`,
|
208
|
+
to make it not leak length information even for variable length string.
|
237
209
|
|
238
|
-
|
210
|
+
Renamed old `ActiveSupport::SecurityUtils.secure_compare` to `fixed_length_secure_compare`,
|
211
|
+
and started raising `ArgumentError` in case of length mismatch of passed strings.
|
239
212
|
|
240
|
-
*
|
213
|
+
*Vipul A M*
|
241
214
|
|
242
|
-
|
215
|
+
* Make `ActiveSupport::TimeZone.all` return only time zones that are in
|
216
|
+
`ActiveSupport::TimeZone::MAPPING`.
|
243
217
|
|
244
|
-
|
218
|
+
Fixes #7245.
|
245
219
|
|
246
|
-
*
|
220
|
+
*Chris LaRose*
|
247
221
|
|
248
|
-
|
222
|
+
* MemCacheStore: Support expiring counters.
|
249
223
|
|
250
|
-
|
251
|
-
|
224
|
+
Pass `expires_in: [seconds]` to `#increment` and `#decrement` options
|
225
|
+
to set the Memcached TTL (time-to-live) if the counter doesn't exist.
|
226
|
+
If the counter exists, Memcached doesn't extend its expiry when it's
|
227
|
+
incremented or decremented.
|
252
228
|
|
253
|
-
|
229
|
+
```
|
230
|
+
Rails.cache.increment("my_counter", 1, expires_in: 2.minutes)
|
231
|
+
```
|
254
232
|
|
255
|
-
*
|
233
|
+
*Takumasa Ochi*
|
256
234
|
|
257
|
-
|
235
|
+
* Handle `TZInfo::AmbiguousTime` errors.
|
258
236
|
|
259
|
-
|
237
|
+
Make `ActiveSupport::TimeWithZone` match Ruby's handling of ambiguous
|
238
|
+
times by choosing the later period, e.g.
|
260
239
|
|
261
|
-
|
240
|
+
Ruby:
|
241
|
+
```
|
242
|
+
ENV["TZ"] = "Europe/Moscow"
|
243
|
+
Time.local(2014, 10, 26, 1, 0, 0) # => 2014-10-26 01:00:00 +0300
|
244
|
+
```
|
262
245
|
|
263
|
-
|
246
|
+
Before:
|
247
|
+
```
|
248
|
+
>> "2014-10-26 01:00:00".in_time_zone("Moscow")
|
249
|
+
TZInfo::AmbiguousTime: 26/10/2014 01:00 is an ambiguous local time.
|
250
|
+
```
|
264
251
|
|
265
|
-
|
252
|
+
After:
|
253
|
+
```
|
254
|
+
>> "2014-10-26 01:00:00".in_time_zone("Moscow")
|
255
|
+
=> Sun, 26 Oct 2014 01:00:00 MSK +03:00
|
256
|
+
```
|
266
257
|
|
267
|
-
|
258
|
+
Fixes #17395.
|
268
259
|
|
269
|
-
|
260
|
+
*Andrew White*
|
270
261
|
|
271
|
-
|
272
|
-
just a bit stricter than `#==`, as it checks whether the argument is also a duration. Their
|
273
|
-
parts may be different though.
|
262
|
+
* Redis cache store.
|
274
263
|
|
275
|
-
|
276
|
-
|
264
|
+
```
|
265
|
+
# Defaults to `redis://localhost:6379/0`. Only use for dev/test.
|
266
|
+
config.cache_store = :redis_cache_store
|
277
267
|
|
278
|
-
|
268
|
+
# Supports all common cache store options (:namespace, :compress,
|
269
|
+
# :compress_threshold, :expires_in, :race_condition_ttl) and all
|
270
|
+
# Redis options.
|
271
|
+
cache_password = Rails.application.secrets.redis_cache_password
|
272
|
+
config.cache_store = :redis_cache_store, driver: :hiredis,
|
273
|
+
namespace: 'myapp-cache', compress: true, timeout: 1,
|
274
|
+
url: "redis://:#{cache_password}@myapp-cache-1:6379/0"
|
279
275
|
|
280
|
-
|
281
|
-
|
276
|
+
# Supports Redis::Distributed with multiple hosts
|
277
|
+
config.cache_store = :redis_cache_store, driver: :hiredis
|
278
|
+
namespace: 'myapp-cache', compress: true,
|
279
|
+
url: %w[
|
280
|
+
redis://myapp-cache-1:6379/0
|
281
|
+
redis://myapp-cache-1:6380/0
|
282
|
+
redis://myapp-cache-2:6379/0
|
283
|
+
redis://myapp-cache-2:6380/0
|
284
|
+
redis://myapp-cache-3:6379/0
|
285
|
+
redis://myapp-cache-3:6380/0
|
286
|
+
]
|
282
287
|
|
283
|
-
|
288
|
+
# Or pass a builder block
|
289
|
+
config.cache_store = :redis_cache_store,
|
290
|
+
namespace: 'myapp-cache', compress: true,
|
291
|
+
redis: -> { Redis.new … }
|
292
|
+
```
|
284
293
|
|
285
|
-
|
286
|
-
|
294
|
+
Deployment note: Take care to use a *dedicated Redis cache* rather
|
295
|
+
than pointing this at your existing Redis server. It won't cope well
|
296
|
+
with mixed usage patterns and it won't expire cache entries by default.
|
287
297
|
|
288
|
-
|
298
|
+
Redis cache server setup guide: https://redis.io/topics/lru-cache
|
289
299
|
|
290
|
-
*
|
291
|
-
specifying the order in which test cases are executed. This option currently defaults
|
292
|
-
to `:sorted` but will be changed to `:random` in Rails 5.0.
|
300
|
+
*Jeremy Daer*
|
293
301
|
|
294
|
-
|
302
|
+
* Cache: Enable compression by default for values > 1kB.
|
295
303
|
|
296
|
-
|
297
|
-
|
304
|
+
Compression has long been available, but opt-in and at a 16kB threshold.
|
305
|
+
It wasn't enabled by default due to CPU cost. Today it's cheap and typical
|
306
|
+
cache data is eminently compressible, such as HTML or JSON fragments.
|
307
|
+
Compression dramatically reduces Memcached/Redis mem usage, which means
|
308
|
+
the same cache servers can store more data, which means higher hit rates.
|
298
309
|
|
299
|
-
|
310
|
+
To disable compression, pass `compress: false` to the initializer.
|
300
311
|
|
301
|
-
*
|
312
|
+
*Jeremy Daer*
|
302
313
|
|
303
|
-
*
|
304
|
-
the time has an offset other than UTC or local.
|
314
|
+
* Allow `Range#include?` on TWZ ranges.
|
305
315
|
|
306
|
-
|
316
|
+
In #11474 we prevented TWZ ranges being iterated over which matched
|
317
|
+
Ruby's handling of Time ranges and as a consequence `include?`
|
318
|
+
stopped working with both Time ranges and TWZ ranges. However in
|
319
|
+
ruby/ruby@b061634 support was added for `include?` to use `cover?`
|
320
|
+
for 'linear' objects. Since we have no way of making Ruby consider
|
321
|
+
TWZ instances as 'linear' we have to override `Range#include?`.
|
307
322
|
|
308
|
-
|
309
|
-
hashes and arrays containing `Method` objects to be `deep_dup`ed.
|
323
|
+
Fixes #30799.
|
310
324
|
|
311
|
-
*
|
325
|
+
*Andrew White*
|
312
326
|
|
313
|
-
*
|
314
|
-
which happens during constant autoloading.
|
327
|
+
* Fix acronym support in `humanize`.
|
315
328
|
|
316
|
-
|
329
|
+
Acronym inflections are stored with lowercase keys in the hash but
|
330
|
+
the match wasn't being lowercased before being looked up in the hash.
|
331
|
+
This shouldn't have any performance impact because before it would
|
332
|
+
fail to find the acronym and perform the `downcase` operation anyway.
|
317
333
|
|
318
|
-
|
334
|
+
Fixes #31052.
|
319
335
|
|
320
|
-
*
|
336
|
+
*Andrew White*
|
321
337
|
|
322
|
-
|
338
|
+
* Add same method signature for `Time#prev_year` and `Time#next_year`
|
339
|
+
in accordance with `Date#prev_year`, `Date#next_year`.
|
323
340
|
|
324
|
-
|
341
|
+
Allows pass argument for `Time#prev_year` and `Time#next_year`.
|
325
342
|
|
326
|
-
|
343
|
+
Before:
|
344
|
+
```
|
345
|
+
Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
|
346
|
+
Time.new(2017, 9, 16, 17, 0).prev_year(1)
|
347
|
+
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
327
348
|
|
328
|
-
|
349
|
+
Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
|
350
|
+
Time.new(2017, 9, 16, 17, 0).next_year(1)
|
351
|
+
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
352
|
+
```
|
329
353
|
|
330
|
-
|
331
|
-
|
332
|
-
|
354
|
+
After:
|
355
|
+
```
|
356
|
+
Time.new(2017, 9, 16, 17, 0).prev_year # => 2016-09-16 17:00:00 +0300
|
357
|
+
Time.new(2017, 9, 16, 17, 0).prev_year(1) # => 2016-09-16 17:00:00 +0300
|
333
358
|
|
334
|
-
|
359
|
+
Time.new(2017, 9, 16, 17, 0).next_year # => 2018-09-16 17:00:00 +0300
|
360
|
+
Time.new(2017, 9, 16, 17, 0).next_year(1) # => 2018-09-16 17:00:00 +0300
|
361
|
+
```
|
335
362
|
|
336
|
-
*
|
337
|
-
with per-second precision, not anything deeper than that.
|
363
|
+
*bogdanvlviv*
|
338
364
|
|
339
|
-
|
365
|
+
* Add same method signature for `Time#prev_month` and `Time#next_month`
|
366
|
+
in accordance with `Date#prev_month`, `Date#next_month`.
|
340
367
|
|
341
|
-
|
368
|
+
Allows pass argument for `Time#prev_month` and `Time#next_month`.
|
342
369
|
|
343
|
-
|
370
|
+
Before:
|
371
|
+
```
|
372
|
+
Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
|
373
|
+
Time.new(2017, 9, 16, 17, 0).prev_month(1)
|
374
|
+
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
344
375
|
|
345
|
-
|
376
|
+
Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
|
377
|
+
Time.new(2017, 9, 16, 17, 0).next_month(1)
|
378
|
+
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
379
|
+
```
|
346
380
|
|
347
|
-
|
381
|
+
After:
|
382
|
+
```
|
383
|
+
Time.new(2017, 9, 16, 17, 0).prev_month # => 2017-08-16 17:00:00 +0300
|
384
|
+
Time.new(2017, 9, 16, 17, 0).prev_month(1) # => 2017-08-16 17:00:00 +0300
|
348
385
|
|
349
|
-
|
386
|
+
Time.new(2017, 9, 16, 17, 0).next_month # => 2017-10-16 17:00:00 +0300
|
387
|
+
Time.new(2017, 9, 16, 17, 0).next_month(1) # => 2017-10-16 17:00:00 +0300
|
388
|
+
```
|
350
389
|
|
351
|
-
*
|
352
|
-
explicit receiver in not passed.
|
390
|
+
*bogdanvlviv*
|
353
391
|
|
354
|
-
|
392
|
+
* Add same method signature for `Time#prev_day` and `Time#next_day`
|
393
|
+
in accordance with `Date#prev_day`, `Date#next_day`.
|
355
394
|
|
356
|
-
|
357
|
-
`active_support/core_ext/object/json` without requiring `active_support/json`.
|
395
|
+
Allows pass argument for `Time#prev_day` and `Time#next_day`.
|
358
396
|
|
359
|
-
|
397
|
+
Before:
|
398
|
+
```
|
399
|
+
Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
|
400
|
+
Time.new(2017, 9, 16, 17, 0).prev_day(1)
|
401
|
+
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
360
402
|
|
361
|
-
|
403
|
+
Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
|
404
|
+
Time.new(2017, 9, 16, 17, 0).next_day(1)
|
405
|
+
# => ArgumentError: wrong number of arguments (given 1, expected 0)
|
406
|
+
```
|
362
407
|
|
363
|
-
|
408
|
+
After:
|
409
|
+
```
|
410
|
+
Time.new(2017, 9, 16, 17, 0).prev_day # => 2017-09-15 17:00:00 +0300
|
411
|
+
Time.new(2017, 9, 16, 17, 0).prev_day(1) # => 2017-09-15 17:00:00 +0300
|
364
412
|
|
365
|
-
|
413
|
+
Time.new(2017, 9, 16, 17, 0).next_day # => 2017-09-17 17:00:00 +0300
|
414
|
+
Time.new(2017, 9, 16, 17, 0).next_day(1) # => 2017-09-17 17:00:00 +0300
|
415
|
+
```
|
366
416
|
|
367
|
-
*
|
417
|
+
*bogdanvlviv*
|
368
418
|
|
369
|
-
|
419
|
+
* `IO#to_json` now returns the `to_s` representation, rather than
|
420
|
+
attempting to convert to an array. This fixes a bug where `IO#to_json`
|
421
|
+
would raise an `IOError` when called on an unreadable object.
|
370
422
|
|
371
|
-
|
423
|
+
Fixes #26132.
|
372
424
|
|
373
|
-
|
374
|
-
To avoid problems we are deprecating them.
|
425
|
+
*Paul Kuruvilla*
|
375
426
|
|
376
|
-
|
427
|
+
* Remove deprecated `halt_callback_chains_on_return_false` option.
|
377
428
|
|
378
|
-
*
|
379
|
-
rounding to `.0`.
|
429
|
+
*Rafael Mendonça França*
|
380
430
|
|
381
|
-
|
431
|
+
* Remove deprecated `:if` and `:unless` string filter for callbacks.
|
382
432
|
|
383
|
-
*
|
433
|
+
*Rafael Mendonça França*
|
384
434
|
|
385
|
-
*
|
386
|
-
hash must change, but the keys are left the same.
|
435
|
+
* `Hash#slice` now falls back to Ruby 2.5+'s built-in definition if defined.
|
387
436
|
|
388
|
-
*
|
437
|
+
*Akira Matsuda*
|
389
438
|
|
390
|
-
*
|
439
|
+
* Deprecate `secrets.secret_token`.
|
391
440
|
|
392
|
-
|
393
|
-
|
441
|
+
The architecture for secrets had a big upgrade between Rails 3 and Rails 4,
|
442
|
+
when the default changed from using `secret_token` to `secret_key_base`.
|
394
443
|
|
395
|
-
|
444
|
+
`secret_token` has been soft deprecated in documentation for four years
|
445
|
+
but is still in place to support apps created before Rails 4.
|
446
|
+
Deprecation warnings have been added to help developers upgrade their
|
447
|
+
applications to `secret_key_base`.
|
396
448
|
|
397
|
-
*
|
398
|
-
whether a word is uncountable or not.
|
449
|
+
*claudiob*, *Kasper Timm Hansen*
|
399
450
|
|
400
|
-
|
451
|
+
* Return an instance of `HashWithIndifferentAccess` from `HashWithIndifferentAccess#transform_keys`.
|
401
452
|
|
402
|
-
*
|
453
|
+
*Yuji Yaginuma*
|
403
454
|
|
404
|
-
|
455
|
+
* Add key rotation support to `MessageEncryptor` and `MessageVerifier`.
|
405
456
|
|
406
|
-
|
457
|
+
This change introduces a `rotate` method to both the `MessageEncryptor` and
|
458
|
+
`MessageVerifier` classes. This method accepts the same arguments and
|
459
|
+
options as the given classes' constructor. The `encrypt_and_verify` method
|
460
|
+
for `MessageEncryptor` and the `verified` method for `MessageVerifier` also
|
461
|
+
accept an optional keyword argument `:on_rotation` block which is called
|
462
|
+
when a rotated instance is used to decrypt or verify the message.
|
407
463
|
|
408
|
-
*
|
464
|
+
*Michael J Coyne*
|
409
465
|
|
410
|
-
*
|
411
|
-
when working with objects with a nanosecond component.
|
466
|
+
* Deprecate `Module#reachable?` method.
|
412
467
|
|
413
|
-
|
414
|
-
using `Time#-`:
|
468
|
+
*bogdanvlviv*
|
415
469
|
|
416
|
-
|
470
|
+
* Add `config/credentials.yml.enc` to store production app secrets.
|
417
471
|
|
418
|
-
|
472
|
+
Allows saving any authentication credentials for third party services
|
473
|
+
directly in repo encrypted with `config/master.key` or `ENV["RAILS_MASTER_KEY"]`.
|
419
474
|
|
420
|
-
|
421
|
-
|
475
|
+
This will eventually replace `Rails.application.secrets` and the encrypted
|
476
|
+
secrets introduced in Rails 5.1.
|
422
477
|
|
423
|
-
|
478
|
+
*DHH*, *Kasper Timm Hansen*
|
424
479
|
|
425
|
-
|
426
|
-
# => 86399.999999999
|
480
|
+
* Add `ActiveSupport::EncryptedFile` and `ActiveSupport::EncryptedConfiguration`.
|
427
481
|
|
428
|
-
|
482
|
+
Allows for stashing encrypted files or configuration directly in repo by
|
483
|
+
encrypting it with a key.
|
429
484
|
|
430
|
-
|
485
|
+
Backs the new credentials setup above, but can also be used independently.
|
431
486
|
|
432
|
-
|
487
|
+
*DHH*, *Kasper Timm Hansen*
|
433
488
|
|
434
|
-
|
435
|
-
|
489
|
+
* `Module#delegate_missing_to` now raises `DelegationError` if target is nil,
|
490
|
+
similar to `Module#delegate`.
|
436
491
|
|
437
|
-
|
492
|
+
*Anton Khamets*
|
438
493
|
|
439
|
-
|
440
|
-
# => "333.33"
|
494
|
+
* Update `String#camelize` to provide feedback when wrong option is passed.
|
441
495
|
|
442
|
-
|
496
|
+
`String#camelize` was returning nil without any feedback when an
|
497
|
+
invalid option was passed as a parameter.
|
443
498
|
|
444
|
-
|
499
|
+
Previously:
|
445
500
|
|
446
|
-
|
501
|
+
'one_two'.camelize(true)
|
502
|
+
# => nil
|
447
503
|
|
448
|
-
|
504
|
+
Now:
|
449
505
|
|
450
|
-
|
451
|
-
|
452
|
-
5.since => 5.seconds.since
|
453
|
-
5.from_now => 5.seconds.from_now
|
506
|
+
'one_two'.camelize(true)
|
507
|
+
# => ArgumentError: Invalid option, use either :upper or :lower.
|
454
508
|
|
455
|
-
|
509
|
+
*Ricardo Díaz*
|
456
510
|
|
457
|
-
|
511
|
+
* Fix modulo operations involving durations.
|
458
512
|
|
459
|
-
|
513
|
+
Rails 5.1 introduced `ActiveSupport::Duration::Scalar` as a wrapper
|
514
|
+
around numeric values as a way of ensuring a duration was the outcome of
|
515
|
+
an expression. However, the implementation was missing support for modulo
|
516
|
+
operations. This support has now been added and should result in a duration
|
517
|
+
being returned from expressions involving modulo operations.
|
460
518
|
|
461
|
-
|
519
|
+
Prior to Rails 5.1:
|
462
520
|
|
463
|
-
|
521
|
+
5.minutes % 2.minutes
|
522
|
+
# => 60
|
464
523
|
|
465
|
-
|
524
|
+
Now:
|
466
525
|
|
467
|
-
|
526
|
+
5.minutes % 2.minutes
|
527
|
+
# => 1 minute
|
468
528
|
|
469
|
-
Fixes #
|
529
|
+
Fixes #29603 and #29743.
|
470
530
|
|
471
|
-
*
|
531
|
+
*Sayan Chakraborty*, *Andrew White*
|
472
532
|
|
473
|
-
*
|
474
|
-
in nested arrays. This change also applies to `Hash#deep_stringify_keys`,
|
475
|
-
`Hash#deep_stringify_keys!`, `Hash#deep_symbolize_keys` and
|
476
|
-
`Hash#deep_symbolize_keys!`.
|
533
|
+
* Fix division where a duration is the denominator.
|
477
534
|
|
478
|
-
|
535
|
+
PR #29163 introduced a change in behavior when a duration was the denominator
|
536
|
+
in a calculation - this was incorrect as dividing by a duration should always
|
537
|
+
return a `Numeric`. The behavior of previous versions of Rails has been restored.
|
479
538
|
|
480
|
-
|
539
|
+
Fixes #29592.
|
481
540
|
|
482
|
-
|
541
|
+
*Andrew White*
|
483
542
|
|
484
|
-
|
543
|
+
* Add purpose and expiry support to `ActiveSupport::MessageVerifier` and
|
544
|
+
`ActiveSupport::MessageEncryptor`.
|
485
545
|
|
486
|
-
|
487
|
-
when a subscriber method is redefined.
|
546
|
+
For instance, to ensure a message is only usable for one intended purpose:
|
488
547
|
|
489
|
-
|
548
|
+
token = @verifier.generate("x", purpose: :shipping)
|
490
549
|
|
491
|
-
|
550
|
+
@verifier.verified(token, purpose: :shipping) # => "x"
|
551
|
+
@verifier.verified(token) # => nil
|
492
552
|
|
493
|
-
|
553
|
+
Or make it expire after a set time:
|
494
554
|
|
495
|
-
|
496
|
-
|
497
|
-
convert a value that is an `ActiveSupport::SafeBuffer` introduced
|
498
|
-
in 2da9d67.
|
555
|
+
@verifier.generate("x", expires_in: 1.month)
|
556
|
+
@verifier.generate("y", expires_at: Time.now.end_of_year)
|
499
557
|
|
500
|
-
|
558
|
+
Showcased with `ActiveSupport::MessageVerifier`, but works the same for
|
559
|
+
`ActiveSupport::MessageEncryptor`'s `encrypt_and_sign` and `decrypt_and_verify`.
|
501
560
|
|
502
|
-
|
561
|
+
Pull requests: #29599, #29854
|
503
562
|
|
504
|
-
*
|
505
|
-
components are specified. This is more consistent with the behavior of
|
506
|
-
`Time#parse`.
|
563
|
+
*Assain Jaleel*
|
507
564
|
|
508
|
-
|
565
|
+
* Make the order of `Hash#reverse_merge!` consistent with `HashWithIndifferentAccess`.
|
509
566
|
|
510
|
-
*
|
567
|
+
*Erol Fornoles*
|
511
568
|
|
512
|
-
|
569
|
+
* Add `freeze_time` helper which freezes time to `Time.now` in tests.
|
513
570
|
|
514
|
-
|
571
|
+
*Prathamesh Sonpatki*
|
515
572
|
|
516
|
-
|
573
|
+
* Default `ActiveSupport::MessageEncryptor` to use AES 256 GCM encryption.
|
574
|
+
|
575
|
+
On for new Rails 5.2 apps. Upgrading apps can find the config as a new
|
576
|
+
framework default.
|
577
|
+
|
578
|
+
*Assain Jaleel*
|
579
|
+
|
580
|
+
* Cache: `write_multi`.
|
581
|
+
|
582
|
+
Rails.cache.write_multi foo: 'bar', baz: 'qux'
|
583
|
+
|
584
|
+
Plus faster fetch_multi with stores that implement `write_multi_entries`.
|
585
|
+
Keys that aren't found may be written to the cache store in one shot
|
586
|
+
instead of separate writes.
|
517
587
|
|
518
|
-
|
588
|
+
The default implementation simply calls `write_entry` for each entry.
|
589
|
+
Stores may override if they're capable of one-shot bulk writes, like
|
590
|
+
Redis `MSET`.
|
519
591
|
|
520
|
-
*
|
592
|
+
*Jeremy Daer*
|
521
593
|
|
522
|
-
*
|
594
|
+
* Add default option to module and class attribute accessors.
|
523
595
|
|
524
|
-
|
596
|
+
mattr_accessor :settings, default: {}
|
525
597
|
|
526
|
-
|
527
|
-
|
598
|
+
Works for `mattr_reader`, `mattr_writer`, `cattr_accessor`, `cattr_reader`,
|
599
|
+
and `cattr_writer` as well.
|
528
600
|
|
529
|
-
|
601
|
+
*Genadi Samokovarov*
|
530
602
|
|
531
|
-
|
603
|
+
* Add `Date#prev_occurring` and `Date#next_occurring` to return specified next/previous occurring day of week.
|
532
604
|
|
533
|
-
*
|
534
|
-
UUID fixtures on PostgreSQL.
|
605
|
+
*Shota Iguchi*
|
535
606
|
|
536
|
-
|
607
|
+
* Add default option to `class_attribute`.
|
537
608
|
|
538
|
-
|
539
|
-
|
609
|
+
Before:
|
610
|
+
|
611
|
+
class_attribute :settings
|
612
|
+
self.settings = {}
|
540
613
|
|
541
|
-
|
614
|
+
Now:
|
542
615
|
|
543
|
-
|
616
|
+
class_attribute :settings, default: {}
|
544
617
|
|
545
|
-
|
546
|
-
This requirement makes `ActiveSupport::Duration`'s behavior consistent with
|
547
|
-
the behavior of Ruby's numeric types:
|
618
|
+
*DHH*
|
548
619
|
|
549
|
-
|
550
|
-
1.0.eql?(1) # => false
|
620
|
+
* `#singularize` and `#pluralize` now respect uncountables for the specified locale.
|
551
621
|
|
552
|
-
|
553
|
-
1.eql?(1.second) # => false
|
622
|
+
*Eilis Hamilton*
|
554
623
|
|
555
|
-
|
556
|
-
|
624
|
+
* Add `ActiveSupport::CurrentAttributes` to provide a thread-isolated attributes singleton.
|
625
|
+
Primary use case is keeping all the per-request attributes easily available to the whole system.
|
557
626
|
|
558
|
-
|
559
|
-
# now => { 1 => "foo", 1.second => "bar" }
|
560
|
-
# was => { 1 => "bar" }
|
627
|
+
*DHH*
|
561
628
|
|
562
|
-
|
629
|
+
* Fix implicit coercion calculations with scalars and durations.
|
563
630
|
|
564
|
-
|
565
|
-
|
631
|
+
Previously, calculations where the scalar is first would be converted to a duration
|
632
|
+
of seconds, but this causes issues with dates being converted to times, e.g:
|
566
633
|
|
567
|
-
|
568
|
-
|
634
|
+
Time.zone = "Beijing" # => Asia/Shanghai
|
635
|
+
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
|
636
|
+
2 * 1.day # => 172800 seconds
|
637
|
+
date + 2 * 1.day # => Mon, 22 May 2017 00:00:00 CST +08:00
|
569
638
|
|
570
|
-
|
639
|
+
Now, the `ActiveSupport::Duration::Scalar` calculation methods will try to maintain
|
640
|
+
the part structure of the duration where possible, e.g:
|
571
641
|
|
572
|
-
|
573
|
-
|
574
|
-
|
642
|
+
Time.zone = "Beijing" # => Asia/Shanghai
|
643
|
+
date = Date.civil(2017, 5, 20) # => Mon, 20 May 2017
|
644
|
+
2 * 1.day # => 2 days
|
645
|
+
date + 2 * 1.day # => Mon, 22 May 2017
|
575
646
|
|
576
|
-
|
647
|
+
Fixes #29160, #28970.
|
577
648
|
|
578
|
-
*
|
579
|
-
receives. In particular, `.new`, `#update`, `#merge`, and `#replace` accept
|
580
|
-
objects which respond to `#to_hash`, even if those objects are not hashes
|
581
|
-
directly.
|
649
|
+
*Andrew White*
|
582
650
|
|
583
|
-
|
651
|
+
* Add support for versioned cache entries. This enables the cache stores to recycle cache keys, greatly saving
|
652
|
+
on storage in cases with frequent churn. Works together with the separation of `#cache_key` and `#cache_version`
|
653
|
+
in Active Record and its use in Action Pack's fragment caching.
|
584
654
|
|
585
|
-
*
|
655
|
+
*DHH*
|
586
656
|
|
587
|
-
|
657
|
+
* Pass gem name and deprecation horizon to deprecation notifications.
|
588
658
|
|
589
|
-
*
|
590
|
-
`#as_json`.
|
659
|
+
*Willem van Bergen*
|
591
660
|
|
592
|
-
|
661
|
+
* Add support for `:offset` and `:zone` to `ActiveSupport::TimeWithZone#change`.
|
593
662
|
|
594
|
-
*
|
595
|
-
array. This makes it consistent with the output of `read_multi`.
|
663
|
+
*Andrew White*
|
596
664
|
|
597
|
-
|
665
|
+
* Add support for `:offset` to `Time#change`.
|
598
666
|
|
599
|
-
|
600
|
-
`module ClassMethods`. Add `Kernel#concern` to define at the toplevel
|
601
|
-
without chunky `module Foo; extend ActiveSupport::Concern` boilerplate.
|
667
|
+
Fixes #28723.
|
602
668
|
|
603
|
-
|
604
|
-
concern :Authentication do
|
605
|
-
included do
|
606
|
-
after_create :generate_private_key
|
607
|
-
end
|
669
|
+
*Andrew White*
|
608
670
|
|
609
|
-
|
610
|
-
def authenticate(credentials)
|
611
|
-
# ...
|
612
|
-
end
|
613
|
-
end
|
671
|
+
* Add `fetch_values` for `HashWithIndifferentAccess`.
|
614
672
|
|
615
|
-
|
616
|
-
# ...
|
617
|
-
end
|
618
|
-
end
|
673
|
+
The method was originally added to `Hash` in Ruby 2.3.0.
|
619
674
|
|
620
|
-
|
621
|
-
class User < ActiveRecord::Base
|
622
|
-
include Authentication
|
623
|
-
end
|
675
|
+
*Josh Pencheon*
|
624
676
|
|
625
|
-
*Jeremy Kemper*
|
626
677
|
|
627
|
-
Please check [
|
678
|
+
Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activesupport/CHANGELOG.md) for previous changes.
|