activesupport 7.0.8.7 → 7.2.3

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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +229 -397
  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 +34 -177
  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_human_size_converter.rb +3 -3
  151. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -0
  152. data/lib/active_support/number_helper.rb +379 -318
  153. data/lib/active_support/option_merger.rb +2 -2
  154. data/lib/active_support/ordered_hash.rb +3 -3
  155. data/lib/active_support/ordered_options.rb +67 -15
  156. data/lib/active_support/parameter_filter.rb +84 -69
  157. data/lib/active_support/proxy_object.rb +8 -3
  158. data/lib/active_support/railtie.rb +25 -20
  159. data/lib/active_support/reloader.rb +12 -4
  160. data/lib/active_support/rescuable.rb +2 -0
  161. data/lib/active_support/secure_compare_rotator.rb +16 -9
  162. data/lib/active_support/string_inquirer.rb +4 -2
  163. data/lib/active_support/subscriber.rb +10 -27
  164. data/lib/active_support/syntax_error_proxy.rb +60 -0
  165. data/lib/active_support/tagged_logging.rb +64 -25
  166. data/lib/active_support/test_case.rb +156 -7
  167. data/lib/active_support/testing/assertions.rb +28 -12
  168. data/lib/active_support/testing/autorun.rb +0 -2
  169. data/lib/active_support/testing/constant_stubbing.rb +54 -0
  170. data/lib/active_support/testing/deprecation.rb +20 -27
  171. data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
  172. data/lib/active_support/testing/isolation.rb +21 -9
  173. data/lib/active_support/testing/method_call_assertions.rb +7 -8
  174. data/lib/active_support/testing/parallelization/server.rb +18 -2
  175. data/lib/active_support/testing/parallelization/worker.rb +2 -2
  176. data/lib/active_support/testing/parallelization.rb +12 -1
  177. data/lib/active_support/testing/parallelize_executor.rb +8 -3
  178. data/lib/active_support/testing/setup_and_teardown.rb +2 -0
  179. data/lib/active_support/testing/stream.rb +1 -1
  180. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  181. data/lib/active_support/testing/time_helpers.rb +38 -16
  182. data/lib/active_support/time_with_zone.rb +12 -18
  183. data/lib/active_support/values/time_zone.rb +25 -14
  184. data/lib/active_support/version.rb +1 -1
  185. data/lib/active_support/xml_mini/jdom.rb +3 -10
  186. data/lib/active_support/xml_mini/nokogiri.rb +1 -1
  187. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  188. data/lib/active_support/xml_mini/rexml.rb +1 -1
  189. data/lib/active_support/xml_mini.rb +14 -3
  190. data/lib/active_support.rb +15 -3
  191. metadata +142 -24
  192. data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
  193. data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -40
  194. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -36
  195. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
  196. data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -36
  197. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -5
  198. data/lib/active_support/core_ext/range/overlaps.rb +0 -10
  199. data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -73
  200. data/lib/active_support/core_ext/uri.rb +0 -5
  201. data/lib/active_support/deprecation/instance_delegator.rb +0 -38
  202. data/lib/active_support/per_thread_registry.rb +0 -65
  203. data/lib/active_support/ruby_features.rb +0 -7
data/CHANGELOG.md CHANGED
@@ -1,600 +1,432 @@
1
- ## Rails 7.0.8.7 (December 10, 2024) ##
1
+ ## Rails 7.2.3 (October 28, 2025) ##
2
2
 
3
- * No changes.
4
-
5
-
6
- ## Rails 7.0.8.6 (October 23, 2024) ##
7
-
8
- * No changes.
9
-
10
-
11
- ## Rails 7.0.8.5 (October 15, 2024) ##
12
-
13
- * No changes.
14
-
15
-
16
- ## Rails 7.0.8.4 (June 04, 2024) ##
3
+ * Fix `Enumerable#sole` to return the full tuple instead of just the first element of the tuple.
17
4
 
18
- * No changes.
19
-
20
-
21
- ## Rails 7.0.8.3 (May 17, 2024) ##
5
+ *Olivier Bellone*
22
6
 
23
- * No changes.
7
+ * Fix parallel tests hanging when worker processes die abruptly.
24
8
 
9
+ Previously, if a worker process was killed (e.g., OOM killed, `kill -9`) during parallel
10
+ test execution, the test suite would hang forever waiting for the dead worker.
25
11
 
