activesupport 7.0.4.3 → 7.2.4

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 (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +270 -266
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/lib/active_support/actionable_error.rb +3 -1
  6. data/lib/active_support/array_inquirer.rb +3 -1
  7. data/lib/active_support/backtrace_cleaner.rb +39 -7
  8. data/lib/active_support/benchmarkable.rb +1 -0
  9. data/lib/active_support/broadcast_logger.rb +238 -0
  10. data/lib/active_support/builder.rb +1 -1
  11. data/lib/active_support/cache/coder.rb +153 -0
  12. data/lib/active_support/cache/entry.rb +134 -0
  13. data/lib/active_support/cache/file_store.rb +51 -19
  14. data/lib/active_support/cache/mem_cache_store.rb +101 -134
  15. data/lib/active_support/cache/memory_store.rb +85 -30
  16. data/lib/active_support/cache/null_store.rb +8 -2
  17. data/lib/active_support/cache/redis_cache_store.rb +168 -153
  18. data/lib/active_support/cache/serializer_with_fallback.rb +152 -0
  19. data/lib/active_support/cache/strategy/local_cache.rb +64 -13
  20. data/lib/active_support/cache.rb +364 -292
  21. data/lib/active_support/callbacks.rb +121 -136
  22. data/lib/active_support/code_generator.rb +15 -10
  23. data/lib/active_support/concern.rb +4 -2
  24. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +42 -3
  25. data/lib/active_support/concurrency/null_lock.rb +13 -0
  26. data/lib/active_support/configurable.rb +10 -0
  27. data/lib/active_support/core_ext/array/conversions.rb +1 -2
  28. data/lib/active_support/core_ext/array.rb +0 -1
  29. data/lib/active_support/core_ext/benchmark.rb +1 -0
  30. data/lib/active_support/core_ext/class/attribute.rb +2 -2
  31. data/lib/active_support/core_ext/class/subclasses.rb +17 -34
  32. data/lib/active_support/core_ext/date/blank.rb +4 -0
  33. data/lib/active_support/core_ext/date/calculations.rb +15 -0
  34. data/lib/active_support/core_ext/date/conversions.rb +1 -2
  35. data/lib/active_support/core_ext/date.rb +0 -1
  36. data/lib/active_support/core_ext/date_and_time/calculations.rb +10 -0
  37. data/lib/active_support/core_ext/date_and_time/compatibility.rb +28 -1
  38. data/lib/active_support/core_ext/date_time/blank.rb +4 -0
  39. data/lib/active_support/core_ext/date_time/calculations.rb +4 -0
  40. data/lib/active_support/core_ext/date_time/conversions.rb +6 -4
  41. data/lib/active_support/core_ext/date_time.rb +0 -1
  42. data/lib/active_support/core_ext/digest/uuid.rb +7 -10
  43. data/lib/active_support/core_ext/enumerable.rb +25 -80
  44. data/lib/active_support/core_ext/erb/util.rb +201 -0
  45. data/lib/active_support/core_ext/hash/conversions.rb +1 -1
  46. data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
  47. data/lib/active_support/core_ext/hash/deep_transform_values.rb +3 -3
  48. data/lib/active_support/core_ext/hash/keys.rb +7 -7
  49. data/lib/active_support/core_ext/integer/inflections.rb +12 -12
  50. data/lib/active_support/core_ext/module/attr_internal.rb +17 -6
  51. data/lib/active_support/core_ext/module/attribute_accessors.rb +6 -0
  52. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +34 -16
  53. data/lib/active_support/core_ext/module/concerning.rb +6 -6
  54. data/lib/active_support/core_ext/module/delegation.rb +20 -119
  55. data/lib/active_support/core_ext/module/deprecation.rb +12 -12
  56. data/lib/active_support/core_ext/module/introspection.rb +3 -1
  57. data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
  58. data/lib/active_support/core_ext/numeric/conversions.rb +5 -3
  59. data/lib/active_support/core_ext/numeric.rb +0 -1
  60. data/lib/active_support/core_ext/object/blank.rb +45 -1
  61. data/lib/active_support/core_ext/object/deep_dup.rb +16 -0
  62. data/lib/active_support/core_ext/object/duplicable.rb +25 -16
  63. data/lib/active_support/core_ext/object/inclusion.rb +13 -5
  64. data/lib/active_support/core_ext/object/instance_variables.rb +4 -2
  65. data/lib/active_support/core_ext/object/json.rb +18 -8
  66. data/lib/active_support/core_ext/object/to_query.rb +0 -2
  67. data/lib/active_support/core_ext/object/try.rb +2 -2
  68. data/lib/active_support/core_ext/object/with.rb +46 -0
  69. data/lib/active_support/core_ext/object/with_options.rb +9 -9
  70. data/lib/active_support/core_ext/object.rb +1 -0
  71. data/lib/active_support/core_ext/pathname/blank.rb +20 -0
  72. data/lib/active_support/core_ext/pathname/existence.rb +2 -0
  73. data/lib/active_support/core_ext/pathname.rb +1 -0
  74. data/lib/active_support/core_ext/range/conversions.rb +28 -7
  75. data/lib/active_support/core_ext/range/overlap.rb +40 -0
  76. data/lib/active_support/core_ext/range/sole.rb +17 -0
  77. data/lib/active_support/core_ext/range.rb +2 -2
  78. data/lib/active_support/core_ext/securerandom.rb +24 -12
  79. data/lib/active_support/core_ext/string/conversions.rb +1 -1
  80. data/lib/active_support/core_ext/string/filters.rb +24 -18
  81. data/lib/active_support/core_ext/string/indent.rb +1 -1
  82. data/lib/active_support/core_ext/string/inflections.rb +16 -9
  83. data/lib/active_support/core_ext/string/multibyte.rb +3 -3
  84. data/lib/active_support/core_ext/string/output_safety.rb +37 -178
  85. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  86. data/lib/active_support/core_ext/time/calculations.rb +40 -30
  87. data/lib/active_support/core_ext/time/compatibility.rb +24 -0
  88. data/lib/active_support/core_ext/time/conversions.rb +1 -3
  89. data/lib/active_support/core_ext/time/zones.rb +7 -8
  90. data/lib/active_support/core_ext/time.rb +0 -1
  91. data/lib/active_support/core_ext.rb +0 -1
  92. data/lib/active_support/current_attributes.rb +60 -46
  93. data/lib/active_support/deep_mergeable.rb +53 -0
  94. data/lib/active_support/delegation.rb +202 -0
  95. data/lib/active_support/dependencies/autoload.rb +9 -16
  96. data/lib/active_support/deprecation/behaviors.rb +65 -42
  97. data/lib/active_support/deprecation/constant_accessor.rb +47 -25
  98. data/lib/active_support/deprecation/deprecators.rb +104 -0
  99. data/lib/active_support/deprecation/disallowed.rb +6 -8
  100. data/lib/active_support/deprecation/method_wrappers.rb +6 -23
  101. data/lib/active_support/deprecation/proxy_wrappers.rb +34 -22
  102. data/lib/active_support/deprecation/reporting.rb +49 -27
  103. data/lib/active_support/deprecation.rb +39 -9
  104. data/lib/active_support/deprecator.rb +7 -0
  105. data/lib/active_support/descendants_tracker.rb +66 -172
  106. data/lib/active_support/duration/iso8601_parser.rb +2 -2
  107. data/lib/active_support/duration/iso8601_serializer.rb +1 -4
  108. data/lib/active_support/duration.rb +13 -7
  109. data/lib/active_support/encrypted_configuration.rb +63 -11
  110. data/lib/active_support/encrypted_file.rb +17 -13
  111. data/lib/active_support/environment_inquirer.rb +22 -2
  112. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  113. data/lib/active_support/error_reporter.rb +163 -36
  114. data/lib/active_support/evented_file_update_checker.rb +17 -3
  115. data/lib/active_support/execution_wrapper.rb +5 -6
  116. data/lib/active_support/file_update_checker.rb +6 -4
  117. data/lib/active_support/fork_tracker.rb +4 -32
  118. data/lib/active_support/gem_version.rb +3 -3
  119. data/lib/active_support/gzip.rb +2 -0
  120. data/lib/active_support/hash_with_indifferent_access.rb +50 -30
  121. data/lib/active_support/html_safe_translation.rb +19 -6
  122. data/lib/active_support/i18n.rb +1 -1
  123. data/lib/active_support/i18n_railtie.rb +20 -13
  124. data/lib/active_support/inflector/inflections.rb +2 -0
  125. data/lib/active_support/inflector/methods.rb +30 -20
  126. data/lib/active_support/inflector/transliterate.rb +3 -1
  127. data/lib/active_support/isolated_execution_state.rb +26 -22
  128. data/lib/active_support/json/decoding.rb +4 -3
  129. data/lib/active_support/json/encoding.rb +49 -49
  130. data/lib/active_support/key_generator.rb +9 -1
  131. data/lib/active_support/lazy_load_hooks.rb +8 -6
  132. data/lib/active_support/locale/en.yml +2 -0
  133. data/lib/active_support/log_subscriber.rb +74 -34
  134. data/lib/active_support/logger.rb +22 -60
  135. data/lib/active_support/logger_thread_safe_level.rb +10 -32
  136. data/lib/active_support/message_encryptor.rb +197 -53
  137. data/lib/active_support/message_encryptors.rb +141 -0
  138. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  139. data/lib/active_support/message_pack/extensions.rb +305 -0
  140. data/lib/active_support/message_pack/serializer.rb +63 -0
  141. data/lib/active_support/message_pack.rb +50 -0
  142. data/lib/active_support/message_verifier.rb +229 -89
  143. data/lib/active_support/message_verifiers.rb +137 -0
  144. data/lib/active_support/messages/codec.rb +65 -0
  145. data/lib/active_support/messages/metadata.rb +111 -45
  146. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  147. data/lib/active_support/messages/rotator.rb +38 -31
  148. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  149. data/lib/active_support/multibyte/chars.rb +8 -3
  150. data/lib/active_support/multibyte/unicode.rb +9 -37
  151. data/lib/active_support/notifications/fanout.rb +248 -87
  152. data/lib/active_support/notifications/instrumenter.rb +93 -25
  153. data/lib/active_support/notifications.rb +30 -29
  154. data/lib/active_support/number_helper/number_converter.rb +16 -7
  155. data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -6
  156. data/lib/active_support/number_helper/number_to_delimited_converter.rb +18 -5
  157. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -3
  158. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -0
  159. data/lib/active_support/number_helper.rb +379 -317
  160. data/lib/active_support/option_merger.rb +2 -2
  161. data/lib/active_support/ordered_hash.rb +3 -3
  162. data/lib/active_support/ordered_options.rb +67 -15
  163. data/lib/active_support/parameter_filter.rb +103 -84
  164. data/lib/active_support/proxy_object.rb +8 -3
  165. data/lib/active_support/railtie.rb +25 -20
  166. data/lib/active_support/reloader.rb +12 -4
  167. data/lib/active_support/rescuable.rb +2 -0
  168. data/lib/active_support/secure_compare_rotator.rb +16 -9
  169. data/lib/active_support/string_inquirer.rb +4 -2
  170. data/lib/active_support/subscriber.rb +10 -27
  171. data/lib/active_support/syntax_error_proxy.rb +60 -0
  172. data/lib/active_support/tagged_logging.rb +64 -25
  173. data/lib/active_support/test_case.rb +156 -7
  174. data/lib/active_support/testing/assertions.rb +28 -12
  175. data/lib/active_support/testing/autorun.rb +0 -2
  176. data/lib/active_support/testing/constant_stubbing.rb +54 -0
  177. data/lib/active_support/testing/deprecation.rb +20 -27
  178. data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
  179. data/lib/active_support/testing/isolation.rb +46 -33
  180. data/lib/active_support/testing/method_call_assertions.rb +7 -8
  181. data/lib/active_support/testing/parallelization/server.rb +18 -2
  182. data/lib/active_support/testing/parallelization/worker.rb +2 -2
  183. data/lib/active_support/testing/parallelization.rb +12 -1
  184. data/lib/active_support/testing/parallelize_executor.rb +8 -3
  185. data/lib/active_support/testing/setup_and_teardown.rb +2 -0
  186. data/lib/active_support/testing/stream.rb +1 -1
  187. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  188. data/lib/active_support/testing/time_helpers.rb +38 -16
  189. data/lib/active_support/time_with_zone.rb +16 -41
  190. data/lib/active_support/values/time_zone.rb +25 -14
  191. data/lib/active_support/version.rb +1 -1
  192. data/lib/active_support/xml_mini/jdom.rb +3 -10
  193. data/lib/active_support/xml_mini/nokogiri.rb +1 -1
  194. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  195. data/lib/active_support/xml_mini/rexml.rb +1 -1
  196. data/lib/active_support/xml_mini.rb +14 -3
  197. data/lib/active_support.rb +15 -3
  198. metadata +154 -24
  199. data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
  200. data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -26
  201. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -22
  202. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
  203. data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -26
  204. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -7
  205. data/lib/active_support/core_ext/range/overlaps.rb +0 -10
  206. data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -22
  207. data/lib/active_support/core_ext/uri.rb +0 -5
  208. data/lib/active_support/deprecation/instance_delegator.rb +0 -38
  209. data/lib/active_support/per_thread_registry.rb +0 -65
  210. data/lib/active_support/ruby_features.rb +0 -7
data/CHANGELOG.md CHANGED
@@ -1,474 +1,478 @@
1
- ## Rails 7.0.4.3 (March 13, 2023) ##
1
+ ## Rails 7.2.4 (September 24, 2026) ##
2
2
 
3
- * Implement SafeBuffer#bytesplice
3
+ * Improve `number_to_delimited` performance when `delimiter_pattern` is not specified.
4
4
 
5
- [CVE-2023-28120]
5
+ *Shinichi Maeshima*
6
6
 
7
+ * Silence Dalli 4.0+ warning when using `ActiveSupport::Cache::MemCacheStore`.
7
8
 
8
- ## Rails 7.0.4.2 (January 24, 2023) ##
9
+ *zzak*
9
10
 
10
- * No changes.
11
+ * Fix `ActiveSupport::Inflector.humanize` with international characters.
11
12
 
13
+ ```ruby
14
+ ActiveSupport::Inflector.humanize("áÉÍÓÚ") # => "Áéíóú"
15
+ ActiveSupport::Inflector.humanize("аБВГДЕ") # => "Абвгде"
16
+ ```
12
17
 
13
- ## Rails 7.0.4.1 (January 17, 2023) ##
18
+ *Jose Luis Duran*
14
19
 
15
- * Avoid regex backtracking in Inflector.underscore
16
20
 
17
- [CVE-2023-22796]
21
+ ## Rails 7.2.3.2 (July 29, 2026) ##
18
22
 
23
+ * No changes.
19
24
 
20
- ## Rails 7.0.4 (September 09, 2022) ##
21
25
 
22
- * Redis cache store is now compatible with redis-rb 5.0.
26
+ ## Rails 7.2.3.1 (March 23, 2026) ##
23
27
 
24
- *Jean Boussier*
28
+ * Reject scientific notation in NumberConverter
25
29
 
26
- * Fix `NoMethodError` on custom `ActiveSupport::Deprecation` behavior.
30
+ [CVE-2026-33176]
27
31
 
28
- `ActiveSupport::Deprecation.behavior=` was supposed to accept any object
29
- that responds to `call`, but in fact its internal implementation assumed that
30
- this object could respond to `arity`, so it was restricted to only `Proc` objects.
32
+ *Jean Boussier*
31
33
 
32
- This change removes this `arity` restriction of custom behaviors.
34
+ * Fix `SafeBuffer#%` to preserve unsafe status
33
35
 
34
- *Ryo Nakamura*
36
+ [CVE-2026-33170]
35
37
 
38
+ *Jean Boussier*
36
39
 
37
- ## Rails 7.0.3.1 (July 12, 2022) ##
40
+ * Improve performance of NumberToDelimitedConverter
38
41
 
39
- * No changes.
42
+ [CVE-2026-33169]
40
43
 
44
+ *Jean Boussier*
41
45
 
42
- ## Rails 7.0.3 (May 09, 2022) ##
43
46
 
44
- * No changes.
47
+ ## Rails 7.2.3 (October 28, 2025) ##
45
48
 
49
+ * Fix `Enumerable#sole` to return the full tuple instead of just the first element of the tuple.
46
50
 
47
- ## Rails 7.0.2.4 (April 26, 2022) ##
51
+ *Olivier Bellone*
48
52
 
49
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
53
+ * Fix parallel tests hanging when worker processes die abruptly.
50
54
 
51
- Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
52
- in names of tags and names of attributes, following the specification of XML.
55
+ Previously, if a worker process was killed (e.g., OOM killed, `kill -9`) during parallel
56
+ test execution, the test suite would hang forever waiting for the dead worker.
53
57
 
54
- *Álvaro Martín Fraguas*
58
+ *Joshua Young*
55
59
 
56
- ## Rails 7.0.2.3 (March 08, 2022) ##
60
+ * `ActiveSupport::FileUpdateChecker` does not depend on `Time.now` to prevent unnecessary reloads with time travel test helpers
57
61
 
58
- * No changes.
62
+ *Jan Grodowski*
59
63
 
64
+ * Fix `ActiveSupport::BroadcastLogger` from executing a block argument for each logger (tagged, info, etc.).
60
65
 
61
- ## Rails 7.0.2.2 (February 11, 2022) ##
66
+ *Jared Armstrong*
62
67
 
63
- * Fix Reloader method signature to work with the new Executor signature
68
+ * Fix `ActiveSupport::HashWithIndifferentAccess#transform_keys!` removing defaults.
64
69
 
70
+ *Hartley McGuire*
65
71
 
66
- ## Rails 7.0.2.1 (February 11, 2022) ##
72
+ * Fix `ActiveSupport::HashWithIndifferentAccess#tranform_keys!` to handle collisions.
67
73
 
68
- * No changes.
74
+ If the transformation would result in a key equal to another not yet transformed one,
75
+ it would result in keys being lost.
69
76
 
77
+ Before:
70
78
 
71
- ## Rails 7.0.2 (February 08, 2022) ##
79
+ ```ruby
80
+ >> {a: 1, b: 2}.with_indifferent_access.transform_keys!(&:succ)
81
+ => {"c" => 1}
82
+ ```
72
83
 
73
- * Fix `ActiveSupport::EncryptedConfiguration` to be compatible with Psych 4
84
+ After:
74
85
 
75
- *Stephen Sugden*
86
+ ```ruby
87
+ >> {a: 1, b: 2}.with_indifferent_access.transform_keys!(&:succ)
88
+ => {"c" => 1, "d" => 2}
89
+ ```
76
90
 
77
- * Improve `File.atomic_write` error handling.
91
+ *Jason T Johnson*, *Jean Boussier*
78
92
 
79
- *Daniel Pepper*
93
+ * Fix `ActiveSupport::Cache::MemCacheStore#read_multi` to handle network errors.
80
94
 
95
+ This method specifically wasn't handling network errors like other codepaths.
81
96
 
82
- ## Rails 7.0.1 (January 06, 2022) ##
97
+ *Alessandro Dal Grande*
83
98
 
84
- * Fix `Class#descendants` and `DescendantsTracker#descendants` compatibility with Ruby 3.1.
99
+ * Fix Active Support Cache `fetch_multi` when local store is active.
85
100
 
86
- [The native `Class#descendants` was reverted prior to Ruby 3.1 release](https://bugs.ruby-lang.org/issues/14394#note-33),
87
- but `Class#subclasses` was kept, breaking the feature detection.
101
+ `fetch_multi` now properly yield to the provided block for missing entries
102
+ that have been recorded as such in the local store.
88
103
 
89
104
  *Jean Boussier*
90
105
 
106
+ * Fix execution wrapping to report all exceptions, including `Exception`.
91
107
 
92
- ## Rails 7.0.0 (December 15, 2021) ##
93
-
94
- * Fix `ActiveSupport::Duration.build` to support negative values.
108
+ If a more serious error like `SystemStackError` or `NoMemoryError` happens,
109
+ the error reporter should be able to report these kinds of exceptions.
95
110
 
96
- The algorithm to collect the `parts` of the `ActiveSupport::Duration`
97
- ignored the sign of the `value` and accumulated incorrect part values. This
98
- impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
99
- not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
111
+ *Gannon McGibbon*
100
112
 
101
- *Caleb Buxton*, *Braden Staudacher*
113
+ * Fix `RedisCacheStore` and `MemCacheStore` to also handle connection pool related errors.
102
114
 
115
+ These errors are rescued and reported to `Rails.error`.
103
116
 
104
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
117
+ *Jean Boussier*
105
118
 
106
- * No changes.
119
+ * Fix `ActiveSupport::Cache#read_multi` to respect version expiry when using local cache.
107
120
 
121
+ *zzak*
108
122
 
109
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
123
+ * Fix `ActiveSupport::MessageVerifier` and `ActiveSupport::MessageEncryptor` configuration of `on_rotation` callback.
110
124
 
111
- * No changes.
125
+ ```ruby
126
+ verifier.rotate(old_secret).on_rotation { ... }
127
+ ```
112
128
 
113
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
129
+ Now both work as documented.
114
130
 
115
- * Deprecate passing a format to `#to_s` in favor of `#to_formatted_s` in `Array`, `Range`, `Date`, `DateTime`, `Time`,
116
- `BigDecimal`, `Float` and, `Integer`.
131
+ *Jean Boussier*
117
132
 
118
- *Rafael Mendonça França*
133
+ * Fix `ActiveSupport::MessageVerifier` to always be able to verify both URL-safe and URL-unsafe payloads.
119
134
 
120
- * Document `ActiveSupport::Testing::Deprecation`.
135
+ This is to allow transitioning seemlessly from either configuration without immediately invalidating
136
+ all previously generated signed messages.
121
137
 
122
- *Sam Bostock & Sam Jordan*
138
+ *Jean Boussier*, *Florent Beaurain*, *Ali Sepehri*
123
139
 
124
- * Add `Pathname#existence`.
140
+ * Fix `cache.fetch` to honor the provided expiry when `:race_condition_ttl` is used.
125
141
 
126
142
  ```ruby
127
- Pathname.new("file").existence&.read
143
+ cache.fetch("key", expires_in: 1.hour, race_condition_ttl: 5.second) do
144
+ "something"
145
+ end
128
146
  ```
129
147
 
130
- *Timo Schilling*
148
+ In the above example, the final cache entry would have a 10 seconds TTL instead
149
+ of the requested 1 hour.
131
150
 
132
- * Remove deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
151
+ *Dhia*
133
152
 
134
- *Rafael Mendonça França*
153
+ * Better handle procs with splat arguments in `set_callback`.
135
154
 
136
- * Remove deprecated support to use `Range#include?` to check the inclusion of a value in
137
- a date time range is deprecated.
155
+ *Radamés Roriz*
138
156
 
139
- *Rafael Mendonça França*
140
-
141
- * Remove deprecated `URI.parser`.
142
-
143
- *Rafael Mendonça França*
157
+ * Fix `String#mb_chars` to not mutate the receiver.
144
158
 
145
- * Remove deprecated `config.active_support.use_sha1_digests`.
159
+ Previously it would call `force_encoding` on the receiver,
160
+ now it dups the receiver first.
146
161
 
147
- *Rafael Mendonça França*
162
+ *Jean Boussier*
148
163
 
149
- * Invoking `Object#with_options` without a `&block` argument returns the
150
- `ActiveSupport::OptionMerger` instance.
164
+ * Improve `ErrorSubscriber` to also mark error causes as reported.
151
165
 
152
- *Sean Doyle*
166
+ This avoid some cases of errors being reported twice, notably in views because of how
167
+ errors are wrapped in `ActionView::Template::Error`.
153
168
 
154
- * `Rails.application.executor` hooks can now be called around every test
169
+ *Jean Boussier*
155
170
 
156
- This helps to better simulate request or job local state being reset around tests and prevents state
157
- leaking from one test to another.
171
+ * Fix `Module#module_parent_name` to return the correct name after the module has been named.
158
172
 
159
- However it requires the executor hooks executed in the test environment to be re-entrant.
173
+ When called on an anonymous module, the return value wouldn't change after the module was given a name
174
+ later by being assigned to a constant.
160
175
 
161
- To enable this, set `config.active_support.executor_around_test_case = true` (this is the default in Rails 7).
176
+ ```ruby
177
+ mod = Module.new
178
+ mod.module_parent_name # => "Object"
179
+ MyModule::Something = mod
180
+ mod.module_parent_name # => "MyModule"
181
+ ```
162
182
 
163
183
  *Jean Boussier*
164
184
 
165
- * `ActiveSupport::DescendantsTracker` now mostly delegate to `Class#descendants` on Ruby 3.1
185
+ * Fix a bug in `ERB::Util.tokenize` that causes incorrect tokenization when ERB tags are preceeded by multibyte characters.
166
186
 
167
- Ruby now provides a fast `Class#descendants` making `ActiveSupport::DescendantsTracker` mostly useless.
187
+ *Martin Emde*
168
188
 
169
- As a result the following methods are deprecated:
170
189
 
171
- - `ActiveSupport::DescendantsTracker.direct_descendants`
172
- - `ActiveSupport::DescendantsTracker#direct_descendants`
190
+ ## Rails 7.2.2.2 (August 13, 2025) ##
173
191
 
174
- *Jean Boussier*
175
-
176
- * Fix the `Digest::UUID.uuid_from_hash` behavior for namespace IDs that are different from the ones defined on `Digest::UUID`.
192
+ * No changes.
177
193
 
178
- The new behavior will be enabled by setting the
179
- `config.active_support.use_rfc4122_namespaced_uuids` option to `true`
180
- and is the default for new apps.
181
194
 
182
- The old behavior is the default for upgraded apps and will output a
183
- deprecation warning every time a value that is different than one of
184
- the constants defined on the `Digest::UUID` extension is used as the
185
- namespace ID.
195
+ ## Rails 7.2.2.1 (December 10, 2024) ##
186
196
 
187
- *Alex Robbin*, *Erich Soares Machado*, *Eugene Kenny*
197
+ * No changes.
188
198
 
189
- * `ActiveSupport::Inflector::Inflections#clear(:acronyms)` is now supported,
190
- and `inflector.clear` / `inflector.clear(:all)` also clears acronyms.
191
199
 
192
- *Alex Ghiculescu*, *Oliver Peate*
200
+ ## Rails 7.2.2 (October 30, 2024) ##
193
201
 
202
+ * Include options when instrumenting `ActiveSupport::Cache::Store#delete` and `ActiveSupport::Cache::Store#delete_multi`.
194
203
 
195
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
204
+ *Adam Renberg Tamm*
196
205
 
197
- * No changes.
206
+ * Print test names when running `rails test -v` for parallel tests.
198
207
 
208
+ *John Hawthorn*, *Abeid Ahmed*
199
209
 
200
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
201
210
 
202
- * `ActiveSupport::Dependencies` no longer installs a `const_missing` hook. Before this, you could push to the autoload paths and have constants autoloaded. This feature, known as the `classic` autoloader, has been removed.
211
+ ## Rails 7.2.1.2 (October 23, 2024) ##
203
212
 
204
- *Xavier Noria*
213
+ * No changes.
205
214
 
206
- * Private internal classes of `ActiveSupport::Dependencies` have been deleted, like `ActiveSupport::Dependencies::Reference`, `ActiveSupport::Dependencies::Blamable`, and others.
207
215
 
208
- *Xavier Noria*
216
+ ## Rails 7.2.1.1 (October 15, 2024) ##
209
217
 
210
- * The private API of `ActiveSupport::Dependencies` has been deleted. That includes methods like `hook!`, `unhook!`, `depend_on`, `require_or_load`, `mechanism`, and many others.
218
+ * No changes.
211
219
 
212
- *Xavier Noria*
213
220
 
214
- * Improves the performance of `ActiveSupport::NumberHelper` formatters by avoiding the use of exceptions as flow control.
221
+ ## Rails 7.2.1 (August 22, 2024) ##
215
222
 
216
- *Mike Dalessio*
223
+ * No changes.
217
224
 
218
- * Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception`
219
225
 
220
- Previously, if you provided a `error_handler` to `redis_cache_store`, any errors thrown by
221
- the error handler would be rescued and logged only. Removed the `rescue` clause from `handle_exception`
222
- to allow these to be thrown.
226
+ ## Rails 7.2.0 (August 09, 2024) ##
223
227
 
224
- *Nicholas A. Stuart*
228
+ * Fix `delegate_missing_to allow_nil: true` when called with implict self
225
229
 
226
- * Allow entirely opting out of deprecation warnings.
230
+ ```ruby
231
+ class Person
232
+ delegate_missing_to :address, allow_nil: true
227
233
 
228
- Previously if you did `app.config.active_support.deprecation = :silence`, some work would
229
- still be done on each call to `ActiveSupport::Deprecation.warn`. In very hot paths, this could
230
- cause performance issues.
234
+ def address
235
+ nil
236
+ end
231
237
 
232
- Now, you can make `ActiveSupport::Deprecation.warn` a no-op:
238
+ def berliner?
239
+ city == "Berlin"
240
+ end
241
+ end
233
242
 
234
- ```ruby
235
- config.active_support.report_deprecations = false
243
+ Person.new.city # => nil
244
+ Person.new.berliner? # undefined local variable or method `city' for an instance of Person (NameError)
236
245
  ```
237
246
 
238
- This is the default in production for new apps. It is the equivalent to:
247
+ *Jean Boussier*
239
248
 
240
- ```ruby
241
- config.active_support.deprecation = :silence
242
- config.active_support.disallowed_deprecation = :silence
243
- ```
249
+ * Add `logger` as a dependency since it is a bundled gem candidate for Ruby 3.5
244
250
 
245
- but will take a more optimised code path.
251
+ *Earlopain*
246
252
 
247
- *Alex Ghiculescu*
253
+ * Define `Digest::UUID.nil_uuid`, which returns the so-called nil UUID.
248
254
 
249
- * Faster tests by parallelizing only when overhead is justified by the number
250
- of them.
255
+ *Xavier Noria*
251
256
 
252
- Running tests in parallel adds overhead in terms of database
253
- setup and fixture loading. Now, Rails will only parallelize test executions when
254
- there are enough tests to make it worth it.
257
+ * Support `duration` type in `ActiveSupport::XmlMini`.
255
258
 
256
- This threshold is 50 by default, and is configurable via config setting in
257
- your test.rb:
259
+ *heka1024*
258
260
 
259
- ```ruby
260
- config.active_support.test_parallelization_threshold = 100
261
- ```
261
+ * Remove deprecated `ActiveSupport::Notifications::Event#children` and `ActiveSupport::Notifications::Event#parent_of?`.
262
262
 
263
- It's also configurable at the test case level:
263
+ *Rafael Mendonça França*
264
264
 
265
- ```ruby
266
- class ActiveSupport::TestCase
267
- parallelize threshold: 100
268
- end
269
- ```
265
+ * Remove deprecated support to call the following methods without passing a deprecator:
270
266
 
271
- *Jorge Manrubia*
267
+ - `deprecate`
268
+ - `deprecate_constant`
269
+ - `ActiveSupport::Deprecation::DeprecatedObjectProxy.new`
270
+ - `ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new`
271
+ - `ActiveSupport::Deprecation::DeprecatedConstantProxy.new`
272
+ - `assert_deprecated`
273
+ - `assert_not_deprecated`
274
+ - `collect_deprecations`
272
275
 
273
- * OpenSSL constants are now used for Digest computations.
276
+ *Rafael Mendonça França*
274
277
 
275
- *Dirkjan Bussink*
278
+ * Remove deprecated `ActiveSupport::Deprecation` delegation to instance.
276
279
 
277
- * `TimeZone.iso8601` now accepts valid ordinal values similar to Ruby's `Date._iso8601` method.
278
- A valid ordinal value will be converted to an instance of `TimeWithZone` using the `:year`
279
- and `:yday` fragments returned from `Date._iso8601`.
280
+ *Rafael Mendonça França*
280
281
 
281
- ```ruby
282
- twz = ActiveSupport::TimeZone["Eastern Time (US & Canada)"].iso8601("21087")
283
- twz.to_a[0, 6] == [0, 0, 0, 28, 03, 2021]
284
- ```
282
+ * Remove deprecated `SafeBuffer#clone_empty`.
285
283
 
286
- *Steve Laing*
284
+ *Rafael Mendonça França*
287
285
 
288
- * `Time#change` and methods that call it (e.g. `Time#advance`) will now
289
- return a `Time` with the timezone argument provided, if the caller was
290
- initialized with a timezone argument.
286
+ * Remove deprecated `#to_default_s` from `Array`, `Date`, `DateTime` and `Time`.
291
287
 
292
- Fixes [#42467](https://github.com/rails/rails/issues/42467).
288
+ *Rafael Mendonça França*
293
289
 
294
- *Alex Ghiculescu*
290
+ * Remove deprecated support to passing `Dalli::Client` instances to `MemCacheStore`.
295
291
 
296
- * Allow serializing any module or class to JSON by name.
292
+ *Rafael Mendonça França*
297
293
 
298
- *Tyler Rick*, *Zachary Scott*
294
+ * Remove deprecated `config.active_support.use_rfc4122_namespaced_uuids`.
299
295
 
300
- * Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the
301
- `RAILS_MASTER_KEY` environment variable is blank (e.g. `""`).
296
+ *Rafael Mendonça França*
302
297
 
303
- *Sunny Ripert*
298
+ * Remove deprecated `config.active_support.remove_deprecated_time_with_zone_name`.
304
299
 
305
- * The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`.
300
+ *Rafael Mendonça França*
306
301
 
307
- It permits asserting on the initial value that is expected not to change.
302
+ * Remove deprecated `config.active_support.disable_to_s_conversion`.
308
303
 
309
- ```ruby
310
- assert_no_changes -> { Status.all_good? }, from: true do
311
- post :create, params: { status: { ok: true } }
312
- end
313
- ```
304
+ *Rafael Mendonça França*
314
305
 
315
- *George Claghorn*
306
+ * Remove deprecated support to bolding log text with positional boolean in `ActiveSupport::LogSubscriber#color`.
316
307
 
317
- * Deprecate `ActiveSupport::SafeBuffer`'s incorrect implicit conversion of objects into string.
308
+ *Rafael Mendonça França*
318
309
 
319
- Except for a few methods like `String#%`, objects must implement `#to_str`
320
- to be implicitly converted to a String in string operations. In some
321
- circumstances `ActiveSupport::SafeBuffer` was incorrectly calling the
322
- explicit conversion method (`#to_s`) on them. This behavior is now
323
- deprecated.
310
+ * Remove deprecated constants `ActiveSupport::LogSubscriber::CLEAR` and `ActiveSupport::LogSubscriber::BOLD`.
324
311
 
325
- *Jean Boussier*
312
+ *Rafael Mendonça França*
326
313
 
327
- * Allow nested access to keys on `Rails.application.credentials`.
314
+ * Remove deprecated support for `config.active_support.cache_format_version = 6.1`.
328
315
 
329
- Previously only top level keys in `credentials.yml.enc` could be accessed with method calls. Now any key can.
316
+ *Rafael Mendonça França*
330
317
 
331
- For example, given these secrets:
318
+ * Remove deprecated `:pool_size` and `:pool_timeout` options for the cache storage.
332
319
 
333
- ```yml
334
- aws:
335
- access_key_id: 123
336
- secret_access_key: 345
337
- ```
320
+ *Rafael Mendonça França*
338
321
 
339
- `Rails.application.credentials.aws.access_key_id` will now return the same thing as
340
- `Rails.application.credentials.aws[:access_key_id]`.
322
+ * Warn on tests without assertions.
341
323
 
342
- *Alex Ghiculescu*
324
+ `ActiveSupport::TestCase` now warns when tests do not run any assertions.
325
+ This is helpful in detecting broken tests that do not perform intended assertions.
343
326
 
344
- * Added a faster and more compact `ActiveSupport::Cache` serialization format.
327
+ *fatkodima*
345
328
 
346
- It can be enabled with `config.active_support.cache_format_version = 7.0` or
347
- `config.load_defaults 7.0`. Regardless of the configuration Active Support
348
- 7.0 can read cache entries serialized by Active Support 6.1 which allows to
349
- upgrade without invalidating the cache. However Rails 6.1 can't read the
350
- new format, so all readers must be upgraded before the new format is enabled.
329
+ * Support `hexBinary` type in `ActiveSupport::XmlMini`.
351
330
 
352
- *Jean Boussier*
331
+ *heka1024*
353
332
 
354
- * Add `Enumerable#sole`, per `ActiveRecord::FinderMethods#sole`. Returns the
355
- sole item of the enumerable, raising if no items are found, or if more than
356
- one is.
333
+ * Deprecate `ActiveSupport::ProxyObject` in favor of Ruby's built-in `BasicObject`.
357
334
 
358
- *Asherah Connor*
335
+ *Earlopain*
359
336
 
360
- * Freeze `ActiveSupport::Duration#parts` and remove writer methods.
337
+ * `stub_const` now accepts a `exists: false` parameter to allow stubbing missing constants.
361
338
 
362
- Durations are meant to be value objects and should not be mutated.
339
+ *Jean Boussier*
340
+
341
+ * Make `ActiveSupport::BacktraceCleaner` copy filters and silencers on dup and clone.
363
342
 
364
- *Andrew White*
343
+ Previously the copy would still share the internal silencers and filters array,
344
+ causing state to leak.
365
345
 
366
- * Fix `ActiveSupport::TimeZone#utc_to_local` with fractional seconds.
346
+ *Jean Boussier*
367
347
 
368
- When `utc_to_local_returns_utc_offset_times` is false and the time
369
- instance had fractional seconds the new UTC time instance was out by
370
- a factor of 1,000,000 as the `Time.utc` constructor takes a usec
371
- value and not a fractional second value.
348
+ * Updating Astana with Western Kazakhstan TZInfo identifier.
372
349
 
373
- *Andrew White*
350
+ *Damian Nelson*
374
351
 
375
- * Add `expires_at` argument to `ActiveSupport::Cache` `write` and `fetch` to set a cache entry TTL as an absolute time.
352
+ * Add filename support for `ActiveSupport::Logger.logger_outputs_to?`.
376
353
 
377
354
  ```ruby
378
- Rails.cache.write(key, value, expires_at: Time.now.at_end_of_hour)
355
+ logger = Logger.new('/var/log/rails.log')
356
+ ActiveSupport::Logger.logger_outputs_to?(logger, '/var/log/rails.log')
379
357
  ```
380
358
 
381
- *Jean Boussier*
359
+ *Christian Schmidt*
382
360
 
383
- * Deprecate `ActiveSupport::TimeWithZone.name` so that from Rails 7.1 it will use the default implementation.
361
+ * Include `IPAddr#prefix` when serializing an `IPAddr` using the
362
+ `ActiveSupport::MessagePack` serializer.
384
363
 
385
- *Andrew White*
364
+ This change is backward and forward compatible — old payloads can
365
+ still be read, and new payloads will be readable by older versions of Rails.
386
366
 
387
- * Deprecates Rails custom `Enumerable#sum` and `Array#sum` in favor of Ruby's native implementation which
388
- is considerably faster.
367
+ *Taiki Komaba*
389
368
 
390
- Ruby requires an initializer for non-numeric type as per examples below:
369
+ * Add `default:` support for `ActiveSupport::CurrentAttributes.attribute`.
391
370
 
392
371
  ```ruby
393
- %w[foo bar].sum('')
394
- # instead of %w[foo bar].sum
372
+ class Current < ActiveSupport::CurrentAttributes
373
+ attribute :counter, default: 0
374
+ end
375
+ ```
376
+
377
+ *Sean Doyle*
378
+
379
+ * Yield instance to `Object#with` block.
395
380
 
396
- [[1, 2], [3, 4, 5]].sum([])
397
- # instead of [[1, 2], [3, 4, 5]].sum
381
+ ```ruby
382
+ client.with(timeout: 5_000) do |c|
383
+ c.get("/commits")
384
+ end
398
385
  ```
399
386
 
400
- *Alberto Mota*
387
+ *Sean Doyle*
388
+
389
+ * Use logical core count instead of physical core count to determine the
390
+ default number of workers when parallelizing tests.
401
391
 
402
- * Tests parallelization is now disabled when running individual files to prevent the setup overhead.
392
+ *Jonathan Hefner*
403
393
 
404
- It can still be enforced if the environment variable `PARALLEL_WORKERS` is present and set to a value greater than 1.
394
+ * Fix `Time.now/DateTime.now/Date.today` to return results in a system timezone after `#travel_to`.
405
395
 
406
- *Ricardo Díaz*
396
+ There is a bug in the current implementation of #travel_to:
397
+ it remembers a timezone of its argument, and all stubbed methods start
398
+ returning results in that remembered timezone. However, the expected
399
+ behavior is to return results in a system timezone.
407
400
 
408
- * Fix proxying keyword arguments in `ActiveSupport::CurrentAttributes`.
401
+ *Aleksei Chernenkov*
409
402
 
410
- *Marcin Kołodziej*
403
+ * Add `ErrorReported#unexpected` to report precondition violations.
411
404
 
412
- * Add `Enumerable#maximum` and `Enumerable#minimum` to easily calculate the maximum or minimum from extracted
413
- elements of an enumerable.
405
+ For example:
414
406
 
415
407
  ```ruby
416
- payments = [Payment.new(5), Payment.new(15), Payment.new(10)]
417
-
418
- payments.minimum(:price) # => 5
419
- payments.maximum(:price) # => 15
408
+ def edit
409
+ if published?
410
+ Rails.error.unexpected("[BUG] Attempting to edit a published article, that shouldn't be possible")
411
+ return false
412
+ end
413
+ # ...
414
+ end
420
415
  ```
421
416
 
422
- This also allows passing enumerables to `fresh_when` and `stale?` in Action Controller.
423
- See PR [#41404](https://github.com/rails/rails/pull/41404) for an example.
417
+ The above will raise an error in development and test, but only report the error in production.
424
418
 
425
- *Ayrton De Craene*
419
+ *Jean Boussier*
426
420
 
427
- * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
421
+ * Make the order of read_multi and write_multi notifications for `Cache::Store#fetch_multi` operations match the order they are executed in.
428
422
 
429
- ```ruby
430
- config.cache_store = :mem_cache_store, nil
423
+ *Adam Renberg Tamm*
431
424
 
432
- # is now equivalent to
425
+ * Make return values of `Cache::Store#write` consistent.
433
426
 
434
- config.cache_store = :mem_cache_store
427
+ The return value was not specified before. Now it returns `true` on a successful write,
428
+ `nil` if there was an error talking to the cache backend, and `false` if the write failed
429
+ for another reason (e.g. the key already exists and `unless_exist: true` was passed).
435
430
 
436
- # and is also equivalent to
431
+ *Sander Verdonschot*
437
432
 
438
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
433
+ * Fix logged cache keys not always matching actual key used by cache action.
439
434
 
440
- # which is the fallback behavior of Dalli
441
- ```
435
+ *Hartley McGuire*
436
+
437
+ * Improve error messages of `assert_changes` and `assert_no_changes`.
438
+
439
+ `assert_changes` error messages now display objects with `.inspect` to make it easier
440
+ to differentiate nil from empty strings, strings from symbols, etc.
441
+ `assert_no_changes` error messages now surface the actual value.
442
+
443
+ *pcreux*
442
444
 
443
- This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
445
+ * Fix `#to_fs(:human_size)` to correctly work with negative numbers.
444
446
 
445
- *Michael Overmeyer*
447
+ *Earlopain*
446
448
 
447
- * Add `Enumerable#in_order_of` to put an Enumerable in a certain order by a key.
449
+ * Fix `BroadcastLogger#dup` so that it duplicates the logger's `broadcasts`.
448
450
 
449
- *DHH*
451
+ *Andrew Novoselac*
450
452
 
451
- * `ActiveSupport::Inflector.camelize` behaves expected when provided a symbol `:upper` or `:lower` argument. Matches
452
- `String#camelize` behavior.
453
+ * Fix issue where `bootstrap.rb` overwrites the `level` of a `BroadcastLogger`'s `broadcasts`.
453
454
 
454
- *Alex Ghiculescu*
455
+ *Andrew Novoselac*
455
456
 
456
- * Raises an `ArgumentError` when the first argument of `ActiveSupport::Notification.subscribe` is
457
- invalid.
457
+ * Fix compatibility with the `semantic_logger` gem.
458
458
 
459
- *Vipul A M*
459
+ The `semantic_logger` gem doesn't behave exactly like stdlib logger in that
460
+ `SemanticLogger#level` returns a Symbol while stdlib `Logger#level` returns an Integer.
460
461
 
461
- * `HashWithIndifferentAccess#deep_transform_keys` now returns a `HashWithIndifferentAccess` instead of a `Hash`.
462
+ This caused the various `LogSubscriber` classes in Rails to break when assigned a
463
+ `SemanticLogger` instance.
462
464
 
463
- *Nathaniel Woodthorpe*
465
+ *Jean Boussier*, *ojab*
464
466
 
465
- * Consume dalli’s `cache_nils` configuration as `ActiveSupport::Cache`'s `skip_nil` when using `MemCacheStore`.
467
+ * Fix MemoryStore to prevent race conditions when incrementing or decrementing.
466
468
 
467
- *Ritikesh G*
469
+ *Pierre Jambet*
468
470
 
469
- * Add `RedisCacheStore#stats` method similar to `MemCacheStore#stats`. Calls `redis#info` internally.
471
+ * Implement `HashWithIndifferentAccess#to_proc`.
470
472
 
471
- *Ritikesh G*
473
+ Previously, calling `#to_proc` on `HashWithIndifferentAccess` object used inherited `#to_proc`
474
+ method from the `Hash` class, which was not able to access values using indifferent keys.
472
475
 
476
+ *fatkodima*
473
477
 
474
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activesupport/CHANGELOG.md) for previous changes.
478
+ Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activesupport/CHANGELOG.md) for previous changes.