activesupport 8.0.2 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +333 -128
  3. data/README.rdoc +1 -1
  4. data/lib/active_support/backtrace_cleaner.rb +71 -0
  5. data/lib/active_support/broadcast_logger.rb +46 -59
  6. data/lib/active_support/cache/mem_cache_store.rb +25 -27
  7. data/lib/active_support/cache/redis_cache_store.rb +36 -30
  8. data/lib/active_support/cache/strategy/local_cache.rb +16 -7
  9. data/lib/active_support/cache/strategy/local_cache_middleware.rb +7 -7
  10. data/lib/active_support/cache.rb +70 -6
  11. data/lib/active_support/callbacks.rb +20 -8
  12. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +8 -62
  13. data/lib/active_support/concurrency/thread_monitor.rb +55 -0
  14. data/lib/active_support/configurable.rb +34 -0
  15. data/lib/active_support/continuous_integration.rb +145 -0
  16. data/lib/active_support/core_ext/array.rb +7 -7
  17. data/lib/active_support/core_ext/benchmark.rb +4 -11
  18. data/lib/active_support/core_ext/big_decimal.rb +1 -1
  19. data/lib/active_support/core_ext/class/attribute.rb +8 -6
  20. data/lib/active_support/core_ext/class.rb +2 -2
  21. data/lib/active_support/core_ext/date.rb +5 -5
  22. data/lib/active_support/core_ext/date_and_time/compatibility.rb +0 -35
  23. data/lib/active_support/core_ext/date_time/compatibility.rb +3 -5
  24. data/lib/active_support/core_ext/date_time/conversions.rb +4 -2
  25. data/lib/active_support/core_ext/date_time.rb +5 -5
  26. data/lib/active_support/core_ext/digest.rb +1 -1
  27. data/lib/active_support/core_ext/enumerable.rb +16 -4
  28. data/lib/active_support/core_ext/erb/util.rb +3 -3
  29. data/lib/active_support/core_ext/file.rb +1 -1
  30. data/lib/active_support/core_ext/hash.rb +8 -8
  31. data/lib/active_support/core_ext/integer.rb +3 -3
  32. data/lib/active_support/core_ext/kernel.rb +3 -3
  33. data/lib/active_support/core_ext/module.rb +11 -11
  34. data/lib/active_support/core_ext/numeric.rb +3 -3
  35. data/lib/active_support/core_ext/object/json.rb +8 -1
  36. data/lib/active_support/core_ext/object/to_query.rb +7 -1
  37. data/lib/active_support/core_ext/object/try.rb +2 -2
  38. data/lib/active_support/core_ext/object.rb +13 -13
  39. data/lib/active_support/core_ext/pathname.rb +2 -2
  40. data/lib/active_support/core_ext/range/overlap.rb +3 -3
  41. data/lib/active_support/core_ext/range/sole.rb +17 -0
  42. data/lib/active_support/core_ext/range.rb +4 -4
  43. data/lib/active_support/core_ext/string/filters.rb +3 -3
  44. data/lib/active_support/core_ext/string/multibyte.rb +12 -3
  45. data/lib/active_support/core_ext/string/output_safety.rb +19 -12
  46. data/lib/active_support/core_ext/string.rb +13 -13
  47. data/lib/active_support/core_ext/symbol.rb +1 -1
  48. data/lib/active_support/core_ext/time/calculations.rb +0 -7
  49. data/lib/active_support/core_ext/time/compatibility.rb +2 -27
  50. data/lib/active_support/core_ext/time.rb +5 -5
  51. data/lib/active_support/core_ext.rb +1 -1
  52. data/lib/active_support/current_attributes/test_helper.rb +2 -2
  53. data/lib/active_support/current_attributes.rb +26 -16
  54. data/lib/active_support/dependencies/interlock.rb +11 -5
  55. data/lib/active_support/dependencies.rb +6 -1
  56. data/lib/active_support/deprecation/reporting.rb +4 -2
  57. data/lib/active_support/deprecation.rb +1 -1
  58. data/lib/active_support/editor.rb +70 -0
  59. data/lib/active_support/error_reporter.rb +50 -6
  60. data/lib/active_support/event_reporter/test_helper.rb +32 -0
  61. data/lib/active_support/event_reporter.rb +592 -0
  62. data/lib/active_support/evented_file_update_checker.rb +5 -1
  63. data/lib/active_support/execution_context.rb +64 -7
  64. data/lib/active_support/file_update_checker.rb +8 -6
  65. data/lib/active_support/gem_version.rb +2 -2
  66. data/lib/active_support/gzip.rb +1 -0
  67. data/lib/active_support/hash_with_indifferent_access.rb +47 -24
  68. data/lib/active_support/i18n_railtie.rb +1 -2
  69. data/lib/active_support/inflector/inflections.rb +31 -15
  70. data/lib/active_support/inflector/transliterate.rb +6 -8
  71. data/lib/active_support/isolated_execution_state.rb +12 -15
  72. data/lib/active_support/json/decoding.rb +6 -4
  73. data/lib/active_support/json/encoding.rb +135 -17
  74. data/lib/active_support/lazy_load_hooks.rb +1 -1
  75. data/lib/active_support/log_subscriber.rb +2 -6
  76. data/lib/active_support/logger_thread_safe_level.rb +6 -3
  77. data/lib/active_support/message_encryptors.rb +52 -0
  78. data/lib/active_support/message_pack/extensions.rb +5 -0
  79. data/lib/active_support/message_verifiers.rb +52 -0
  80. data/lib/active_support/messages/rotation_coordinator.rb +9 -0
  81. data/lib/active_support/messages/rotator.rb +5 -0
  82. data/lib/active_support/multibyte/chars.rb +8 -1
  83. data/lib/active_support/multibyte.rb +4 -0
  84. data/lib/active_support/notifications/fanout.rb +64 -42
  85. data/lib/active_support/notifications/instrumenter.rb +1 -1
  86. data/lib/active_support/railtie.rb +32 -15
  87. data/lib/active_support/structured_event_subscriber.rb +99 -0
  88. data/lib/active_support/subscriber.rb +0 -5
  89. data/lib/active_support/syntax_error_proxy.rb +3 -0
  90. data/lib/active_support/test_case.rb +61 -6
  91. data/lib/active_support/testing/assertions.rb +34 -6
  92. data/lib/active_support/testing/error_reporter_assertions.rb +18 -1
  93. data/lib/active_support/testing/event_reporter_assertions.rb +227 -0
  94. data/lib/active_support/testing/notification_assertions.rb +92 -0
  95. data/lib/active_support/testing/parallelization/server.rb +15 -2
  96. data/lib/active_support/testing/parallelization/worker.rb +4 -2
  97. data/lib/active_support/testing/parallelization.rb +25 -1
  98. data/lib/active_support/testing/tests_without_assertions.rb +1 -1
  99. data/lib/active_support/testing/time_helpers.rb +7 -3
  100. data/lib/active_support/time_with_zone.rb +22 -22
  101. data/lib/active_support/values/time_zone.rb +8 -1
  102. data/lib/active_support/xml_mini.rb +3 -2
  103. data/lib/active_support.rb +20 -15
  104. metadata +27 -19
  105. data/lib/active_support/core_ext/range/each.rb +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f094945c33f1c6e036f987c0cc7405a0146f0c800635e1fc16d8a1c34910cb7