26
- ## Rails 7.0.8.2 (May 16, 2024) ##
12
+ *Joshua Young*
27
13
 
28
- * No changes.
14
+ * `ActiveSupport::FileUpdateChecker` does not depend on `Time.now` to prevent unnecessary reloads with time travel test helpers
29
15
 
16
+ *Jan Grodowski*
30
17
 
31
- ## Rails 7.0.8.1 (February 21, 2024) ##
18
+ * Fix `ActiveSupport::BroadcastLogger` from executing a block argument for each logger (tagged, info, etc.).
32
19
 
33
- * No changes.
20
+ *Jared Armstrong*
34
21
 
35
-
36
- ## Rails 7.0.8 (September 09, 2023) ##
37
-
38
- * Fix `TimeWithZone` still using deprecated `#to_s` when `ENV` or `config` to
39
- disable it are set.
22
+ * Fix `ActiveSupport::HashWithIndifferentAccess#transform_keys!` removing defaults.
40
23
 
41
24
  *Hartley McGuire*
42
25
 
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).
26
+ * Fix `ActiveSupport::HashWithIndifferentAccess#tranform_keys!` to handle collisions.
46
27
 
47
- *Jonathan del Strother*
28
+ If the transformation would result in a key equal to another not yet transformed one,
29
+ it would result in keys being lost.
48
30
 
31
+ Before:
49
32
 
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]
60
-
61
-
62
- ## Rails 7.0.7 (August 09, 2023) ##
63
-
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*
33
+ ```ruby
34
+ >> {a: 1, b: 2}.with_indifferent_access.transform_keys!(&:succ)
35
+ => {"c" => 1}
36
+ ```
71
37
 
72
- * Fix `ActiveSupport::Inflector.humanize(nil)` raising ``NoMethodError: undefined method `end_with?' for nil:NilClass``.
38
+ After:
73
39
 
74
- *James Robinson*
40
+ ```ruby
41
+ >> {a: 1, b: 2}.with_indifferent_access.transform_keys!(&:succ)
42
+ => {"c" => 1, "d" => 2}
43
+ ```
75
44
 
76
- * Fix `Enumerable#sum` for `Enumerator#lazy`.
45
+ *Jason T Johnson*, *Jean Boussier*
77
46
 
78
- *fatkodima*, *Matthew Draper*, *Jonathan Hefner*
47
+ * Fix `ActiveSupport::Cache::MemCacheStore#read_multi` to handle network errors.
79
48
 
80
- * Improve error message when EventedFileUpdateChecker is used without a
81
- compatible version of the Listen gem
49
+ This method specifically wasn't handling network errors like other codepaths.
82
50
 
83
- *Hartley McGuire*
51
+ *Alessandro Dal Grande*
84
52
 
53
+ * Fix Active Support Cache `fetch_multi` when local store is active.
85
54
 
86
- ## Rails 7.0.6 (June 29, 2023) ##
55
+ `fetch_multi` now properly yield to the provided block for missing entries
56
+ that have been recorded as such in the local store.
87
57
 
88
- * Fix `EncryptedConfiguration` returning incorrect values for some `Hash`
89
- methods
58
+ *Jean Boussier*
90
59
 
91
- *Hartley McGuire*
60
+ * Fix execution wrapping to report all exceptions, including `Exception`.
92
61
 
93
- * Fix arguments being destructed `Enumerable#many?` with block.
62
+ If a more serious error like `SystemStackError` or `NoMemoryError` happens,
63
+ the error reporter should be able to report these kinds of exceptions.
94
64
 
95
- *Andrew Novoselac*
65
+ *Gannon McGibbon*
96
66
 
97
- * Fix humanize for strings ending with id.
67
+ * Fix `RedisCacheStore` and `MemCacheStore` to also handle connection pool related errors.
98
68
 
99
- *fatkodima*
69
+ These errors are rescued and reported to `Rails.error`.
100
70
 
71
+ *Jean Boussier*
101
72
 
102
- ## Rails 7.0.5.1 (June 26, 2023) ##
73
+ * Fix `ActiveSupport::Cache#read_multi` to respect version expiry when using local cache.
103
74
 
104
- * No changes.
75
+ *zzak*
105
76
 
