activesupport 7.1.5.1 → 7.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +113 -1178
  3. data/lib/active_support/array_inquirer.rb +1 -1
  4. data/lib/active_support/backtrace_cleaner.rb +10 -3
  5. data/lib/active_support/broadcast_logger.rb +18 -19
  6. data/lib/active_support/cache/file_store.rb +15 -10
  7. data/lib/active_support/cache/mem_cache_store.rb +16 -74
  8. data/lib/active_support/cache/memory_store.rb +2 -1
  9. data/lib/active_support/cache/redis_cache_store.rb +16 -13
  10. data/lib/active_support/cache/serializer_with_fallback.rb +0 -23
  11. data/lib/active_support/cache.rb +59 -67
  12. data/lib/active_support/callbacks.rb +74 -113
  13. data/lib/active_support/code_generator.rb +10 -15
  14. data/lib/active_support/core_ext/array/conversions.rb +0 -2
  15. data/lib/active_support/core_ext/class/subclasses.rb +15 -35
  16. data/lib/active_support/core_ext/date/blank.rb +4 -0
  17. data/lib/active_support/core_ext/date/conversions.rb +0 -2
  18. data/lib/active_support/core_ext/date_and_time/compatibility.rb +12 -9
  19. data/lib/active_support/core_ext/date_time/blank.rb +4 -0
  20. data/lib/active_support/core_ext/date_time/compatibility.rb +3 -5
  21. data/lib/active_support/core_ext/date_time/conversions.rb +0 -4
  22. data/lib/active_support/core_ext/erb/util.rb +5 -0
  23. data/lib/active_support/core_ext/hash/keys.rb +4 -4
  24. data/lib/active_support/core_ext/module/attr_internal.rb +17 -6
  25. data/lib/active_support/core_ext/module/delegation.rb +20 -163
  26. data/lib/active_support/core_ext/module/deprecation.rb +1 -4
  27. data/lib/active_support/core_ext/numeric/conversions.rb +3 -3
  28. data/lib/active_support/core_ext/object/blank.rb +45 -1
  29. data/lib/active_support/core_ext/object/instance_variables.rb +11 -19
  30. data/lib/active_support/core_ext/object/json.rb +4 -6
  31. data/lib/active_support/core_ext/object/with.rb +5 -3
  32. data/lib/active_support/core_ext/pathname/blank.rb +4 -0
  33. data/lib/active_support/core_ext/range/overlap.rb +1 -1
  34. data/lib/active_support/core_ext/string/conversions.rb +1 -1
  35. data/lib/active_support/core_ext/string/filters.rb +1 -1
  36. data/lib/active_support/core_ext/string/output_safety.rb +0 -7
  37. data/lib/active_support/core_ext/time/calculations.rb +12 -27
  38. data/lib/active_support/core_ext/time/compatibility.rb +2 -3
  39. data/lib/active_support/core_ext/time/conversions.rb +0 -2
  40. data/lib/active_support/core_ext.rb +0 -1
  41. data/lib/active_support/current_attributes.rb +33 -40
  42. data/lib/active_support/delegation.rb +188 -0
  43. data/lib/active_support/dependencies/autoload.rb +0 -12
  44. data/lib/active_support/deprecation/constant_accessor.rb +1 -3
  45. data/lib/active_support/deprecation/proxy_wrappers.rb +9 -12
  46. data/lib/active_support/deprecation/reporting.rb +9 -4
  47. data/lib/active_support/deprecation.rb +8 -5
  48. data/lib/active_support/descendants_tracker.rb +9 -87
  49. data/lib/active_support/duration/iso8601_parser.rb +2 -2
  50. data/lib/active_support/duration/iso8601_serializer.rb +1 -2
  51. data/lib/active_support/duration.rb +11 -6
  52. data/lib/active_support/error_reporter.rb +41 -3
  53. data/lib/active_support/evented_file_update_checker.rb +0 -1
  54. data/lib/active_support/execution_wrapper.rb +0 -1
  55. data/lib/active_support/file_update_checker.rb +1 -1
  56. data/lib/active_support/fork_tracker.rb +2 -38
  57. data/lib/active_support/gem_version.rb +3 -3
  58. data/lib/active_support/hash_with_indifferent_access.rb +6 -8
  59. data/lib/active_support/html_safe_translation.rb +3 -0
  60. data/lib/active_support/log_subscriber.rb +0 -12
  61. data/lib/active_support/logger.rb +15 -2
  62. data/lib/active_support/message_pack/extensions.rb +15 -2
  63. data/lib/active_support/multibyte/chars.rb +2 -2
  64. data/lib/active_support/notifications/fanout.rb +4 -7
  65. data/lib/active_support/notifications/instrumenter.rb +21 -18
  66. data/lib/active_support/notifications.rb +28 -27
  67. data/lib/active_support/number_helper/number_converter.rb +2 -2
  68. data/lib/active_support/option_merger.rb +2 -2
  69. data/lib/active_support/ordered_options.rb +53 -15
  70. data/lib/active_support/proxy_object.rb +8 -5
  71. data/lib/active_support/railtie.rb +4 -11
  72. data/lib/active_support/string_inquirer.rb +1 -1
  73. data/lib/active_support/syntax_error_proxy.rb +11 -1
  74. data/lib/active_support/test_case.rb +3 -1
  75. data/lib/active_support/testing/assertions.rb +4 -4
  76. data/lib/active_support/testing/constant_stubbing.rb +30 -8
  77. data/lib/active_support/testing/deprecation.rb +5 -12
  78. data/lib/active_support/testing/isolation.rb +18 -8
  79. data/lib/active_support/testing/method_call_assertions.rb +2 -16
  80. data/lib/active_support/testing/strict_warnings.rb +5 -4
  81. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  82. data/lib/active_support/time_with_zone.rb +9 -10
  83. data/lib/active_support/values/time_zone.rb +1 -1
  84. data/lib/active_support/xml_mini.rb +11 -2
  85. data/lib/active_support.rb +7 -8
  86. metadata +20 -70
  87. data/lib/active_support/deprecation/instance_delegator.rb +0 -65
  88. data/lib/active_support/ruby_features.rb +0 -7
data/CHANGELOG.md CHANGED
@@ -1,1301 +1,236 @@
1
- ## Rails 7.1.5.1 (December 10, 2024) ##
1
+ ## Rails 7.2.0.beta1 (May 29, 2024) ##
2
2
 
3
- * No changes.
3
+ * Support `duration` type in `ActiveSupport::XmlMini`.
4
4
 
5
+ *heka1024*
5
6
 
6
- ## Rails 7.1.5 (October 30, 2024) ##
7
+ * Remove deprecated `ActiveSupport::Notifications::Event#children` and `ActiveSupport::Notifications::Event#parent_of?`.
7
8
 
