activesupport 7.1.3.4 → 8.0.1

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