77
+ * Fix `ActiveSupport::MessageVerifier` and `ActiveSupport::MessageEncryptor` configuration of `on_rotation` callback.
106
78
 
107
- ## Rails 7.0.5 (May 24, 2023) ##
79
+ ```ruby
80
+ verifier.rotate(old_secret).on_rotation { ... }
81
+ ```
108
82
 
109
- * Fixes TimeWithZone ArgumentError.
83
+ Now both work as documented.
110
84
 
111
- *Niklas Häusele*
85
+ *Jean Boussier*
112
86
 
87
+ * Fix `ActiveSupport::MessageVerifier` to always be able to verify both URL-safe and URL-unsafe payloads.
113
88
 
114
- ## Rails 7.0.4.3 (March 13, 2023) ##
89
+ This is to allow transitioning seemlessly from either configuration without immediately invalidating
90
+ all previously generated signed messages.
115
91
 
116
- * Implement SafeBuffer#bytesplice
92
+ *Jean Boussier*, *Florent Beaurain*, *Ali Sepehri*
117
93
 
118
- [CVE-2023-28120]
94
+ * Fix `cache.fetch` to honor the provided expiry when `:race_condition_ttl` is used.
119
95
 
96
+ ```ruby
97
+ cache.fetch("key", expires_in: 1.hour, race_condition_ttl: 5.second) do
98
+ "something"
99
+ end
100
+ ```
120
101
 
121
- ## Rails 7.0.4.2 (January 24, 2023) ##
102
+ In the above example, the final cache entry would have a 10 seconds TTL instead
103
+ of the requested 1 hour.
122
104
 
123
- * No changes.
105
+ *Dhia*
124
106
 
107
+ * Better handle procs with splat arguments in `set_callback`.
125
108
 
126
- ## Rails 7.0.4.1 (January 17, 2023) ##
109
+ *Radamés Roriz*
127
110
 
128
- * Avoid regex backtracking in Inflector.underscore
111
+ * Fix `String#mb_chars` to not mutate the receiver.
129
112
 
130
- [CVE-2023-22796]
113
+ Previously it would call `force_encoding` on the receiver,
114
+ now it dups the receiver first.
131
115
 
116
+ *Jean Boussier*
132
117
 
133
- ## Rails 7.0.4 (September 09, 2022) ##
118
+ * Improve `ErrorSubscriber` to also mark error causes as reported.
134
119
 
135
- * Ensure `ActiveSupport::Testing::Isolation::Forking` closes pipes
120
+ This avoid some cases of errors being reported twice, notably in views because of how
121
+ errors are wrapped in `ActionView::Template::Error`.
136
122
 
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.
123
+ *Jean Boussier*
142
124
 
143
- This resulted in an accumulation of open file descriptors, which could
144
- cause errors if the limit is reached.
125
+ * Fix `Module#module_parent_name` to return the correct name after the module has been named.
145
126
 
146
- *Sam Bostock*
127
+ When called on an anonymous module, the return value wouldn't change after the module was given a name
128
+ later by being assigned to a constant.
147
129
 
148
- * Redis cache store is now compatible with redis-rb 5.0.
130
+ ```ruby
131
+ mod = Module.new
132
+ mod.module_parent_name # => "Object"
133
+ MyModule::Something = mod
134
+ mod.module_parent_name # => "MyModule"
135
+ ```
149
136
 
150
137
  *Jean Boussier*
151
138
 
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.
139
+ * Fix a bug in `ERB::Util.tokenize` that causes incorrect tokenization when ERB tags are preceeded by multibyte characters.
157
140
 
158
- This change removes this `arity` restriction of custom behaviors.
141
+ *Martin Emde*
159
142
 
160
- *Ryo Nakamura*
161
143
 
162
-
163
- ## Rails 7.0.3.1 (July 12, 2022) ##
144
+ ## Rails 7.2.2.2 (August 13, 2025) ##
164
145
 
165
146
  * No changes.
166
147
 
167
148
 
168
- ## Rails 7.0.3 (May 09, 2022) ##
149
+ ## Rails 7.2.2.1 (December 10, 2024) ##
169
150
 
170
151
  * No changes.
171
152
 
172
153
 
173
- ## Rails 7.0.2.4 (April 26, 2022) ##
174
-
175
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
154
+ ## Rails 7.2.2 (October 30, 2024) ##
176
155
 
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.
156
+ * Include options when instrumenting `ActiveSupport::Cache::Store#delete` and `ActiveSupport::Cache::Store#delete_multi`.
179
157
 