4
- data.tar.gz: 9ffe8729fffcae283965435a590eb7db596a43fa39c8565e814abab6e16e0444
3
+ metadata.gz: 8e2e34de82e59790b784a08b2471fa7427da0b1642763bba5904ad1aa6ad45a8
4
+ data.tar.gz: fadad2b6a958becb7cc187251643463d43127d28af9098631050c4b368079dcc
5
5
  SHA512:
6
- metadata.gz: a391e85fc1235084e201abc2736139578767397fa4a503573e82c5f7f339e13d13b5702302ff37176a26a8d80203fc914682e40c570d933aa282e2fb92f26e76
7
- data.tar.gz: 6adf2e0b528f17bcd51373d8e627c4ec77de8967c968fdab89fb2bac11952bf98f5ffb6910cdf372cf57bd7929f539808dc783160b0456a803783264421016ce
6
+ metadata.gz: 1d545e02442de9422d3b62f261fdba69bbf9aaa95e2f8138a62493dd090397a163841044b5fb538a1e1be2ab70a464e51a7eb3ee56f12f778ecb7cc681ea6dab
7
+ data.tar.gz: d6de04f518b4802721210693b496f28ac80d16f3d7aa78bedeb007c4c850d0084d532a8b696b079f41412e274e5e29ff3644b95adfbf861f6852cfc0675ac516
data/CHANGELOG.md CHANGED
@@ -1,255 +1,460 @@
1
- ## Rails 8.0.2 (March 12, 2025) ##
1
+ ## Rails 8.1.0 (October 22, 2025) ##
2
2
 
3
- * No changes.
3
+ * Remove deprecated passing a Time object to `Time#since`.
4
4
 
