activesupport 6.1.5 → 7.0.0.alpha1

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.

Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +151 -584
  3. data/MIT-LICENSE +1 -1
  4. data/lib/active_support/actionable_error.rb +1 -1
  5. data/lib/active_support/array_inquirer.rb +0 -2
  6. data/lib/active_support/benchmarkable.rb +2 -2
  7. data/lib/active_support/cache/file_store.rb +15 -9
  8. data/lib/active_support/cache/mem_cache_store.rb +119 -28
  9. data/lib/active_support/cache/memory_store.rb +21 -13
  10. data/lib/active_support/cache/null_store.rb +10 -2
  11. data/lib/active_support/cache/redis_cache_store.rb +39 -59
  12. data/lib/active_support/cache/strategy/local_cache.rb +29 -49
  13. data/lib/active_support/cache.rb +189 -45
  14. data/lib/active_support/callbacks.rb +35 -31
  15. data/lib/active_support/concern.rb +5 -5
  16. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
  17. data/lib/active_support/concurrency/share_lock.rb +2 -2
  18. data/lib/active_support/configurable.rb +6 -3
  19. data/lib/active_support/configuration_file.rb +1 -1
  20. data/lib/active_support/core_ext/array/access.rb +1 -5
  21. data/lib/active_support/core_ext/array/conversions.rb +6 -6
  22. data/lib/active_support/core_ext/array/grouping.rb +6 -6
  23. data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
  24. data/lib/active_support/core_ext/date/blank.rb +1 -1
  25. data/lib/active_support/core_ext/date/calculations.rb +2 -2
  26. data/lib/active_support/core_ext/date_time/blank.rb +1 -1
  27. data/lib/active_support/core_ext/digest/uuid.rb +13 -13
  28. data/lib/active_support/core_ext/enumerable.rb +64 -12
  29. data/lib/active_support/core_ext/file/atomic.rb +1 -1
  30. data/lib/active_support/core_ext/hash/keys.rb +1 -1
  31. data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
  32. data/lib/active_support/core_ext/module/delegation.rb +2 -8
  33. data/lib/active_support/core_ext/name_error.rb +2 -8
  34. data/lib/active_support/core_ext/numeric/conversions.rb +2 -2
  35. data/lib/active_support/core_ext/object/blank.rb +2 -2
  36. data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
  37. data/lib/active_support/core_ext/object/duplicable.rb +11 -0
  38. data/lib/active_support/core_ext/object/json.rb +29 -24
  39. data/lib/active_support/core_ext/object/to_query.rb +2 -2
  40. data/lib/active_support/core_ext/object/try.rb +20 -20
  41. data/lib/active_support/core_ext/range/compare_range.rb +0 -25
  42. data/lib/active_support/core_ext/range/each.rb +1 -1
  43. data/lib/active_support/core_ext/range/include_time_with_zone.rb +1 -1
  44. data/lib/active_support/core_ext/string/filters.rb +1 -1
  45. data/lib/active_support/core_ext/string/inflections.rb +1 -1
  46. data/lib/active_support/core_ext/string/output_safety.rb +60 -36
  47. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
  48. data/lib/active_support/core_ext/time/calculations.rb +4 -5
  49. data/lib/active_support/core_ext/time/zones.rb +2 -17
  50. data/lib/active_support/core_ext/uri.rb +0 -14
  51. data/lib/active_support/current_attributes.rb +17 -1
  52. data/lib/active_support/dependencies/interlock.rb +10 -18
  53. data/lib/active_support/dependencies/require_dependency.rb +28 -0
  54. data/lib/active_support/dependencies.rb +58 -788
  55. data/lib/active_support/deprecation/behaviors.rb +4 -1
  56. data/lib/active_support/deprecation/method_wrappers.rb +3 -3
  57. data/lib/active_support/deprecation/proxy_wrappers.rb +1 -1
  58. data/lib/active_support/deprecation.rb +1 -1
  59. data/lib/active_support/descendants_tracker.rb +12 -9
  60. data/lib/active_support/digest.rb +4 -4
  61. data/lib/active_support/duration/iso8601_parser.rb +3 -3
  62. data/lib/active_support/duration/iso8601_serializer.rb +9 -1
  63. data/lib/active_support/duration.rb +80 -52
  64. data/lib/active_support/encrypted_configuration.rb +11 -1
  65. data/lib/active_support/encrypted_file.rb +1 -1
  66. data/lib/active_support/environment_inquirer.rb +1 -1
  67. data/lib/active_support/evented_file_update_checker.rb +1 -1
  68. data/lib/active_support/execution_wrapper.rb +13 -16
  69. data/lib/active_support/fork_tracker.rb +2 -4
  70. data/lib/active_support/gem_version.rb +4 -4
  71. data/lib/active_support/hash_with_indifferent_access.rb +3 -1
  72. data/lib/active_support/i18n.rb +1 -0
  73. data/lib/active_support/inflector/inflections.rb +11 -4
  74. data/lib/active_support/inflector/methods.rb +23 -47
  75. data/lib/active_support/json/encoding.rb +3 -3
  76. data/lib/active_support/key_generator.rb +18 -1
  77. data/lib/active_support/locale/en.yml +1 -1
  78. data/lib/active_support/log_subscriber.rb +13 -3
  79. data/lib/active_support/logger_thread_safe_level.rb +5 -13
  80. data/lib/active_support/message_encryptor.rb +3 -3
  81. data/lib/active_support/message_verifier.rb +4 -4
  82. data/lib/active_support/messages/metadata.rb +2 -2
  83. data/lib/active_support/multibyte/chars.rb +10 -11
  84. data/lib/active_support/multibyte.rb +1 -1
  85. data/lib/active_support/notifications/fanout.rb +31 -11
  86. data/lib/active_support/notifications/instrumenter.rb +17 -0
  87. data/lib/active_support/notifications.rb +10 -0
  88. data/lib/active_support/number_helper/number_converter.rb +1 -3
  89. data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
  90. data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
  91. data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
  92. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
  93. data/lib/active_support/number_helper/rounding_helper.rb +1 -5
  94. data/lib/active_support/number_helper.rb +0 -2
  95. data/lib/active_support/option_merger.rb +4 -16
  96. data/lib/active_support/ordered_hash.rb +1 -1
  97. data/lib/active_support/parameter_filter.rb +5 -0
  98. data/lib/active_support/per_thread_registry.rb +1 -1
  99. data/lib/active_support/railtie.rb +33 -10
  100. data/lib/active_support/reloader.rb +1 -1
  101. data/lib/active_support/rescuable.rb +2 -2
  102. data/lib/active_support/secure_compare_rotator.rb +1 -1
  103. data/lib/active_support/string_inquirer.rb +0 -2
  104. data/lib/active_support/subscriber.rb +5 -0
  105. data/lib/active_support/test_case.rb +9 -21
  106. data/lib/active_support/testing/assertions.rb +34 -4
  107. data/lib/active_support/testing/deprecation.rb +1 -1
  108. data/lib/active_support/testing/isolation.rb +1 -1
  109. data/lib/active_support/testing/method_call_assertions.rb +5 -5
  110. data/lib/active_support/testing/parallelization/server.rb +4 -0
  111. data/lib/active_support/testing/parallelization/worker.rb +3 -0
  112. data/lib/active_support/testing/parallelization.rb +4 -0
  113. data/lib/active_support/testing/parallelize_executor.rb +76 -0
  114. data/lib/active_support/testing/stream.rb +3 -5
  115. data/lib/active_support/testing/tagged_logging.rb +1 -1
  116. data/lib/active_support/testing/time_helpers.rb +13 -2
  117. data/lib/active_support/time_with_zone.rb +19 -6
  118. data/lib/active_support/values/time_zone.rb +25 -11
  119. data/lib/active_support/xml_mini/jdom.rb +1 -1
  120. data/lib/active_support/xml_mini/libxml.rb +5 -5
  121. data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
  122. data/lib/active_support/xml_mini/nokogiri.rb +4 -4
  123. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  124. data/lib/active_support/xml_mini/rexml.rb +1 -1
  125. data/lib/active_support/xml_mini.rb +2 -1
  126. data/lib/active_support.rb +14 -1
  127. metadata +11 -26
  128. data/lib/active_support/core_ext/marshal.rb +0 -26
  129. data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -120