8
- * No changes.
9
-
10
-
11
- ## Rails 7.1.4.2 (October 23, 2024) ##
12
-
13
- * No changes.
14
-
15
-
16
- ## Rails 7.1.4.1 (October 15, 2024) ##
17
-
18
- * No changes.
19
-
20
-
21
- ## Rails 7.1.4 (August 22, 2024) ##
22
-
23
- * Improve compatibility for `ActiveSupport::BroadcastLogger`.
24
-
25
- *Máximo Mussini*
26
-
27
- * Pass options along to write_entry in handle_expired_entry method.
28
-
29
- *Graham Cooper*
30
-
31
- * Fix Active Support configurations deprecations.
32
-
33
- *fatkodima*
34
-
35
- * Fix teardown callbacks.
36
-
37
- *Tristan Starck*
38
-
39
- * `BacktraceCleaner` silence core internal methods by default.
40
-
41
- *Jean Boussier*
42
-
43
- * Fix `delegate_missing_to allow_nil: true` when called with implict self
44
-
45
- ```ruby
46
- class Person
47
- delegate_missing_to :address, allow_nil: true
48
-
49
- def address
50
- nil
51
- end
52
-
53
- def berliner?
54
- city == "Berlin"
55
- end
56
- end
57
-
58
- Person.new.city # => nil
59
- Person.new.berliner? # undefined local variable or method `city' for an instance of Person (NameError)
60
- ```
61
-
62
- *Jean Boussier*
63
-
64
- * Work around a Ruby bug that can cause a VM crash.
65
-
66
- This would happen if using `TaggerLogger` with a Proc
67
- formatter on which you called `object_id`.
68
-
69
- ```
70
- [BUG] Object ID seen, but not in mapping table: proc
71
- ```
72
-
73
- *Jean Boussier*
74
-
75
- * Fix `ActiveSupport::Notifications.publish_event` to preserve units.
76
-
77
- This solves the incorrect reporting of time spent running Active Record
78
- asynchronous queries (by a factor `1000`).
79
-
80
- *Jean Boussier*
81
-
82
-
83
- ## Rails 7.1.3.4 (June 04, 2024) ##
84
-
85
- * No changes.
86
-
87
-
88
- ## Rails 7.1.3.3 (May 16, 2024) ##
89
-
90
- * No changes.
91
-
92
-
93
- ## Rails 7.1.3.2 (February 21, 2024) ##
94
-
95
- * No changes.
96
-
97
-
98
- ## Rails 7.1.3.1 (February 21, 2024) ##
99
-
100
- * No changes.
101
-
102
-
103
- ## Rails 7.1.3 (January 16, 2024) ##
104
-
105
- * Handle nil `backtrace_locations` in `ActiveSupport::SyntaxErrorProxy`.
106
-
107
- *Eugene Kenny*
108
-
109
- * Fix `ActiveSupport::JSON.encode` to prevent duplicate keys.
110
-
111
- If the same key exist in both String and Symbol form it could
112
- lead to the same key being emitted twice.
113
-
114
- *Manish Sharma*
115
-
116
- * Fix `ActiveSupport::Cache::Store#read_multi` when using a cache namespace
117
- and local cache strategy.
118
-
119
- *Mark Oleson*
120
-
121
- * Fix `Time.now/DateTime.now/Date.today` to return results in a system timezone after `#travel_to`.
122
-
123
- There is a bug in the current implementation of #travel_to:
124
- it remembers a timezone of its argument, and all stubbed methods start
125
- returning results in that remembered timezone. However, the expected
126
- behaviour is to return results in a system timezone.
127
-
128
- *Aleksei Chernenkov*
129
-
130
- * Fix `:unless_exist` option for `MemoryStore#write` (et al) when using a
131
- cache namespace.
132
-
133
- *S. Brent Faulkner*
134
-
135
- * Fix ActiveSupport::Deprecation to handle blaming generated code.
136
-
137
- *Jean Boussier*, *fatkodima*
138
-
139
-
140
- ## Rails 7.1.2 (November 10, 2023) ##
141
-
142
- * Fix `:expires_in` option for `RedisCacheStore#write_multi`.
143
-
144
- *fatkodima*
145
-
146
- * Fix deserialization of non-string "purpose" field in Message serializer
147
-
148
- *Jacopo Beschi*
149
-
150
- * Prevent global cache options being overwritten when setting dynamic options
151
- inside a `ActiveSupport::Cache::Store#fetch` block.
152
-
153
- *Yasha Krasnou*
154
-
155
- * Fix missing `require` resulting in `NoMethodError` when running
156
- `bin/rails secrets:show` or `bin/rails secrets:edit`.
157
-
158
- *Stephen Ierodiaconou*
159
-
160
- * Ensure `{down,up}case_first` returns non-frozen string.
161
-
162
- *Jonathan Hefner*
163
-
164
- * Fix `#to_fs(:human_size)` to correctly work with negative numbers.
165
-
166
- *Earlopain*
167
-
168
- * Fix `BroadcastLogger#dup` so that it duplicates the logger's `broadcasts`.
169
-
170
- *Andrew Novoselac*
171
-
172
- * Fix issue where `bootstrap.rb` overwrites the `level` of a `BroadcastLogger`'s `broadcasts`.
173
-
174
- *Andrew Novoselac*
175
-
176
- * Fix `ActiveSupport::Cache` to handle outdated Marshal payload from Rails 6.1 format.
177
-
178
- Active Support's Cache is supposed to treat a Marshal payload that can no longer be
179
- deserialized as a cache miss. It fail to do so for compressed payload in the Rails 6.1
180
- legacy format.
181
-
182
- *Jean Boussier*
183
-
184
- * Fix `OrderedOptions#dig` for array indexes.
185
-
186
- *fatkodima*
187
-
188
- * Fix time travel helpers to work when nested using with separate classes.
189
-
190
- *fatkodima*
191
-
192
- * Fix `delete_matched` for file cache store to work with keys longer than the
193
- max filename size.
194
-
195
- *fatkodima* and *Jonathan Hefner*
196
-
197
- * Fix compatibility with the `semantic_logger` gem.
198
-
199
- The `semantic_logger` gem doesn't behave exactly like stdlib logger in that
200
- `SemanticLogger#level` returns a Symbol while stdlib `Logger#level` returns an Integer.
201
-
202
- This caused the various `LogSubscriber` classes in Rails to break when assigned a
203
- `SemanticLogger` instance.
204
-
205
- *Jean Boussier*, *ojab*
206
-
207
- ## Rails 7.1.1 (October 11, 2023) ##
208
-
209
- * Add support for keyword arguments when delegating calls to custom loggers from `ActiveSupport::BroadcastLogger`.
210
-
211
- *Edouard Chin*
212
-
213
- * `NumberHelper`: handle objects responding `to_d`.
214
-
215
- *fatkodima*
216
-
217
- * Fix RedisCacheStore to properly set the TTL when incrementing or decrementing.
218
-
219
- This bug was only impacting Redis server older than 7.0.
220
-
221
- *Thomas Countz*
222
-
223
- * Fix MemoryStore to prevent race conditions when incrementing or decrementing.
224
-
225
- *Pierre Jambet*
226
-
227
-
228
- ## Rails 7.1.0 (October 05, 2023) ##
229
-
230
- * No changes.
231
-
232
-
233
- ## Rails 7.1.0.rc2 (October 01, 2023) ##
234
-
235
- * Fix `AS::MessagePack` with `ENV["RAILS_MAX_THREADS"]`.
236
-
237
- *Jonathan Hefner*
238
-
239
-
240
- ## Rails 7.1.0.rc1 (September 27, 2023) ##
241
-
242
- * Add a new public API for broadcasting logs
243
-
244
- This feature existed for a while but was until now a private API.
245
- Broadcasting log allows to send log message to difference sinks (STDOUT, a file ...) and
246
- is used by default in the development environment to write logs both on STDOUT and in the
247
- "development.log" file.
248
-
249
- Basic usage:
250
-
251
- ```ruby
252
- stdout_logger = Logger.new(STDOUT)
253
- file_logger = Logger.new("development.log")
254
- broadcast = ActiveSupport::BroadcastLogger.new(stdout_logger, file_logger)
255
-
256
- broadcast.info("Hello!") # The "Hello!" message is written on STDOUT and in the log file.
257
- ```
258
-
259
- Adding other sink(s) to the broadcast:
260
-
261
- ```ruby
262
- broadcast = ActiveSupport::BroadcastLogger.new
263
- broadcast.broadcast_to(Logger.new(STDERR))
264
- ```
265
-
266
- Remove a sink from the broadcast:
267
-
268
- ```ruby
269
- stdout_logger = Logger.new(STDOUT)
270
- broadcast = ActiveSupport::BroadcastLogger.new(stdout_logger)
271
-
272
- broadcast.stop_broadcasting_to(stdout_logger)
273
- ```
274
-
275
- *Edouard Chin*
276
-
277
- * Fix Range#overlap? not taking empty ranges into account on Ruby < 3.3
278
-
279
- *Nobuyoshi Nakada*, *Shouichi Kamiya*, *Hartley McGuire*
280
-
281
- * Use Ruby 3.3 Range#overlap? if available
282
-
283
- *Yasuo Honda*
284
-
285
-
286
- ## Rails 7.1.0.beta1 (September 13, 2023) ##
287
-
288
- * Add `bigdecimal` as Active Support dependency that is a bundled gem candidate for Ruby 3.4.
289
-
290
- `bigdecimal` 3.1.4 or higher version will be installed.
291
- Ruby 2.7 and 3.0 users who want `bigdecimal` version 2.0.0 or 3.0.0 behavior as a default gem,
292
- pin the `bigdecimal` version in your application Gemfile.
293
-
294
- *Koichi ITO*
295
-
296
- * Add `drb`, `mutex_m` and `base64` that are bundled gem candidates for Ruby 3.4
297
-
298
- *Yasuo Honda*
299
-
300
- * When using cache format version >= 7.1 or a custom serializer, expired and
301
- version-mismatched cache entries can now be detected without deserializing
302
- their values.
303
-
304
- *Jonathan Hefner*
305
-
306
- * Make all cache stores return a boolean for `#delete`
307
-
308
- Previously the `RedisCacheStore#delete` would return `1` if the entry
309
- exists and `0` otherwise. Now it returns true if the entry exists and false
310
- otherwise, just like the other stores.
311
-
312
- The `FileStore` would return `nil` if the entry doesn't exists and returns
313
- `false` now as well.
314
-
315
- *Petrik de Heus*
316
-
317
- * Active Support cache stores now support replacing the default compressor via
318
- a `:compressor` option. The specified compressor must respond to `deflate`
319
- and `inflate`. For example:
320
-
321
- ```ruby
322
- module MyCompressor
323
- def self.deflate(string)
324
- # compression logic...
325
- end
326
-
327
- def self.inflate(compressed)
328
- # decompression logic...
329
- end
330
- end
331
-
332
- config.cache_store = :redis_cache_store, { compressor: MyCompressor }
333
- ```
334
-
335
- *Jonathan Hefner*
336
-
337
- * Active Support cache stores now support a `:serializer` option. Similar to
338
- the `:coder` option, serializers must respond to `dump` and `load`. However,
339
- serializers are only responsible for serializing a cached value, whereas
340
- coders are responsible for serializing the entire `ActiveSupport::Cache::Entry`
341
- instance. Additionally, the output from serializers can be automatically
342
- compressed, whereas coders are responsible for their own compression.
343
-
344
- Specifying a serializer instead of a coder also enables performance
345
- optimizations, including the bare string optimization introduced by cache
346
- format version 7.1.
347
-
348
- The `:serializer` and `:coder` options are mutually exclusive. Specifying
349
- both will raise an `ArgumentError`.
350
-
351
- *Jonathan Hefner*
352
-
353
- * Fix `ActiveSupport::Inflector.humanize(nil)` raising ``NoMethodError: undefined method `end_with?' for nil:NilClass``.
354
-
355
- *James Robinson*
356
-
357
- * Don't show secrets for `ActiveSupport::KeyGenerator#inspect`.
358
-
359
- Before:
360
-
361
- ```ruby
362
- ActiveSupport::KeyGenerator.new(secret).inspect
363
- "#<ActiveSupport::KeyGenerator:0x0000000104888038 ... @secret=\"\\xAF\\bFh]LV}q\\nl\\xB2U\\xB3 ... >"
364
- ```
365
-
366
- After:
367
-
368
- ```ruby
369
- ActiveSupport::KeyGenerator::Aes256Gcm(secret).inspect
370
- "#<ActiveSupport::KeyGenerator:0x0000000104888038>"
371
- ```
372
-
373
- *Petrik de Heus*
374
-
375
- * Improve error message when EventedFileUpdateChecker is used without a
376
- compatible version of the Listen gem
377
-
378
- *Hartley McGuire*
379
-
380
- * Add `:report` behavior for Deprecation
381
-
382
- Setting `config.active_support.deprecation = :report` uses the error
383
- reporter to report deprecation warnings to `ActiveSupport::ErrorReporter`.
384
-
385
- Deprecations are reported as handled errors, with a severity of `:warning`.
386
-
387
- Useful to report deprecations happening in production to your bug tracker.
388
-
389
- *Étienne Barrié*
390
-
391
- * Rename `Range#overlaps?` to `#overlap?` and add alias for backwards compatibility
392
-
393
- *Christian Schmidt*
394
-
395
- * Fix `EncryptedConfiguration` returning incorrect values for some `Hash`
396
- methods
397
-
398
- *Hartley McGuire*
399
-
400
- * Don't show secrets for `MessageEncryptor#inspect`.
401
-
402
- Before:
403
-
404
- ```ruby
405
- ActiveSupport::MessageEncryptor.new(secret, cipher: "aes-256-gcm").inspect
406
- "#<ActiveSupport::MessageEncryptor:0x0000000104888038 ... @secret=\"\\xAF\\bFh]LV}q\\nl\\xB2U\\xB3 ... >"
407
- ```
408
-
409
- After:
410
-
411
- ```ruby
412
- ActiveSupport::MessageEncryptor.new(secret, cipher: "aes-256-gcm").inspect
413
- "#<ActiveSupport::MessageEncryptor:0x0000000104888038>"
414
- ```
415
-
416
- *Petrik de Heus*
417
-
418
- * Don't show contents for `EncryptedConfiguration#inspect`.
419
-
420
- Before:
421
- ```ruby
422
- Rails.application.credentials.inspect
423
- "#<ActiveSupport::EncryptedConfiguration:0x000000010d2b38e8 ... @config={:secret=>\"something secret\"} ... @key_file_contents=\"915e4ea054e011022398dc242\" ...>"
424
- ```
425
-
426
- After:
427
- ```ruby
428
- Rails.application.credentials.inspect
429
- "#<ActiveSupport::EncryptedConfiguration:0x000000010d2b38e8>"
430
- ```
431
-
432
- *Petrik de Heus*
433
-
434
- * `ERB::Util.html_escape_once` always returns an `html_safe` string.
435
-
436
- This method previously maintained the `html_safe?` property of a string on the return
437
- value. Because this string has been escaped, however, not marking it as `html_safe` causes
438
- entities to be double-escaped.
439
-
440
- As an example, take this view snippet:
441
-
442
- ```html
443
- <p><%= html_escape_once("this & that &amp; the other") %></p>
444
- ```
445
-
446
- Before this change, that would be double-escaped and render as:
447
-
448
- ```html
449
- <p>this &amp;amp; that &amp;amp; the other</p>
450
- ```
451
-
452
- After this change, it renders correctly as:
453
-
454
- ```html
455
- <p>this &amp; that &amp; the other</p>
456
- ```
457
-
458
- Fixes #48256
459
-
460
- *Mike Dalessio*
461
-
462
- * Deprecate `SafeBuffer#clone_empty`.
463
-
464
- This method has not been used internally since Rails 4.2.0.
465
-
466
- *Mike Dalessio*
467
-
468
- * `MessageEncryptor`, `MessageVerifier`, and `config.active_support.message_serializer`
469
- now accept `:message_pack` and `:message_pack_allow_marshal` as serializers.
470
- These serializers require the [`msgpack` gem](https://rubygems.org/gems/msgpack)
471
- (>= 1.7.0).
472
-
473
- The Message Pack format can provide improved performance and smaller payload
474
- sizes. It also supports round-tripping some Ruby types that are not supported
475
- by JSON. For example:
476
-
477
- ```ruby
478
- verifier = ActiveSupport::MessageVerifier.new("secret")
479
- data = [{ a: 1 }, { b: 2 }.with_indifferent_access, 1.to_d, Time.at(0, 123)]
480
- message = verifier.generate(data)
481
-
482
- # BEFORE with config.active_support.message_serializer = :json
483
- verifier.verified(message)
484
- # => [{"a"=>1}, {"b"=>2}, "1.0", "1969-12-31T18:00:00.000-06:00"]
485
- verifier.verified(message).map(&:class)
486
- # => [Hash, Hash, String, String]
487
-
488
- # AFTER with config.active_support.message_serializer = :message_pack
489
- verifier.verified(message)
490
- # => [{:a=>1}, {"b"=>2}, 0.1e1, 1969-12-31 18:00:00.000123 -0600]
491
- verifier.verified(message).map(&:class)
492
- # => [Hash, ActiveSupport::HashWithIndifferentAccess, BigDecimal, Time]
493
- ```
494
-
495
- The `:message_pack` serializer can fall back to deserializing with
496
- `ActiveSupport::JSON` when necessary, and the `:message_pack_allow_marshal`
497
- serializer can fall back to deserializing with `Marshal` as well as
498
- `ActiveSupport::JSON`. Additionally, the `:marshal`, `:json`, and
499
- `:json_allow_marshal` serializers can now fall back to deserializing with
500
- `ActiveSupport::MessagePack` when necessary. These behaviors ensure old
501
- messages can still be read so that migration is easier.
502
-
503
- *Jonathan Hefner*
504
-
505
- * A new `7.1` cache format is available which includes an optimization for
506
- bare string values such as view fragments.
507
-
508
- The `7.1` cache format is used by default for new apps, and existing apps
509
- can enable the format by setting `config.load_defaults 7.1` or by setting
510
- `config.active_support.cache_format_version = 7.1` in `config/application.rb`
511
- or a `config/environments/*.rb` file.
512
-
513
- Cache entries written using the `6.1` or `7.0` cache formats can be read
514
- when using the `7.1` format. To perform a rolling deploy of a Rails 7.1
515
- upgrade, wherein servers that have not yet been upgraded must be able to
516
- read caches from upgraded servers, leave the cache format unchanged on the
517
- first deploy, then enable the `7.1` cache format on a subsequent deploy.
518
-
519
- *Jonathan Hefner*
520
-
521
- * Active Support cache stores can now use a preconfigured serializer based on
522
- `ActiveSupport::MessagePack` via the `:serializer` option:
523
-
524
- ```ruby
525
- config.cache_store = :redis_cache_store, { serializer: :message_pack }
526
- ```
527
-
528
- The `:message_pack` serializer can reduce cache entry sizes and improve
529
- performance, but requires the [`msgpack` gem](https://rubygems.org/gems/msgpack)
530
- (>= 1.7.0).
531
-
532
- The `:message_pack` serializer can read cache entries written by the default
533
- serializer, and the default serializer can now read entries written by the
534
- `:message_pack` serializer. These behaviors make it easy to migrate between
535
- serializer without invalidating the entire cache.
536
-
537
- *Jonathan Hefner*
538
-
539
- * `Object#deep_dup` no longer duplicate named classes and modules.
540
-
541
- Before:
542
-
543
- ```ruby
544
- hash = { class: Object, module: Kernel }
545
- hash.deep_dup # => {:class=>#<Class:0x00000001063ffc80>, :module=>#<Module:0x00000001063ffa00>}
546
- ```
547
-
548
- After:
549
-
550
- ```ruby
551
- hash = { class: Object, module: Kernel }
552
- hash.deep_dup # => {:class=>Object, :module=>Kernel}
553
- ```
554
-
555
- *Jean Boussier*
556
-
557
- * Consistently raise an `ArgumentError` if the `ActiveSupport::Cache` key is blank.
558
-
559
- *Joshua Young*
560
-
561
- * Deprecate usage of the singleton `ActiveSupport::Deprecation`.
562
-
563
- All usage of `ActiveSupport::Deprecation` as a singleton is deprecated, the most common one being
564
- `ActiveSupport::Deprecation.warn`. Gem authors should now create their own deprecator (`ActiveSupport::Deprecation`
565
- object), and use it to emit deprecation warnings.
566
-
567
- Calling any of the following without specifying a deprecator argument is also deprecated:
568
- * Module.deprecate
569
- * deprecate_constant
570
- * DeprecatedObjectProxy
571
- * DeprecatedInstanceVariableProxy
572
- * DeprecatedConstantProxy
573
- * deprecation-related test assertions
574
-
575
- Use of `ActiveSupport::Deprecation.silence` and configuration methods like `behavior=`, `disallowed_behavior=`,
576
- `disallowed_warnings=` should now be aimed at the [application's deprecators](https://api.rubyonrails.org/classes/Rails/Application.html#method-i-deprecators).
577
-
578
- ```ruby
579
- Rails.application.deprecators.silence do
580
- # code that emits deprecation warnings
581
- end
582
- ```
583
-
584
- If your gem has a Railtie or Engine, it's encouraged to add your deprecator to the application's deprecators, that
585
- way the deprecation related configuration options will apply to it as well, e.g.
586
- `config.active_support.report_deprecations` set to `false` in the production environment will also disable your
587
- deprecator.
588
-
589
- ```ruby
590
- initializer "my_gem.deprecator" do |app|
591
- app.deprecators[:my_gem] = MyGem.deprecator
592
- end
593
- ```
594
-
595
- *Étienne Barrié*
9
+ *Rafael Mendonça França*
596
10
 
597
- * Add `Object#with` to set and restore public attributes around a block
11
+ * Remove deprecated support to call the following methods without passing a deprecator:
598
12
 
599
- ```ruby
600
- client.timeout # => 5
601
- client.with(timeout: 1) do
602
- client.timeout # => 1
603
- end
604
- client.timeout # => 5
605
- ```
13
+ - `deprecate`
14
+ - `deprecate_constant`
15
+ - `ActiveSupport::Deprecation::DeprecatedObjectProxy.new`
16
+ - `ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new`
17
+ - `ActiveSupport::Deprecation::DeprecatedConstantProxy.new`
18
+ - `assert_deprecated`
19
+ - `assert_not_deprecated`
20
+ - `collect_deprecations`
606
21
 
607
- *Jean Boussier*
22
+ *Rafael Mendonça França*
608
23
 
609
- * Remove deprecated support to generate incorrect RFC 4122 UUIDs when providing a namespace ID that is not one of the
610
- constants defined on `Digest::UUID`.
24
+ * Remove deprecated `ActiveSupport::Deprecation` delegation to instance.
611
25
 
612
26
  *Rafael Mendonça França*
613
27
 
614
- * Deprecate `config.active_support.use_rfc4122_namespaced_uuids`.
28
+ * Remove deprecated `SafeBuffer#clone_empty`.
615
29
 
616
30
  *Rafael Mendonça França*
617
31
 
618
- * Remove implicit conversion of objects into `String` by `ActiveSupport::SafeBuffer`.
32
+ * Remove deprecated `#to_default_s` from `Array`, `Date`, `DateTime` and `Time`.
619
33
 
620
34
  *Rafael Mendonça França*
621
35
 
622
- * Remove deprecated `active_support/core_ext/range/include_time_with_zone` file.
36
+ * Remove deprecated support to passing `Dalli::Client` instances to `MemCacheStore`.
623
37
 
624
38
  *Rafael Mendonça França*
625
39
 
626
- * Deprecate `config.active_support.remove_deprecated_time_with_zone_name`.
40
+ * Remove deprecated `config.active_support.use_rfc4122_namespaced_uuids`.
627
41
 
628
42
  *Rafael Mendonça França*
629
43
 
630
- * Remove deprecated override of `ActiveSupport::TimeWithZone.name`.
44
+ * Remove deprecated `config.active_support.remove_deprecated_time_with_zone_name`.
631
45
 
632
46
  *Rafael Mendonça França*
633
47
 
634
- * Deprecate `config.active_support.disable_to_s_conversion`.
48
+ * Remove deprecated `config.active_support.disable_to_s_conversion`.
635
49
 
636
50
  *Rafael Mendonça França*
637
51
 
638
- * Remove deprecated option to passing a format to `#to_s` in `Array`, `Range`, `Date`, `DateTime`, `Time`,
639
- `BigDecimal`, `Float` and, `Integer`.
52
+ * Remove deprecated support to bolding log text with positional boolean in `ActiveSupport::LogSubscriber#color`.
640
53
 
641
54
  *Rafael Mendonça França*
642
55
 
643
- * Remove deprecated `ActiveSupport::PerThreadRegistry`.
56
+ * Remove deprecated constants `ActiveSupport::LogSubscriber::CLEAR` and `ActiveSupport::LogSubscriber::BOLD`.
644
57
 
645
58
  *Rafael Mendonça França*
646
59
 
647
- * Remove deprecated override of `Enumerable#sum`.
60
+ * Remove deprecated support for `config.active_support.cache_format_version = 6.1`.
648
61
 
649
62
  *Rafael Mendonça França*
650
63
 
651
- * Deprecated initializing a `ActiveSupport::Cache::MemCacheStore` with an instance of `Dalli::Client`.
652
-
653
- Deprecate the undocumented option of providing an already-initialized instance of `Dalli::Client` to `ActiveSupport::Cache::MemCacheStore`. Such clients could be configured with unrecognized options, which could lead to unexpected behavior. Instead, provide addresses as documented.
64
+ * Remove deprecated `:pool_size` and `:pool_timeout` options for the cache storage.
654
65
 
655
- *aledustet*
66
+ *Rafael Mendonça França*
656
67
 
657
- * Stub `Time.new()` in `TimeHelpers#travel_to`
68
+ * Warn on tests without assertions.
658
69
 
659
- ```ruby
660
- travel_to Time.new(2004, 11, 24) do
661
- # Inside the `travel_to` block `Time.new` is stubbed
662
- assert_equal 2004, Time.new.year
663
- end
664
- ```
70
+ `ActiveSupport::TestCase` now warns when tests do not run any assertions.
71
+ This is helpful in detecting broken tests that do not perform intended assertions.
665
72
 
666
73
  *fatkodima*
667
74
 
668
- * Raise `ActiveSupport::MessageEncryptor::InvalidMessage` from
669
- `ActiveSupport::MessageEncryptor#decrypt_and_verify` regardless of cipher.
670
- Previously, when a `MessageEncryptor` was using a non-AEAD cipher such as
671
- AES-256-CBC, a corrupt or tampered message would raise
672
- `ActiveSupport::MessageVerifier::InvalidSignature`. Now, all ciphers raise
673
- the same error:
674
-
675
- ```ruby
676
- encryptor = ActiveSupport::MessageEncryptor.new("x" * 32, cipher: "aes-256-gcm")
677
- message = encryptor.encrypt_and_sign("message")
678
- encryptor.decrypt_and_verify(message.next)
679
- # => raises ActiveSupport::MessageEncryptor::InvalidMessage
680
-
681
- encryptor = ActiveSupport::MessageEncryptor.new("x" * 32, cipher: "aes-256-cbc")
682
- message = encryptor.encrypt_and_sign("message")
683
- encryptor.decrypt_and_verify(message.next)
684
- # BEFORE:
685
- # => raises ActiveSupport::MessageVerifier::InvalidSignature
686
- # AFTER:
687
- # => raises ActiveSupport::MessageEncryptor::InvalidMessage
688
- ```
689
-
690
- *Jonathan Hefner*
691
-
692
- * Support `nil` original values when using `ActiveSupport::MessageVerifier#verify`.
693
- Previously, `MessageVerifier#verify` did not work with `nil` original
694
- values, though both `MessageVerifier#verified` and
695
- `MessageEncryptor#decrypt_and_verify` do:
696
-
697
- ```ruby
698
- encryptor = ActiveSupport::MessageEncryptor.new(secret)
699
- message = encryptor.encrypt_and_sign(nil)
75
+ * Support `hexBinary` type in `ActiveSupport::XmlMini`.
700
76
 
701
- encryptor.decrypt_and_verify(message)
702
- # => nil
77
+ *heka1024*
703
78
 
704
- verifier = ActiveSupport::MessageVerifier.new(secret)
705
- message = verifier.generate(nil)
79
+ * Deprecate `ActiveSupport::ProxyObject` in favor of Ruby's built-in `BasicObject`.
706
80
 
707
- verifier.verified(message)
708
- # => nil
709
-
710
- verifier.verify(message)
711
- # BEFORE:
712
- # => raises ActiveSupport::MessageVerifier::InvalidSignature
713
- # AFTER:
714
- # => nil
715
- ```
716
-
717
- *Jonathan Hefner*
718
-
719
- * Maintain `html_safe?` on html_safe strings when sliced with `slice`, `slice!`, or `chr` method.
720
-
721
- Previously, `html_safe?` was only maintained when the html_safe strings were sliced
722
- with `[]` method. Now, `slice`, `slice!`, and `chr` methods will maintain `html_safe?` like `[]` method.
723
-
724
- ```ruby
725
- string = "<div>test</div>".html_safe
726
- string.slice(0, 1).html_safe? # => true
727
- string.slice!(0, 1).html_safe? # => true
728
- # maintain html_safe? after the slice!
729
- string.html_safe? # => true
730
- string.chr.html_safe? # => true
731
- ```
732
-
733
- *Michael Go*
734
-
735
- * Add `Object#in?` support for open ranges.
736
-
737
- ```ruby
738
- assert Date.today.in?(..Date.tomorrow)
739
- assert_not Date.today.in?(Date.tomorrow..)
740
- ```
741
-
742
- *Ignacio Galindo*
743
-
744
- * `config.i18n.raise_on_missing_translations = true` now raises on any missing translation.
745
-
746
- Previously it would only raise when called in a view or controller. Now it will raise
747
- anytime `I18n.t` is provided an unrecognised key.
748
-
749
- If you do not want this behaviour, you can customise the i18n exception handler. See the
750
- upgrading guide or i18n guide for more information.
751
-
752
- *Alex Ghiculescu*
753
-
754
- * `ActiveSupport::CurrentAttributes` now raises if a restricted attribute name is used.
755
-
756
- Attributes such as `set` and `reset` cannot be used as they clash with the
757
- `CurrentAttributes` public API.
758
-
759
- *Alex Ghiculescu*
760
-
761
- * `HashWithIndifferentAccess#transform_keys` now takes a Hash argument, just
762
- as Ruby's `Hash#transform_keys` does.
763
-
764
- *Akira Matsuda*
765
-
766
- * `delegate` now defines method with proper arity when delegating to a Class.
767
- With this change, it defines faster method (3.5x faster with no argument).
768
- However, in order to gain this benefit, the delegation target method has to
769
- be defined before declaring the delegation.
770
-
771
- ```ruby
772
- # This defines 3.5 times faster method than before
773
- class C
774
- def self.x() end
775
- delegate :x, to: :class
776
- end
777
-
778
- class C
779
- # This works but silently falls back to old behavior because
780
- # `delegate` cannot find the definition of `x`
781
- delegate :x, to: :class
782
- def self.x() end
783
- end
784
- ```
785
-
786
- *Akira Matsuda*
81
+ *Earlopain*
787
82
 
788
- * `assert_difference` message now includes what changed.
83
+ * `stub_const` now accepts a `exists: false` parameter to allow stubbing missing constants.
789
84
 
790
- This makes it easier to debug non-obvious failures.
85
+ *Jean Boussier*
791
86
 
792
- Before:
87
+ * Make `ActiveSupport::BacktraceCleaner` copy filters and silencers on dup and clone.
793
88
 
794
- ```
795
- "User.count" didn't change by 32.
796
- Expected: 1611
797
- Actual: 1579
798
- ```
89
+ Previously the copy would still share the internal silencers and filters array,
90
+ causing state to leak.
799
91
 
800
- After:
92
+ *Jean Boussier*
801
93
 
802
- ```
803
- "User.count" didn't change by 32, but by 0.
804
- Expected: 1611
805
- Actual: 1579
806
- ```
94
+ * Updating Astana with Western Kazakhstan TZInfo identifier.
807
95
 
808
- *Alex Ghiculescu*
96
+ *Damian Nelson*
809
97
 
810
- * Add ability to match exception messages to `assert_raises` assertion
98
+ * Add filename support for `ActiveSupport::Logger.logger_outputs_to?`.
811
99
 
812
- Instead of this
813
100
  ```ruby
814
- error = assert_raises(ArgumentError) do
815
- perform_service(param: 'exception')
816
- end
817
- assert_match(/incorrect param/i, error.message)
101
+ logger = Logger.new('/var/log/rails.log')
102
+ ActiveSupport::Logger.logger_outputs_to?(logger, '/var/log/rails.log')
818
103
  ```
819
104
 
820
- you can now write this
821
- ```ruby
822
- assert_raises(ArgumentError, match: /incorrect param/i) do
823
- perform_service(param: 'exception')
824
- end
825
- ```
826
-
827
- *fatkodima*
828
-
829
- * Add `Rails.env.local?` shorthand for `Rails.env.development? || Rails.env.test?`.
830
-
831
- *DHH*
105
+ *Christian Schmidt*
832
106
 
833
- * `ActiveSupport::Testing::TimeHelpers` now accepts named `with_usec` argument
834
- to `freeze_time`, `travel`, and `travel_to` methods. Passing true prevents
835
- truncating the destination time with `change(usec: 0)`.
107
+ * Include `IPAddr#prefix` when serializing an `IPAddr` using the
108
+ `ActiveSupport::MessagePack` serializer.
836
109
 
837
- *KevSlashNull*, and *serprex*
110
+ This change is backward and forward compatible — old payloads can
111
+ still be read, and new payloads will be readable by older versions of Rails.
838
112
 
839
- * `ActiveSupport::CurrentAttributes.resets` now accepts a method name
113
+ *Taiki Komaba*
840
114
 
841
- The block API is still the recommended approach, but now both APIs are supported:
115
+ * Add `default:` support for `ActiveSupport::CurrentAttributes.attribute`.
842
116
 
843
117
  ```ruby
844
118
  class Current < ActiveSupport::CurrentAttributes
845
- resets { Time.zone = nil }
846
- resets :clear_time_zone
119
+ attribute :counter, default: 0
847
120
  end
848
121
  ```
849
122
 
850
- *Alex Ghiculescu*
851
-
852
- * Ensure `ActiveSupport::Testing::Isolation::Forking` closes pipes
853
-
854
- Previously, `Forking.run_in_isolation` opened two ends of a pipe. The fork
855
- process closed the read end, wrote to it, and then terminated (which
856
- presumably closed the file descriptors on its end). The parent process
857
- closed the write end, read from it, and returned, never closing the read
858
- end.
859
-
860
- This resulted in an accumulation of open file descriptors, which could
861
- cause errors if the limit is reached.
862
-
863
- *Sam Bostock*
864
-
865
- * Fix `Time#change` and `Time#advance` for times around the end of Daylight
866
- Saving Time.
867
-
868
- Previously, when `Time#change` or `Time#advance` constructed a time inside
869
- the final stretch of Daylight Saving Time (DST), the non-DST offset would
870
- always be chosen for local times:
871
-
872
- ```ruby
873
- # DST ended just before 2021-11-07 2:00:00 AM in US/Eastern.
874
- ENV["TZ"] = "US/Eastern"
875
-
876
- time = Time.local(2021, 11, 07, 00, 59, 59) + 1
877
- # => 2021-11-07 01:00:00 -0400
878
- time.change(day: 07)
879
- # => 2021-11-07 01:00:00 -0500
880
- time.advance(seconds: 0)
881
- # => 2021-11-07 01:00:00 -0500
882
-
883
- time = Time.local(2021, 11, 06, 01, 00, 00)
884
- # => 2021-11-06 01:00:00 -0400
885
- time.change(day: 07)
886
- # => 2021-11-07 01:00:00 -0500
887
- time.advance(days: 1)
888
- # => 2021-11-07 01:00:00 -0500
889
- ```
123
+ *Sean Doyle*
890
124
 
891
- And the DST offset would always be chosen for times with a `TimeZone`
892
- object:
125
+ * Remove deprecated support for the pre-Ruby 2.4 behavior of `to_time` returning a `Time` object with local timezone.
893
126
 
894
- ```ruby
895
- Time.zone = "US/Eastern"
896
-
897
- time = Time.new(2021, 11, 07, 02, 00, 00, Time.zone) - 3600
898
- # => 2021-11-07 01:00:00 -0500
899
- time.change(day: 07)
900
- # => 2021-11-07 01:00:00 -0400
901
- time.advance(seconds: 0)
902
- # => 2021-11-07 01:00:00 -0400
903
-
904
- time = Time.new(2021, 11, 8, 01, 00, 00, Time.zone)
905
- # => 2021-11-08 01:00:00 -0500
906
- time.change(day: 07)
907
- # => 2021-11-07 01:00:00 -0400
908
- time.advance(days: -1)
909
- # => 2021-11-07 01:00:00 -0400
910
- ```
911
-
912
- Now, `Time#change` and `Time#advance` will choose the offset that matches
913
- the original time's offset when possible:
914
-
915
- ```ruby
916
- ENV["TZ"] = "US/Eastern"
917
-
918
- time = Time.local(2021, 11, 07, 00, 59, 59) + 1
919
- # => 2021-11-07 01:00:00 -0400
920
- time.change(day: 07)
921
- # => 2021-11-07 01:00:00 -0400
922
- time.advance(seconds: 0)
923
- # => 2021-11-07 01:00:00 -0400
924
-
925
- time = Time.local(2021, 11, 06, 01, 00, 00)
926
- # => 2021-11-06 01:00:00 -0400
927
- time.change(day: 07)
928
- # => 2021-11-07 01:00:00 -0400
929
- time.advance(days: 1)
930
- # => 2021-11-07 01:00:00 -0400
931
-
932
- Time.zone = "US/Eastern"
933
-
934
- time = Time.new(2021, 11, 07, 02, 00, 00, Time.zone) - 3600
935
- # => 2021-11-07 01:00:00 -0500
936
- time.change(day: 07)
937
- # => 2021-11-07 01:00:00 -0500
938
- time.advance(seconds: 0)
939
- # => 2021-11-07 01:00:00 -0500
940
-
941
- time = Time.new(2021, 11, 8, 01, 00, 00, Time.zone)
942
- # => 2021-11-08 01:00:00 -0500
943
- time.change(day: 07)
944
- # => 2021-11-07 01:00:00 -0500
945
- time.advance(days: -1)
946
- # => 2021-11-07 01:00:00 -0500
947
- ```
127
+ *Rafael Mendonça França*
948
128
 
949
- *Kevin Hall*, *Takayoshi Nishida*, and *Jonathan Hefner*
129
+ * Deprecate `config.active_support.to_time_preserves_timezone`.
950
130
 
951
- * Fix MemoryStore to preserve entries TTL when incrementing or decrementing
131
+ *Rafael Mendonça França*
952
132
 
953
- This is to be more consistent with how MemCachedStore and RedisCacheStore behaves.
133
+ * Deprecate `DateAndTime::Compatibility.preserve_timezone`.
954
134
 
955
- *Jean Boussier*
135
+ *Rafael Mendonça França*
956
136
 
957
- * `Rails.error.handle` and `Rails.error.record` filter now by multiple error classes.
137
+ * Yield instance to `Object#with` block.
958
138
 
959
139
  ```ruby
960
- Rails.error.handle(IOError, ArgumentError) do
961
- 1 + '1' # raises TypeError
140
+ client.with(timeout: 5_000) do |c|
141
+ c.get("/commits")
962
142
  end
963
- 1 + 1 # TypeErrors are not IOErrors or ArgumentError, so this will *not* be handled
964
143
  ```
965
144
 
966
- *Martin Spickermann*
967
-
968
- * `Class#subclasses` and `Class#descendants` now automatically filter reloaded classes.
969
-
970
- Previously they could return old implementations of reloadable classes that have been
971
- dereferenced but not yet garbage collected.
145
+ *Sean Doyle*
972
146
 
973
- They now automatically filter such classes like `DescendantTracker#subclasses` and
974
- `DescendantTracker#descendants`.
147
+ * Use logical core count instead of physical core count to determine the
148
+ default number of workers when parallelizing tests.
975
149
 
976
- *Jean Boussier*
977
-
978
- * `Rails.error.report` now marks errors as reported to avoid reporting them twice.
150
+ *Jonathan Hefner*
979
151
 
980
- In some cases, users might want to report errors explicitly with some extra context
981
- before letting it bubble up.
152
+ * Fix `Time.now/DateTime.now/Date.today` to return results in a system timezone after `#travel_to`.
982
153
 
983
- This also allows to safely catch and report errors outside of the execution context.
154
+ There is a bug in the current implementation of #travel_to:
155
+ it remembers a timezone of its argument, and all stubbed methods start
156
+ returning results in that remembered timezone. However, the expected
157
+ behavior is to return results in a system timezone.
984
158
 
985
- *Jean Boussier*
159
+ *Aleksei Chernenkov*
986
160
 
987
- * Add `assert_error_reported` and `assert_no_error_reported`
161
+ * Add `ErrorReported#unexpected` to report precondition violations.
988
162
 
989
- Allows to easily asserts an error happened but was handled
163
+ For example:
990
164
 
991
165
  ```ruby
992
- report = assert_error_reported(IOError) do
166
+ def edit
167
+ if published?
168
+ Rails.error.unexpected("[BUG] Attempting to edit a published article, that shouldn't be possible")
169
+ return false
170
+ end
993
171
  # ...
994
172
  end
995
- assert_equal "Oops", report.error.message
996
- assert_equal "admin", report.context[:section]
997
- assert_equal :warning, report.severity
998
- assert_predicate report, :handled?
999
- ```
1000
-
1001
- *Jean Boussier*
1002
-
1003
- * `ActiveSupport::Deprecation` behavior callbacks can now receive the
1004
- deprecator instance as an argument. This makes it easier for such callbacks
1005
- to change their behavior based on the deprecator's state. For example,
1006
- based on the deprecator's `debug` flag.
1007
-
1008
- 3-arity and splat-args callbacks such as the following will now be passed
1009
- the deprecator instance as their third argument:
1010
-
1011
- * `->(message, callstack, deprecator) { ... }`
1012
- * `->(*args) { ... }`
1013
- * `->(message, *other_args) { ... }`
1014
-
1015
- 2-arity and 4-arity callbacks such as the following will continue to behave
1016
- the same as before:
1017
-
1018
- * `->(message, callstack) { ... }`
1019
- * `->(message, callstack, deprecation_horizon, gem_name) { ... }`
1020
- * `->(message, callstack, *deprecation_details) { ... }`
1021
-
1022
- *Jonathan Hefner*
1023
-
1024
- * `ActiveSupport::Deprecation#disallowed_warnings` now affects the instance on
1025
- which it is configured.
1026
-
1027
- This means that individual `ActiveSupport::Deprecation` instances can be
1028
- configured with their own disallowed warnings, and the global
1029
- `ActiveSupport::Deprecation.disallowed_warnings` now only affects the global
1030
- `ActiveSupport::Deprecation.warn`.
1031
-
1032
- **Before**
1033
-
1034
- ```ruby
1035
- ActiveSupport::Deprecation.disallowed_warnings = ["foo"]
1036
- deprecator = ActiveSupport::Deprecation.new("2.0", "MyCoolGem")
1037
- deprecator.disallowed_warnings = ["bar"]
1038
-
1039
- ActiveSupport::Deprecation.warn("foo") # => raise ActiveSupport::DeprecationException
1040
- ActiveSupport::Deprecation.warn("bar") # => print "DEPRECATION WARNING: bar"
1041
- deprecator.warn("foo") # => raise ActiveSupport::DeprecationException
1042
- deprecator.warn("bar") # => print "DEPRECATION WARNING: bar"
1043
- ```
1044
-
1045
- **After**
1046
-
1047
- ```ruby
1048
- ActiveSupport::Deprecation.disallowed_warnings = ["foo"]
1049
- deprecator = ActiveSupport::Deprecation.new("2.0", "MyCoolGem")
1050
- deprecator.disallowed_warnings = ["bar"]
1051
-
1052
- ActiveSupport::Deprecation.warn("foo") # => raise ActiveSupport::DeprecationException
1053
- ActiveSupport::Deprecation.warn("bar") # => print "DEPRECATION WARNING: bar"
1054
- deprecator.warn("foo") # => print "DEPRECATION WARNING: foo"
1055
- deprecator.warn("bar") # => raise ActiveSupport::DeprecationException
1056
- ```
1057
-
1058
- Note that global `ActiveSupport::Deprecation` methods such as `ActiveSupport::Deprecation.warn`
1059
- and `ActiveSupport::Deprecation.disallowed_warnings` have been deprecated.
1060
-
1061
- *Jonathan Hefner*
1062
-
1063
- * Add italic and underline support to `ActiveSupport::LogSubscriber#color`
1064
-
1065
- Previously, only bold text was supported via a positional argument.
1066
- This allows for bold, italic, and underline options to be specified
1067
- for colored logs.
1068
-
1069
- ```ruby
1070
- info color("Hello world!", :red, bold: true, underline: true)
1071
173
  ```
1072
174
 
1073
- *Gannon McGibbon*
1074
-
1075
- * Add `String#downcase_first` method.
1076
-
1077
- This method is the corollary of `String#upcase_first`.
1078
-
1079
- *Mark Schneider*
1080
-
1081
- * `thread_mattr_accessor` will call `.dup.freeze` on non-frozen default values.
1082
-
1083
- This provides a basic level of protection against different threads trying
1084
- to mutate a shared default object.
1085
-
1086
- *Jonathan Hefner*
1087
-
1088
- * Add `raise_on_invalid_cache_expiration_time` config to `ActiveSupport::Cache::Store`
1089
-
1090
- Specifies if an `ArgumentError` should be raised if `Rails.cache` `fetch` or
1091
- `write` are given an invalid `expires_at` or `expires_in` time.
1092
-
1093
- Options are `true`, and `false`. If `false`, the exception will be reported
1094
- as `handled` and logged instead. Defaults to `true` if `config.load_defaults >= 7.1`.
1095
-
1096
- *Trevor Turk*
1097
-
1098
- * `ActiveSupport::Cache::Store#fetch` now passes an options accessor to the block.
1099
-
1100
- It makes possible to override cache options:
1101
-
1102
- Rails.cache.fetch("3rd-party-token") do |name, options|
1103
- token = fetch_token_from_remote
1104
- # set cache's TTL to match token's TTL
1105
- options.expires_in = token.expires_in
1106
- token
1107
- end
1108
-
1109
- *Andrii Gladkyi*, *Jean Boussier*
1110
-
1111
- * `default` option of `thread_mattr_accessor` now applies through inheritance and
1112
- also across new threads.
1113
-
1114
- Previously, the `default` value provided was set only at the moment of defining
1115
- the attribute writer, which would cause the attribute to be uninitialized in
1116
- descendants and in other threads.
1117
-
1118
- Fixes #43312.
1119
-
1120
- *Thierry Deo*
1121
-
1122
- * Redis cache store is now compatible with redis-rb 5.0.
175
+ The above will raise an error in development and test, but only report the error in production.
1123
176
 
1124
177
  *Jean Boussier*
1125
178
 
1126
- * Add `skip_nil:` support to `ActiveSupport::Cache::Store#fetch_multi`.
1127
-
1128
- *Daniel Alfaro*
1129
-
1130
- * Add `quarter` method to date/time
179
+ * Make the order of read_multi and write_multi notifications for `Cache::Store#fetch_multi` operations match the order they are executed in.
1131
180
 
1132
- *Matt Swanson*
181
+ *Adam Renberg Tamm*
1133
182
 
1134
- * Fix `NoMethodError` on custom `ActiveSupport::Deprecation` behavior.
183
+ * Make return values of `Cache::Store#write` consistent.
1135
184
 
1136
- `ActiveSupport::Deprecation.behavior=` was supposed to accept any object
1137
- that responds to `call`, but in fact its internal implementation assumed that
1138
- this object could respond to `arity`, so it was restricted to only `Proc` objects.
185
+ The return value was not specified before. Now it returns `true` on a successful write,
186
+ `nil` if there was an error talking to the cache backend, and `false` if the write failed
187
+ for another reason (e.g. the key already exists and `unless_exist: true` was passed).
1139
188
 
1140
- This change removes this `arity` restriction of custom behaviors.
189
+ *Sander Verdonschot*
1141
190
 
1142
- *Ryo Nakamura*
191
+ * Fix logged cache keys not always matching actual key used by cache action.
1143
192
 
1144
- * Support `:url_safe` option for `MessageEncryptor`.
1145
-
1146
- The `MessageEncryptor` constructor now accepts a `:url_safe` option, similar
1147
- to the `MessageVerifier` constructor. When enabled, this option ensures
1148
- that messages use a URL-safe encoding.
193
+ *Hartley McGuire*
1149
194
 
1150
- *Jonathan Hefner*
195
+ * Improve error messages of `assert_changes` and `assert_no_changes`.
1151
196
 
1152
- * Add `url_safe` option to `ActiveSupport::MessageVerifier` initializer
197
+ `assert_changes` error messages now display objects with `.inspect` to make it easier
198
+ to differentiate nil from empty strings, strings from symbols, etc.
199
+ `assert_no_changes` error messages now surface the actual value.
1153
200
 
1154
- `ActiveSupport::MessageVerifier.new` now takes optional `url_safe` argument.
1155
- It can generate URL-safe strings by passing `url_safe: true`.
201
+ *pcreux*
1156
202
 
1157
- ```ruby
1158
- verifier = ActiveSupport::MessageVerifier.new(url_safe: true)
1159
- message = verifier.generate(data) # => URL-safe string
1160
- ```
203
+ * Fix `#to_fs(:human_size)` to correctly work with negative numbers.
1161
204
 
1162
- This option is `false` by default to be backwards compatible.
205
+ *Earlopain*
1163
206
 
1164
- *Shouichi Kamiya*
207
+ * Fix `BroadcastLogger#dup` so that it duplicates the logger's `broadcasts`.
1165
208
 
1166
- * Enable connection pooling by default for `MemCacheStore` and `RedisCacheStore`.
209
+ *Andrew Novoselac*
1167
210
 
1168
- If you want to disable connection pooling, set `:pool` option to `false` when configuring the cache store:
211
+ * Fix issue where `bootstrap.rb` overwrites the `level` of a `BroadcastLogger`'s `broadcasts`.
1169
212
 
1170
- ```ruby
1171
- config.cache_store = :mem_cache_store, "cache.example.com", pool: false
1172
- ```
213
+ *Andrew Novoselac*
1173
214
 
1174
- *fatkodima*
215
+ * Fix compatibility with the `semantic_logger` gem.
1175
216
 
1176
- * Add `force:` support to `ActiveSupport::Cache::Store#fetch_multi`.
217
+ The `semantic_logger` gem doesn't behave exactly like stdlib logger in that
218
+ `SemanticLogger#level` returns a Symbol while stdlib `Logger#level` returns an Integer.
1177
219
 
1178
- *fatkodima*
220
+ This caused the various `LogSubscriber` classes in Rails to break when assigned a
221
+ `SemanticLogger` instance.
1179
222
 
1180
- * Deprecated `:pool_size` and `:pool_timeout` options for configuring connection pooling in cache stores.
223
+ *Jean Boussier*, *ojab*
1181
224
 
1182
- Use `pool: true` to enable pooling with default settings:
225
+ * Fix MemoryStore to prevent race conditions when incrementing or decrementing.
1183
226
 
1184
- ```ruby
1185
- config.cache_store = :redis_cache_store, pool: true
1186
- ```
227
+ *Pierre Jambet*
1187
228
 
1188
- Or pass individual options via `:pool` option:
229
+ * Implement `HashWithIndifferentAccess#to_proc`.
1189
230
 
1190
- ```ruby
1191
- config.cache_store = :redis_cache_store, pool: { size: 10, timeout: 2 }
1192
- ```
231
+ Previously, calling `#to_proc` on `HashWithIndifferentAccess` object used inherited `#to_proc`
232
+ method from the `Hash` class, which was not able to access values using indifferent keys.
1193
233
 
1194
234
  *fatkodima*
1195
235
 
1196
- * Allow #increment and #decrement methods of `ActiveSupport::Cache::Store`
1197
- subclasses to set new values.
1198
-
1199
- Previously incrementing or decrementing an unset key would fail and return
1200
- nil. A default will now be assumed and the key will be created.
1201
-
1202
- *Andrej Blagojević*, *Eugene Kenny*
1203
-
1204
- * Add `skip_nil:` support to `RedisCacheStore`
1205
-
1206
- *Joey Paris*
1207
-
1208
- * `ActiveSupport::Cache::MemoryStore#write(name, val, unless_exist:true)` now
1209
- correctly writes expired keys.
1210
-
1211
- *Alan Savage*
1212
-
1213
- * `ActiveSupport::ErrorReporter` now accepts and forward a `source:` parameter.
1214
-
1215
- This allow libraries to signal the origin of the errors, and reporters
1216
- to easily ignore some sources.
1217
-
1218
- *Jean Boussier*
1219
-
1220
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
1221
-
1222
- Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
1223
- in names of tags and names of attributes, following the specification of XML.
1224
-
1225
- *Álvaro Martín Fraguas*
1226
-
1227
- * Respect `ActiveSupport::Logger.new`'s `:formatter` keyword argument
1228
-
1229
- The stdlib `Logger::new` allows passing a `:formatter` keyword argument to
1230
- set the logger's formatter. Previously `ActiveSupport::Logger.new` ignored
1231
- that argument by always setting the formatter to an instance of
1232
- `ActiveSupport::Logger::SimpleFormatter`.
1233
-
1234
- *Steven Harman*
1235
-
1236
- * Deprecate preserving the pre-Ruby 2.4 behavior of `to_time`
1237
-
1238
- With Ruby 2.4+ the default for +to_time+ changed from converting to the
1239
- local system time to preserving the offset of the receiver. At the time Rails
1240
- supported older versions of Ruby so a compatibility layer was added to assist
1241
- in the migration process. From Rails 5.0 new applications have defaulted to
1242
- the Ruby 2.4+ behavior and since Rails 7.0 now only supports Ruby 2.7+
1243
- this compatibility layer can be safely removed.
1244
-
1245
- To minimize any noise generated the deprecation warning only appears when the
1246
- setting is configured to `false` as that is the only scenario where the
1247
- removal of the compatibility layer has any effect.
1248
-
1249
- *Andrew White*
1250
-
1251
- * `Pathname.blank?` only returns true for `Pathname.new("")`
1252
-
1253
- Previously it would end up calling `Pathname#empty?` which returned true
1254
- if the path existed and was an empty directory or file.
1255
-
1256
- That behavior was unlikely to be expected.
1257
-
1258
- *Jean Boussier*
1259
-
1260
- * Deprecate `Notification::Event`'s `#children` and `#parent_of?`
1261
-
1262
- *John Hawthorn*
1263
-
1264
- * Change the default serializer of `ActiveSupport::MessageVerifier` from
1265
- `Marshal` to `ActiveSupport::JSON` when using `config.load_defaults 7.1`.
1266
-
1267
- Messages serialized with `Marshal` can still be read, but new messages will
1268
- be serialized with `ActiveSupport::JSON`. For more information, see
1269
- https://guides.rubyonrails.org/v7.1/configuring.html#config-active-support-message-serializer.
1270
-
1271
- *Saba Kiaei*, *David Buckley*, and *Jonathan Hefner*
1272
-
1273
- * Change the default serializer of `ActiveSupport::MessageEncryptor` from
1274
- `Marshal` to `ActiveSupport::JSON` when using `config.load_defaults 7.1`.
1275
-
1276
- Messages serialized with `Marshal` can still be read, but new messages will
1277
- be serialized with `ActiveSupport::JSON`. For more information, see
1278
- https://guides.rubyonrails.org/v7.1/configuring.html#config-active-support-message-serializer.
1279
-
1280
- *Zack Deveau*, *Martin Gingras*, and *Jonathan Hefner*
1281
-
1282
- * Add `ActiveSupport::TestCase#stub_const` to stub a constant for the duration of a yield.
1283
-
1284
- *DHH*
1285
-
1286
- * Fix `ActiveSupport::EncryptedConfiguration` to be compatible with Psych 4
1287
-
1288
- *Stephen Sugden*
1289
-
1290
- * Improve `File.atomic_write` error handling
1291
-
1292
- *Daniel Pepper*
1293
-
1294
- * Fix `Class#descendants` and `DescendantsTracker#descendants` compatibility with Ruby 3.1.
1295
-
1296
- [The native `Class#descendants` was reverted prior to Ruby 3.1 release](https://bugs.ruby-lang.org/issues/14394#note-33),
1297
- but `Class#subclasses` was kept, breaking the feature detection.
1298
-
1299
- *Jean Boussier*
1300
-
1301
- Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activesupport/CHANGELOG.md) for previous changes.
236
+ Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activesupport/CHANGELOG.md) for previous changes.