5
+ *Rafael Mendonça França*
5
6
 
6
- ## Rails 8.0.2 (March 12, 2025) ##
7
+ * Remove deprecated `Benchmark.ms` method. It is now defined in the `benchmark` gem.
7
8
 
8
- * Fix setting `to_time_preserves_timezone` from `new_framework_defaults_8_0.rb`.
9
+ *Rafael Mendonça França*
9
10
 
10
- *fatkodima*
11
+ * Remove deprecated addition for `Time` instances with `ActiveSupport::TimeWithZone`.
11
12
 
12
- * Fix Active Support Cache `fetch_multi` when local store is active.
13
+ *Rafael Mendonça França*
13
14
 
14
- `fetch_multi` now properly yield to the provided block for missing entries
15
- that have been recorded as such in the local store.
15
+ * Remove deprecated support for `to_time` to preserve the system local time. It will now always preserve the receiver
16
+ timezone.
16
17
 
17
- *Jean Boussier*
18
+ *Rafael Mendonça França*
18
19
 
19
- * Fix execution wrapping to report all exceptions, including `Exception`.
20
+ * Deprecate `config.active_support.to_time_preserves_timezone`.
20
21
 
21
- If a more serious error like `SystemStackError` or `NoMemoryError` happens,
22
- the error reporter should be able to report these kinds of exceptions.
22
+ *Rafael Mendonça França*
23
+
24
+ * Standardize event name formatting in `assert_event_reported` error messages.
25
+
26
+ The event name in failure messages now uses `.inspect` (e.g., `name: "user.created"`)
27
+ to match `assert_events_reported` and provide type clarity between strings and symbols.
28
+ This only affects tests that assert on the failure message format itself.
29
+
30
+ *George Ma*
31
+
32
+ * Fix `Enumerable#sole` to return the full tuple instead of just the first element of the tuple.
33
+
34
+ *Olivier Bellone*
35
+
36
+ * Fix parallel tests hanging when worker processes die abruptly.
37
+
38
+ Previously, if a worker process was killed (e.g., OOM killed, `kill -9`) during parallel
39
+ test execution, the test suite would hang forever waiting for the dead worker.
40
+
41
+ *Joshua Young*
42
+
43
+ * Add `config.active_support.escape_js_separators_in_json`.
44
+
45
+ Introduce a new framework default to skip escaping LINE SEPARATOR (U+2028) and PARAGRAPH SEPARATOR (U+2029) in JSON.
46
+
47
+ Historically these characters were not valid inside JavaScript literal strings but that changed in ECMAScript 2019.
48
+ As such it's no longer a concern in modern browsers: https://caniuse.com/mdn-javascript_builtins_json_json_superset.
49
+
50
+ *Étienne Barrié*, *Jean Boussier*
51
+
52
+ * Fix `NameError` when `class_attribute` is defined on instance singleton classes.
53
+
54
+ Previously, calling `class_attribute` on an instance's singleton class would raise
55
+ a `NameError` when accessing the attribute through the instance.
56
+
57
+ ```ruby
58
+ object = MyClass.new
59
+ object.singleton_class.class_attribute :foo, default: "bar"
60
+ object.foo # previously raised NameError, now returns "bar"
61
+ ```
62
+
63
+ *Joshua Young*
64
+
65
+ * Introduce `ActiveSupport::Testing::EventReporterAssertions#with_debug_event_reporting`
66
+ to enable event reporter debug mode in tests.
67
+
68
+ The previous way to enable debug mode is by using `#with_debug` on the
69
+ event reporter itself, which is too verbose. This new helper will help
70
+ clear up any confusion on how to test debug events.
23
71
 
24
72
  *Gannon McGibbon*
25
73
 
26
- * Fix `RedisCacheStore` and `MemCacheStore` to also handle connection pool related errors.
74
+ * Add `ActiveSupport::StructuredEventSubscriber` for consuming notifications and
75
+ emitting structured event logs. Events may be emitted with the `#emit_event`
76
+ or `#emit_debug_event` methods.
27
77
 
28
- These errors are rescued and reported to `Rails.error`.
78
+ ```ruby
79
+ class MyStructuredEventSubscriber < ActiveSupport::StructuredEventSubscriber
80
+ def notification(event)
81
+ emit_event("my.notification", data: 1)
82
+ end
83
+ end
84
+ ```
29
85
 
