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