data/CHANGELOG.md CHANGED
@@ -1,708 +1,275 @@
1
- ## Rails 6.1.5 (March 09, 2022) ##
1
+ ## Rails 7.0.0.alpha1 (September 15, 2021) ##
2
2
 
3
- * Fix `ActiveSupport::Duration.build` to support negative values.
3
+ * `ActiveSupport::Dependencies` no longer installs a `const_missing` hook. Before this, you could push to the autoload paths and have constants autoloaded. This feature, known as the `classic` autoloader, has been removed.
4
4
 
5
- The algorithm to collect the `parts` of the `ActiveSupport::Duration`
6
- ignored the sign of the `value` and accumulated incorrect part values. This
7
- impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
8
- not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
9
-
10
- *Caleb Buxton*, *Braden Staudacher*
11
-
12
- * `Time#change` and methods that call it (eg. `Time#advance`) will now
13
- return a `Time` with the timezone argument provided, if the caller was
14
- initialized with a timezone argument.
15
-
16
- Fixes [#42467](https://github.com/rails/rails/issues/42467).
17
-
18
- *Alex Ghiculescu*
19
-
20
- * Clone to keep extended Logger methods for tagged logger.
21
-
22
- *Orhan Toy*
23
-
24
- * `assert_changes` works on including `ActiveSupport::Assertions` module.
25
-
26
- *Pedro Medeiros*
27
-
28
-
29
- ## Rails 6.1.4.7 (March 08, 2022) ##
30
-
31
- * No changes.
32
-
33
-
34
- ## Rails 6.1.4.6 (February 11, 2022) ##
35
-
36
- * Fix Reloader method signature to work with the new Executor signature
37
-
38
-
39
- ## Rails 6.1.4.5 (February 11, 2022) ##
40
-
41
- * No changes.
42
-
43
-
44
- ## Rails 6.1.4.4 (December 15, 2021) ##
45
-
46
- * No changes.
47
-
48
-
49
- ## Rails 6.1.4.3 (December 14, 2021) ##
50
-
51
- * No changes.
52
-
53
-
54
- ## Rails 6.1.4.2 (December 14, 2021) ##
55
-
56
- * No changes.
57
-
58
-
59
- ## Rails 6.1.4.1 (August 19, 2021) ##
60
-
61
- * No changes.
62
-
63
-
64
- ## Rails 6.1.4 (June 24, 2021) ##
65
-
66
- * MemCacheStore: convert any underlying value (including `false`) to an `Entry`.
67
-
68
- See [#42559](https://github.com/rails/rails/pull/42559).
69
-
70
- *Alex Ghiculescu*
71
-
72
- * Fix bug in `number_with_precision` when using large `BigDecimal` values.
73
-
74
- Fixes #42302.
75
-
76
- *Federico Aldunate*, *Zachary Scott*
77
-
78
- * Check byte size instead of length on `secure_compare`.
79
-
80
- *Tietew*
81
-
82
- * Fix `Time.at` to not lose `:in` option.
83
-
84
- *Ryuta Kamizono*
85
-
86
- * Require a path for `config.cache_store = :file_store`.
87
-
88
- *Alex Ghiculescu*
89
-
90
- * Avoid having to store complex object in the default translation file.
91
-
92
- *Rafael Mendonça França*
93
-
94
-
95
- ## Rails 6.1.3.2 (May 05, 2021) ##
96
-
97
- * No changes.
98
-
99
-
100
- ## Rails 6.1.3.1 (March 26, 2021) ##
101
-
102
- * No changes.
103
-
104
-
105
- ## Rails 6.1.3 (February 17, 2021) ##
106
-
107
- * No changes.
108
-
109
-
110
- ## Rails 6.1.2.1 (February 10, 2021) ##
111
-
112
- * No changes.
113
-
114
-
115
- ## Rails 6.1.2 (February 09, 2021) ##
116
-
117
- * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
5
+ *Xavier Noria*
118
6
 
119
- ```ruby
120
- config.cache_store = :mem_cache_store, nil
7
+ * Private internal classes of `ActiveSupport::Dependencies` have been deleted, like `ActiveSupport::Dependencies::Reference`, `ActiveSupport::Dependencies::Blamable`, and others.
121
8
 
122
- # is now equivalent to
9
+ *Xavier Noria*
123
10
 
124
- config.cache_store = :mem_cache_store
11
+ * The private API of `ActiveSupport::Dependencies` has been deleted. That includes methods like `hook!`, `unhook!`, `depend_on`, `require_or_load`, `mechanism`, and many others.
125
12
 
126
- # and is also equivalent to
13
+ *Xavier Noria*
127
14
 
128
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
15
+ * Improves the performance of `ActiveSupport::NumberHelper` formatters by avoiding the use of exceptions as flow control.
129
16
 
130
- # which is the fallback behavior of Dalli
131
- ```
17
+ *Mike Dalessio*
132
18
 
133
- This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
19
+ * Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception`
134
20
 
135
- *Michael Overmeyer*
21
+ Previously, if you provided a `error_handler` to `redis_cache_store`, any errors thrown by
22
+ the error handler would be rescued and logged only. Removed the `rescue` clause from `handle_exception`
23
+ to allow these to be thrown.
136
24
 
25
+ *Nicholas A. Stuart*
137
26
 
138
- ## Rails 6.1.1 (January 07, 2021) ##
27
+ * Allow entirely opting out of deprecation warnings.
139
28
 
140
- * Change `IPAddr#to_json` to match the behavior of the json gem returning the string representation
141
- instead of the instance variables of the object.
29
+ Previously if you did `app.config.active_support.deprecation = :silence`, some work would
30
+ still be done on each call to `ActiveSupport::Deprecation.warn`. In very hot paths, this could
31
+ cause performance issues.
142
32
 
143
- Before:
33
+ Now, you can make `ActiveSupport::Deprecation.warn` a no-op:
144
34
 
145
35
  ```ruby
146
- IPAddr.new("127.0.0.1").to_json
147
- # => "{\"addr\":2130706433,\"family\":2,\"mask_addr\":4294967295}"
36
+ config.active_support.report_deprecations = false
148
37
  ```
149
38
 
150
- After:
39
+ This is the default in production for new apps. It is the equivalent to:
151
40
 
152
41
  ```ruby
153
- IPAddr.new("127.0.0.1").to_json
154
- # => "\"127.0.0.1\""
42
+ config.active_support.deprecation = :silence
43
+ config.active_support.disallowed_deprecation = :silence
155
44
  ```
156
45
 
46
+ but will take a more optimised code path.
157
47
 
158
- ## Rails 6.1.0 (December 09, 2020) ##
159
-
160
- * Ensure `MemoryStore` disables compression by default. Reverts behavior of
161
- `MemoryStore` to its prior rails `5.1` behavior.
162
-
163
- *Max Gurewitz*
164
-
165
- * Calling `iso8601` on negative durations retains the negative sign on individual
166
- digits instead of prepending it.
167
-
168
- This change is required so we can interoperate with PostgreSQL, which prefers
169
- negative signs for each component.
170
-
171
- Compatibility with other iso8601 parsers which support leading negatives as well
172
- as negatives per component is still retained.
173
-
174
- Before:
175
-
176
- (-1.year - 1.day).iso8601
177
- # => "-P1Y1D"
178
-
179
- After:
180
-
181
- (-1.year - 1.day).iso8601
182
- # => "P-1Y-1D"
183
-
184
- *Vipul A M*
185
-
186
- * Remove deprecated `ActiveSupport::Notifications::Instrumenter#end=`.
187
-
188
- *Rafael Mendonça França*
189
-
190
- * Deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
191
-
192
- *Rafael Mendonça França*
193
-
194
- * Remove deprecated `ActiveSupport::Multibyte::Unicode.pack_graphemes`,
195
- `ActiveSupport::Multibyte::Unicode.unpack_graphemes`,
196
- `ActiveSupport::Multibyte::Unicode.normalize`,
197
- `ActiveSupport::Multibyte::Unicode.downcase`,
198
- `ActiveSupport::Multibyte::Unicode.upcase` and `ActiveSupport::Multibyte::Unicode.swapcase`.
199
-
200
- *Rafael Mendonça França*
201
-
202
- * Remove deprecated `ActiveSupport::Multibyte::Chars#consumes?` and `ActiveSupport::Multibyte::Chars#normalize`.
203
-
204
- *Rafael Mendonça França*
205
-
206
- * Remove deprecated file `active_support/core_ext/range/include_range`.
207
-
208
- *Rafael Mendonça França*
209
-
210
- * Remove deprecated file `active_support/core_ext/hash/transform_values`.
211
-
212
- *Rafael Mendonça França*
213
-
214
- * Remove deprecated file `active_support/core_ext/hash/compact`.
215
-
216
- *Rafael Mendonça França*
217
-
218
- * Remove deprecated file `active_support/core_ext/array/prepend_and_append`.
219
-
220
- *Rafael Mendonça França*
221
-
222
- * Remove deprecated file `active_support/core_ext/numeric/inquiry`.
223
-
224
- *Rafael Mendonça França*
225
-
226
- * Remove deprecated file `active_support/core_ext/module/reachable`.
227
-
228
- *Rafael Mendonça França*
229
-
230
- * Remove deprecated `Module#parent_name`, `Module#parent` and `Module#parents`.
231
-
232
- *Rafael Mendonça França*
233
-
234
- * Remove deprecated `ActiveSupport::LoggerThreadSafeLevel#after_initialize`.
235
-
236
- *Rafael Mendonça França*
237
-
238
- * Remove deprecated `LoggerSilence` constant.
239
-
240
- *Rafael Mendonça França*
241
-
242
- * Remove deprecated fallback to `I18n.default_local` when `config.i18n.fallbacks` is empty.
243
-
244
- *Rafael Mendonça França*
245
-
246
- * Remove entries from local cache on `RedisCacheStore#delete_matched`
247
-
248
- Fixes #38627
249
-
250
- *ojab*
48
+ *Alex Ghiculescu*
251
49
 
252
- * Speed up `ActiveSupport::SecurityUtils.fixed_length_secure_compare` by using
253
- `OpenSSL.fixed_length_secure_compare`, if available.
50
+ * Faster tests by parallelizing only when overhead is justified by the number
51
+ of them.
254
52
 
255
- *Nate Matykiewicz*
53
+ Running tests in parallel adds overhead in terms of database
54
+ setup and fixture loading. Now, Rails will only parallelize test executions when
55
+ there are enough tests to make it worth it.
256
56
 
257
- * `ActiveSupport::Cache::MemCacheStore` now checks `ENV["MEMCACHE_SERVERS"]` before falling back to `"localhost:11211"` if configured without any addresses.
57
+ This threshold is 50 by default, and is configurable via config setting in
58
+ your test.rb:
258
59
 
259
60
  ```ruby
260
- config.cache_store = :mem_cache_store
261
-
262
- # is now equivalent to
263
-
264
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
265
-
266
- # instead of
267
-
268
- config.cache_store = :mem_cache_store, "localhost:11211" # ignores ENV["MEMCACHE_SERVERS"]
61
+ config.active_support.test_parallelization_threshold = 100
269
62
  ```
270
63
 
271
- *Sam Bostock*
272
-
273
- * `ActiveSupport::Subscriber#attach_to` now accepts an `inherit_all:` argument. When set to true,
274
- it allows a subscriber to receive events for methods defined in the subscriber's ancestor class(es).
64
+ It's also configurable at the test case level:
275
65
 
276
66
  ```ruby
277
- class ActionControllerSubscriber < ActiveSupport::Subscriber
278
- attach_to :action_controller
279
-
280
- def start_processing(event)
281
- info "Processing by #{event.payload[:controller]}##{event.payload[:action]} as #{format}"
282
- end
283
-
284
- def redirect_to(event)
285
- info { "Redirected to #{event.payload[:location]}" }
286
- end
287
- end
288
-
289
- # We detach ActionControllerSubscriber from the :action_controller namespace so that our CustomActionControllerSubscriber
290
- # can provide its own instrumentation for certain events in the namespace
291
- ActionControllerSubscriber.detach_from(:action_controller)
292
-
293
- class CustomActionControllerSubscriber < ActionControllerSubscriber
294
- attach_to :action_controller, inherit_all: true
295
-
296
- def start_processing(event)
297
- info "A custom response to start_processing events"
298
- end
299
-
300
- # => CustomActionControllerSubscriber will process events for "start_processing.action_controller" notifications
301
- # using its own #start_processing implementation, while retaining ActionControllerSubscriber's instrumentation
302
- # for "redirect_to.action_controller" notifications
67
+ class ActiveSupport::TestCase
68
+ parallelize threshold: 100
303
69
  end
304
70
  ```
305
71
 
306
- *Adrianna Chang*
72
+ *Jorge Manrubia*
307
73
 
308
- * Allow the digest class used to generate non-sensitive digests to be configured with `config.active_support.hash_digest_class`.
309
-
310
- `config.active_support.use_sha1_digests` is deprecated in favour of `config.active_support.hash_digest_class = ::Digest::SHA1`.
74
+ * OpenSSL constants are now used for Digest computations.
311
75
 
312
76
  *Dirkjan Bussink*
313
77
 
314
- * Fix bug to make memcached write_entry expire correctly with unless_exist
315
-
316
- *Jye Lee*
317
-
318
- * Add `ActiveSupport::Duration` conversion methods
319
-
320
- `in_seconds`, `in_minutes`, `in_hours`, `in_days`, `in_weeks`, `in_months`, and `in_years` return the respective duration covered.
321
-
322
- *Jason York*
323
-
324
- * Fixed issue in `ActiveSupport::Cache::RedisCacheStore` not passing options
325
- to `read_multi` causing `fetch_multi` to not work properly
326
-
327
- *Rajesh Sharma*
78
+ * `TimeZone.iso8601` now accepts valid ordinal values similar to Ruby's `Date._iso8601` method.
79
+ A valid ordinal value will be converted to an instance of `TimeWithZone` using the `:year`
80
+ and `:yday` fragments returned from `Date._iso8601`.
328
81
 
329
- * Fixed issue in `ActiveSupport::Cache::MemCacheStore` which caused duplicate compression,
330
- and caused the provided `compression_threshold` to not be respected.
331
-
332
- *Max Gurewitz*
333
-
334
- * Prevent `RedisCacheStore` and `MemCacheStore` from performing compression
335
- when reading entries written with `raw: true`.
336
-
337
- *Max Gurewitz*
82
+ ```ruby
83
+ twz = ActiveSupport::TimeZone["Eastern Time (US & Canada)"].iso8601("21087")
84
+ twz.to_a[0, 6] == [0, 0, 0, 28, 03, 2021]
85
+ ```
338
86
 
339
- * `URI.parser` is deprecated and will be removed in Rails 7.0. Use
340
- `URI::DEFAULT_PARSER` instead.
87
+ *Steve Laing*
341
88
 
342
- *Jean Boussier*
89
+ * `Time#change` and methods that call it (e.g. `Time#advance`) will now
90
+ return a `Time` with the timezone argument provided, if the caller was
91
+ initialized with a timezone argument.
343
92
 
344
- * `require_dependency` has been documented to be _obsolete_ in `:zeitwerk`
345
- mode. The method is not deprecated as such (yet), but applications are
346
- encouraged to not use it.
93
+ Fixes [#42467](https://github.com/rails/rails/issues/42467).
347
94
 
348
- In `:zeitwerk` mode, semantics match Ruby's and you do not need to be
349
- defensive with load order. Just refer to classes and modules normally. If
350
- the constant name is dynamic, camelize if needed, and constantize.
95
+ *Alex Ghiculescu*
351
96
 
352
- *Xavier Noria*
97
+ * Allow serializing any module or class to JSON by name.
353
98
 
354
- * Add 3rd person aliases of `Symbol#start_with?` and `Symbol#end_with?`.
99
+ *Tyler Rick*, *Zachary Scott*
355
100
 
356
- ```ruby
357
- :foo.starts_with?("f") # => true
358
- :foo.ends_with?("o") # => true
359
- ```
101
+ * Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the
102
+ `RAILS_MASTER_KEY` environment variable is blank (e.g. `""`).
360
103
 
361
- *Ryuta Kamizono*
104
+ *Sunny Ripert*
362
105
 
363
- * Add override of unary plus for `ActiveSupport::Duration`.
106
+ * The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`.
364
107
 
365
- `+ 1.second` is now identical to `+1.second` to prevent errors
366
- where a seemingly innocent change of formatting leads to a change in the code behavior.
108
+ It permits asserting on the initial value that is expected not to change.
367
109
 
368
- Before:
369
110
  ```ruby
370
- +1.second.class
371
- # => ActiveSupport::Duration
372
- (+ 1.second).class
373
- # => Integer
374
- ```
375
-
376
- After:
377
- ```ruby
378
- +1.second.class
379
- # => ActiveSupport::Duration
380
- (+ 1.second).class
381
- # => ActiveSupport::Duration
111
+ assert_no_changes -> { Status.all_good? }, from: true do
112
+ post :create, params: { status: { ok: true } }
113
+ end
382
114
  ```
383
115
 
384
- Fixes #39079.
385
-
386
- *Roman Kushnir*
387
-
388
- * Add subsec to `ActiveSupport::TimeWithZone#inspect`.
116
+ *George Claghorn*
389
117
 
390
- Before:
118
+ * Deprecate `ActiveSupport::SafeBuffer`'s incorrect implicit conversion of objects into string.
391
119
 
392
- Time.at(1498099140).in_time_zone.inspect
393
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
394
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
395
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
396
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
397
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
120
+ Except for a few methods like `String#%`, objects must implement `#to_str`
121
+ to be implicitly converted to a String in string operations. In some
122
+ circumstances `ActiveSupport::SafeBuffer` was incorrectly calling the
123
+ explicit conversion method (`#to_s`) on them. This behavior is now
124
+ deprecated.
398
125
 
399
- After:
126
+ *Jean Boussier*
400
127
 
401
- Time.at(1498099140).in_time_zone.inspect
402
- # => "Thu, 22 Jun 2017 02:39:00.000000000 UTC +00:00"
403
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
404
- # => "Thu, 22 Jun 2017 02:39:00.123456780 UTC +00:00"
405
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
406
- # => "Thu, 22 Jun 2017 02:39:00.333333333 UTC +00:00"
128
+ * Allow nested access to keys on `Rails.application.credentials`.
407
129
 
408
- *akinomaeni*
130
+ Previously only top level keys in `credentials.yml.enc` could be accessed with method calls. Now any key can.
409
131
 
410
- * Calling `ActiveSupport::TaggedLogging#tagged` without a block now returns a tagged logger.
132
+ For example, given these secrets:
411
133
 
412
- ```ruby
413
- logger.tagged("BCX").info("Funky time!") # => [BCX] Funky time!
134
+ ```yml
135
+ aws:
136
+ access_key_id: 123
137
+ secret_access_key: 345
414
138
  ```
415
139
 
416
- *Eugene Kenny*
417
-
418
- * Align `Range#cover?` extension behavior with Ruby behavior for backwards ranges.
140
+ `Rails.application.credentials.aws.access_key_id` will now return the same thing as
141
+ `Rails.application.credentials.aws[:access_key_id]`.
419
142
 
420
- `(1..10).cover?(5..3)` now returns `false`, as it does in plain Ruby.
421
-
422
- Also update `#include?` and `#===` behavior to match.
423
-
424
- *Michael Groeneman*
143
+ *Alex Ghiculescu*
425
144
 
426
- * Update to TZInfo v2.0.0.
145
+ * Added a faster and more compact `ActiveSupport::Cache` serialization format.
427
146
 
428
- This changes the output of `ActiveSupport::TimeZone.utc_to_local`, but
429
- can be controlled with the
430
- `ActiveSupport.utc_to_local_returns_utc_offset_times` config.
147
+ It can be enabled with `config.active_support.cache_format_version = 7.0` or
148
+ `config.load_defaults 7.0`. Regardless of the configuration Active Support
149
+ 7.0 can read cache entries serialized by Active Support 6.1 which allows to
150
+ upgrade without invalidating the cache. However Rails 6.1 can't read the
151
+ new format, so all readers must be upgraded before the new format is enabled.
431
152
 
432
- New Rails 6.1 apps have it enabled by default, existing apps can upgrade
433
- via the config in config/initializers/new_framework_defaults_6_1.rb
153
+ *Jean Boussier*
434
154
 
435
- See the `utc_to_local_returns_utc_offset_times` documentation for details.
155
+ * Add `Enumerable#sole`, per `ActiveRecord::FinderMethods#sole`. Returns the
156
+ sole item of the enumerable, raising if no items are found, or if more than
157
+ one is.
436
158
 
437
- *Phil Ross*, *Jared Beck*
159
+ *Asherah Connor*
438
160
 
439
- * Add Date and Time `#yesterday?` and `#tomorrow?` alongside `#today?`.
161
+ * Freeze `ActiveSupport::Duration#parts` and remove writer methods.
440
162
 
441
- Aliased to `#prev_day?` and `#next_day?` to match the existing `#prev/next_day` methods.
163
+ Durations are meant to be value objects and should not be mutated.
442
164
 
443
- *Jatin Dhankhar*
165
+ *Andrew White*
444
166
 
445
- * Add `Enumerable#pick` to complement `ActiveRecord::Relation#pick`.
167
+ * Fix `ActiveSupport::TimeZone#utc_to_local` with fractional seconds.
446
168
 
447
- *Eugene Kenny*
169
+ When `utc_to_local_returns_utc_offset_times` is false and the time
170
+ instance had fractional seconds the new UTC time instance was out by
171
+ a factor of 1,000,000 as the `Time.utc` constructor takes a usec
172
+ value and not a fractional second value.
448
173
 
449
- * [Breaking change] `ActiveSupport::Callbacks#halted_callback_hook` now receive a 2nd argument:
174
+ *Andrew White*
450
175
 
451
- `ActiveSupport::Callbacks#halted_callback_hook` now receive the name of the callback
452
- being halted as second argument.
453
- This change will allow you to differentiate which callbacks halted the chain
454
- and act accordingly.
176
+ * Add `expires_at` argument to `ActiveSupport::Cache` `write` and `fetch` to set a cache entry TTL as an absolute time.
455
177
 
456
178
  ```ruby
457
- class Book < ApplicationRecord
458
- before_save { throw(:abort) }
459
- before_create { throw(:abort) }
460
-
461
- def halted_callback_hook(filter, callback_name)
462
- Rails.logger.info("Book couldn't be #{callback_name}d")
463
- end
464
-
465
- Book.create # => "Book couldn't be created"
466
- book.save # => "Book couldn't be saved"
467
- end
179
+ Rails.cache.write(key, value, expires_at: Time.now.at_end_of_hour)
468
180
  ```
469
181
 
470
- *Edouard Chin*
471
-
472
- * Support `prepend` with `ActiveSupport::Concern`.
473
-
474
- Allows a module with `extend ActiveSupport::Concern` to be prepended.
475
-
476
- module Imposter
477
- extend ActiveSupport::Concern
478
-
479
- # Same as `included`, except only run when prepended.
480
- prepended do
481
- end
482
- end
483
-
484
- class Person
485
- prepend Imposter
486
- end
487
-
488
- Class methods are prepended to the base class, concerning is also
489
- updated: `concerning :Imposter, prepend: true do`.
182
+ *Jean Boussier*
490
183
 
491
- *Jason Karns*, *Elia Schito*
184
+ * Deprecate `ActiveSupport::TimeWithZone.name` so that from Rails 7.1 it will use the default implementation.
492
185
 
493
- * Deprecate using `Range#include?` method to check the inclusion of a value
494
- in a date time range. It is recommended to use `Range#cover?` method
495
- instead of `Range#include?` to check the inclusion of a value
496
- in a date time range.
186
+ *Andrew White*
497
187
 
498
- *Vishal Telangre*
188
+ * Deprecates Rails custom `Enumerable#sum` and `Array#sum` in favor of Ruby's native implementation which
189
+ is considerably faster.
499
190
 
500
- * Support added for a `round_mode` parameter, in all number helpers. (See: `BigDecimal::mode`.)
191
+ Ruby requires an initializer for non-numeric type as per examples below:
501
192
 
502
193
  ```ruby
503
- number_to_currency(1234567890.50, precision: 0, round_mode: :half_down) # => "$1,234,567,890"
504
- number_to_percentage(302.24398923423, precision: 5, round_mode: :down) # => "302.24398%"
505
- number_to_rounded(389.32314, precision: 0, round_mode: :ceil) # => "390"
506
- number_to_human_size(483989, precision: 2, round_mode: :up) # => "480 KB"
507
- number_to_human(489939, precision: 2, round_mode: :floor) # => "480 Thousand"
194
+ %w[foo bar].sum('')
195
+ # instead of %w[foo bar].sum
508
196
 
509
- 485000.to_s(:human, precision: 2, round_mode: :half_even) # => "480 Thousand"
197
+ [[1, 2], [3, 4, 5]].sum([])
198
+ # instead of [[1, 2], [3, 4, 5]].sum
510
199
  ```
511
200
 
512
- *Tom Lord*
201
+ *Alberto Mota*
513
202
 
514
- * `Array#to_sentence` no longer returns a frozen string.
203
+ * Tests parallelization is now disabled when running individual files to prevent the setup overhead.
515
204
 
516
- Before:
205
+ It can still be enforced if the environment variable `PARALLEL_WORKERS` is present and set to a value greater than 1.
517
206
 
518
- ['one', 'two'].to_sentence.frozen?
519
- # => true
207
+ *Ricardo Díaz*
520
208
 
521
- After:
209
+ * Fix proxying keyword arguments in `ActiveSupport::CurrentAttributes`.
522
210
 
523
- ['one', 'two'].to_sentence.frozen?
524
- # => false
211
+ *Marcin Kołodziej*
525
212
 
526
- *Nicolas Dular*
527
-
528
- * 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.
529
- This keeps the parser and serializer on the same page.
213
+ * Add `Enumerable#maximum` and `Enumerable#minimum` to easily calculate the maximum or minimum from extracted
214
+ elements of an enumerable.
530
215
 
531
216
  ```ruby
532
- duration = ActiveSupport::Duration.build(1000000)
533
- # 1 week, 4 days, 13 hours, 46 minutes, and 40.0 seconds
534
-
535
- duration_iso = duration.iso8601
536
- # P11DT13H46M40S
217
+ payments = [Payment.new(5), Payment.new(15), Payment.new(10)]
537
218
 
538
- ActiveSupport::Duration.parse(duration_iso)
539
- # 11 days, 13 hours, 46 minutes, and 40 seconds
540
-
541
- duration = ActiveSupport::Duration.build(604800)
542
- # 1 week
543
-
544
- duration_iso = duration.iso8601
545
- # P1W
546
-
547
- ActiveSupport::Duration.parse(duration_iso)
548
- # 1 week
219
+ payments.minimum(:price) # => 5
220
+ payments.maximum(:price) # => 15
549
221
  ```
550
222
 
551
- *Abhishek Sarkar*
552
-
553
- * Add block support to `ActiveSupport::Testing::TimeHelpers#travel_back`.
554
-
555
- *Tim Masliuchenko*
556
-
557
- * Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when
558
- `ActiveSupport.parse_json_times = true`.
559
-
560
- *Christian Gregg*
561
-
562
- * Support symbolic links for `content_path` in `ActiveSupport::EncryptedFile`.
563
-
564
- *Takumi Shotoku*
565
-
566
- * Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
567
- and endless range targets.
568
-
569
- *Allen Hsu*, *Andrew Hodgkinson*
570
-
571
- * Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
572
-
573
- *Iain Beeston*
574
-
575
- * Prevent `ActiveSupport::Duration.build(value)` from creating instances of
576
- `ActiveSupport::Duration` unless `value` is of type `Numeric`.
577
-
578
- Addresses the errant set of behaviours described in #37012 where
579
- `ActiveSupport::Duration` comparisons would fail confusingly
580
- or return unexpected results when comparing durations built from instances of `String`.
581
-
582
- Before:
583
-
584
- small_duration_from_string = ActiveSupport::Duration.build('9')
585
- large_duration_from_string = ActiveSupport::Duration.build('100000000000000')
586
- small_duration_from_int = ActiveSupport::Duration.build(9)
587
-
588
- large_duration_from_string > small_duration_from_string
589
- # => false
590
-
591
- small_duration_from_string == small_duration_from_int
592
- # => false
593
-
594
- small_duration_from_int < large_duration_from_string
595
- # => ArgumentError (comparison of ActiveSupport::Duration::Scalar with ActiveSupport::Duration failed)
596
-
597
- large_duration_from_string > small_duration_from_int
598
- # => ArgumentError (comparison of String with ActiveSupport::Duration failed)
223
+ This also allows passing enumerables to `fresh_when` and `stale?` in Action Controller.
224
+ See PR [#41404](https://github.com/rails/rails/pull/41404) for an example.
599
225
 
600
- After:
226
+ *Ayrton De Craene*
601
227
 
602
- small_duration_from_string = ActiveSupport::Duration.build('9')
603
- # => TypeError (can't build an ActiveSupport::Duration from a String)
604
-
605
- *Alexei Emam*
606
-
607
- * Add `ActiveSupport::Cache::Store#delete_multi` method to delete multiple keys from the cache store.
608
-
609
- *Peter Zhu*
610
-
611
- * Support multiple arguments in `HashWithIndifferentAccess` for `merge` and `update` methods, to
612
- follow Ruby 2.6 addition.
613
-
614
- *Wojciech Wnętrzak*
615
-
616
- * Allow initializing `thread_mattr_*` attributes via `:default` option.
617
-
618
- class Scraper
619
- thread_mattr_reader :client, default: Api::Client.new
620
- end
621
-
622
- *Guilherme Mansur*
623
-
624
- * Add `compact_blank` for those times when you want to remove #blank? values from
625
- an Enumerable (also `compact_blank!` on Hash, Array, ActionController::Parameters).
626
-
627
- *Dana Sherson*
628
-
629
- * Make ActiveSupport::Logger Fiber-safe.
630
-
631
- Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
632
- to make log level local to Ruby Fibers in addition to Threads.
633
-
634
- Example:
635
-
636
- logger = ActiveSupport::Logger.new(STDOUT)
637
- logger.level = 1
638
- puts "Main is debug? #{logger.debug?}"
639
-
640
- Fiber.new {
641
- logger.local_level = 0
642
- puts "Thread is debug? #{logger.debug?}"
643
- }.resume
644
-
645
- puts "Main is debug? #{logger.debug?}"
228
+ * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
646
229
 
647
- Before:
230
+ ```ruby
231
+ config.cache_store = :mem_cache_store, nil
648
232
 
649
- Main is debug? false
650
- Thread is debug? true
651
- Main is debug? true
233
+ # is now equivalent to
652
234
 
653
- After:
235
+ config.cache_store = :mem_cache_store
654
236
 
655
- Main is debug? false
656
- Thread is debug? true
657
- Main is debug? false
237
+ # and is also equivalent to
658
238
 
659
- Fixes #36752.
239
+ config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
660
240
 
661
- *Alexander Varnin*
241
+ # which is the fallback behavior of Dalli
242
+ ```
662
243
 
663
- * Allow the `on_rotation` proc used when decrypting/verifying a message to be
664
- passed at the constructor level.
244
+ This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
665
245
 
666
- Before:
246
+ *Michael Overmeyer*
667
247
 
668
- crypt = ActiveSupport::MessageEncryptor.new('long_secret')
669
- crypt.decrypt_and_verify(encrypted_message, on_rotation: proc { ... })
670
- crypt.decrypt_and_verify(another_encrypted_message, on_rotation: proc { ... })
248
+ * Add `Enumerable#in_order_of` to put an Enumerable in a certain order by a key.
671
249
 
672
- After:
250
+ *DHH*
673
251
 
674
- crypt = ActiveSupport::MessageEncryptor.new('long_secret', on_rotation: proc { ... })
675
- crypt.decrypt_and_verify(encrypted_message)
676
- crypt.decrypt_and_verify(another_encrypted_message)
252
+ * `ActiveSupport::Inflector.camelize` behaves expected when provided a symbol `:upper` or `:lower` argument. Matches
253
+ `String#camelize` behavior.
677
254
 
678
- *Edouard Chin*
255
+ *Alex Ghiculescu*
679
256
 
680
- * `delegate_missing_to` would raise a `DelegationError` if the object
681
- delegated to was `nil`. Now the `allow_nil` option has been added to enable
682
- the user to specify they want `nil` returned in this case.
257
+ * Raises an `ArgumentError` when the first argument of `ActiveSupport::Notification.subscribe` is
258
+ invalid.
683
259
 
684
- *Matthew Tanous*
260
+ *Vipul A M*
685
261
 
686
- * `truncate` would return the original string if it was too short to be truncated
687
- and a frozen string if it were long enough to be truncated. Now truncate will
688
- consistently return an unfrozen string regardless. This behavior is consistent
689
- with `gsub` and `strip`.
262
+ * `HashWithIndifferentAccess#deep_transform_keys` now returns a `HashWithIndifferentAccess` instead of a `Hash`.
690
263
 
691
- Before:
264
+ *Nathaniel Woodthorpe*
692
265
 
693
- 'foobar'.truncate(5).frozen?
694
- # => true
695
- 'foobar'.truncate(6).frozen?
696
- # => false
266
+ * Consume dalli’s `cache_nils` configuration as `ActiveSupport::Cache`'s `skip_nil` when using `MemCacheStore`.
697
267
 
698
- After:
268
+ *Ritikesh G*
699
269
 
700
- 'foobar'.truncate(5).frozen?
701
- # => false
702
- 'foobar'.truncate(6).frozen?
703
- # => false
270
+ * Add `RedisCacheStore#stats` method similar to `MemCacheStore#stats`. Calls `redis#info` internally.
704
271
 
705
- *Jordan Thomas*
272
+ *Ritikesh G*
706
273
 
707
274
 
708
- Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activesupport/CHANGELOG.md) for previous changes.
275
+ Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activesupport/CHANGELOG.md) for previous changes.