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