180
- *Álvaro Martín Fraguas*
158
+ *Adam Renberg Tamm*
181
159
 
182
- ## Rails 7.0.2.3 (March 08, 2022) ##
160
+ * Print test names when running `rails test -v` for parallel tests.
183
161
 
184
- * No changes.
162
+ *John Hawthorn*, *Abeid Ahmed*
185
163
 
186
164
 
187
- ## Rails 7.0.2.2 (February 11, 2022) ##
165
+ ## Rails 7.2.1.2 (October 23, 2024) ##
188
166
 
189
- * Fix Reloader method signature to work with the new Executor signature
167
+ * No changes.
190
168
 
191
169
 
192
- ## Rails 7.0.2.1 (February 11, 2022) ##
170
+ ## Rails 7.2.1.1 (October 15, 2024) ##
193
171
 
194
172
  * No changes.
195
173
 
196
174
 
197
- ## Rails 7.0.2 (February 08, 2022) ##
175
+ ## Rails 7.2.1 (August 22, 2024) ##
198
176
 
199
- * Fix `ActiveSupport::EncryptedConfiguration` to be compatible with Psych 4
177
+ * No changes.
200
178
 
201
- *Stephen Sugden*
202
179
 
203
- * Improve `File.atomic_write` error handling.
180
+ ## Rails 7.2.0 (August 09, 2024) ##
204
181
 
205
- *Daniel Pepper*
182
+ * Fix `delegate_missing_to allow_nil: true` when called with implict self
206
183
 
184
+ ```ruby
185
+ class Person
186
+ delegate_missing_to :address, allow_nil: true
207
187
 
208
- ## Rails 7.0.1 (January 06, 2022) ##
188
+ def address
189
+ nil
190
+ end
209
191
 
210
- * Fix `Class#descendants` and `DescendantsTracker#descendants` compatibility with Ruby 3.1.
192
+ def berliner?
193
+ city == "Berlin"
194
+ end
195
+ end
211
196
 
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.
197
+ Person.new.city # => nil
198
+ Person.new.berliner? # undefined local variable or method `city' for an instance of Person (NameError)
199
+ ```
214
200
 
215
201
  *Jean Boussier*
216
202
 
203
+ * Add `logger` as a dependency since it is a bundled gem candidate for Ruby 3.5
217
204
 
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`).
205
+ *Earlopain*
226
206
 
227
- *Caleb Buxton*, *Braden Staudacher*
228
-
229
-
230
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
231
-
232
- * No changes.
207
+ * Define `Digest::UUID.nil_uuid`, which returns the so-called nil UUID.
233
208
 
209
+ *Xavier Noria*
234
210
 
235
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
211
+ * Support `duration` type in `ActiveSupport::XmlMini`.
236
212
 
237
- * No changes.
213
+ *heka1024*
238
214
 
239
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
240
-
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`.
215
+ * Remove deprecated `ActiveSupport::Notifications::Event#children` and `ActiveSupport::Notifications::Event#parent_of?`.
243
216
 
244
217
  *Rafael Mendonça França*
245
218
 
246
- * Document `ActiveSupport::Testing::Deprecation`.
247
-
248
- *Sam Bostock & Sam Jordan*
219
+ * Remove deprecated support to call the following methods without passing a deprecator:
249
220
 
250
- * Add `Pathname#existence`.
251
-
252
- ```ruby
253
- Pathname.new("file").existence&.read
254
- ```
255
-
256
- *Timo Schilling*
257
-
258
- * Remove deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
221
+ - `deprecate`
222
+ - `deprecate_constant`
223
+ - `ActiveSupport::Deprecation::DeprecatedObjectProxy.new`
224
+ - `ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new`
225
+ - `ActiveSupport::Deprecation::DeprecatedConstantProxy.new`
226
+ - `assert_deprecated`
227
+ - `assert_not_deprecated`
228
+ - `collect_deprecations`
259
229
 
260
230
  *Rafael Mendonça França*
261
231
 
262
- * Remove deprecated support to use `Range#include?` to check the inclusion of a value in
263
- a date time range is deprecated.
232
+ * Remove deprecated `ActiveSupport::Deprecation` delegation to instance.
264
233
 
265
234
  *Rafael Mendonça França*