30
- *Jean Boussier*
86
+ *Adrianna Chang*
87
+
88
+ * `ActiveSupport::FileUpdateChecker` does not depend on `Time.now` to prevent unecessary reloads with time travel test helpers
89
+
90
+ *Jan Grodowski*
91
+
92
+ * Add `ActiveSupport::Cache::Store#namespace=` and `#namespace`.
93
+
94
+ Can be used as an alternative to `Store#clear` in some situations such as parallel
95
+ testing.
96
+
97
+ *Nick Schwaderer*
31
98
 
32
- * Fix `ActiveSupport::Cache#read_multi` to respect version expiry when using local cache.
99
+ * Create `parallel_worker_id` helper for running parallel tests. This allows users to
100
+ know which worker they are currently running in.
33
101
 
34
- *zzak*
102
+ *Nick Schwaderer*
103
+
104
+ * Make the cache of `ActiveSupport::Cache::Strategy::LocalCache::Middleware` updatable.
105
+
106
+ If the cache client at `Rails.cache` of a booted application changes, the corresponding
107
+ mounted middleware needs to update in order for request-local caches to be setup properly.
108
+ Otherwise, redundant cache operations will erroneously hit the datastore.
109
+
110
+ *Gannon McGibbon*
111
+
112
+ * Add `assert_events_reported` test helper for `ActiveSupport::EventReporter`.
35
113
 
36
- * Fix `ActiveSupport::MessageVerifier` and `ActiveSupport::MessageEncryptor` configuration of `on_rotation` callback.
114
+ This new assertion allows testing multiple events in a single block, regardless of order:
37
115
 
38
116
  ```ruby
39
- verifier.rotate(old_secret).on_rotation { ... }
117
+ assert_events_reported([
118
+ { name: "user.created", payload: { id: 123 } },
119
+ { name: "email.sent", payload: { to: "user@example.com" } }
120
+ ]) do
121
+ create_user_and_send_welcome_email
122
+ end
40
123
  ```
41
124
 
42
- Now both work as documented.
125
+ *George Ma*
43
126
 
44
- *Jean Boussier*
127
+ * Add `ActiveSupport::TimeZone#standard_name` method.
45
128
 
46
- * Fix `ActiveSupport::MessageVerifier` to always be able to verify both URL-safe and URL-unsafe payloads.
129
+ ``` ruby
130
+ zone = ActiveSupport::TimeZone['Hawaii']
131
+ # Old way
132
+ ActiveSupport::TimeZone::MAPPING[zone.name]
133
+ # New way
134
+ zone.standard_name # => 'Pacific/Honolulu'
135
+ ```
136
+
137
+ *Bogdan Gusiev*
47
138
 
48
- This is to allow transitioning seemlessly from either configuration without immediately invalidating
49
- all previously generated signed messages.
139
+ * Add Structured Event Reporter, accessible via `Rails.event`.
50
140
 
51
- *Jean Boussier*, *Florent Beaurain*, *Ali Sepehri*
141
+ The Event Reporter provides a unified interface for producing structured events in Rails
142
+ applications:
143
+
144
+ ```ruby
145
+ Rails.event.notify("user.signup", user_id: 123, email: "user@example.com")
146
+ ```
52
147
 
53
- * Fix `cache.fetch` to honor the provided expiry when `:race_condition_ttl` is used.
148
+ It supports adding tags to events:
54
149
 
55
150
  ```ruby
56
- cache.fetch("key", expires_in: 1.hour, race_condition_ttl: 5.second) do
57
- "something"
151
+ Rails.event.tagged("graphql") do
152
+ # Event includes tags: { graphql: true }
153
+ Rails.event.notify("user.signup", user_id: 123, email: "user@example.com")
58
154
  end
59
155
  ```
60
156
 
61
- In the above example, the final cache entry would have a 10 seconds TTL instead
62
- of the requested 1 hour.
157
+ As well as context:
158
+ ```ruby
159
+ # All events will contain context: {request_id: "abc123", shop_id: 456}
160
+ Rails.event.set_context(request_id: "abc123", shop_id: 456)
161
+ ```
63
162
 
64
- *Dhia*
163
+ Events are emitted to subscribers. Applications register subscribers to
164
+ control how events are serialized and emitted. Subscribers must implement
165
+ an `#emit` method, which receives the event hash:
65
166
 
66
- * Better handle procs with splat arguments in `set_callback`.
167
+ ```ruby
168
+ class LogSubscriber
169
+ def emit(event)
170
+ payload = event[:payload].map { |key, value| "#{key}=#{value}" }.join(" ")
171
+ source_location = event[:source_location]
172
+ log = "[#{event[:name]}] #{payload} at #{source_location[:filepath]}:#{source_location[:lineno]}"
173
+ Rails.logger.info(log)
174
+ end
175
+ end
176
+ ```
67
177
 
