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