266
235
 
267
- * Remove deprecated `URI.parser`.
236
+ * Remove deprecated `SafeBuffer#clone_empty`.
268
237
 
269
238
  *Rafael Mendonça França*
270
239
 
271
- * Remove deprecated `config.active_support.use_sha1_digests`.
240
+ * Remove deprecated `#to_default_s` from `Array`, `Date`, `DateTime` and `Time`.
272
241
 
273
242
  *Rafael Mendonça França*
274
243
 
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.
244
+ * Remove deprecated support to passing `Dalli::Client` instances to `MemCacheStore`.
286
245
 
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
246
+ *Rafael Mendonça França*
292
247
 
293
- Ruby now provides a fast `Class#descendants` making `ActiveSupport::DescendantsTracker` mostly useless.
248
+ * Remove deprecated `config.active_support.use_rfc4122_namespaced_uuids`.
294
249
 
295
- As a result the following methods are deprecated:
250
+ *Rafael Mendonça França*
296
251
 
297
- - `ActiveSupport::DescendantsTracker.direct_descendants`
298
- - `ActiveSupport::DescendantsTracker#direct_descendants`
252
+ * Remove deprecated `config.active_support.remove_deprecated_time_with_zone_name`.
299
253
 
300
- *Jean Boussier*
254
+ *Rafael Mendonça França*
301
255
 
302
- * Fix the `Digest::UUID.uuid_from_hash` behavior for namespace IDs that are different from the ones defined on `Digest::UUID`.
256
+ * Remove deprecated `config.active_support.disable_to_s_conversion`.
303
257
 
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.
258
+ *Rafael Mendonça França*
307
259
 
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.
260
+ * Remove deprecated support to bolding log text with positional boolean in `ActiveSupport::LogSubscriber#color`.
312
261
 
313
- *Alex Robbin*, *Erich Soares Machado*, *Eugene Kenny*
262
+ *Rafael Mendonça França*
314
263
 
315
- * `ActiveSupport::Inflector::Inflections#clear(:acronyms)` is now supported,
316
- and `inflector.clear` / `inflector.clear(:all)` also clears acronyms.
264
+ * Remove deprecated constants `ActiveSupport::LogSubscriber::CLEAR` and `ActiveSupport::LogSubscriber::BOLD`.
317
265
 
318
- *Alex Ghiculescu*, *Oliver Peate*
266
+ *Rafael Mendonça França*
319
267
 
268
+ * Remove deprecated support for `config.active_support.cache_format_version = 6.1`.
320
269
 
321
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
270
+ *Rafael Mendonça França*
322
271
 
323
- * No changes.
272
+ * Remove deprecated `:pool_size` and `:pool_timeout` options for the cache storage.
324
273
 
274
+ *Rafael Mendonça França*
325
275
 
326
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
276
+ * Warn on tests without assertions.
327
277
 
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.
278
+ `ActiveSupport::TestCase` now warns when tests do not run any assertions.
279
+ This is helpful in detecting broken tests that do not perform intended assertions.
329
280
 
330
- *Xavier Noria*
281
+ *fatkodima*
331
282
 
332
- * Private internal classes of `ActiveSupport::Dependencies` have been deleted, like `ActiveSupport::Dependencies::Reference`, `ActiveSupport::Dependencies::Blamable`, and others.
283
+ * Support `hexBinary` type in `ActiveSupport::XmlMini`.
333
284
 
334
- *Xavier Noria*
285
+ *heka1024*
335
286
 
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.
287
+ * Deprecate `ActiveSupport::ProxyObject` in favor of Ruby's built-in `BasicObject`.
337
288
 
338
- *Xavier Noria*
289
+ *Earlopain*
339
290
 
340
- * Improves the performance of `ActiveSupport::NumberHelper` formatters by avoiding the use of exceptions as flow control.
291
+ * `stub_const` now accepts a `exists: false` parameter to allow stubbing missing constants.
341
292
 
342
- *Mike Dalessio*
293
+ *Jean Boussier*
343
294
 