68
- *Radamés Roriz*
178
+ *Adrianna Chang*
69
179
 
70
- * Fix `String#mb_chars` to not mutate the receiver.
180
+ * Make `ActiveSupport::Logger` `#freeze`-friendly.
71
181
 
72
- Previously it would call `force_encoding` on the receiver,
73
- now it dups the receiver first.
182
+ *Joshua Young*
74
183
 
75
- *Jean Boussier*
184
+ * Make `ActiveSupport::Gzip.compress` deterministic based on input.
76
185
 
77
- * Improve `ErrorSubscriber` to also mark error causes as reported.
186
+ `ActiveSupport::Gzip.compress` used to include a timestamp in the output,
187
+ causing consecutive calls with the same input data to have different output
188
+ if called during different seconds. It now always sets the timestamp to `0`
189
+ so that the output is identical for any given input.
78
190
 
79
- This avoid some cases of errors being reported twice, notably in views because of how
80
- errors are wrapped in `ActionView::Template::Error`.
191
+ *Rob Brackett*
81
192
 
82
- *Jean Boussier*
193
+ * Given an array of `Thread::Backtrace::Location` objects, the new method
194
+ `ActiveSupport::BacktraceCleaner#clean_locations` returns an array with the
195
+ clean ones:
83
196
 
84
- * Fix `Module#module_parent_name` to return the correct name after the module has been named.
197
+ ```ruby
198
+ clean_locations = backtrace_cleaner.clean_locations(caller_locations)
199
+ ```
85
200
 
86
- When called on an anonymous module, the return value wouldn't change after the module was given a name
87
- later by being assigned to a constant.
201
+ Filters and silencers receive strings as usual. However, the `path`
202
+ attributes of the locations in the returned array are the original,
203
+ unfiltered ones, since locations are immutable.
204
+
205
+ *Xavier Noria*
206
+
207
+ * Improve `CurrentAttributes` and `ExecutionContext` state managment in test cases.
208
+
209
+ Previously these two global state would be entirely cleared out whenever calling
210
+ into code that is wrapped by the Rails executor, typically Action Controller or
211
+ Active Job helpers:
88
212
 
89
213
  ```ruby
90
- mod = Module.new
91
- mod.module_parent_name # => "Object"
92
- MyModule::Something = mod
93
- mod.module_parent_name # => "MyModule"
214
+ test "#index works" do
215
+ CurrentUser.id = 42
216
+ get :index
217
+ CurrentUser.id == nil
218
+ end
94
219
  ```
95
220
 
221
+ Now re-entering the executor properly save and restore that state.
222
+
96
223
  *Jean Boussier*
97
224
 
225
+ * The new method `ActiveSupport::BacktraceCleaner#first_clean_location`
226
+ returns the first clean location of the caller's call stack, or `nil`.
227
+ Locations are `Thread::Backtrace::Location` objects. Useful when you want to
228
+ report the application-level location where something happened as an object.
98
229
 
99
- ## Rails 8.0.1 (December 13, 2024) ##
230
+ *Xavier Noria*
100
231
 
101
- * Fix a bug in `ERB::Util.tokenize` that causes incorrect tokenization when ERB tags are preceeded by multibyte characters.
232
+ * FileUpdateChecker and EventedFileUpdateChecker ignore changes in Gem.path now.
102
233
 
103
- *Martin Emde*
234
+ *Ermolaev Andrey*, *zzak*
104
235
 
105
- * Restore the ability to decorate methods generated by `class_attribute`.
236
+ * The new method `ActiveSupport::BacktraceCleaner#first_clean_frame` returns
237
+ the first clean frame of the caller's backtrace, or `nil`. Useful when you
238
+ want to report the application-level frame where something happened as a
239
+ string.
106
240
 
107
- It always has been complicated to use Module#prepend or an alias method chain
108
- to decorate methods defined by `class_attribute`, but became even harder in 8.0.
241
+ *Xavier Noria*
109
242
 
110
- This capability is now supported for both reader and writer methods.
243
+ * Always clear `CurrentAttributes` instances.
111
244
 
112
- *Jean Boussier*
245
+ Previously `CurrentAttributes` instance would be reset at the end of requests.
246
+ Meaning its attributes would be re-initialized.
113
247
 
248
+ This is problematic because it assume these objects don't hold any state
249
+ other than their declared attribute, which isn't always the case, and
250
+ can lead to state leak across request.
114
251
 
