activesupport 7.0.8.7 → 7.2.3.1

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