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