115
- ## Rails 8.0.0.1 (December 10, 2024) ##
252
+ Now `CurrentAttributes` instances are abandoned at the end of a request,
253
+ and a new instance is created at the start of the next request.
116
254
 
117
- * No changes.
255
+ *Jean Boussier*, *Janko Marohnić*
118
256
 
257
+ * Add public API for `before_fork_hook` in parallel testing.
119
258
 
120
- ## Rails 8.0.0 (November 07, 2024) ##
259
+ Introduces a public API for calling the before fork hooks implemented by parallel testing.
121
260
 
122
- * No changes.
261
+ ```ruby
262
+ parallelize_before_fork do
263
+ # perform an action before test processes are forked
264
+ end
265
+ ```
123
266
 
267
+ *Eileen M. Uchitelle*
124
268
 
125
- ## Rails 8.0.0.rc2 (October 30, 2024) ##
269
+ * Implement ability to skip creating parallel testing databases.
126
270
 
127
- * No changes.
271
+ With parallel testing, Rails will create a database per process. If this isn't
272
+ desirable or you would like to implement databases handling on your own, you can
273
+ now turn off this default behavior.
128
274
 
275
+ To skip creating a database per process, you can change it via the
276
+ `parallelize` method:
129
277
 
130
- ## Rails 8.0.0.rc1 (October 19, 2024) ##
278
+ ```ruby
279
+ parallelize(workers: 10, parallelize_databases: false)
280
+ ```
131
281
 
132
- * Remove deprecated support to passing an array of strings to `ActiveSupport::Deprecation#warn`.
282
+ or via the application configuration:
133
283
 
134
- *Rafael Mendonça França*
284
+ ```ruby
285
+ config.active_support.parallelize_databases = false
286
+ ```
135
287
 
136
- * Remove deprecated support to setting `attr_internal_naming_format` with a `@` prefix.
288
+ *Eileen M. Uchitelle*
137
289
 
138
- *Rafael Mendonça França*
290
+ * Allow to configure maximum cache key sizes
139
291
 
140
- * Remove deprecated `ActiveSupport::ProxyObject`.
292
+ When the key exceeds the configured limit (250 bytes by default), it will be truncated and
293
+ the digest of the rest of the key appended to it.
141
294
 
142
- *Rafael Mendonça França*
295
+ Note that previously `ActiveSupport::Cache::RedisCacheStore` allowed up to 1kb cache keys before
296
+ truncation, which is now reduced to 250 bytes.
297
+
298
+ ```ruby
299
+ config.cache_store = :redis_cache_store, { max_key_size: 64 }
300
+ ```
143
301
 
144
- * Don't execute i18n watcher on boot. It shouldn't catch any file changes initially,
145
- and unnecessarily slows down boot of applications with lots of translations.
302
+ *fatkodima*
146
303
 
147
- *Gannon McGibbon*, *David Stosik*
304
+ * Use `UNLINK` command instead of `DEL` in `ActiveSupport::Cache::RedisCacheStore` for non-blocking deletion.
148
305
 
149
- * Fix `ActiveSupport::HashWithIndifferentAccess#stringify_keys` to stringify all keys not just symbols.
306
+ *Aron Roh*
150
307
 
151
- Previously:
308
+ * Add `Cache#read_counter` and `Cache#write_counter`
152
309
 
153
310
  ```ruby
154
- { 1 => 2 }.with_indifferent_access.stringify_keys[1] # => 2
311
+ Rails.cache.write_counter("foo", 1)
312
+ Rails.cache.read_counter("foo") # => 1
313
+ Rails.cache.increment("foo")
314
+ Rails.cache.read_counter("foo") # => 2
155
315
  ```
156
316
 
157
- After this change:
317
+ *Alex Ghiculescu*
318
+
319
+ * Introduce ActiveSupport::Testing::ErrorReporterAssertions#capture_error_reports
320
+
321
+ Captures all reported errors from within the block that match the given
322
+ error class.
158
323
 
159
324
  ```ruby
160
- { 1 => 2 }.with_indifferent_access.stringify_keys["1"] # => 2
325
+ reports = capture_error_reports(IOError) do
326
+ Rails.error.report(IOError.new("Oops"))
327
+ Rails.error.report(IOError.new("Oh no"))
328
+ Rails.error.report(StandardError.new)
329
+ end
330
+
331
+ assert_equal 2, reports.size
332
+ assert_equal "Oops", reports.first.error.message
333
+ assert_equal "Oh no", reports.last.error.message
161
334
  ```
162
335
 