344
- * Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception`
295
+ * Make `ActiveSupport::BacktraceCleaner` copy filters and silencers on dup and clone.
345
296
 
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.
297
+ Previously the copy would still share the internal silencers and filters array,
298
+ causing state to leak.
349
299
 
350
- *Nicholas A. Stuart*
300
+ *Jean Boussier*
351
301
 
352
- * Allow entirely opting out of deprecation warnings.
302
+ * Updating Astana with Western Kazakhstan TZInfo identifier.
353
303
 
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.
304
+ *Damian Nelson*
357
305
 
358
- Now, you can make `ActiveSupport::Deprecation.warn` a no-op:
306
+ * Add filename support for `ActiveSupport::Logger.logger_outputs_to?`.
359
307
 
360
308
  ```ruby
361
- config.active_support.report_deprecations = false
309
+ logger = Logger.new('/var/log/rails.log')
310
+ ActiveSupport::Logger.logger_outputs_to?(logger, '/var/log/rails.log')
362
311
  ```
363
312
 
364
- This is the default in production for new apps. It is the equivalent to:
365
-
366
- ```ruby
367
- config.active_support.deprecation = :silence
368
- config.active_support.disallowed_deprecation = :silence
369
- ```
313
+ *Christian Schmidt*
370
314
 
371
- but will take a more optimised code path.
315
+ * Include `IPAddr#prefix` when serializing an `IPAddr` using the
316
+ `ActiveSupport::MessagePack` serializer.
372
317
 
373
- *Alex Ghiculescu*
318
+ This change is backward and forward compatible — old payloads can
319
+ still be read, and new payloads will be readable by older versions of Rails.
374
320
 
375
- * Faster tests by parallelizing only when overhead is justified by the number
376
- of them.
321
+ *Taiki Komaba*
377
322
 
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.
381
-
382
- This threshold is 50 by default, and is configurable via config setting in
383
- your test.rb:
384
-
385
- ```ruby
386
- config.active_support.test_parallelization_threshold = 100
387
- ```
388
-
389
- It's also configurable at the test case level:
323
+ * Add `default:` support for `ActiveSupport::CurrentAttributes.attribute`.
390
324
 
391
325
  ```ruby
392
- class ActiveSupport::TestCase
393
- parallelize threshold: 100
326
+ class Current < ActiveSupport::CurrentAttributes
327
+ attribute :counter, default: 0
394
328
  end
395
329
  ```
396
330
 
397
- *Jorge Manrubia*
398
-
399
- * OpenSSL constants are now used for Digest computations.
400
-
401
- *Dirkjan Bussink*
331
+ *Sean Doyle*
402
332
 
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`.
333
+ * Yield instance to `Object#with` block.
406
334
 
407
335
  ```ruby
408
- twz = ActiveSupport::TimeZone["Eastern Time (US & Canada)"].iso8601("21087")
409
- twz.to_a[0, 6] == [0, 0, 0, 28, 03, 2021]
336
+ client.with(timeout: 5_000) do |c|
337
+ c.get("/commits")
338
+ end
410
339
  ```
411
340
 
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).
341
+ *Sean Doyle*
419
342
 
420
- *Alex Ghiculescu*
343
+ * Use logical core count instead of physical core count to determine the
344
+ default number of workers when parallelizing tests.
421
345
 
422
- * Allow serializing any module or class to JSON by name.
346
+ *Jonathan Hefner*
423
347
 
424
- *Tyler Rick*, *Zachary Scott*
348
+ * Fix `Time.now/DateTime.now/Date.today` to return results in a system timezone after `#travel_to`.
425
349
 
426
- * Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the
427
- `RAILS_MASTER_KEY` environment variable is blank (e.g. `""`).
350
+ There is a bug in the current implementation of #travel_to:
351
+ it remembers a timezone of its argument, and all stubbed methods start
352
+ returning results in that remembered timezone. However, the expected
353
+ behavior is to return results in a system timezone.
428
354
 
429
- *Sunny Ripert*
355
+ *Aleksei Chernenkov*
430
356
 
431
- * The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`.
357
+ * Add `ErrorReported#unexpected` to report precondition violations.
432
358
 
433
- It permits asserting on the initial value that is expected not to change.
359
+ For example:
434
360
 
435
361
  ```ruby
436
- assert_no_changes -> { Status.all_good? }, from: true do
437
- post :create, params: { status: { ok: true } }
362
+ def edit
363
+ if published?
364
+ Rails.error.unexpected("[BUG] Attempting to edit a published article, that shouldn't be possible")
365
+ return false
366
+ end
367
+ # ...
438
368
  end
439
369
  ```
