activesupport 6.0.3.7 → 6.1.0.rc1
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 +4 -4
- data/CHANGELOG.md +338 -488
- data/MIT-LICENSE +1 -1
- data/lib/active_support.rb +13 -1
- data/lib/active_support/array_inquirer.rb +4 -2
- data/lib/active_support/backtrace_cleaner.rb +3 -3
- data/lib/active_support/benchmarkable.rb +1 -1
- data/lib/active_support/cache.rb +80 -39
- data/lib/active_support/cache/file_store.rb +4 -3
- data/lib/active_support/cache/mem_cache_store.rb +21 -14
- data/lib/active_support/cache/memory_store.rb +38 -26
- data/lib/active_support/cache/redis_cache_store.rb +27 -27
- data/lib/active_support/cache/strategy/local_cache.rb +14 -5
- data/lib/active_support/callbacks.rb +65 -56
- data/lib/active_support/concern.rb +46 -2
- data/lib/active_support/configurable.rb +3 -3
- data/lib/active_support/configuration_file.rb +46 -0
- data/lib/active_support/core_ext/benchmark.rb +2 -2
- data/lib/active_support/core_ext/class/attribute.rb +34 -44
- data/lib/active_support/core_ext/class/subclasses.rb +17 -38
- data/lib/active_support/core_ext/date/conversions.rb +2 -1
- data/lib/active_support/core_ext/date_and_time/calculations.rb +13 -0
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +15 -0
- data/lib/active_support/core_ext/enumerable.rb +76 -4
- data/lib/active_support/core_ext/hash/conversions.rb +2 -2
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +1 -1
- data/lib/active_support/core_ext/hash/except.rb +1 -1
- data/lib/active_support/core_ext/hash/keys.rb +1 -1
- data/lib/active_support/core_ext/hash/slice.rb +3 -2
- data/lib/active_support/core_ext/load_error.rb +1 -1
- data/lib/active_support/core_ext/marshal.rb +2 -0
- data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
- data/lib/active_support/core_ext/module/attribute_accessors.rb +23 -29
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +8 -4
- data/lib/active_support/core_ext/module/concerning.rb +8 -2
- data/lib/active_support/core_ext/module/delegation.rb +38 -28
- data/lib/active_support/core_ext/module/introspection.rb +1 -25
- data/lib/active_support/core_ext/name_error.rb +29 -2
- data/lib/active_support/core_ext/numeric/conversions.rb +22 -18
- data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
- data/lib/active_support/core_ext/object/json.rb +6 -2
- data/lib/active_support/core_ext/object/try.rb +2 -2
- data/lib/active_support/core_ext/range/compare_range.rb +9 -3
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +8 -3
- data/lib/active_support/core_ext/string/access.rb +5 -24
- data/lib/active_support/core_ext/string/inflections.rb +38 -4
- data/lib/active_support/core_ext/string/inquiry.rb +1 -0
- data/lib/active_support/core_ext/string/multibyte.rb +2 -2
- data/lib/active_support/core_ext/string/output_safety.rb +2 -3
- data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -2
- data/lib/active_support/core_ext/symbol.rb +3 -0
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +14 -0
- data/lib/active_support/core_ext/time/calculations.rb +19 -1
- data/lib/active_support/core_ext/time/conversions.rb +1 -0
- data/lib/active_support/core_ext/uri.rb +5 -1
- data/lib/active_support/current_attributes.rb +7 -2
- data/lib/active_support/current_attributes/test_helper.rb +13 -0
- data/lib/active_support/dependencies.rb +37 -18
- data/lib/active_support/deprecation.rb +6 -1
- data/lib/active_support/deprecation/behaviors.rb +15 -2
- data/lib/active_support/deprecation/disallowed.rb +56 -0
- data/lib/active_support/deprecation/instance_delegator.rb +0 -1
- data/lib/active_support/deprecation/method_wrappers.rb +3 -2
- data/lib/active_support/deprecation/proxy_wrappers.rb +3 -3
- data/lib/active_support/deprecation/reporting.rb +50 -7
- data/lib/active_support/descendants_tracker.rb +6 -2
- data/lib/active_support/duration.rb +71 -22
- data/lib/active_support/duration/iso8601_serializer.rb +15 -9
- data/lib/active_support/encrypted_file.rb +19 -2
- data/lib/active_support/environment_inquirer.rb +20 -0
- data/lib/active_support/evented_file_update_checker.rb +69 -133
- data/lib/active_support/fork_tracker.rb +58 -0
- data/lib/active_support/gem_version.rb +3 -3
- data/lib/active_support/hash_with_indifferent_access.rb +35 -22
- data/lib/active_support/i18n_railtie.rb +14 -19
- data/lib/active_support/inflector/inflections.rb +1 -2
- data/lib/active_support/inflector/methods.rb +35 -31
- data/lib/active_support/inflector/transliterate.rb +4 -4
- data/lib/active_support/json/decoding.rb +4 -4
- data/lib/active_support/json/encoding.rb +5 -1
- data/lib/active_support/key_generator.rb +1 -1
- data/lib/active_support/locale/en.yml +7 -3
- data/lib/active_support/log_subscriber.rb +8 -0
- data/lib/active_support/logger.rb +1 -1
- data/lib/active_support/logger_silence.rb +2 -26
- data/lib/active_support/logger_thread_safe_level.rb +34 -12
- data/lib/active_support/message_encryptor.rb +4 -7
- data/lib/active_support/message_verifier.rb +5 -5
- data/lib/active_support/messages/metadata.rb +9 -1
- data/lib/active_support/messages/rotation_configuration.rb +2 -1
- data/lib/active_support/messages/rotator.rb +6 -5
- data/lib/active_support/multibyte/chars.rb +4 -42
- data/lib/active_support/multibyte/unicode.rb +9 -83
- data/lib/active_support/notifications.rb +31 -4
- data/lib/active_support/notifications/fanout.rb +23 -8
- data/lib/active_support/notifications/instrumenter.rb +6 -15
- data/lib/active_support/number_helper.rb +29 -14
- data/lib/active_support/number_helper/number_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_currency_converter.rb +3 -7
- data/lib/active_support/number_helper/number_to_human_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +3 -3
- data/lib/active_support/number_helper/rounding_helper.rb +12 -28
- data/lib/active_support/option_merger.rb +3 -2
- data/lib/active_support/ordered_options.rb +8 -2
- data/lib/active_support/parameter_filter.rb +15 -10
- data/lib/active_support/per_thread_registry.rb +1 -1
- data/lib/active_support/rails.rb +1 -4
- data/lib/active_support/railtie.rb +23 -1
- data/lib/active_support/secure_compare_rotator.rb +51 -0
- data/lib/active_support/security_utils.rb +19 -12
- data/lib/active_support/string_inquirer.rb +4 -2
- data/lib/active_support/subscriber.rb +12 -7
- data/lib/active_support/tagged_logging.rb +29 -4
- data/lib/active_support/testing/assertions.rb +18 -11
- data/lib/active_support/testing/parallelization.rb +12 -95
- data/lib/active_support/testing/parallelization/server.rb +78 -0
- data/lib/active_support/testing/parallelization/worker.rb +100 -0
- data/lib/active_support/testing/time_helpers.rb +40 -3
- data/lib/active_support/time_with_zone.rb +66 -42
- data/lib/active_support/values/time_zone.rb +20 -10
- data/lib/active_support/xml_mini/rexml.rb +8 -1
- metadata +39 -41
- data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -5
- data/lib/active_support/core_ext/hash/compact.rb +0 -5
- data/lib/active_support/core_ext/hash/transform_values.rb +0 -5
- data/lib/active_support/core_ext/module/reachable.rb +0 -6
- data/lib/active_support/core_ext/numeric/inquiry.rb +0 -5
- data/lib/active_support/core_ext/range/include_range.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e3b1535797c76aeec9ce935c778ef87ef0607bf156916734c1b9ad789f4666d
|
4
|
+
data.tar.gz: aaa132d9325b4dcefabe7e4b379a8709cc7cfcdbca7e0a663b63d75e213353c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 400e5ad4e88a2c8a82c1514b5c5ac9c30edd0e4fed6b22348ec11ab408db5478dad0dfdc1711e3f70b1a98343071583de1d4ad98cdce1bd7860008c229676d8a
|
7
|
+
data.tar.gz: 2481dadc58812a57876a1d2ed559adeaaba012d144a8e2f7f3076cb51ad7ec2da63224f334d7fdfac8e3dd00fab2c6b8bff8f25efd3622f67a6bcb2f9cd9c674
|
data/CHANGELOG.md
CHANGED
@@ -1,696 +1,546 @@
|
|
1
|
-
## Rails 6.0.
|
1
|
+
## Rails 6.1.0.rc1 (November 02, 2020) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Calling `iso8601` on negative durations retains the negative sign on individual
|
4
|
+
digits instead of prepending it.
|
4
5
|
|
6
|
+
This change is required so we can interoperate with PostgreSQL, which prefers
|
7
|
+
negative signs for each component.
|
5
8
|
|
6
|
-
|
9
|
+
Compatibility with other iso8601 parsers which support leading negatives as well
|
10
|
+
as negatives per component is still retained.
|
7
11
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
## Rails 6.0.3.5 (February 10, 2021) ##
|
12
|
-
|
13
|
-
* No changes.
|
14
|
-
|
15
|
-
|
16
|
-
## Rails 6.0.3.4 (October 07, 2020) ##
|
17
|
-
|
18
|
-
* No changes.
|
19
|
-
|
20
|
-
|
21
|
-
## Rails 6.0.3.3 (September 09, 2020) ##
|
12
|
+
Before:
|
22
13
|
|
23
|
-
|
14
|
+
(-1.year - 1.day).iso8601
|
15
|
+
# => "-P1Y1D"
|
24
16
|
|
17
|
+
After:
|
25
18
|
|
26
|
-
|
19
|
+
(-1.year - 1.day).iso8601
|
20
|
+
# => "P-1Y-1D"
|
27
21
|
|
28
|
-
*
|
22
|
+
*Vipul A M*
|
29
23
|
|
24
|
+
* Remove deprecated `ActiveSupport::Notifications::Instrumenter#end=`.
|
30
25
|
|
31
|
-
|
26
|
+
*Rafael Mendonça França*
|
32
27
|
|
33
|
-
*
|
28
|
+
* Deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
|
34
29
|
|
35
|
-
*
|
30
|
+
*Rafael Mendonça França*
|
36
31
|
|
37
|
-
|
32
|
+
* Remove deprecated `ActiveSupport::Multibyte::Unicode.pack_graphemes`,
|
33
|
+
`ActiveSupport::Multibyte::Unicode.unpack_graphemes`,
|
34
|
+
`ActiveSupport::Multibyte::Unicode.normalize`,
|
35
|
+
`ActiveSupport::Multibyte::Unicode.downcase`,
|
36
|
+
`ActiveSupport::Multibyte::Unicode.upcase` and `ActiveSupport::Multibyte::Unicode.swapcase`.
|
38
37
|
|
39
|
-
*
|
38
|
+
*Rafael Mendonça França*
|
40
39
|
|
41
|
-
|
40
|
+
* Remove deprecated `ActiveSupport::Multibyte::Chars#consumes?` and `ActiveSupport::Multibyte::Chars#normalize`.
|
42
41
|
|
43
|
-
|
44
|
-
# => true
|
42
|
+
*Rafael Mendonça França*
|
45
43
|
|
46
|
-
|
44
|
+
* Remove deprecated file `active_support/core_ext/range/include_range`.
|
47
45
|
|
48
|
-
|
49
|
-
# => false
|
46
|
+
*Rafael Mendonça França*
|
50
47
|
|
51
|
-
|
48
|
+
* Remove deprecated file `active_support/core_ext/hash/transform_values`.
|
52
49
|
|
53
|
-
*
|
54
|
-
`ActiveSupport.parse_json_times = true`.
|
50
|
+
*Rafael Mendonça França*
|
55
51
|
|
56
|
-
|
52
|
+
* Remove deprecated file `active_support/core_ext/hash/compact`.
|
57
53
|
|
54
|
+
*Rafael Mendonça França*
|
58
55
|
|
59
|
-
|
56
|
+
* Remove deprecated file `active_support/core_ext/array/prepend_and_append`.
|
60
57
|
|
61
|
-
*
|
58
|
+
*Rafael Mendonça França*
|
62
59
|
|
60
|
+
* Remove deprecated file `active_support/core_ext/numeric/inquiry`.
|
63
61
|
|
64
|
-
|
62
|
+
*Rafael Mendonça França*
|
65
63
|
|
66
|
-
*
|
64
|
+
* Remove deprecated file `active_support/core_ext/module/reachable`.
|
67
65
|
|
66
|
+
*Rafael Mendonça França*
|
68
67
|
|
69
|
-
|
68
|
+
* Remove deprecated `Module#parent_name`, `Module#parent` and `Module#parents`.
|
70
69
|
|
71
|
-
*
|
70
|
+
*Rafael Mendonça França*
|
72
71
|
|
73
|
-
|
72
|
+
* Remove deprecated `ActiveSupport::LoggerThreadSafeLevel#after_initialize`.
|
74
73
|
|
75
|
-
*
|
74
|
+
*Rafael Mendonça França*
|
76
75
|
|
77
|
-
|
76
|
+
* Remove deprecated `LoggerSilence` constant.
|
78
77
|
|
78
|
+
*Rafael Mendonça França*
|
79
79
|
|
80
|
-
|
80
|
+
* Remove deprecated fallback to `I18n.default_local` when `config.i18n.fallbacks` is empty.
|
81
81
|
|
82
|
-
*
|
82
|
+
*Rafael Mendonça França*
|
83
83
|
|
84
|
-
|
84
|
+
* Remove entries from local cache on `RedisCacheStore#delete_matched`
|
85
85
|
|
86
|
-
|
87
|
-
of clients reached" error.
|
86
|
+
Fixes #38627
|
88
87
|
|
89
|
-
*
|
88
|
+
*ojab*
|
90
89
|
|
91
|
-
*
|
92
|
-
|
90
|
+
* Speed up `ActiveSupport::SecurityUtils.fixed_length_secure_compare` by using
|
91
|
+
`OpenSSL.fixed_length_secure_compare`, if available.
|
93
92
|
|
94
|
-
*
|
93
|
+
*Nate Matykiewicz*
|
95
94
|
|
96
|
-
*
|
95
|
+
* `ActiveSupport::Cache::MemCacheStore` now checks `ENV["MEMCACHE_SERVERS"]` before falling back to `"localhost:11211"` if configured without any addresses.
|
97
96
|
|
98
97
|
```ruby
|
99
|
-
|
100
|
-
Rails.autoloaders.each do |autoloader|
|
101
|
-
autoloader.inflector.inflect(
|
102
|
-
"html_parser" => "HTMLParser",
|
103
|
-
"ssl_error" => "SSLError"
|
104
|
-
)
|
105
|
-
end
|
106
|
-
```
|
107
|
-
|
108
|
-
That way, you can tweak how individual basenames are inflected without touching Active Support inflection rules, which are global. These inflectors fallback to `String#camelize`, so existing inflection rules are still taken into account for non-overridden basenames.
|
109
|
-
|
110
|
-
Please, check the [autoloading guide for `zeitwerk` mode](https://guides.rubyonrails.org/v6.0/autoloading_and_reloading_constants.html#customizing-inflections) if you prefer not to depend on `String#camelize` at all.
|
111
|
-
|
112
|
-
*Xavier Noria*
|
113
|
-
|
114
|
-
* Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
|
115
|
-
and endless range targets.
|
116
|
-
|
117
|
-
*Allen Hsu*, *Andrew Hodgkinson*
|
118
|
-
|
119
|
-
* Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
|
98
|
+
config.cache_store = :mem_cache_store
|
120
99
|
|
121
|
-
|
100
|
+
# is now equivalent to
|
122
101
|
|
102
|
+
config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
|
123
103
|
|
124
|
-
|
104
|
+
# instead of
|
125
105
|
|
126
|
-
|
127
|
-
|
106
|
+
config.cache_store = :mem_cache_store, "localhost:11211" # ignores ENV["MEMCACHE_SERVERS"]
|
107
|
+
```
|
128
108
|
|
129
|
-
*
|
109
|
+
*Sam Bostock*
|
130
110
|
|
131
|
-
*
|
132
|
-
to
|
111
|
+
* `ActiveSupport::Subscriber#attach_to` now accepts an `inherit_all:` argument. When set to true,
|
112
|
+
it allows a subscriber to receive events for methods defined in the subscriber's ancestor class(es).
|
133
113
|
|
134
|
-
|
114
|
+
```ruby
|
115
|
+
class ActionControllerSubscriber < ActiveSupport::Subscriber
|
116
|
+
attach_to :action_controller
|
135
117
|
|
136
|
-
|
118
|
+
def start_processing(event)
|
119
|
+
info "Processing by #{event.payload[:controller]}##{event.payload[:action]} as #{format}"
|
120
|
+
end
|
137
121
|
|
138
|
-
|
139
|
-
|
122
|
+
def redirect_to(event)
|
123
|
+
info { "Redirected to #{event.payload[:location]}" }
|
124
|
+
end
|
125
|
+
end
|
140
126
|
|
141
|
-
|
127
|
+
# We detach ActionControllerSubscriber from the :action_controller namespace so that our CustomActionControllerSubscriber
|
128
|
+
# can provide its own instrumentation for certain events in the namespace
|
129
|
+
ActionControllerSubscriber.detach_from(:action_controller)
|
142
130
|
|
143
|
-
|
144
|
-
|
145
|
-
p "Main is debug? #{logger.debug?}"
|
131
|
+
class CustomActionControllerSubscriber < ActionControllerSubscriber
|
132
|
+
attach_to :action_controller, inherit_all: true
|
146
133
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
}.resume
|
134
|
+
def start_processing(event)
|
135
|
+
info "A custom response to start_processing events"
|
136
|
+
end
|
151
137
|
|
152
|
-
|
138
|
+
# => CustomActionControllerSubscriber will process events for "start_processing.action_controller" notifications
|
139
|
+
# using its own #start_processing implementation, while retaining ActionControllerSubscriber's instrumentation
|
140
|
+
# for "redirect_to.action_controller" notifications
|
141
|
+
end
|
142
|
+
```
|
153
143
|
|
154
|
-
|
144
|
+
*Adrianna Chang*
|
155
145
|
|
156
|
-
|
157
|
-
Thread is debug? true
|
158
|
-
Main is debug? true
|
146
|
+
* Allow the digest class used to generate non-sensitive digests to be configured with `config.active_support.hash_digest_class`.
|
159
147
|
|
160
|
-
|
148
|
+
`config.active_support.use_sha1_digests` is deprecated in favour of `config.active_support.hash_digest_class = ::Digest::SHA1`.
|
161
149
|
|
162
|
-
|
163
|
-
Thread is debug? true
|
164
|
-
Main is debug? false
|
150
|
+
*Dirkjan Bussink*
|
165
151
|
|
166
|
-
|
152
|
+
* Fix bug to make memcached write_entry expire correctly with unless_exist
|
167
153
|
|
168
|
-
*
|
169
|
-
`delegate_missing_to` extension. This avoids unintentionally adding instance
|
170
|
-
variables when calling `Marshal.dump(object)`, should the delegation target of
|
171
|
-
`object` be a method which would otherwise add them. Fixes #36522.
|
154
|
+
*Jye Lee*
|
172
155
|
|
173
|
-
|
156
|
+
* Add `ActiveSupport::Duration` conversion methods
|
174
157
|
|
158
|
+
`in_seconds`, `in_minutes`, `in_hours`, `in_days`, `in_weeks`, `in_months`, and `in_years` return the respective duration covered.
|
175
159
|
|
176
|
-
|
160
|
+
*Jason York*
|
177
161
|
|
178
|
-
*
|
179
|
-
|
180
|
-
consistently return an unfrozen string regardless. This behavior is consistent
|
181
|
-
with `gsub` and `strip`.
|
162
|
+
* Fixed issue in `ActiveSupport::Cache::RedisCacheStore` not passing options
|
163
|
+
to `read_multi` causing `fetch_multi` to not work properly
|
182
164
|
|
183
|
-
|
165
|
+
*Rajesh Sharma*
|
184
166
|
|
185
|
-
|
186
|
-
|
187
|
-
'foobar'.truncate(6).frozen?
|
188
|
-
# => false
|
167
|
+
* Fixed issue in `ActiveSupport::Cache::MemCacheStore` which caused duplicate compression,
|
168
|
+
and caused the provided `compression_threshold` to not be respected.
|
189
169
|
|
190
|
-
|
170
|
+
*Max Gurewitz*
|
191
171
|
|
192
|
-
|
193
|
-
|
194
|
-
'foobar'.truncate(6).frozen?
|
195
|
-
# => false
|
172
|
+
* Prevent `RedisCacheStore` and `MemCacheStore` from performing compression
|
173
|
+
when reading entries written with `raw: true`.
|
196
174
|
|
197
|
-
*
|
175
|
+
*Max Gurewitz*
|
198
176
|
|
177
|
+
* `URI.parser` is deprecated and will be removed in Rails 6.2. Use
|
178
|
+
`URI::DEFAULT_PARSER` instead.
|
199
179
|
|
200
|
-
|
180
|
+
*Jean Boussier*
|
201
181
|
|
202
|
-
*
|
182
|
+
* `require_dependency` has been documented to be _obsolete_ in `:zeitwerk`
|
183
|
+
mode. The method is not deprecated as such (yet), but applications are
|
184
|
+
encouraged to not use it.
|
203
185
|
|
204
|
-
|
205
|
-
|
206
|
-
|
186
|
+
In `:zeitwerk` mode, semantics match Ruby's and you do not need to be
|
187
|
+
defensive with load order. Just refer to classes and modules normally. If
|
188
|
+
the constant name is dynamic, camelize if needed, and constantize.
|
207
189
|
|
208
|
-
|
209
|
-
are found, a middleware raises an error. With actionable errors, you can
|
210
|
-
run the migrations right from the error page. Other examples include Rails
|
211
|
-
plugins that need to run a rake task to setup themselves. They can now
|
212
|
-
raise actionable errors to run the setup straight from the error pages.
|
190
|
+
*Xavier Noria*
|
213
191
|
|
214
|
-
|
192
|
+
* Add 3rd person aliases of `Symbol#start_with?` and `Symbol#end_with?`.
|
215
193
|
|
216
194
|
```ruby
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
action "Run pending migrations" do
|
221
|
-
ActiveRecord::Tasks::DatabaseTasks.migrate
|
222
|
-
end
|
223
|
-
end
|
195
|
+
:foo.starts_with?("f") # => true
|
196
|
+
:foo.ends_with?("o") # => true
|
224
197
|
```
|
225
198
|
|
226
|
-
|
227
|
-
module and invoke the `action` class macro to define the action. An action
|
228
|
-
needs a name and a procedure to execute. The name is shown as the name of a
|
229
|
-
button on the error pages. Once clicked, it will invoke the given
|
230
|
-
procedure.
|
199
|
+
*Ryuta Kamizono*
|
231
200
|
|
232
|
-
|
201
|
+
* Add override of unary plus for `ActiveSupport::Duration`.
|
233
202
|
|
234
|
-
|
203
|
+
`+ 1.second` is now identical to `+1.second` to prevent errors
|
204
|
+
where a seemingly innocent change of formatting leads to a change in the code behavior.
|
235
205
|
|
236
206
|
Before:
|
237
|
-
|
238
|
-
|
207
|
+
```ruby
|
208
|
+
+1.second.class
|
209
|
+
# => ActiveSupport::Duration
|
210
|
+
(+ 1.second).class
|
211
|
+
# => Integer
|
212
|
+
```
|
239
213
|
|
240
214
|
After:
|
215
|
+
```ruby
|
216
|
+
+1.second.class
|
217
|
+
# => ActiveSupport::Duration
|
218
|
+
(+ 1.second).class
|
219
|
+
# => ActiveSupport::Duration
|
220
|
+
```
|
241
221
|
|
242
|
-
|
243
|
-
|
244
|
-
*Ryo Nakamura*
|
245
|
-
|
246
|
-
* Calling test methods with `with_info_handler` method to allow minitest-hooks
|
247
|
-
plugin to work.
|
248
|
-
|
249
|
-
*Mauri Mustonen*
|
250
|
-
|
251
|
-
* The Zeitwerk compatibility interface for `ActiveSupport::Dependencies` no
|
252
|
-
longer implements `autoloaded_constants` or `autoloaded?` (undocumented,
|
253
|
-
anyway). Experience shows introspection does not have many use cases, and
|
254
|
-
troubleshooting is done by logging. With this design trade-off we are able
|
255
|
-
to use even less memory in all environments.
|
256
|
-
|
257
|
-
*Xavier Noria*
|
258
|
-
|
259
|
-
* Depends on Zeitwerk 2, which stores less metadata if reloading is disabled
|
260
|
-
and hence uses less memory when `config.cache_classes` is `true`, a standard
|
261
|
-
setup in production.
|
262
|
-
|
263
|
-
*Xavier Noria*
|
264
|
-
|
265
|
-
* In `:zeitwerk` mode, eager load directories in engines and applications only
|
266
|
-
if present in their respective `config.eager_load_paths`.
|
267
|
-
|
268
|
-
A common use case for this is adding `lib` to `config.autoload_paths`, but
|
269
|
-
not to `config.eager_load_paths`. In that configuration, for example, files
|
270
|
-
in the `lib` directory should not be eager loaded.
|
222
|
+
Fixes #39079.
|
271
223
|
|
272
|
-
*
|
224
|
+
*Roman Kushnir*
|
273
225
|
|
274
|
-
*
|
226
|
+
* Add subsec to `ActiveSupport::TimeWithZone#inspect`.
|
275
227
|
|
276
228
|
Before:
|
277
229
|
|
278
|
-
(
|
230
|
+
Time.at(1498099140).in_time_zone.inspect
|
231
|
+
# => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
|
232
|
+
Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
|
233
|
+
# => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
|
234
|
+
Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
|
235
|
+
# => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
|
279
236
|
|
280
237
|
After:
|
281
238
|
|
282
|
-
(
|
239
|
+
Time.at(1498099140).in_time_zone.inspect
|
240
|
+
# => "Thu, 22 Jun 2017 02:39:00.000000000 UTC +00:00"
|
241
|
+
Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
|
242
|
+
# => "Thu, 22 Jun 2017 02:39:00.123456780 UTC +00:00"
|
243
|
+
Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
|
244
|
+
# => "Thu, 22 Jun 2017 02:39:00.333333333 UTC +00:00"
|
283
245
|
|
284
|
-
|
246
|
+
*akinomaeni*
|
285
247
|
|
286
|
-
|
287
|
-
|
288
|
-
* Use weak references in descendants tracker to allow anonymous subclasses to
|
289
|
-
be garbage collected.
|
290
|
-
|
291
|
-
*Edgars Beigarts*
|
292
|
-
|
293
|
-
* Update `ActiveSupport::Notifications::Instrumenter#instrument` to make
|
294
|
-
passing a block optional. This will let users use
|
295
|
-
`ActiveSupport::Notifications` messaging features outside of
|
296
|
-
instrumentation.
|
297
|
-
|
298
|
-
*Ali Ibrahim*
|
299
|
-
|
300
|
-
* Fix `Time#advance` to work with dates before 1001-03-07
|
301
|
-
|
302
|
-
Before:
|
303
|
-
|
304
|
-
Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC
|
305
|
-
|
306
|
-
After
|
307
|
-
|
308
|
-
Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-06 00:00:00 UTC
|
309
|
-
|
310
|
-
Note that this doesn't affect `DateTime#advance` as that doesn't use a proleptic calendar.
|
311
|
-
|
312
|
-
*Andrew White*
|
313
|
-
|
314
|
-
* In Zeitwerk mode, engines are now managed by the `main` autoloader. Engines may reference application constants, if the application is reloaded and we do not reload engines, they won't use the reloaded application code.
|
315
|
-
|
316
|
-
*Xavier Noria*
|
248
|
+
* Calling `ActiveSupport::TaggedLogging#tagged` without a block now returns a tagged logger.
|
317
249
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
ActiveSupport::Inflector.transliterate("ü", locale: :de) # => "ue"
|
323
|
-
"Fünf autos".parameterize(locale: :de) # => "fuenf-autos"
|
324
|
-
ActiveSupport::Inflector.parameterize("Fünf autos", locale: :de) # => "fuenf-autos"
|
325
|
-
|
326
|
-
*Kaan Ozkan*, *Sharang Dashputre*
|
327
|
-
|
328
|
-
* Allow `Array#excluding` and `Enumerable#excluding` to deal with a passed array gracefully.
|
329
|
-
|
330
|
-
[ 1, 2, 3, 4, 5 ].excluding([4, 5]) # => [ 1, 2, 3 ]
|
331
|
-
|
332
|
-
*DHH*
|
333
|
-
|
334
|
-
* Renamed `Array#without` and `Enumerable#without` to `Array#excluding` and `Enumerable#excluding`, to create parity with
|
335
|
-
`Array#including` and `Enumerable#including`. Retained the old names as aliases.
|
336
|
-
|
337
|
-
*DHH*
|
338
|
-
|
339
|
-
* Added `Array#including` and `Enumerable#including` to conveniently enlarge a collection with more members using a method rather than an operator:
|
340
|
-
|
341
|
-
[ 1, 2, 3 ].including(4, 5) # => [ 1, 2, 3, 4, 5 ]
|
342
|
-
post.authors.including(Current.person) # => All the authors plus the current person!
|
343
|
-
|
344
|
-
*DHH*
|
345
|
-
|
346
|
-
|
347
|
-
## Rails 6.0.0.beta3 (March 11, 2019) ##
|
348
|
-
|
349
|
-
* No changes.
|
350
|
-
|
351
|
-
|
352
|
-
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
353
|
-
|
354
|
-
* New autoloading based on [Zeitwerk](https://github.com/fxn/zeitwerk).
|
355
|
-
|
356
|
-
*Xavier Noria*
|
357
|
-
|
358
|
-
* Revise `ActiveSupport::Notifications.unsubscribe` to correctly handle Regex or other multiple-pattern subscribers.
|
359
|
-
|
360
|
-
*Zach Kemp*
|
361
|
-
|
362
|
-
* Add `before_reset` callback to `CurrentAttributes` and define `after_reset` as an alias of `resets` for symmetry.
|
363
|
-
|
364
|
-
*Rosa Gutierrez*
|
365
|
-
|
366
|
-
* Remove the `` Kernel#` `` override that suppresses ENOENT and accidentally returns nil on Unix systems.
|
367
|
-
|
368
|
-
*Akinori Musha*
|
369
|
-
|
370
|
-
* Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
|
371
|
-
|
372
|
-
`assoc` can now be called with either a string or a symbol.
|
373
|
-
|
374
|
-
*Stefan Schüßler*
|
375
|
-
|
376
|
-
* Add `Hash#deep_transform_values`, and `Hash#deep_transform_values!`.
|
377
|
-
|
378
|
-
*Guillermo Iguaran*
|
379
|
-
|
380
|
-
|
381
|
-
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
250
|
+
```ruby
|
251
|
+
logger.tagged("BCX").info("Funky time!") # => [BCX] Funky time!
|
252
|
+
```
|
382
253
|
|
383
|
-
*
|
254
|
+
*Eugene Kenny*
|
384
255
|
|
385
|
-
|
256
|
+
* Align `Range#cover?` extension behavior with Ruby behavior for backwards ranges.
|
386
257
|
|
387
|
-
|
258
|
+
`(1..10).cover?(5..3)` now returns `false`, as it does in plain Ruby.
|
388
259
|
|
389
|
-
|
260
|
+
Also update `#include?` and `#===` behavior to match.
|
390
261
|
|
391
|
-
*
|
262
|
+
*Michael Groeneman*
|
392
263
|
|
393
|
-
|
264
|
+
* Update to TZInfo v2.0.0.
|
394
265
|
|
395
|
-
|
266
|
+
This changes the output of `ActiveSupport::TimeZone.utc_to_local`, but
|
267
|
+
can be controlled with the
|
268
|
+
`ActiveSupport.utc_to_local_returns_utc_offset_times` config.
|
396
269
|
|
397
|
-
|
270
|
+
New Rails 6.1 apps have it enabled by default, existing apps can upgrade
|
271
|
+
via the config in config/initializers/new_framework_defaults_6_1.rb
|
398
272
|
|
399
|
-
|
273
|
+
See the `utc_to_local_returns_utc_offset_times` documentation for details.
|
400
274
|
|
401
|
-
*
|
275
|
+
*Phil Ross*, *Jared Beck*
|
402
276
|
|
403
|
-
|
277
|
+
* Add Date and Time `#yesterday?` and `#tomorrow?` alongside `#today?`.
|
404
278
|
|
405
|
-
|
406
|
-
would not act as alias for `#symbolize_keys`.
|
279
|
+
Aliased to `#prev_day?` and `#next_day?` to match the existing `#prev/next_day` methods.
|
407
280
|
|
408
|
-
*
|
281
|
+
*Jatin Dhankhar*
|
409
282
|
|
410
|
-
*
|
283
|
+
* Add `Enumerable#pick` to complement `ActiveRecord::Relation#pick`.
|
411
284
|
|
412
|
-
*
|
285
|
+
*Eugene Kenny*
|
413
286
|
|
414
|
-
*
|
415
|
-
in favor of `array.flatten.pack("U*")` and `string.scan(/\X/).map(&:codepoints)`, respectively.
|
287
|
+
* [Breaking change] `ActiveSupport::Callbacks#halted_callback_hook` now receive a 2nd argument:
|
416
288
|
|
417
|
-
|
289
|
+
`ActiveSupport::Callbacks#halted_callback_hook` now receive the name of the callback
|
290
|
+
being halted as second argument.
|
291
|
+
This change will allow you to differentiate which callbacks halted the chain
|
292
|
+
and act accordingly.
|
418
293
|
|
419
|
-
|
294
|
+
```ruby
|
295
|
+
class Book < ApplicationRecord
|
296
|
+
before_save { throw(:abort) }
|
297
|
+
before_create { throw(:abort) }
|
420
298
|
|
421
|
-
|
299
|
+
def halted_callback_hook(filter, callback_name)
|
300
|
+
Rails.logger.info("Book couldn't be #{callback_name}d")
|
301
|
+
end
|
422
302
|
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
time += 0.51.seconds
|
303
|
+
Book.create # => "Book couldn't be created"
|
304
|
+
book.save # => "Book couldn't be saved"
|
305
|
+
end
|
427
306
|
```
|
428
|
-
Will now correctly add 0.51 second and not 1 full second.
|
429
307
|
|
430
308
|
*Edouard Chin*
|
431
309
|
|
432
|
-
*
|
433
|
-
in favor of `String#unicode_normalize`
|
310
|
+
* Support `prepend` with `ActiveSupport::Concern`.
|
434
311
|
|
435
|
-
|
312
|
+
Allows a module with `extend ActiveSupport::Concern` to be prepended.
|
436
313
|
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
*Francesco Rodríguez*
|
441
|
-
|
442
|
-
* Add `ActiveSupport::ParameterFilter`.
|
443
|
-
|
444
|
-
*Yoshiyuki Kinjo*
|
445
|
-
|
446
|
-
* Rename `Module#parent`, `Module#parents`, and `Module#parent_name` to
|
447
|
-
`module_parent`, `module_parents`, and `module_parent_name`.
|
448
|
-
|
449
|
-
*Gannon McGibbon*
|
450
|
-
|
451
|
-
* Deprecate the use of `LoggerSilence` in favor of `ActiveSupport::LoggerSilence`
|
452
|
-
|
453
|
-
*Edouard Chin*
|
314
|
+
module Imposter
|
315
|
+
extend ActiveSupport::Concern
|
454
316
|
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
* Fix bug where `#without` for `ActiveSupport::HashWithIndifferentAccess` would fail
|
460
|
-
with symbol arguments
|
461
|
-
|
462
|
-
*Abraham Chan*
|
463
|
-
|
464
|
-
* Treat `#delete_prefix`, `#delete_suffix` and `#unicode_normalize` results as non-`html_safe`.
|
465
|
-
Ensure safety of arguments for `#insert`, `#[]=` and `#replace` calls on `html_safe` Strings.
|
466
|
-
|
467
|
-
*Janosch Müller*
|
468
|
-
|
469
|
-
* Changed `ActiveSupport::TaggedLogging.new` to return a new logger instance instead
|
470
|
-
of mutating the one received as parameter.
|
471
|
-
|
472
|
-
*Thierry Joyal*
|
473
|
-
|
474
|
-
* Define `unfreeze_time` as an alias of `travel_back` in `ActiveSupport::Testing::TimeHelpers`.
|
317
|
+
# Same as `included`, except only run when prepended.
|
318
|
+
prepended do
|
319
|
+
end
|
320
|
+
end
|
475
321
|
|
476
|
-
|
322
|
+
class Person
|
323
|
+
prepend Imposter
|
324
|
+
end
|
477
325
|
|
478
|
-
|
326
|
+
Class methods are prepended to the base class, concerning is also
|
327
|
+
updated: `concerning :Imposter, prepend: true do`.
|
479
328
|
|
480
|
-
*
|
329
|
+
*Jason Karns*, *Elia Schito*
|
481
330
|
|
482
|
-
|
483
|
-
|
331
|
+
* Deprecate using `Range#include?` method to check the inclusion of a value
|
332
|
+
in a date time range. It is recommended to use `Range#cover?` method
|
333
|
+
instead of `Range#include?` to check the inclusion of a value
|
334
|
+
in a date time range.
|
484
335
|
|
485
|
-
|
336
|
+
*Vishal Telangre*
|
486
337
|
|
487
|
-
|
338
|
+
* Support added for a `round_mode` parameter, in all number helpers. (See: `BigDecimal::mode`.)
|
488
339
|
|
489
|
-
|
340
|
+
```ruby
|
341
|
+
number_to_currency(1234567890.50, precision: 0, round_mode: :half_down) # => "$1,234,567,890"
|
342
|
+
number_to_percentage(302.24398923423, precision: 5, round_mode: :down) # => "302.24398%"
|
343
|
+
number_to_rounded(389.32314, precision: 0, round_mode: :ceil) # => "390"
|
344
|
+
number_to_human_size(483989, precision: 2, round_mode: :up) # => "480 KB"
|
345
|
+
number_to_human(489939, precision: 2, round_mode: :floor) # => "480 Thousand"
|
490
346
|
|
491
|
-
|
492
|
-
|
347
|
+
485000.to_s(:human, precision: 2, round_mode: :half_even) # => "480 Thousand"
|
348
|
+
```
|
493
349
|
|
494
|
-
*
|
350
|
+
*Tom Lord*
|
495
351
|
|
496
|
-
*
|
352
|
+
* `Array#to_sentence` no longer returns a frozen string.
|
497
353
|
|
498
|
-
|
499
|
-
If no block is given, an Enumerator is returned instead.
|
354
|
+
Before:
|
500
355
|
|
501
|
-
|
502
|
-
|
503
|
-
numbers # => [0, 2, 4, 6, 8]
|
356
|
+
['one', 'two'].to_sentence.frozen?
|
357
|
+
# => true
|
504
358
|
|
505
|
-
|
359
|
+
After:
|
506
360
|
|
507
|
-
|
361
|
+
['one', 'two'].to_sentence.frozen?
|
362
|
+
# => false
|
508
363
|
|
509
|
-
|
510
|
-
cache.exist?('bar') # => false
|
364
|
+
*Nicolas Dular*
|
511
365
|
|
512
|
-
|
366
|
+
* When an instance of `ActiveSupport::Duration` is converted to an `iso8601` duration string, if `weeks` are mixed with `date` parts, the `week` part will be converted to days.
|
367
|
+
This keeps the parser and serializer on the same page.
|
513
368
|
|
514
|
-
|
515
|
-
|
516
|
-
|
369
|
+
```ruby
|
370
|
+
duration = ActiveSupport::Duration.build(1000000)
|
371
|
+
# 1 week, 4 days, 13 hours, 46 minutes, and 40.0 seconds
|
517
372
|
|
518
|
-
|
519
|
-
|
520
|
-
end
|
373
|
+
duration_iso = duration.iso8601
|
374
|
+
# P11DT13H46M40S
|
521
375
|
|
522
|
-
|
523
|
-
|
524
|
-
end
|
376
|
+
ActiveSupport::Duration.parse(duration_iso)
|
377
|
+
# 11 days, 13 hours, 46 minutes, and 40 seconds
|
525
378
|
|
526
|
-
|
379
|
+
duration = ActiveSupport::Duration.build(604800)
|
380
|
+
# 1 week
|
527
381
|
|
528
|
-
|
529
|
-
|
530
|
-
end users are no longer required to make their own:
|
382
|
+
duration_iso = duration.iso8601
|
383
|
+
# P1W
|
531
384
|
|
532
|
-
|
533
|
-
|
534
|
-
|
385
|
+
ActiveSupport::Duration.parse(duration_iso)
|
386
|
+
# 1 week
|
387
|
+
```
|
535
388
|
|
536
|
-
|
537
|
-
sleep 1
|
538
|
-
end
|
389
|
+
*Abhishek Sarkar*
|
539
390
|
|
540
|
-
|
541
|
-
p @event.cpu_time # => 0.256
|
542
|
-
p @event.idle_time # => 1003.2399
|
391
|
+
* Add block support to `ActiveSupport::Testing::TimeHelpers#travel_back`.
|
543
392
|
|
544
|
-
|
393
|
+
*Tim Masliuchenko*
|
545
394
|
|
546
|
-
|
395
|
+
* Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when
|
396
|
+
`ActiveSupport.parse_json_times = true`.
|
547
397
|
|
548
|
-
*
|
398
|
+
*Christian Gregg*
|
549
399
|
|
550
|
-
|
400
|
+
* Support symbolic links for `content_path` in `ActiveSupport::EncryptedFile`.
|
551
401
|
|
552
|
-
*
|
402
|
+
*Takumi Shotoku*
|
553
403
|
|
554
|
-
|
404
|
+
* Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
|
405
|
+
and endless range targets.
|
555
406
|
|
556
|
-
|
407
|
+
*Allen Hsu*, *Andrew Hodgkinson*
|
557
408
|
|
558
|
-
|
409
|
+
* Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
|
559
410
|
|
560
|
-
*
|
411
|
+
*Iain Beeston*
|
561
412
|
|
562
|
-
*
|
413
|
+
* Prevent `ActiveSupport::Duration.build(value)` from creating instances of
|
414
|
+
`ActiveSupport::Duration` unless `value` is of type `Numeric`.
|
563
415
|
|
564
|
-
|
565
|
-
`
|
566
|
-
|
416
|
+
Addresses the errant set of behaviours described in #37012 where
|
417
|
+
`ActiveSupport::Duration` comparisons would fail confusingly
|
418
|
+
or return unexpected results when comparing durations built from instances of `String`.
|
567
419
|
|
568
|
-
|
569
|
-
*Use `require "active_support/core_ext/range/compare_range"` instead.*
|
420
|
+
Before:
|
570
421
|
|
571
|
-
|
422
|
+
small_duration_from_string = ActiveSupport::Duration.build('9')
|
423
|
+
large_duration_from_string = ActiveSupport::Duration.build('100000000000000')
|
424
|
+
small_duration_from_int = ActiveSupport::Duration.build(9)
|
572
425
|
|
573
|
-
|
426
|
+
large_duration_from_string > small_duration_from_string
|
427
|
+
# => false
|
574
428
|
|
575
|
-
|
576
|
-
|
429
|
+
small_duration_from_string == small_duration_from_int
|
430
|
+
# => false
|
577
431
|
|
578
|
-
|
579
|
-
# =>
|
432
|
+
small_duration_from_int < large_duration_from_string
|
433
|
+
# => ArgumentError (comparison of ActiveSupport::Duration::Scalar with ActiveSupport::Duration failed)
|
580
434
|
|
581
|
-
|
582
|
-
# =>
|
435
|
+
large_duration_from_string > small_duration_from_int
|
436
|
+
# => ArgumentError (comparison of String with ActiveSupport::Duration failed)
|
583
437
|
|
584
|
-
|
438
|
+
After:
|
585
439
|
|
586
|
-
|
440
|
+
small_duration_from_string = ActiveSupport::Duration.build('9')
|
441
|
+
# => TypeError (can't build an ActiveSupport::Duration from a String)
|
587
442
|
|
588
|
-
*
|
589
|
-
any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
|
443
|
+
*Alexei Emam*
|
590
444
|
|
591
|
-
|
445
|
+
* Add `ActiveSupport::Cache::Store#delete_multi` method to delete multiple keys from the cache store.
|
592
446
|
|
593
|
-
*
|
594
|
-
(Switches from evaled Lua to a batched SCAN + DEL loop.)
|
447
|
+
*Peter Zhu*
|
595
448
|
|
596
|
-
|
449
|
+
* Support multiple arguments in `HashWithIndifferentAccess` for `merge` and `update` methods, to
|
450
|
+
follow Ruby 2.6 addition.
|
597
451
|
|
598
|
-
*
|
599
|
-
size when compression is enabled (which is true by default). This patch
|
600
|
-
does not attempt to repair existing data: please manually flush the cache
|
601
|
-
to clear out the problematic entries.
|
452
|
+
*Wojciech Wnętrzak*
|
602
453
|
|
603
|
-
|
454
|
+
* Allow initializing `thread_mattr_*` attributes via `:default` option.
|
604
455
|
|
605
|
-
|
456
|
+
class Scraper
|
457
|
+
thread_mattr_reader :client, default: Api::Client.new
|
458
|
+
end
|
606
459
|
|
607
|
-
|
608
|
-
URI.unescape("%E3%83%90") # => "バ"
|
609
|
-
URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
|
460
|
+
*Guilherme Mansur*
|
610
461
|
|
611
|
-
|
462
|
+
* Add `compact_blank` for those times when you want to remove #blank? values from
|
463
|
+
an Enumerable (also `compact_blank!` on Hash, Array, ActionController::Parameters).
|
612
464
|
|
613
|
-
*
|
614
|
-
`Time`, and `TimeWithZone`.
|
465
|
+
*Dana Sherson*
|
615
466
|
|
616
|
-
|
467
|
+
* Make ActiveSupport::Logger Fiber-safe.
|
617
468
|
|
618
|
-
|
619
|
-
|
469
|
+
Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
|
470
|
+
to make log level local to Ruby Fibers in addition to Threads.
|
620
471
|
|
621
|
-
|
472
|
+
Example:
|
622
473
|
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
nth: {
|
627
|
-
ordinals: lambda do |_key, number:, **_options|
|
628
|
-
if number.to_i.abs == 1
|
629
|
-
'er'
|
630
|
-
else
|
631
|
-
'e'
|
632
|
-
end
|
633
|
-
end,
|
474
|
+
logger = ActiveSupport::Logger.new(STDOUT)
|
475
|
+
logger.level = 1
|
476
|
+
puts "Main is debug? #{logger.debug?}"
|
634
477
|
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
}
|
640
|
-
}
|
641
|
-
}
|
478
|
+
Fiber.new {
|
479
|
+
logger.local_level = 0
|
480
|
+
puts "Thread is debug? #{logger.debug?}"
|
481
|
+
}.resume
|
642
482
|
|
483
|
+
puts "Main is debug? #{logger.debug?}"
|
643
484
|
|
644
|
-
|
485
|
+
Before:
|
645
486
|
|
646
|
-
|
647
|
-
|
487
|
+
Main is debug? false
|
488
|
+
Thread is debug? true
|
489
|
+
Main is debug? true
|
648
490
|
|
649
|
-
|
650
|
-
has_one :profile
|
651
|
-
delegate :date_of_birth, to: :profile, private: true
|
491
|
+
After:
|
652
492
|
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
end
|
493
|
+
Main is debug? false
|
494
|
+
Thread is debug? true
|
495
|
+
Main is debug? false
|
657
496
|
|
658
|
-
|
659
|
-
# User.new.date_of_birth
|
660
|
-
# => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>
|
497
|
+
Fixes #36752.
|
661
498
|
|
662
|
-
*
|
499
|
+
*Alexander Varnin*
|
663
500
|
|
664
|
-
* `
|
665
|
-
|
501
|
+
* Allow the `on_rotation` proc used when decrypting/verifying a message to be
|
502
|
+
passed at the constructor level.
|
666
503
|
|
667
|
-
|
504
|
+
Before:
|
668
505
|
|
669
|
-
|
506
|
+
crypt = ActiveSupport::MessageEncryptor.new('long_secret')
|
507
|
+
crypt.decrypt_and_verify(encrypted_message, on_rotation: proc { ... })
|
508
|
+
crypt.decrypt_and_verify(another_encrypted_message, on_rotation: proc { ... })
|
670
509
|
|
671
|
-
|
510
|
+
After:
|
672
511
|
|
673
|
-
|
512
|
+
crypt = ActiveSupport::MessageEncryptor.new('long_secret', on_rotation: proc { ... })
|
513
|
+
crypt.decrypt_and_verify(encrypted_message)
|
514
|
+
crypt.decrypt_and_verify(another_encrypted_message)
|
674
515
|
|
675
|
-
|
516
|
+
*Edouard Chin*
|
676
517
|
|
677
|
-
|
678
|
-
|
679
|
-
|
518
|
+
* `delegate_missing_to` would raise a `DelegationError` if the object
|
519
|
+
delegated to was `nil`. Now the `allow_nil` option has been added to enable
|
520
|
+
the user to specify they want `nil` returned in this case.
|
680
521
|
|
681
|
-
|
522
|
+
*Matthew Tanous*
|
682
523
|
|
683
|
-
|
524
|
+
* `truncate` would return the original string if it was too short to be truncated
|
525
|
+
and a frozen string if it were long enough to be truncated. Now truncate will
|
526
|
+
consistently return an unfrozen string regardless. This behavior is consistent
|
527
|
+
with `gsub` and `strip`.
|
684
528
|
|
685
|
-
|
529
|
+
Before:
|
686
530
|
|
687
|
-
|
531
|
+
'foobar'.truncate(5).frozen?
|
532
|
+
# => true
|
533
|
+
'foobar'.truncate(6).frozen?
|
534
|
+
# => false
|
688
535
|
|
689
|
-
|
536
|
+
After:
|
690
537
|
|
691
|
-
|
538
|
+
'foobar'.truncate(5).frozen?
|
539
|
+
# => false
|
540
|
+
'foobar'.truncate(6).frozen?
|
541
|
+
# => false
|
692
542
|
|
693
|
-
*
|
543
|
+
*Jordan Thomas*
|
694
544
|
|
695
545
|
|
696
|
-
Please check [
|
546
|
+
Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activesupport/CHANGELOG.md) for previous changes.
|