163
- This change can be seen as a bug fix, but since it behaved like this for a very long time, we're deciding
164
- to not backport the fix and to make the change in a major release.
336
+ *Andrew Novoselac*
165
337
 
166
- *Jean Boussier*
338
+ * Introduce ActiveSupport::ErrorReporter#add_middleware
167
339
 
168
- ## Rails 8.0.0.beta1 (September 26, 2024) ##
340
+ When reporting an error, the error context middleware will be called with the reported error
341
+ and base execution context. The stack may mutate the context hash. The mutated context will
342
+ then be passed to error subscribers. Middleware receives the same parameters as `ErrorReporter#report`.
169
343
 
170
- * Include options when instrumenting `ActiveSupport::Cache::Store#delete` and `ActiveSupport::Cache::Store#delete_multi`.
344
+ *Andrew Novoselac*, *Sam Schmidt*
345
+
346
+ * Change execution wrapping to report all exceptions, including `Exception`.
347
+
348
+ If a more serious error like `SystemStackError` or `NoMemoryError` happens,
349
+ the error reporter should be able to report these kinds of exceptions.
171
350
 
172
- *Adam Renberg Tamm*
351
+ *Gannon McGibbon*
173
352
 
174
- * Print test names when running `rails test -v` for parallel tests.
353
+ * `ActiveSupport::Testing::Parallelization.before_fork_hook` allows declaration of callbacks that
354
+ are invoked immediately before forking test workers.
175
355
 
176
- *John Hawthorn*, *Abeid Ahmed*
356
+ *Mike Dalessio*
177
357
 
178
- * Deprecate `Benchmark.ms` core extension.
358
+ * Allow the `#freeze_time` testing helper to accept a date or time argument.
179
359
 
180
- The `benchmark` gem will become bundled in Ruby 3.5
360
+ ```ruby
361
+ Time.current # => Sun, 09 Jul 2024 15:34:49 EST -05:00
362
+ freeze_time Time.current + 1.day
363
+ sleep 1
364
+ Time.current # => Mon, 10 Jul 2024 15:34:49 EST -05:00
365
+ ```
181
366
 
182
- *Earlopain*
367
+ *Joshua Young*
183
368
 
184
- * `ActiveSupport::TimeWithZone#inspect` now uses ISO 8601 style time like `Time#inspect`
369
+ * `ActiveSupport::JSON` now accepts options
185
370
 
186
- *John Hawthorn*
371
+ It is now possible to pass options to `ActiveSupport::JSON`:
372
+ ```ruby
373
+ ActiveSupport::JSON.decode('{"key": "value"}', symbolize_names: true) # => { key: "value" }
374
+ ```
187
375
 
188
- * `ActiveSupport::ErrorReporter#report` now assigns a backtrace to unraised exceptions.
376
+ *matthaigh27*
189
377
 
190
- Previously reporting an un-raised exception would result in an error report without
191
- a backtrace. Now it automatically generates one.
378
+ * `ActiveSupport::Testing::NotificationAssertions`'s `assert_notification` now matches against payload subsets by default.
192
379
 
193
- *Jean Boussier*
380
+ Previously the following assertion would fail due to excess key vals in the notification payload. Now with payload subset matching, it will pass.
194
381
 
195
- * Add `escape_html_entities` option to `ActiveSupport::JSON.encode`.
382
+ ```ruby
383
+ assert_notification("post.submitted", title: "Cool Post") do
384
+ ActiveSupport::Notifications.instrument("post.submitted", title: "Cool Post", body: "Cool Body")
385
+ end
386
+ ```
196
387
 
197
- This allows for overriding the global configuration found at
198
- `ActiveSupport.escape_html_entities_in_json` for specific calls to `to_json`.
388
+ Additionally, you can now persist a matched notification for more customized assertions.
199
389
 
200
- This should be usable from controllers in the following manner:
201
390
  ```ruby
202
- class MyController < ApplicationController
203
- def index
204
- render json: { hello: "world" }, escape_html_entities: false
205
- end
391
+ notification = assert_notification("post.submitted", title: "Cool Post") do
392
+ ActiveSupport::Notifications.instrument("post.submitted", title: "Cool Post", body: Body.new("Cool Body"))
206
393
  end
394
+
395
+ assert_instance_of(Body, notification.payload[:body])
207
396
  ```
208
397
 
209
- *Nigel Baillie*
398
+ *Nicholas La Roux*
210
399
 
211
- * Raise when using key which can't respond to `#to_sym` in `EncryptedConfiguration`.
400
+ * Deprecate `String#mb_chars` and `ActiveSupport::Multibyte::Chars`.
212
401
 
