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