440
370
 
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.
371
+ The above will raise an error in development and test, but only report the error in production.
450
372
 
451
373
  *Jean Boussier*
452
374
 
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:
375
+ * Make the order of read_multi and write_multi notifications for `Cache::Store#fetch_multi` operations match the order they are executed in.
458
376
 
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*
377
+ *Adam Renberg Tamm*
469
378
 
470
- * Added a faster and more compact `ActiveSupport::Cache` serialization format.
379
+ * Make return values of `Cache::Store#write` consistent.
471
380
 
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*
381
+ The return value was not specified before. Now it returns `true` on a successful write,
382
+ `nil` if there was an error talking to the cache backend, and `false` if the write failed
383
+ for another reason (e.g. the key already exists and `unless_exist: true` was passed).
479
384
 
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.
385
+ *Sander Verdonschot*
483
386
 
484
- *Asherah Connor*
387
+ * Fix logged cache keys not always matching actual key used by cache action.
485
388
 
486
- * Freeze `ActiveSupport::Duration#parts` and remove writer methods.
487
-
488
- Durations are meant to be value objects and should not be mutated.
489
-
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
389
+ *Hartley McGuire*
561
390
 
562
- # and is also equivalent to
391
+ * Improve error messages of `assert_changes` and `assert_no_changes`.
563
392
 
564
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
393
+ `assert_changes` error messages now display objects with `.inspect` to make it easier
394
+ to differentiate nil from empty strings, strings from symbols, etc.
395
+ `assert_no_changes` error messages now surface the actual value.
565
396
 
566
- # which is the fallback behavior of Dalli
567
- ```
397
+ *pcreux*
568
398
 
569
- This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
399
+ * Fix `#to_fs(:human_size)` to correctly work with negative numbers.
570
400
 
571
- *Michael Overmeyer*
401
+ *Earlopain*
572
402
 
573
- * Add `Enumerable#in_order_of` to put an Enumerable in a certain order by a key.
403
+ * Fix `BroadcastLogger#dup` so that it duplicates the logger's `broadcasts`.
574
404
 
575
- *DHH*
405
+ *Andrew Novoselac*
576
406
 
577
- * `ActiveSupport::Inflector.camelize` behaves expected when provided a symbol `:upper` or `:lower` argument. Matches
578
- `String#camelize` behavior.
407
+ * Fix issue where `bootstrap.rb` overwrites the `level` of a `BroadcastLogger`'s `broadcasts`.
579
408
 
580
- *Alex Ghiculescu*
409
+ *Andrew Novoselac*
581
410
 
582
- * Raises an `ArgumentError` when the first argument of `ActiveSupport::Notification.subscribe` is
583
- invalid.
411
+ * Fix compatibility with the `semantic_logger` gem.
584
412
 
585
- *Vipul A M*
413
+ The `semantic_logger` gem doesn't behave exactly like stdlib logger in that
414
+ `SemanticLogger#level` returns a Symbol while stdlib `Logger#level` returns an Integer.
586
415
 
587
- * `HashWithIndifferentAccess#deep_transform_keys` now returns a `HashWithIndifferentAccess` instead of a `Hash`.
416
+ This caused the various `LogSubscriber` classes in Rails to break when assigned a
417
+ `SemanticLogger` instance.
588
418
 
589
- *Nathaniel Woodthorpe*
419
+ *Jean Boussier*, *ojab*
590
420
 
591
- * Consume dalli’s `cache_nils` configuration as `ActiveSupport::Cache`'s `skip_nil` when using `MemCacheStore`.
421
+ * Fix MemoryStore to prevent race conditions when incrementing or decrementing.
592
422
 
593
- *Ritikesh G*
423
+ *Pierre Jambet*
594
424
 
595
- * Add `RedisCacheStore#stats` method similar to `MemCacheStore#stats`. Calls `redis#info` internally.
425
+ * Implement `HashWithIndifferentAccess#to_proc`.
596
426
 
597
- *Ritikesh G*
427
+ Previously, calling `#to_proc` on `HashWithIndifferentAccess` object used inherited `#to_proc`
428
+ method from the `Hash` class, which was not able to access values using indifferent keys.
598
429
 
430
+ *fatkodima*
599
431
 
600
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activesupport/CHANGELOG.md) for previous changes.
432
+ Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activesupport/CHANGELOG.md) for previous changes.