213
- As is the case when trying to use an Integer or Float as a key, which is unsupported.
402
+ These APIs are a relic of the Ruby 1.8 days when Ruby strings weren't encoding
403
+ aware. There is no legitimate reasons to need these APIs today.
214
404
 
215
- *zzak*
405
+ *Jean Boussier*
216
406
 
217
- * Deprecate addition and since between two `Time` and `ActiveSupport::TimeWithZone`.
407
+ * Deprecate `ActiveSupport::Configurable`
218
408
 
219
- 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.
409
+ *Sean Doyle*
220
410
 
221
- *Nick Schwaderer*
411
+ * `nil.to_query("key")` now returns `key`.
222
412
 
223
- * Support rfc2822 format for Time#to_fs & Date#to_fs.
413
+ Previously it would return `key=`, preventing round tripping with `Rack::Utils.parse_nested_query`.
224
414
 
225
- *Akshay Birajdar*
415
+ *Erol Fornoles*
226
416
 
227
- * Optimize load time for `Railtie#initialize_i18n`. Filter `I18n.load_path`s passed to the file watcher to only those
228
- under `Rails.root`. Previously the watcher would grab all available locales, including those in gems
229
- which do not require a watcher because they won't change.
417
+ * Avoid wrapping redis in a `ConnectionPool` when using `ActiveSupport::Cache::RedisCacheStore` if the `:redis`
418
+ option is already a `ConnectionPool`.
230
419
 
231
- *Nick Schwaderer*
420
+ *Joshua Young*
232
421
 
233
- * Add a `filter` option to `in_order_of` to prioritize certain values in the sorting without filtering the results
234
- by these values.
422
+ * Alter `ERB::Util.tokenize` to return :PLAIN token with full input string when string doesn't contain ERB tags.
235
423
 
236
- *Igor Depolli*
424
+ *Martin Emde*
237
425
 
238
- * Improve error message when using `assert_difference` or `assert_changes` with a
239
- proc by printing the proc's source code (MRI only).
426
+ * Fix a bug in `ERB::Util.tokenize` that causes incorrect tokenization when ERB tags are preceded by multibyte characters.
240
427
 
241
- *Richard Böhme*, *Jean Boussier*
428
+ *Martin Emde*
429
+
430
+ * Add `ActiveSupport::Testing::NotificationAssertions` module to help with testing `ActiveSupport::Notifications`.
431
+
432
+ *Nicholas La Roux*, *Yishu See*, *Sean Doyle*
433
+
434
+ * `ActiveSupport::CurrentAttributes#attributes` now will return a new hash object on each call.
242
435
 
243
- * 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`.
436
+ Previously, the same hash object was returned each time that method was called.
244
437
 
245
- *Jason Kim*, *John Hawthorn*
438
+ *fatkodima*
439
+
440
+ * `ActiveSupport::JSON.encode` supports CIDR notation.
441
+
442
+ Previously:
246
443
 
247
- * Align instrumentation `payload[:key]` in ActiveSupport::Cache to follow the same pattern, with namespaced and normalized keys.
444
+ ```ruby
445
+ ActiveSupport::JSON.encode(IPAddr.new("172.16.0.0/24")) # => "\"172.16.0.0\""
446
+ ```
447
+
448
+ After this change:
449
+
450
+ ```ruby
451
+ ActiveSupport::JSON.encode(IPAddr.new("172.16.0.0/24")) # => "\"172.16.0.0/24\""
452
+ ```
248
453
 
249
- *Frederik Erbs Spang Thomsen*
454
+ *Taketo Takashima*
250
455
 
251
- * Fix `travel_to` to set usec 0 when `with_usec` is `false` and the given argument String or DateTime.
456
+ * Make `ActiveSupport::FileUpdateChecker` faster when checking many file-extensions.
252
457
 
253
- *mopp*
458
+ *Jonathan del Strother*
254
459
 
255
- Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activesupport/CHANGELOG.md) for previous changes.
460
+ Please check [8-0-stable](https://github.com/rails/rails/blob/8-0-stable/activesupport/CHANGELOG.md) for previous changes.
data/README.rdoc CHANGED
@@ -35,6 +35,6 @@ Bug reports for the Ruby on \Rails project can be filed here:
35
35
 
36
36
  * https://github.com/rails/rails/issues
37
37
 
38
- Feature requests should be discussed on the rails-core mailing list here:
38
+ Feature requests should be discussed on the rubyonrails-core forum here:
39
39
 
40
40
  * https://discuss.rubyonrails.org/c/rubyonrails-core