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