activesupport 6.1.7.10 → 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 -664
  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 -68
  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 -2
  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 +10 -9
  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 -46
  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,788 +1,275 @@
1
- ## Rails 6.1.7.10 (October 23, 2024) ##
1
+ ## Rails 7.0.0.alpha1 (September 15, 2021) ##
2
2
 
3
- * No changes.
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
+ *Xavier Noria*
5
6
 
6
- ## Rails 6.1.7.9 (October 15, 2024) ##
7
-
8
- * No changes.
9
-
10
-
11
- ## Rails 6.1.7.8 (June 04, 2024) ##
12
-
13
- * No changes.
14
-
15
-
16
- ## Rails 6.1.7.7 (February 21, 2024) ##
17
-
18
- * No changes.
19
-
20
-
21
- ## Rails 6.1.7.6 (August 22, 2023) ##
22
-
23
- * No changes.
24
-
25
-
26
- ## Rails 6.1.7.5 (August 22, 2023) ##
27
-
28
- * Use a temporary file for storing unencrypted files while editing
29
-
30
- [CVE-2023-38037]
31
-
32
-
33
- ## Rails 6.1.7.4 (June 26, 2023) ##
34
-
35
- * No changes.
36
-
37
-
38
- ## Rails 6.1.7.3 (March 13, 2023) ##
39
-
40
- * Implement SafeBuffer#bytesplice
41
-
42
- [CVE-2023-28120]
43
-
44
-
45
- ## Rails 6.1.7.2 (January 24, 2023) ##
46
-
47
- * No changes.
48
-
49
-
50
- ## Rails 6.1.7.1 (January 17, 2023) ##
51
-
52
- * Avoid regex backtracking in Inflector.underscore
53
-
54
- [CVE-2023-22796]
55
-
56
-
57
- ## Rails 6.1.7 (September 09, 2022) ##
58
-
59
- * No changes.
60
-
61
-
62
- ## Rails 6.1.6.1 (July 12, 2022) ##
63
-
64
- * No changes.
65
-
66
-
67
- ## Rails 6.1.6 (May 09, 2022) ##
68
-
69
- * No changes.
70
-
71
-
72
- ## Rails 6.1.5.1 (April 26, 2022) ##
73
-
74
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
75
-
76
- Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
77
- in names of tags and names of attributes, following the specification of XML.
78
-
79
- *Álvaro Martín Fraguas*
80
-
81
- ## Rails 6.1.5 (March 09, 2022) ##
82
-
83
- * Fix `ActiveSupport::Duration.build` to support negative values.
84
-
85
- The algorithm to collect the `parts` of the `ActiveSupport::Duration`
86
- ignored the sign of the `value` and accumulated incorrect part values. This
87
- impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
88
- not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
89
-
90
- *Caleb Buxton*, *Braden Staudacher*
91
-
92
- * `Time#change` and methods that call it (eg. `Time#advance`) will now
93
- return a `Time` with the timezone argument provided, if the caller was
94
- initialized with a timezone argument.
95
-
96
- Fixes [#42467](https://github.com/rails/rails/issues/42467).
97
-
98
- *Alex Ghiculescu*
99
-
100
- * Clone to keep extended Logger methods for tagged logger.
101
-
102
- *Orhan Toy*
103
-
104
- * `assert_changes` works on including `ActiveSupport::Assertions` module.
105
-
106
- *Pedro Medeiros*
107
-
108
-
109
- ## Rails 6.1.4.7 (March 08, 2022) ##
110
-
111
- * No changes.
112
-
113
-
114
- ## Rails 6.1.4.6 (February 11, 2022) ##
115
-
116
- * Fix Reloader method signature to work with the new Executor signature
117
-
118
-
119
- ## Rails 6.1.4.5 (February 11, 2022) ##
120
-
121
- * No changes.
122
-
123
-
124
- ## Rails 6.1.4.4 (December 15, 2021) ##
125
-
126
- * No changes.
127
-
128
-
129
- ## Rails 6.1.4.3 (December 14, 2021) ##
130
-
131
- * No changes.
132
-
133
-
134
- ## Rails 6.1.4.2 (December 14, 2021) ##
135
-
136
- * No changes.
137
-
138
-
139
- ## Rails 6.1.4.1 (August 19, 2021) ##
140
-
141
- * No changes.
142
-
143
-
144
- ## Rails 6.1.4 (June 24, 2021) ##
145
-
146
- * MemCacheStore: convert any underlying value (including `false`) to an `Entry`.
147
-
148
- See [#42559](https://github.com/rails/rails/pull/42559).
149
-
150
- *Alex Ghiculescu*
151
-
152
- * Fix bug in `number_with_precision` when using large `BigDecimal` values.
153
-
154
- Fixes #42302.
155
-
156
- *Federico Aldunate*, *Zachary Scott*
157
-
158
- * Check byte size instead of length on `secure_compare`.
159
-
160
- *Tietew*
161
-
162
- * Fix `Time.at` to not lose `:in` option.
163
-
164
- *Ryuta Kamizono*
165
-
166
- * Require a path for `config.cache_store = :file_store`.
167
-
168
- *Alex Ghiculescu*
169
-
170
- * Avoid having to store complex object in the default translation file.
171
-
172
- *Rafael Mendonça França*
173
-
174
-
175
- ## Rails 6.1.3.2 (May 05, 2021) ##
176
-
177
- * No changes.
178
-
179
-
180
- ## Rails 6.1.3.1 (March 26, 2021) ##
181
-
182
- * No changes.
183
-
184
-
185
- ## Rails 6.1.3 (February 17, 2021) ##
186
-
187
- * No changes.
188
-
189
-
190
- ## Rails 6.1.2.1 (February 10, 2021) ##
191
-
192
- * No changes.
193
-
194
-
195
- ## Rails 6.1.2 (February 09, 2021) ##
196
-
197
- * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
7
+ * Private internal classes of `ActiveSupport::Dependencies` have been deleted, like `ActiveSupport::Dependencies::Reference`, `ActiveSupport::Dependencies::Blamable`, and others.
198
8
 
199
- ```ruby
200
- config.cache_store = :mem_cache_store, nil
201
-
202
- # is now equivalent to
9
+ *Xavier Noria*
203
10
 
204
- 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.
205
12
 
206
- # and is also equivalent to
13
+ *Xavier Noria*
207
14
 
208
- 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.
209
16
 
210
- # which is the fallback behavior of Dalli
211
- ```
17
+ *Mike Dalessio*
212
18
 
213
- This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
19
+ * Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception`
214
20
 
215
- *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.
216
24
 
25
+ *Nicholas A. Stuart*
217
26
 
218
- ## Rails 6.1.1 (January 07, 2021) ##
27
+ * Allow entirely opting out of deprecation warnings.
219
28
 
220
- * Change `IPAddr#to_json` to match the behavior of the json gem returning the string representation
221
- 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.
222
32
 
223
- Before:
33
+ Now, you can make `ActiveSupport::Deprecation.warn` a no-op:
224
34
 
225
35
  ```ruby
226
- IPAddr.new("127.0.0.1").to_json
227
- # => "{\"addr\":2130706433,\"family\":2,\"mask_addr\":4294967295}"
36
+ config.active_support.report_deprecations = false
228
37
  ```
229
38
 
230
- After:
39
+ This is the default in production for new apps. It is the equivalent to:
231
40
 
232
41
  ```ruby
233
- IPAddr.new("127.0.0.1").to_json
234
- # => "\"127.0.0.1\""
42
+ config.active_support.deprecation = :silence
43
+ config.active_support.disallowed_deprecation = :silence
235
44
  ```
236
45
 
46
+ but will take a more optimised code path.
237
47
 
238
- ## Rails 6.1.0 (December 09, 2020) ##
239
-
240
- * Ensure `MemoryStore` disables compression by default. Reverts behavior of
241
- `MemoryStore` to its prior rails `5.1` behavior.
242
-
243
- *Max Gurewitz*
244
-
245
- * Calling `iso8601` on negative durations retains the negative sign on individual
246
- digits instead of prepending it.
247
-
248
- This change is required so we can interoperate with PostgreSQL, which prefers
249
- negative signs for each component.
250
-
251
- Compatibility with other iso8601 parsers which support leading negatives as well
252
- as negatives per component is still retained.
253
-
254
- Before:
255
-
256
- (-1.year - 1.day).iso8601
257
- # => "-P1Y1D"
258
-
259
- After:
260
-
261
- (-1.year - 1.day).iso8601
262
- # => "P-1Y-1D"
263
-
264
- *Vipul A M*
265
-
266
- * Remove deprecated `ActiveSupport::Notifications::Instrumenter#end=`.
267
-
268
- *Rafael Mendonça França*
269
-
270
- * Deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
271
-
272
- *Rafael Mendonça França*
273
-
274
- * Remove deprecated `ActiveSupport::Multibyte::Unicode.pack_graphemes`,
275
- `ActiveSupport::Multibyte::Unicode.unpack_graphemes`,
276
- `ActiveSupport::Multibyte::Unicode.normalize`,
277
- `ActiveSupport::Multibyte::Unicode.downcase`,
278
- `ActiveSupport::Multibyte::Unicode.upcase` and `ActiveSupport::Multibyte::Unicode.swapcase`.
279
-
280
- *Rafael Mendonça França*
281
-
282
- * Remove deprecated `ActiveSupport::Multibyte::Chars#consumes?` and `ActiveSupport::Multibyte::Chars#normalize`.
283
-
284
- *Rafael Mendonça França*
285
-
286
- * Remove deprecated file `active_support/core_ext/range/include_range`.
287
-
288
- *Rafael Mendonça França*
289
-
290
- * Remove deprecated file `active_support/core_ext/hash/transform_values`.
291
-
292
- *Rafael Mendonça França*
293
-
294
- * Remove deprecated file `active_support/core_ext/hash/compact`.
295
-
296
- *Rafael Mendonça França*
297
-
298
- * Remove deprecated file `active_support/core_ext/array/prepend_and_append`.
299
-
300
- *Rafael Mendonça França*
301
-
302
- * Remove deprecated file `active_support/core_ext/numeric/inquiry`.
303
-
304
- *Rafael Mendonça França*
305
-
306
- * Remove deprecated file `active_support/core_ext/module/reachable`.
307
-
308
- *Rafael Mendonça França*
309
-
310
- * Remove deprecated `Module#parent_name`, `Module#parent` and `Module#parents`.
311
-
312
- *Rafael Mendonça França*
313
-
314
- * Remove deprecated `ActiveSupport::LoggerThreadSafeLevel#after_initialize`.
315
-
316
- *Rafael Mendonça França*
317
-
318
- * Remove deprecated `LoggerSilence` constant.
319
-
320
- *Rafael Mendonça França*
321
-
322
- * Remove deprecated fallback to `I18n.default_local` when `config.i18n.fallbacks` is empty.
323
-
324
- *Rafael Mendonça França*
325
-
326
- * Remove entries from local cache on `RedisCacheStore#delete_matched`
327
-
328
- Fixes #38627
329
-
330
- *ojab*
48
+ *Alex Ghiculescu*
331
49
 
332
- * Speed up `ActiveSupport::SecurityUtils.fixed_length_secure_compare` by using
333
- `OpenSSL.fixed_length_secure_compare`, if available.
50
+ * Faster tests by parallelizing only when overhead is justified by the number
51
+ of them.
334
52
 
335
- *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.
336
56
 
337
- * `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:
338
59
 
339
60
  ```ruby
340
- config.cache_store = :mem_cache_store
341
-
342
- # is now equivalent to
343
-
344
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
345
-
346
- # instead of
347
-
348
- config.cache_store = :mem_cache_store, "localhost:11211" # ignores ENV["MEMCACHE_SERVERS"]
61
+ config.active_support.test_parallelization_threshold = 100
349
62
  ```
350
63
 
351
- *Sam Bostock*
352
-
353
- * `ActiveSupport::Subscriber#attach_to` now accepts an `inherit_all:` argument. When set to true,
354
- 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:
355
65
 
356
66
  ```ruby
357
- class ActionControllerSubscriber < ActiveSupport::Subscriber
358
- attach_to :action_controller
359
-
360
- def start_processing(event)
361
- info "Processing by #{event.payload[:controller]}##{event.payload[:action]} as #{format}"
362
- end
363
-
364
- def redirect_to(event)
365
- info { "Redirected to #{event.payload[:location]}" }
366
- end
367
- end
368
-
369
- # We detach ActionControllerSubscriber from the :action_controller namespace so that our CustomActionControllerSubscriber
370
- # can provide its own instrumentation for certain events in the namespace
371
- ActionControllerSubscriber.detach_from(:action_controller)
372
-
373
- class CustomActionControllerSubscriber < ActionControllerSubscriber
374
- attach_to :action_controller, inherit_all: true
375
-
376
- def start_processing(event)
377
- info "A custom response to start_processing events"
378
- end
379
-
380
- # => CustomActionControllerSubscriber will process events for "start_processing.action_controller" notifications
381
- # using its own #start_processing implementation, while retaining ActionControllerSubscriber's instrumentation
382
- # for "redirect_to.action_controller" notifications
67
+ class ActiveSupport::TestCase
68
+ parallelize threshold: 100
383
69
  end
384
70
  ```
385
71
 
386
- *Adrianna Chang*
387
-
388
- * Allow the digest class used to generate non-sensitive digests to be configured with `config.active_support.hash_digest_class`.
72
+ *Jorge Manrubia*
389
73
 
390
- `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.
391
75
 
392
76
  *Dirkjan Bussink*
393
77
 
394
- * Fix bug to make memcached write_entry expire correctly with unless_exist
395
-
396
- *Jye Lee*
397
-
398
- * Add `ActiveSupport::Duration` conversion methods
399
-
400
- `in_seconds`, `in_minutes`, `in_hours`, `in_days`, `in_weeks`, `in_months`, and `in_years` return the respective duration covered.
401
-
402
- *Jason York*
403
-
404
- * Fixed issue in `ActiveSupport::Cache::RedisCacheStore` not passing options
405
- to `read_multi` causing `fetch_multi` to not work properly
406
-
407
- *Rajesh Sharma*
408
-
409
- * Fixed issue in `ActiveSupport::Cache::MemCacheStore` which caused duplicate compression,
410
- and caused the provided `compression_threshold` to not be respected.
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`.
411
81
 
412
- *Max Gurewitz*
413
-
414
- * Prevent `RedisCacheStore` and `MemCacheStore` from performing compression
415
- when reading entries written with `raw: true`.
416
-
417
- *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
+ ```
418
86
 
419
- * `URI.parser` is deprecated and will be removed in Rails 7.0. Use
420
- `URI::DEFAULT_PARSER` instead.
87
+ *Steve Laing*
421
88
 
422
- *Jean Boussier*
423
-
424
- * `require_dependency` has been documented to be _obsolete_ in `:zeitwerk`
425
- mode. The method is not deprecated as such (yet), but applications are
426
- encouraged to not use it.
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.
427
92
 
428
- In `:zeitwerk` mode, semantics match Ruby's and you do not need to be
429
- defensive with load order. Just refer to classes and modules normally. If
430
- the constant name is dynamic, camelize if needed, and constantize.
93
+ Fixes [#42467](https://github.com/rails/rails/issues/42467).
431
94
 
432
- *Xavier Noria*
95
+ *Alex Ghiculescu*
433
96
 
434
- * Add 3rd person aliases of `Symbol#start_with?` and `Symbol#end_with?`.
97
+ * Allow serializing any module or class to JSON by name.
435
98
 
436
- ```ruby
437
- :foo.starts_with?("f") # => true
438
- :foo.ends_with?("o") # => true
439
- ```
99
+ *Tyler Rick*, *Zachary Scott*
440
100
 
441
- *Ryuta Kamizono*
101
+ * Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the
102
+ `RAILS_MASTER_KEY` environment variable is blank (e.g. `""`).
442
103
 
443
- * Add override of unary plus for `ActiveSupport::Duration`.
104
+ *Sunny Ripert*
444
105
 
445
- `+ 1.second` is now identical to `+1.second` to prevent errors
446
- where a seemingly innocent change of formatting leads to a change in the code behavior.
106
+ * The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`.
447
107
 
448
- Before:
449
- ```ruby
450
- +1.second.class
451
- # => ActiveSupport::Duration
452
- (+ 1.second).class
453
- # => Integer
454
- ```
108
+ It permits asserting on the initial value that is expected not to change.
455
109
 
456
- After:
457
110
  ```ruby
458
- +1.second.class
459
- # => ActiveSupport::Duration
460
- (+ 1.second).class
461
- # => ActiveSupport::Duration
111
+ assert_no_changes -> { Status.all_good? }, from: true do
112
+ post :create, params: { status: { ok: true } }
113
+ end
462
114
  ```
463
115
 
464
- Fixes #39079.
465
-
466
- *Roman Kushnir*
116
+ *George Claghorn*
467
117
 
468
- * Add subsec to `ActiveSupport::TimeWithZone#inspect`.
118
+ * Deprecate `ActiveSupport::SafeBuffer`'s incorrect implicit conversion of objects into string.
469
119
 
470
- Before:
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.
471
125
 
472
- Time.at(1498099140).in_time_zone.inspect
473
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
474
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
475
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
476
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
477
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
478
-
479
- After:
126
+ *Jean Boussier*
480
127
 
481
- Time.at(1498099140).in_time_zone.inspect
482
- # => "Thu, 22 Jun 2017 02:39:00.000000000 UTC +00:00"
483
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
484
- # => "Thu, 22 Jun 2017 02:39:00.123456780 UTC +00:00"
485
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
486
- # => "Thu, 22 Jun 2017 02:39:00.333333333 UTC +00:00"
128
+ * Allow nested access to keys on `Rails.application.credentials`.
487
129
 
488
- *akinomaeni*
130
+ Previously only top level keys in `credentials.yml.enc` could be accessed with method calls. Now any key can.
489
131
 
490
- * Calling `ActiveSupport::TaggedLogging#tagged` without a block now returns a tagged logger.
132
+ For example, given these secrets:
491
133
 
492
- ```ruby
493
- logger.tagged("BCX").info("Funky time!") # => [BCX] Funky time!
134
+ ```yml
135
+ aws:
136
+ access_key_id: 123
137
+ secret_access_key: 345
494
138
  ```
495
139
 
496
- *Eugene Kenny*
497
-
498
- * Align `Range#cover?` extension behavior with Ruby behavior for backwards ranges.
499
-
500
- `(1..10).cover?(5..3)` now returns `false`, as it does in plain Ruby.
140
+ `Rails.application.credentials.aws.access_key_id` will now return the same thing as
141
+ `Rails.application.credentials.aws[:access_key_id]`.
501
142
 
502
- Also update `#include?` and `#===` behavior to match.
503
-
504
- *Michael Groeneman*
143
+ *Alex Ghiculescu*
505
144
 
506
- * Update to TZInfo v2.0.0.
145
+ * Added a faster and more compact `ActiveSupport::Cache` serialization format.
507
146
 
508
- This changes the output of `ActiveSupport::TimeZone.utc_to_local`, but
509
- can be controlled with the
510
- `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.
511
152
 
512
- New Rails 6.1 apps have it enabled by default, existing apps can upgrade
513
- via the config in config/initializers/new_framework_defaults_6_1.rb
153
+ *Jean Boussier*
514
154
 
515
- 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.
516
158
 
517
- *Phil Ross*, *Jared Beck*
159
+ *Asherah Connor*
518
160
 
519
- * Add Date and Time `#yesterday?` and `#tomorrow?` alongside `#today?`.
161
+ * Freeze `ActiveSupport::Duration#parts` and remove writer methods.
520
162
 
521
- 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.
522
164
 
523
- *Jatin Dhankhar*
165
+ *Andrew White*
524
166
 
525
- * Add `Enumerable#pick` to complement `ActiveRecord::Relation#pick`.
167
+ * Fix `ActiveSupport::TimeZone#utc_to_local` with fractional seconds.
526
168
 
527
- *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.
528
173
 
529
- * [Breaking change] `ActiveSupport::Callbacks#halted_callback_hook` now receive a 2nd argument:
174
+ *Andrew White*
530
175
 
531
- `ActiveSupport::Callbacks#halted_callback_hook` now receive the name of the callback
532
- being halted as second argument.
533
- This change will allow you to differentiate which callbacks halted the chain
534
- and act accordingly.
176
+ * Add `expires_at` argument to `ActiveSupport::Cache` `write` and `fetch` to set a cache entry TTL as an absolute time.
535
177
 
536
178
  ```ruby
537
- class Book < ApplicationRecord
538
- before_save { throw(:abort) }
539
- before_create { throw(:abort) }
540
-
541
- def halted_callback_hook(filter, callback_name)
542
- Rails.logger.info("Book couldn't be #{callback_name}d")
543
- end
544
-
545
- Book.create # => "Book couldn't be created"
546
- book.save # => "Book couldn't be saved"
547
- end
179
+ Rails.cache.write(key, value, expires_at: Time.now.at_end_of_hour)
548
180
  ```
549
181
 
550
- *Edouard Chin*
551
-
552
- * Support `prepend` with `ActiveSupport::Concern`.
553
-
554
- Allows a module with `extend ActiveSupport::Concern` to be prepended.
555
-
556
- module Imposter
557
- extend ActiveSupport::Concern
558
-
559
- # Same as `included`, except only run when prepended.
560
- prepended do
561
- end
562
- end
563
-
564
- class Person
565
- prepend Imposter
566
- end
567
-
568
- Class methods are prepended to the base class, concerning is also
569
- updated: `concerning :Imposter, prepend: true do`.
182
+ *Jean Boussier*
570
183
 
571
- *Jason Karns*, *Elia Schito*
184
+ * Deprecate `ActiveSupport::TimeWithZone.name` so that from Rails 7.1 it will use the default implementation.
572
185
 
573
- * Deprecate using `Range#include?` method to check the inclusion of a value
574
- in a date time range. It is recommended to use `Range#cover?` method
575
- instead of `Range#include?` to check the inclusion of a value
576
- in a date time range.
186
+ *Andrew White*
577
187
 
578
- *Vishal Telangre*
188
+ * Deprecates Rails custom `Enumerable#sum` and `Array#sum` in favor of Ruby's native implementation which
189
+ is considerably faster.
579
190
 
580
- * 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:
581
192
 
582
193
  ```ruby
583
- number_to_currency(1234567890.50, precision: 0, round_mode: :half_down) # => "$1,234,567,890"
584
- number_to_percentage(302.24398923423, precision: 5, round_mode: :down) # => "302.24398%"
585
- number_to_rounded(389.32314, precision: 0, round_mode: :ceil) # => "390"
586
- number_to_human_size(483989, precision: 2, round_mode: :up) # => "480 KB"
587
- number_to_human(489939, precision: 2, round_mode: :floor) # => "480 Thousand"
194
+ %w[foo bar].sum('')
195
+ # instead of %w[foo bar].sum
588
196
 
589
- 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
590
199
  ```
591
200
 
592
- *Tom Lord*
593
-
594
- * `Array#to_sentence` no longer returns a frozen string.
201
+ *Alberto Mota*
595
202
 
596
- Before:
203
+ * Tests parallelization is now disabled when running individual files to prevent the setup overhead.
597
204
 
598
- ['one', 'two'].to_sentence.frozen?
599
- # => true
205
+ It can still be enforced if the environment variable `PARALLEL_WORKERS` is present and set to a value greater than 1.
600
206
 
601
- After:
207
+ *Ricardo Díaz*
602
208
 
603
- ['one', 'two'].to_sentence.frozen?
604
- # => false
209
+ * Fix proxying keyword arguments in `ActiveSupport::CurrentAttributes`.
605
210
 
606
- *Nicolas Dular*
211
+ *Marcin Kołodziej*
607
212
 
608
- * 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.
609
- 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.
610
215
 
611
216
  ```ruby
612
- duration = ActiveSupport::Duration.build(1000000)
613
- # 1 week, 4 days, 13 hours, 46 minutes, and 40.0 seconds
217
+ payments = [Payment.new(5), Payment.new(15), Payment.new(10)]
614
218
 
615
- duration_iso = duration.iso8601
616
- # P11DT13H46M40S
617
-
618
- ActiveSupport::Duration.parse(duration_iso)
619
- # 11 days, 13 hours, 46 minutes, and 40 seconds
620
-
621
- duration = ActiveSupport::Duration.build(604800)
622
- # 1 week
623
-
624
- duration_iso = duration.iso8601
625
- # P1W
626
-
627
- ActiveSupport::Duration.parse(duration_iso)
628
- # 1 week
219
+ payments.minimum(:price) # => 5
220
+ payments.maximum(:price) # => 15
629
221
  ```
630
222
 
631
- *Abhishek Sarkar*
632
-
633
- * Add block support to `ActiveSupport::Testing::TimeHelpers#travel_back`.
634
-
635
- *Tim Masliuchenko*
636
-
637
- * Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when
638
- `ActiveSupport.parse_json_times = true`.
639
-
640
- *Christian Gregg*
641
-
642
- * Support symbolic links for `content_path` in `ActiveSupport::EncryptedFile`.
643
-
644
- *Takumi Shotoku*
645
-
646
- * Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
647
- and endless range targets.
648
-
649
- *Allen Hsu*, *Andrew Hodgkinson*
650
-
651
- * Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
652
-
653
- *Iain Beeston*
654
-
655
- * Prevent `ActiveSupport::Duration.build(value)` from creating instances of
656
- `ActiveSupport::Duration` unless `value` is of type `Numeric`.
657
-
658
- Addresses the errant set of behaviours described in #37012 where
659
- `ActiveSupport::Duration` comparisons would fail confusingly
660
- or return unexpected results when comparing durations built from instances of `String`.
661
-
662
- Before:
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.
663
225
 
664
- small_duration_from_string = ActiveSupport::Duration.build('9')
665
- large_duration_from_string = ActiveSupport::Duration.build('100000000000000')
666
- small_duration_from_int = ActiveSupport::Duration.build(9)
226
+ *Ayrton De Craene*
667
227
 
668
- large_duration_from_string > small_duration_from_string
669
- # => false
670
-
671
- small_duration_from_string == small_duration_from_int
672
- # => false
673
-
674
- small_duration_from_int < large_duration_from_string
675
- # => ArgumentError (comparison of ActiveSupport::Duration::Scalar with ActiveSupport::Duration failed)
676
-
677
- large_duration_from_string > small_duration_from_int
678
- # => ArgumentError (comparison of String with ActiveSupport::Duration failed)
679
-
680
- After:
681
-
682
- small_duration_from_string = ActiveSupport::Duration.build('9')
683
- # => TypeError (can't build an ActiveSupport::Duration from a String)
684
-
685
- *Alexei Emam*
686
-
687
- * Add `ActiveSupport::Cache::Store#delete_multi` method to delete multiple keys from the cache store.
688
-
689
- *Peter Zhu*
690
-
691
- * Support multiple arguments in `HashWithIndifferentAccess` for `merge` and `update` methods, to
692
- follow Ruby 2.6 addition.
693
-
694
- *Wojciech Wnętrzak*
695
-
696
- * Allow initializing `thread_mattr_*` attributes via `:default` option.
697
-
698
- class Scraper
699
- thread_mattr_reader :client, default: Api::Client.new
700
- end
701
-
702
- *Guilherme Mansur*
703
-
704
- * Add `compact_blank` for those times when you want to remove #blank? values from
705
- an Enumerable (also `compact_blank!` on Hash, Array, ActionController::Parameters).
706
-
707
- *Dana Sherson*
708
-
709
- * Make ActiveSupport::Logger Fiber-safe.
710
-
711
- Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
712
- to make log level local to Ruby Fibers in addition to Threads.
713
-
714
- Example:
715
-
716
- logger = ActiveSupport::Logger.new(STDOUT)
717
- logger.level = 1
718
- puts "Main is debug? #{logger.debug?}"
719
-
720
- Fiber.new {
721
- logger.local_level = 0
722
- puts "Thread is debug? #{logger.debug?}"
723
- }.resume
724
-
725
- puts "Main is debug? #{logger.debug?}"
228
+ * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
726
229
 
727
- Before:
230
+ ```ruby
231
+ config.cache_store = :mem_cache_store, nil
728
232
 
729
- Main is debug? false
730
- Thread is debug? true
731
- Main is debug? true
233
+ # is now equivalent to
732
234
 
733
- After:
235
+ config.cache_store = :mem_cache_store
734
236
 
735
- Main is debug? false
736
- Thread is debug? true
737
- Main is debug? false
237
+ # and is also equivalent to
738
238
 
739
- Fixes #36752.
239
+ config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
740
240
 
741
- *Alexander Varnin*
241
+ # which is the fallback behavior of Dalli
242
+ ```
742
243
 
743
- * Allow the `on_rotation` proc used when decrypting/verifying a message to be
744
- passed at the constructor level.
244
+ This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
745
245
 
746
- Before:
246
+ *Michael Overmeyer*
747
247
 
748
- crypt = ActiveSupport::MessageEncryptor.new('long_secret')
749
- crypt.decrypt_and_verify(encrypted_message, on_rotation: proc { ... })
750
- 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.
751
249
 
752
- After:
250
+ *DHH*
753
251
 
754
- crypt = ActiveSupport::MessageEncryptor.new('long_secret', on_rotation: proc { ... })
755
- crypt.decrypt_and_verify(encrypted_message)
756
- 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.
757
254
 
758
- *Edouard Chin*
255
+ *Alex Ghiculescu*
759
256
 
760
- * `delegate_missing_to` would raise a `DelegationError` if the object
761
- delegated to was `nil`. Now the `allow_nil` option has been added to enable
762
- 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.
763
259
 
764
- *Matthew Tanous*
260
+ *Vipul A M*
765
261
 
766
- * `truncate` would return the original string if it was too short to be truncated
767
- and a frozen string if it were long enough to be truncated. Now truncate will
768
- consistently return an unfrozen string regardless. This behavior is consistent
769
- with `gsub` and `strip`.
262
+ * `HashWithIndifferentAccess#deep_transform_keys` now returns a `HashWithIndifferentAccess` instead of a `Hash`.
770
263
 
771
- Before:
264
+ *Nathaniel Woodthorpe*
772
265
 
773
- 'foobar'.truncate(5).frozen?
774
- # => true
775
- 'foobar'.truncate(6).frozen?
776
- # => false
266
+ * Consume dalli’s `cache_nils` configuration as `ActiveSupport::Cache`'s `skip_nil` when using `MemCacheStore`.
777
267
 
778
- After:
268
+ *Ritikesh G*
779
269
 
780
- 'foobar'.truncate(5).frozen?
781
- # => false
782
- 'foobar'.truncate(6).frozen?
783
- # => false
270
+ * Add `RedisCacheStore#stats` method similar to `MemCacheStore#stats`. Calls `redis#info` internally.
784
271
 
785
- *Jordan Thomas*
272
+ *Ritikesh G*
786
273
 
787
274
 
788
- 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.