activesupport 6.1.7.2 → 7.0.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activesupport might be problematic. Click here for more details.

Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +261 -511
  3. data/lib/active_support/actionable_error.rb +1 -1
  4. data/lib/active_support/array_inquirer.rb +0 -2
  5. data/lib/active_support/backtrace_cleaner.rb +2 -2
  6. data/lib/active_support/benchmarkable.rb +2 -2
  7. data/lib/active_support/cache/file_store.rb +15 -9
  8. data/lib/active_support/cache/mem_cache_store.rb +148 -37
  9. data/lib/active_support/cache/memory_store.rb +24 -16
  10. data/lib/active_support/cache/null_store.rb +10 -2
  11. data/lib/active_support/cache/redis_cache_store.rb +59 -78
  12. data/lib/active_support/cache/strategy/local_cache.rb +38 -61
  13. data/lib/active_support/cache.rb +299 -147
  14. data/lib/active_support/callbacks.rb +184 -85
  15. data/lib/active_support/code_generator.rb +65 -0
  16. data/lib/active_support/concern.rb +5 -5
  17. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
  18. data/lib/active_support/concurrency/share_lock.rb +2 -2
  19. data/lib/active_support/configurable.rb +8 -5
  20. data/lib/active_support/configuration_file.rb +1 -1
  21. data/lib/active_support/core_ext/array/access.rb +1 -5
  22. data/lib/active_support/core_ext/array/conversions.rb +13 -12
  23. data/lib/active_support/core_ext/array/deprecated_conversions.rb +25 -0
  24. data/lib/active_support/core_ext/array/grouping.rb +6 -6
  25. data/lib/active_support/core_ext/array/inquiry.rb +2 -2
  26. data/lib/active_support/core_ext/array.rb +1 -0
  27. data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
  28. data/lib/active_support/core_ext/class/subclasses.rb +25 -17
  29. data/lib/active_support/core_ext/date/blank.rb +1 -1
  30. data/lib/active_support/core_ext/date/calculations.rb +24 -9
  31. data/lib/active_support/core_ext/date/conversions.rb +14 -14
  32. data/lib/active_support/core_ext/date/deprecated_conversions.rb +26 -0
  33. data/lib/active_support/core_ext/date.rb +1 -0
  34. data/lib/active_support/core_ext/date_and_time/calculations.rb +4 -4
  35. data/lib/active_support/core_ext/date_and_time/compatibility.rb +1 -1
  36. data/lib/active_support/core_ext/date_time/blank.rb +1 -1
  37. data/lib/active_support/core_ext/date_time/calculations.rb +4 -0
  38. data/lib/active_support/core_ext/date_time/conversions.rb +13 -13
  39. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +22 -0
  40. data/lib/active_support/core_ext/date_time.rb +1 -0
  41. data/lib/active_support/core_ext/digest/uuid.rb +39 -14
  42. data/lib/active_support/core_ext/enumerable.rb +106 -37
  43. data/lib/active_support/core_ext/file/atomic.rb +3 -1
  44. data/lib/active_support/core_ext/hash/conversions.rb +0 -1
  45. data/lib/active_support/core_ext/hash/deep_transform_values.rb +3 -3
  46. data/lib/active_support/core_ext/hash/indifferent_access.rb +3 -3
  47. data/lib/active_support/core_ext/hash/keys.rb +4 -4
  48. data/lib/active_support/core_ext/integer/inflections.rb +12 -12
  49. data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
  50. data/lib/active_support/core_ext/kernel/singleton_class.rb +1 -1
  51. data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
  52. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +19 -10
  53. data/lib/active_support/core_ext/module/delegation.rb +2 -8
  54. data/lib/active_support/core_ext/name_error.rb +2 -8
  55. data/lib/active_support/core_ext/numeric/conversions.rb +80 -77
  56. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +60 -0
  57. data/lib/active_support/core_ext/numeric.rb +1 -0
  58. data/lib/active_support/core_ext/object/acts_like.rb +29 -5
  59. data/lib/active_support/core_ext/object/blank.rb +2 -2
  60. data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
  61. data/lib/active_support/core_ext/object/duplicable.rb +15 -4
  62. data/lib/active_support/core_ext/object/json.rb +30 -25
  63. data/lib/active_support/core_ext/object/to_query.rb +2 -2
  64. data/lib/active_support/core_ext/object/try.rb +20 -20
  65. data/lib/active_support/core_ext/object/with_options.rb +21 -2
  66. data/lib/active_support/core_ext/pathname/existence.rb +21 -0
  67. data/lib/active_support/core_ext/pathname.rb +3 -0
  68. data/lib/active_support/core_ext/range/compare_range.rb +0 -25
  69. data/lib/active_support/core_ext/range/conversions.rb +8 -8
  70. data/lib/active_support/core_ext/range/deprecated_conversions.rb +26 -0
  71. data/lib/active_support/core_ext/range/each.rb +1 -1
  72. data/lib/active_support/core_ext/range/include_time_with_zone.rb +3 -26
  73. data/lib/active_support/core_ext/range/overlaps.rb +1 -1
  74. data/lib/active_support/core_ext/range.rb +1 -1
  75. data/lib/active_support/core_ext/securerandom.rb +1 -1
  76. data/lib/active_support/core_ext/string/conversions.rb +2 -2
  77. data/lib/active_support/core_ext/string/filters.rb +1 -1
  78. data/lib/active_support/core_ext/string/inflections.rb +1 -1
  79. data/lib/active_support/core_ext/string/inquiry.rb +1 -1
  80. data/lib/active_support/core_ext/string/output_safety.rb +66 -38
  81. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
  82. data/lib/active_support/core_ext/time/calculations.rb +11 -8
  83. data/lib/active_support/core_ext/time/conversions.rb +13 -12
  84. data/lib/active_support/core_ext/time/deprecated_conversions.rb +22 -0
  85. data/lib/active_support/core_ext/time/zones.rb +10 -26
  86. data/lib/active_support/core_ext/time.rb +1 -0
  87. data/lib/active_support/core_ext/uri.rb +3 -27
  88. data/lib/active_support/core_ext.rb +1 -0
  89. data/lib/active_support/current_attributes.rb +31 -15
  90. data/lib/active_support/dependencies/interlock.rb +10 -18
  91. data/lib/active_support/dependencies/require_dependency.rb +28 -0
  92. data/lib/active_support/dependencies.rb +58 -788
  93. data/lib/active_support/deprecation/behaviors.rb +8 -5
  94. data/lib/active_support/deprecation/disallowed.rb +3 -3
  95. data/lib/active_support/deprecation/method_wrappers.rb +3 -3
  96. data/lib/active_support/deprecation/proxy_wrappers.rb +2 -2
  97. data/lib/active_support/deprecation.rb +2 -2
  98. data/lib/active_support/descendants_tracker.rb +174 -68
  99. data/lib/active_support/digest.rb +4 -4
  100. data/lib/active_support/duration/iso8601_parser.rb +3 -3
  101. data/lib/active_support/duration/iso8601_serializer.rb +9 -1
  102. data/lib/active_support/duration.rb +77 -48
  103. data/lib/active_support/encrypted_configuration.rb +45 -3
  104. data/lib/active_support/encrypted_file.rb +13 -1
  105. data/lib/active_support/environment_inquirer.rb +1 -1
  106. data/lib/active_support/error_reporter.rb +117 -0
  107. data/lib/active_support/evented_file_update_checker.rb +3 -5
  108. data/lib/active_support/execution_context/test_helper.rb +13 -0
  109. data/lib/active_support/execution_context.rb +53 -0
  110. data/lib/active_support/execution_wrapper.rb +30 -11
  111. data/lib/active_support/executor/test_helper.rb +7 -0
  112. data/lib/active_support/fork_tracker.rb +19 -12
  113. data/lib/active_support/gem_version.rb +5 -5
  114. data/lib/active_support/hash_with_indifferent_access.rb +3 -1
  115. data/lib/active_support/html_safe_translation.rb +43 -0
  116. data/lib/active_support/i18n.rb +1 -0
  117. data/lib/active_support/i18n_railtie.rb +1 -1
  118. data/lib/active_support/inflector/inflections.rb +23 -7
  119. data/lib/active_support/inflector/methods.rb +27 -50
  120. data/lib/active_support/inflector/transliterate.rb +1 -1
  121. data/lib/active_support/isolated_execution_state.rb +72 -0
  122. data/lib/active_support/json/encoding.rb +3 -3
  123. data/lib/active_support/key_generator.rb +22 -5
  124. data/lib/active_support/lazy_load_hooks.rb +28 -4
  125. data/lib/active_support/locale/en.yml +1 -1
  126. data/lib/active_support/log_subscriber/test_helper.rb +2 -2
  127. data/lib/active_support/log_subscriber.rb +15 -5
  128. data/lib/active_support/logger_thread_safe_level.rb +4 -13
  129. data/lib/active_support/message_encryptor.rb +12 -6
  130. data/lib/active_support/message_verifier.rb +46 -14
  131. data/lib/active_support/messages/metadata.rb +2 -2
  132. data/lib/active_support/multibyte/chars.rb +10 -11
  133. data/lib/active_support/multibyte/unicode.rb +0 -12
  134. data/lib/active_support/multibyte.rb +1 -1
  135. data/lib/active_support/notifications/fanout.rb +91 -65
  136. data/lib/active_support/notifications/instrumenter.rb +32 -15
  137. data/lib/active_support/notifications.rb +23 -23
  138. data/lib/active_support/number_helper/number_converter.rb +1 -3
  139. data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
  140. data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
  141. data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
  142. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
  143. data/lib/active_support/number_helper/rounding_helper.rb +1 -5
  144. data/lib/active_support/number_helper.rb +4 -5
  145. data/lib/active_support/option_merger.rb +10 -18
  146. data/lib/active_support/ordered_hash.rb +1 -1
  147. data/lib/active_support/ordered_options.rb +1 -1
  148. data/lib/active_support/parameter_filter.rb +20 -11
  149. data/lib/active_support/per_thread_registry.rb +5 -1
  150. data/lib/active_support/railtie.rb +69 -19
  151. data/lib/active_support/rescuable.rb +12 -12
  152. data/lib/active_support/ruby_features.rb +7 -0
  153. data/lib/active_support/secure_compare_rotator.rb +2 -2
  154. data/lib/active_support/string_inquirer.rb +0 -2
  155. data/lib/active_support/subscriber.rb +7 -18
  156. data/lib/active_support/tagged_logging.rb +1 -1
  157. data/lib/active_support/test_case.rb +13 -21
  158. data/lib/active_support/testing/assertions.rb +35 -5
  159. data/lib/active_support/testing/deprecation.rb +52 -1
  160. data/lib/active_support/testing/isolation.rb +30 -29
  161. data/lib/active_support/testing/method_call_assertions.rb +5 -5
  162. data/lib/active_support/testing/parallelization/server.rb +4 -0
  163. data/lib/active_support/testing/parallelization/worker.rb +3 -0
  164. data/lib/active_support/testing/parallelization.rb +4 -0
  165. data/lib/active_support/testing/parallelize_executor.rb +76 -0
  166. data/lib/active_support/testing/stream.rb +3 -5
  167. data/lib/active_support/testing/tagged_logging.rb +1 -1
  168. data/lib/active_support/testing/time_helpers.rb +13 -2
  169. data/lib/active_support/time_with_zone.rb +62 -22
  170. data/lib/active_support/values/time_zone.rb +33 -14
  171. data/lib/active_support/version.rb +1 -1
  172. data/lib/active_support/xml_mini/jdom.rb +1 -1
  173. data/lib/active_support/xml_mini/libxml.rb +5 -5
  174. data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
  175. data/lib/active_support/xml_mini/nokogiri.rb +4 -4
  176. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  177. data/lib/active_support/xml_mini/rexml.rb +1 -1
  178. data/lib/active_support/xml_mini.rb +5 -4
  179. data/lib/active_support.rb +16 -0
  180. metadata +28 -26
  181. data/lib/active_support/core_ext/marshal.rb +0 -26
  182. data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -120
data/CHANGELOG.md CHANGED
@@ -1,744 +1,494 @@
1
- ## Rails 6.1.7.2 (January 24, 2023) ##
1
+ ## Rails 7.0.5 (May 24, 2023) ##
2
2
 
3
- * No changes.
4
-
5
-
6
- ## Rails 6.1.7.1 (January 17, 2023) ##
7
-
8
- * Avoid regex backtracking in Inflector.underscore
9
-
10
- [CVE-2023-22796]
3
+ * Fixes TimeWithZone ArgumentError.
11
4
 
5
+ *Niklas Häusele*
12
6
 
13
- ## Rails 6.1.7 (September 09, 2022) ##
14
-
15
- * No changes.
16
7
 
8
+ ## Rails 7.0.4.3 (March 13, 2023) ##
17
9
 
18
- ## Rails 6.1.6.1 (July 12, 2022) ##
10
+ * Implement SafeBuffer#bytesplice
19
11
 
20
- * No changes.
12
+ [CVE-2023-28120]
21
13
 
22
14
 
23
- ## Rails 6.1.6 (May 09, 2022) ##
15
+ ## Rails 7.0.4.2 (January 24, 2023) ##
24
16
 
25
17
  * No changes.
26
18
 
27
19
 
28
- ## Rails 6.1.5.1 (April 26, 2022) ##
20
+ ## Rails 7.0.4.1 (January 17, 2023) ##
29
21
 
30
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
31
-
32
- Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
33
- in names of tags and names of attributes, following the specification of XML.
34
-
35
- *Álvaro Martín Fraguas*
36
-
37
- ## Rails 6.1.5 (March 09, 2022) ##
38
-
39
- * Fix `ActiveSupport::Duration.build` to support negative values.
40
-
41
- The algorithm to collect the `parts` of the `ActiveSupport::Duration`
42
- ignored the sign of the `value` and accumulated incorrect part values. This
43
- impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
44
- not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
45
-
46
- *Caleb Buxton*, *Braden Staudacher*
22
+ * Avoid regex backtracking in Inflector.underscore
47
23
 
48
- * `Time#change` and methods that call it (eg. `Time#advance`) will now
49
- return a `Time` with the timezone argument provided, if the caller was
50
- initialized with a timezone argument.
24
+ [CVE-2023-22796]
51
25
 
52
- Fixes [#42467](https://github.com/rails/rails/issues/42467).
53
26
 
54
- *Alex Ghiculescu*
27
+ ## Rails 7.0.4 (September 09, 2022) ##
55
28
 
56
- * Clone to keep extended Logger methods for tagged logger.
29
+ * Ensure `ActiveSupport::Testing::Isolation::Forking` closes pipes
57
30
 
58
- *Orhan Toy*
31
+ Previously, `Forking.run_in_isolation` opened two ends of a pipe. The fork
32
+ process closed the read end, wrote to it, and then terminated (which
33
+ presumably closed the file descriptors on its end). The parent process
34
+ closed the write end, read from it, and returned, never closing the read
35
+ end.
59
36
 
60
- * `assert_changes` works on including `ActiveSupport::Assertions` module.
37
+ This resulted in an accumulation of open file descriptors, which could
38
+ cause errors if the limit is reached.
61
39
 
62
- *Pedro Medeiros*
40
+ *Sam Bostock*
63
41
 
42
+ * Redis cache store is now compatible with redis-rb 5.0.
64
43
 
65
- ## Rails 6.1.4.7 (March 08, 2022) ##
44
+ *Jean Boussier*
66
45
 
67
- * No changes.
46
+ * Fix `NoMethodError` on custom `ActiveSupport::Deprecation` behavior.
68
47
 
48
+ `ActiveSupport::Deprecation.behavior=` was supposed to accept any object
49
+ that responds to `call`, but in fact its internal implementation assumed that
50
+ this object could respond to `arity`, so it was restricted to only `Proc` objects.
69
51
 
70
- ## Rails 6.1.4.6 (February 11, 2022) ##
52
+ This change removes this `arity` restriction of custom behaviors.
71
53
 
72
- * Fix Reloader method signature to work with the new Executor signature
54
+ *Ryo Nakamura*
73
55
 
74
56
 
75
- ## Rails 6.1.4.5 (February 11, 2022) ##
57
+ ## Rails 7.0.3.1 (July 12, 2022) ##
76
58
 
77
59
  * No changes.
78
60
 
79
61
 
80
- ## Rails 6.1.4.4 (December 15, 2021) ##
62
+ ## Rails 7.0.3 (May 09, 2022) ##
81
63
 
82
64
  * No changes.
83
65
 
84
66
 
85
- ## Rails 6.1.4.3 (December 14, 2021) ##
86
-
87
- * No changes.
67
+ ## Rails 7.0.2.4 (April 26, 2022) ##
88
68
 
69
+ * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
89
70
 
90
- ## Rails 6.1.4.2 (December 14, 2021) ##
91
-
92
- * No changes.
71
+ Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
72
+ in names of tags and names of attributes, following the specification of XML.
93
73
 
74
+ *Álvaro Martín Fraguas*
94
75
 
95
- ## Rails 6.1.4.1 (August 19, 2021) ##
76
+ ## Rails 7.0.2.3 (March 08, 2022) ##
96
77
 
97
78
  * No changes.
98
79
 
99
80
 
100
- ## Rails 6.1.4 (June 24, 2021) ##
81
+ ## Rails 7.0.2.2 (February 11, 2022) ##
101
82
 
102
- * MemCacheStore: convert any underlying value (including `false`) to an `Entry`.
83
+ * Fix Reloader method signature to work with the new Executor signature
103
84
 
104
- See [#42559](https://github.com/rails/rails/pull/42559).
105
85
 
106
- *Alex Ghiculescu*
86
+ ## Rails 7.0.2.1 (February 11, 2022) ##
107
87
 
108
- * Fix bug in `number_with_precision` when using large `BigDecimal` values.
88
+ * No changes.
109
89
 
110
- Fixes #42302.
111
90
 
112
- *Federico Aldunate*, *Zachary Scott*
91
+ ## Rails 7.0.2 (February 08, 2022) ##
113
92
 
114
- * Check byte size instead of length on `secure_compare`.
93
+ * Fix `ActiveSupport::EncryptedConfiguration` to be compatible with Psych 4
115
94
 
116
- *Tietew*
95
+ *Stephen Sugden*
117
96
 
118
- * Fix `Time.at` to not lose `:in` option.
97
+ * Improve `File.atomic_write` error handling.
119
98
 
120
- *Ryuta Kamizono*
99
+ *Daniel Pepper*
121
100
 
122
- * Require a path for `config.cache_store = :file_store`.
123
101
 
124
- *Alex Ghiculescu*
102
+ ## Rails 7.0.1 (January 06, 2022) ##
125
103
 
126
- * Avoid having to store complex object in the default translation file.
104
+ * Fix `Class#descendants` and `DescendantsTracker#descendants` compatibility with Ruby 3.1.
127
105
 
128
- *Rafael Mendonça França*
106
+ [The native `Class#descendants` was reverted prior to Ruby 3.1 release](https://bugs.ruby-lang.org/issues/14394#note-33),
107
+ but `Class#subclasses` was kept, breaking the feature detection.
129
108
 
109
+ *Jean Boussier*
130
110
 
131
- ## Rails 6.1.3.2 (May 05, 2021) ##
132
111
 
133
- * No changes.
112
+ ## Rails 7.0.0 (December 15, 2021) ##
134
113
 
114
+ * Fix `ActiveSupport::Duration.build` to support negative values.
135
115
 
136
- ## Rails 6.1.3.1 (March 26, 2021) ##
116
+ The algorithm to collect the `parts` of the `ActiveSupport::Duration`
117
+ ignored the sign of the `value` and accumulated incorrect part values. This
118
+ impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
119
+ not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
137
120
 
138
- * No changes.
121
+ *Caleb Buxton*, *Braden Staudacher*
139
122
 
140
123
 
141
- ## Rails 6.1.3 (February 17, 2021) ##
124
+ ## Rails 7.0.0.rc3 (December 14, 2021) ##
142
125
 
143
126
  * No changes.
144
127
 
145
128
 
146
- ## Rails 6.1.2.1 (February 10, 2021) ##
129
+ ## Rails 7.0.0.rc2 (December 14, 2021) ##
147
130
 
148
131
  * No changes.
149
132
 
133
+ ## Rails 7.0.0.rc1 (December 06, 2021) ##
150
134
 
151
- ## Rails 6.1.2 (February 09, 2021) ##
152
-
153
- * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
154
-
155
- ```ruby
156
- config.cache_store = :mem_cache_store, nil
157
-
158
- # is now equivalent to
135
+ * Deprecate passing a format to `#to_s` in favor of `#to_formatted_s` in `Array`, `Range`, `Date`, `DateTime`, `Time`,
136
+ `BigDecimal`, `Float` and, `Integer`.
159
137
 
160
- config.cache_store = :mem_cache_store
161
-
162
- # and is also equivalent to
163
-
164
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
165
-
166
- # which is the fallback behavior of Dalli
167
- ```
168
-
169
- This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
170
-
171
- *Michael Overmeyer*
172
-
173
-
174
- ## Rails 6.1.1 (January 07, 2021) ##
175
-
176
- * Change `IPAddr#to_json` to match the behavior of the json gem returning the string representation
177
- instead of the instance variables of the object.
138
+ *Rafael Mendonça França*
178
139
 
179
- Before:
140
+ * Document `ActiveSupport::Testing::Deprecation`.
180
141
 
181
- ```ruby
182
- IPAddr.new("127.0.0.1").to_json
183
- # => "{\"addr\":2130706433,\"family\":2,\"mask_addr\":4294967295}"
184
- ```
142
+ *Sam Bostock & Sam Jordan*
185
143
 
186
- After:
144
+ * Add `Pathname#existence`.
187
145
 
188
146
  ```ruby
189
- IPAddr.new("127.0.0.1").to_json
190
- # => "\"127.0.0.1\""
147
+ Pathname.new("file").existence&.read
191
148
  ```
192
149
 
150
+ *Timo Schilling*
193
151
 
194
- ## Rails 6.1.0 (December 09, 2020) ##
195
-
196
- * Ensure `MemoryStore` disables compression by default. Reverts behavior of
197
- `MemoryStore` to its prior rails `5.1` behavior.
198
-
199
- *Max Gurewitz*
200
-
201
- * Calling `iso8601` on negative durations retains the negative sign on individual
202
- digits instead of prepending it.
203
-
204
- This change is required so we can interoperate with PostgreSQL, which prefers
205
- negative signs for each component.
206
-
207
- Compatibility with other iso8601 parsers which support leading negatives as well
208
- as negatives per component is still retained.
209
-
210
- Before:
211
-
212
- (-1.year - 1.day).iso8601
213
- # => "-P1Y1D"
214
-
215
- After:
216
-
217
- (-1.year - 1.day).iso8601
218
- # => "P-1Y-1D"
219
-
220
- *Vipul A M*
221
-
222
- * Remove deprecated `ActiveSupport::Notifications::Instrumenter#end=`.
152
+ * Remove deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
223
153
 
224
154
  *Rafael Mendonça França*
225
155
 
226
- * Deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
156
+ * Remove deprecated support to use `Range#include?` to check the inclusion of a value in
157
+ a date time range is deprecated.
227
158
 
228
159
  *Rafael Mendonça França*
229
160
 
230
- * Remove deprecated `ActiveSupport::Multibyte::Unicode.pack_graphemes`,
231
- `ActiveSupport::Multibyte::Unicode.unpack_graphemes`,
232
- `ActiveSupport::Multibyte::Unicode.normalize`,
233
- `ActiveSupport::Multibyte::Unicode.downcase`,
234
- `ActiveSupport::Multibyte::Unicode.upcase` and `ActiveSupport::Multibyte::Unicode.swapcase`.
161
+ * Remove deprecated `URI.parser`.
235
162
 
236
163
  *Rafael Mendonça França*
237
164
 
238
- * Remove deprecated `ActiveSupport::Multibyte::Chars#consumes?` and `ActiveSupport::Multibyte::Chars#normalize`.
165
+ * Remove deprecated `config.active_support.use_sha1_digests`.
239
166
 
240
167
  *Rafael Mendonça França*
241
168
 
242
- * Remove deprecated file `active_support/core_ext/range/include_range`.
169
+ * Invoking `Object#with_options` without a `&block` argument returns the
170
+ `ActiveSupport::OptionMerger` instance.
243
171
 
244
- *Rafael Mendonça França*
245
-
246
- * Remove deprecated file `active_support/core_ext/hash/transform_values`.
172
+ *Sean Doyle*
247
173
 
248
- *Rafael Mendonça França*
174
+ * `Rails.application.executor` hooks can now be called around every test
249
175
 
250
- * Remove deprecated file `active_support/core_ext/hash/compact`.
176
+ This helps to better simulate request or job local state being reset around tests and prevents state
177
+ leaking from one test to another.
251
178
 
252
- *Rafael Mendonça França*
253
-
254
- * Remove deprecated file `active_support/core_ext/array/prepend_and_append`.
255
-
256
- *Rafael Mendonça França*
257
-
258
- * Remove deprecated file `active_support/core_ext/numeric/inquiry`.
259
-
260
- *Rafael Mendonça França*
261
-
262
- * Remove deprecated file `active_support/core_ext/module/reachable`.
263
-
264
- *Rafael Mendonça França*
179
+ However it requires the executor hooks executed in the test environment to be re-entrant.
265
180
 
266
- * Remove deprecated `Module#parent_name`, `Module#parent` and `Module#parents`.
181
+ To enable this, set `config.active_support.executor_around_test_case = true` (this is the default in Rails 7).
267
182
 
268
- *Rafael Mendonça França*
269
-
270
- * Remove deprecated `ActiveSupport::LoggerThreadSafeLevel#after_initialize`.
271
-
272
- *Rafael Mendonça França*
273
-
274
- * Remove deprecated `LoggerSilence` constant.
275
-
276
- *Rafael Mendonça França*
277
-
278
- * Remove deprecated fallback to `I18n.default_local` when `config.i18n.fallbacks` is empty.
279
-
280
- *Rafael Mendonça França*
281
-
282
- * Remove entries from local cache on `RedisCacheStore#delete_matched`
283
-
284
- Fixes #38627
285
-
286
- *ojab*
287
-
288
- * Speed up `ActiveSupport::SecurityUtils.fixed_length_secure_compare` by using
289
- `OpenSSL.fixed_length_secure_compare`, if available.
290
-
291
- *Nate Matykiewicz*
292
-
293
- * `ActiveSupport::Cache::MemCacheStore` now checks `ENV["MEMCACHE_SERVERS"]` before falling back to `"localhost:11211"` if configured without any addresses.
294
-
295
- ```ruby
296
- config.cache_store = :mem_cache_store
297
-
298
- # is now equivalent to
299
-
300
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
301
-
302
- # instead of
303
-
304
- config.cache_store = :mem_cache_store, "localhost:11211" # ignores ENV["MEMCACHE_SERVERS"]
305
- ```
183
+ *Jean Boussier*
306
184
 
307
- *Sam Bostock*
185
+ * `ActiveSupport::DescendantsTracker` now mostly delegate to `Class#descendants` on Ruby 3.1
308
186
 
309
- * `ActiveSupport::Subscriber#attach_to` now accepts an `inherit_all:` argument. When set to true,
310
- it allows a subscriber to receive events for methods defined in the subscriber's ancestor class(es).
187
+ Ruby now provides a fast `Class#descendants` making `ActiveSupport::DescendantsTracker` mostly useless.
311
188
 
312
- ```ruby
313
- class ActionControllerSubscriber < ActiveSupport::Subscriber
314
- attach_to :action_controller
189
+ As a result the following methods are deprecated:
315
190
 
316
- def start_processing(event)
317
- info "Processing by #{event.payload[:controller]}##{event.payload[:action]} as #{format}"
318
- end
191
+ - `ActiveSupport::DescendantsTracker.direct_descendants`
192
+ - `ActiveSupport::DescendantsTracker#direct_descendants`
319
193
 
320
- def redirect_to(event)
321
- info { "Redirected to #{event.payload[:location]}" }
322
- end
323
- end
194
+ *Jean Boussier*
324
195
 
325
- # We detach ActionControllerSubscriber from the :action_controller namespace so that our CustomActionControllerSubscriber
326
- # can provide its own instrumentation for certain events in the namespace
327
- ActionControllerSubscriber.detach_from(:action_controller)
196
+ * Fix the `Digest::UUID.uuid_from_hash` behavior for namespace IDs that are different from the ones defined on `Digest::UUID`.
328
197
 
329
- class CustomActionControllerSubscriber < ActionControllerSubscriber
330
- attach_to :action_controller, inherit_all: true
198
+ The new behavior will be enabled by setting the
199
+ `config.active_support.use_rfc4122_namespaced_uuids` option to `true`
200
+ and is the default for new apps.
331
201
 
332
- def start_processing(event)
333
- info "A custom response to start_processing events"
334
- end
202
+ The old behavior is the default for upgraded apps and will output a
203
+ deprecation warning every time a value that is different than one of
204
+ the constants defined on the `Digest::UUID` extension is used as the
205
+ namespace ID.
335
206
 
336
- # => CustomActionControllerSubscriber will process events for "start_processing.action_controller" notifications
337
- # using its own #start_processing implementation, while retaining ActionControllerSubscriber's instrumentation
338
- # for "redirect_to.action_controller" notifications
339
- end
340
- ```
207
+ *Alex Robbin*, *Erich Soares Machado*, *Eugene Kenny*
341
208
 
342
- *Adrianna Chang*
209
+ * `ActiveSupport::Inflector::Inflections#clear(:acronyms)` is now supported,
210
+ and `inflector.clear` / `inflector.clear(:all)` also clears acronyms.
343
211
 
344
- * Allow the digest class used to generate non-sensitive digests to be configured with `config.active_support.hash_digest_class`.
212
+ *Alex Ghiculescu*, *Oliver Peate*
345
213
 
346
- `config.active_support.use_sha1_digests` is deprecated in favour of `config.active_support.hash_digest_class = ::Digest::SHA1`.
347
214
 
348
- *Dirkjan Bussink*
215
+ ## Rails 7.0.0.alpha2 (September 15, 2021) ##
349
216
 
350
- * Fix bug to make memcached write_entry expire correctly with unless_exist
217
+ * No changes.
351
218
 
352
- *Jye Lee*
353
219
 
354
- * Add `ActiveSupport::Duration` conversion methods
220
+ ## Rails 7.0.0.alpha1 (September 15, 2021) ##
355
221
 
356
- `in_seconds`, `in_minutes`, `in_hours`, `in_days`, `in_weeks`, `in_months`, and `in_years` return the respective duration covered.
222
+ * `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.
357
223
 
358
- *Jason York*
224
+ *Xavier Noria*
359
225
 
360
- * Fixed issue in `ActiveSupport::Cache::RedisCacheStore` not passing options
361
- to `read_multi` causing `fetch_multi` to not work properly
226
+ * Private internal classes of `ActiveSupport::Dependencies` have been deleted, like `ActiveSupport::Dependencies::Reference`, `ActiveSupport::Dependencies::Blamable`, and others.
362
227
 
363
- *Rajesh Sharma*
228
+ *Xavier Noria*
364
229
 
365
- * Fixed issue in `ActiveSupport::Cache::MemCacheStore` which caused duplicate compression,
366
- and caused the provided `compression_threshold` to not be respected.
230
+ * The private API of `ActiveSupport::Dependencies` has been deleted. That includes methods like `hook!`, `unhook!`, `depend_on`, `require_or_load`, `mechanism`, and many others.
367
231
 
368
- *Max Gurewitz*
232
+ *Xavier Noria*
369
233
 
370
- * Prevent `RedisCacheStore` and `MemCacheStore` from performing compression
371
- when reading entries written with `raw: true`.
234
+ * Improves the performance of `ActiveSupport::NumberHelper` formatters by avoiding the use of exceptions as flow control.
372
235
 
373
- *Max Gurewitz*
236
+ *Mike Dalessio*
374
237
 
375
- * `URI.parser` is deprecated and will be removed in Rails 7.0. Use
376
- `URI::DEFAULT_PARSER` instead.
238
+ * Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception`
377
239
 
378
- *Jean Boussier*
240
+ Previously, if you provided a `error_handler` to `redis_cache_store`, any errors thrown by
241
+ the error handler would be rescued and logged only. Removed the `rescue` clause from `handle_exception`
242
+ to allow these to be thrown.
379
243
 
380
- * `require_dependency` has been documented to be _obsolete_ in `:zeitwerk`
381
- mode. The method is not deprecated as such (yet), but applications are
382
- encouraged to not use it.
244
+ *Nicholas A. Stuart*
383
245
 
384
- In `:zeitwerk` mode, semantics match Ruby's and you do not need to be
385
- defensive with load order. Just refer to classes and modules normally. If
386
- the constant name is dynamic, camelize if needed, and constantize.
246
+ * Allow entirely opting out of deprecation warnings.
387
247
 
388
- *Xavier Noria*
248
+ Previously if you did `app.config.active_support.deprecation = :silence`, some work would
249
+ still be done on each call to `ActiveSupport::Deprecation.warn`. In very hot paths, this could
250
+ cause performance issues.
389
251
 
390
- * Add 3rd person aliases of `Symbol#start_with?` and `Symbol#end_with?`.
252
+ Now, you can make `ActiveSupport::Deprecation.warn` a no-op:
391
253
 
392
254
  ```ruby
393
- :foo.starts_with?("f") # => true
394
- :foo.ends_with?("o") # => true
255
+ config.active_support.report_deprecations = false
395
256
  ```
396
257
 
397
- *Ryuta Kamizono*
398
-
399
- * Add override of unary plus for `ActiveSupport::Duration`.
258
+ This is the default in production for new apps. It is the equivalent to:
400
259
 
401
- `+ 1.second` is now identical to `+1.second` to prevent errors
402
- where a seemingly innocent change of formatting leads to a change in the code behavior.
403
-
404
- Before:
405
- ```ruby
406
- +1.second.class
407
- # => ActiveSupport::Duration
408
- (+ 1.second).class
409
- # => Integer
410
- ```
411
-
412
- After:
413
260
  ```ruby
414
- +1.second.class
415
- # => ActiveSupport::Duration
416
- (+ 1.second).class
417
- # => ActiveSupport::Duration
261
+ config.active_support.deprecation = :silence
262
+ config.active_support.disallowed_deprecation = :silence
418
263
  ```
419
264
 
420
- Fixes #39079.
421
-
422
- *Roman Kushnir*
423
-
424
- * Add subsec to `ActiveSupport::TimeWithZone#inspect`.
425
-
426
- Before:
265
+ but will take a more optimised code path.
427
266
 
428
- Time.at(1498099140).in_time_zone.inspect
429
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
430
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
431
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
432
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
433
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
434
-
435
- After:
267
+ *Alex Ghiculescu*
436
268
 
437
- Time.at(1498099140).in_time_zone.inspect
438
- # => "Thu, 22 Jun 2017 02:39:00.000000000 UTC +00:00"
439
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
440
- # => "Thu, 22 Jun 2017 02:39:00.123456780 UTC +00:00"
441
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
442
- # => "Thu, 22 Jun 2017 02:39:00.333333333 UTC +00:00"
269
+ * Faster tests by parallelizing only when overhead is justified by the number
270
+ of them.
443
271
 
444
- *akinomaeni*
272
+ Running tests in parallel adds overhead in terms of database
273
+ setup and fixture loading. Now, Rails will only parallelize test executions when
274
+ there are enough tests to make it worth it.
445
275
 
446
- * Calling `ActiveSupport::TaggedLogging#tagged` without a block now returns a tagged logger.
276
+ This threshold is 50 by default, and is configurable via config setting in
277
+ your test.rb:
447
278
 
448
279
  ```ruby
449
- logger.tagged("BCX").info("Funky time!") # => [BCX] Funky time!
280
+ config.active_support.test_parallelization_threshold = 100
450
281
  ```
451
282
 
452
- *Eugene Kenny*
453
-
454
- * Align `Range#cover?` extension behavior with Ruby behavior for backwards ranges.
455
-
456
- `(1..10).cover?(5..3)` now returns `false`, as it does in plain Ruby.
457
-
458
- Also update `#include?` and `#===` behavior to match.
459
-
460
- *Michael Groeneman*
283
+ It's also configurable at the test case level:
461
284
 
462
- * Update to TZInfo v2.0.0.
463
-
464
- This changes the output of `ActiveSupport::TimeZone.utc_to_local`, but
465
- can be controlled with the
466
- `ActiveSupport.utc_to_local_returns_utc_offset_times` config.
467
-
468
- New Rails 6.1 apps have it enabled by default, existing apps can upgrade
469
- via the config in config/initializers/new_framework_defaults_6_1.rb
470
-
471
- See the `utc_to_local_returns_utc_offset_times` documentation for details.
472
-
473
- *Phil Ross*, *Jared Beck*
474
-
475
- * Add Date and Time `#yesterday?` and `#tomorrow?` alongside `#today?`.
476
-
477
- Aliased to `#prev_day?` and `#next_day?` to match the existing `#prev/next_day` methods.
478
-
479
- *Jatin Dhankhar*
285
+ ```ruby
286
+ class ActiveSupport::TestCase
287
+ parallelize threshold: 100
288
+ end
289
+ ```
480
290
 
481
- * Add `Enumerable#pick` to complement `ActiveRecord::Relation#pick`.
291
+ *Jorge Manrubia*
482
292
 
483
- *Eugene Kenny*
293
+ * OpenSSL constants are now used for Digest computations.
484
294
 
485
- * [Breaking change] `ActiveSupport::Callbacks#halted_callback_hook` now receive a 2nd argument:
295
+ *Dirkjan Bussink*
486
296
 
487
- `ActiveSupport::Callbacks#halted_callback_hook` now receive the name of the callback
488
- being halted as second argument.
489
- This change will allow you to differentiate which callbacks halted the chain
490
- and act accordingly.
297
+ * `TimeZone.iso8601` now accepts valid ordinal values similar to Ruby's `Date._iso8601` method.
298
+ A valid ordinal value will be converted to an instance of `TimeWithZone` using the `:year`
299
+ and `:yday` fragments returned from `Date._iso8601`.
491
300
 
492
301
  ```ruby
493
- class Book < ApplicationRecord
494
- before_save { throw(:abort) }
495
- before_create { throw(:abort) }
496
-
497
- def halted_callback_hook(filter, callback_name)
498
- Rails.logger.info("Book couldn't be #{callback_name}d")
499
- end
500
-
501
- Book.create # => "Book couldn't be created"
502
- book.save # => "Book couldn't be saved"
503
- end
302
+ twz = ActiveSupport::TimeZone["Eastern Time (US & Canada)"].iso8601("21087")
303
+ twz.to_a[0, 6] == [0, 0, 0, 28, 03, 2021]
504
304
  ```
505
305
 
506
- *Edouard Chin*
507
-
508
- * Support `prepend` with `ActiveSupport::Concern`.
306
+ *Steve Laing*
509
307
 
510
- Allows a module with `extend ActiveSupport::Concern` to be prepended.
308
+ * `Time#change` and methods that call it (e.g. `Time#advance`) will now
309
+ return a `Time` with the timezone argument provided, if the caller was
310
+ initialized with a timezone argument.
511
311
 
512
- module Imposter
513
- extend ActiveSupport::Concern
312
+ Fixes [#42467](https://github.com/rails/rails/issues/42467).
514
313
 
515
- # Same as `included`, except only run when prepended.
516
- prepended do
517
- end
518
- end
314
+ *Alex Ghiculescu*
519
315
 
520
- class Person
521
- prepend Imposter
522
- end
316
+ * Allow serializing any module or class to JSON by name.
523
317
 
524
- Class methods are prepended to the base class, concerning is also
525
- updated: `concerning :Imposter, prepend: true do`.
318
+ *Tyler Rick*, *Zachary Scott*
526
319
 
527
- *Jason Karns*, *Elia Schito*
320
+ * Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the
321
+ `RAILS_MASTER_KEY` environment variable is blank (e.g. `""`).
528
322
 
529
- * Deprecate using `Range#include?` method to check the inclusion of a value
530
- in a date time range. It is recommended to use `Range#cover?` method
531
- instead of `Range#include?` to check the inclusion of a value
532
- in a date time range.
323
+ *Sunny Ripert*
533
324
 
534
- *Vishal Telangre*
325
+ * The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`.
535
326
 
536
- * Support added for a `round_mode` parameter, in all number helpers. (See: `BigDecimal::mode`.)
327
+ It permits asserting on the initial value that is expected not to change.
537
328
 
538
329
  ```ruby
539
- number_to_currency(1234567890.50, precision: 0, round_mode: :half_down) # => "$1,234,567,890"
540
- number_to_percentage(302.24398923423, precision: 5, round_mode: :down) # => "302.24398%"
541
- number_to_rounded(389.32314, precision: 0, round_mode: :ceil) # => "390"
542
- number_to_human_size(483989, precision: 2, round_mode: :up) # => "480 KB"
543
- number_to_human(489939, precision: 2, round_mode: :floor) # => "480 Thousand"
544
-
545
- 485000.to_s(:human, precision: 2, round_mode: :half_even) # => "480 Thousand"
330
+ assert_no_changes -> { Status.all_good? }, from: true do
331
+ post :create, params: { status: { ok: true } }
332
+ end
546
333
  ```
547
334
 
548
- *Tom Lord*
549
-
550
- * `Array#to_sentence` no longer returns a frozen string.
335
+ *George Claghorn*
551
336
 
552
- Before:
337
+ * Deprecate `ActiveSupport::SafeBuffer`'s incorrect implicit conversion of objects into string.
553
338
 
554
- ['one', 'two'].to_sentence.frozen?
555
- # => true
556
-
557
- After:
558
-
559
- ['one', 'two'].to_sentence.frozen?
560
- # => false
561
-
562
- *Nicolas Dular*
563
-
564
- * When an instance of `ActiveSupport::Duration` is converted to an `iso8601` duration string, if `weeks` are mixed with `date` parts, the `week` part will be converted to days.
565
- This keeps the parser and serializer on the same page.
566
-
567
- ```ruby
568
- duration = ActiveSupport::Duration.build(1000000)
569
- # 1 week, 4 days, 13 hours, 46 minutes, and 40.0 seconds
339
+ Except for a few methods like `String#%`, objects must implement `#to_str`
340
+ to be implicitly converted to a String in string operations. In some
341
+ circumstances `ActiveSupport::SafeBuffer` was incorrectly calling the
342
+ explicit conversion method (`#to_s`) on them. This behavior is now
343
+ deprecated.
570
344
 
571
- duration_iso = duration.iso8601
572
- # P11DT13H46M40S
345
+ *Jean Boussier*
573
346
 
574
- ActiveSupport::Duration.parse(duration_iso)
575
- # 11 days, 13 hours, 46 minutes, and 40 seconds
347
+ * Allow nested access to keys on `Rails.application.credentials`.
576
348
 
577
- duration = ActiveSupport::Duration.build(604800)
578
- # 1 week
349
+ Previously only top level keys in `credentials.yml.enc` could be accessed with method calls. Now any key can.
579
350
 
580
- duration_iso = duration.iso8601
581
- # P1W
351
+ For example, given these secrets:
582
352
 
583
- ActiveSupport::Duration.parse(duration_iso)
584
- # 1 week
353
+ ```yml
354
+ aws:
355
+ access_key_id: 123
356
+ secret_access_key: 345
585
357
  ```
586
358
 
587
- *Abhishek Sarkar*
588
-
589
- * Add block support to `ActiveSupport::Testing::TimeHelpers#travel_back`.
590
-
591
- *Tim Masliuchenko*
592
-
593
- * Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when
594
- `ActiveSupport.parse_json_times = true`.
359
+ `Rails.application.credentials.aws.access_key_id` will now return the same thing as
360
+ `Rails.application.credentials.aws[:access_key_id]`.
595
361
 
596
- *Christian Gregg*
362
+ *Alex Ghiculescu*
597
363
 
598
- * Support symbolic links for `content_path` in `ActiveSupport::EncryptedFile`.
364
+ * Added a faster and more compact `ActiveSupport::Cache` serialization format.
599
365
 
600
- *Takumi Shotoku*
366
+ It can be enabled with `config.active_support.cache_format_version = 7.0` or
367
+ `config.load_defaults 7.0`. Regardless of the configuration Active Support
368
+ 7.0 can read cache entries serialized by Active Support 6.1 which allows to
369
+ upgrade without invalidating the cache. However Rails 6.1 can't read the
370
+ new format, so all readers must be upgraded before the new format is enabled.
601
371
 
602
- * Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
603
- and endless range targets.
372
+ *Jean Boussier*
604
373
 
605
- *Allen Hsu*, *Andrew Hodgkinson*
374
+ * Add `Enumerable#sole`, per `ActiveRecord::FinderMethods#sole`. Returns the
375
+ sole item of the enumerable, raising if no items are found, or if more than
376
+ one is.
606
377
 
607
- * Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
378
+ *Asherah Connor*
608
379
 
609
- *Iain Beeston*
380
+ * Freeze `ActiveSupport::Duration#parts` and remove writer methods.
610
381
 
611
- * Prevent `ActiveSupport::Duration.build(value)` from creating instances of
612
- `ActiveSupport::Duration` unless `value` is of type `Numeric`.
382
+ Durations are meant to be value objects and should not be mutated.
613
383
 
614
- Addresses the errant set of behaviours described in #37012 where
615
- `ActiveSupport::Duration` comparisons would fail confusingly
616
- or return unexpected results when comparing durations built from instances of `String`.
384
+ *Andrew White*
617
385
 
618
- Before:
386
+ * Fix `ActiveSupport::TimeZone#utc_to_local` with fractional seconds.
619
387
 
620
- small_duration_from_string = ActiveSupport::Duration.build('9')
621
- large_duration_from_string = ActiveSupport::Duration.build('100000000000000')
622
- small_duration_from_int = ActiveSupport::Duration.build(9)
388
+ When `utc_to_local_returns_utc_offset_times` is false and the time
389
+ instance had fractional seconds the new UTC time instance was out by
390
+ a factor of 1,000,000 as the `Time.utc` constructor takes a usec
391
+ value and not a fractional second value.
623
392
 
624
- large_duration_from_string > small_duration_from_string
625
- # => false
393
+ *Andrew White*
626
394
 
627
- small_duration_from_string == small_duration_from_int
628
- # => false
395
+ * Add `expires_at` argument to `ActiveSupport::Cache` `write` and `fetch` to set a cache entry TTL as an absolute time.
629
396
 
630
- small_duration_from_int < large_duration_from_string
631
- # => ArgumentError (comparison of ActiveSupport::Duration::Scalar with ActiveSupport::Duration failed)
397
+ ```ruby
398
+ Rails.cache.write(key, value, expires_at: Time.now.at_end_of_hour)
399
+ ```
632
400
 
633
- large_duration_from_string > small_duration_from_int
634
- # => ArgumentError (comparison of String with ActiveSupport::Duration failed)
401
+ *Jean Boussier*
635
402
 
636
- After:
403
+ * Deprecate `ActiveSupport::TimeWithZone.name` so that from Rails 7.1 it will use the default implementation.
637
404
 
638
- small_duration_from_string = ActiveSupport::Duration.build('9')
639
- # => TypeError (can't build an ActiveSupport::Duration from a String)
405
+ *Andrew White*
640
406
 
641
- *Alexei Emam*
407
+ * Deprecates Rails custom `Enumerable#sum` and `Array#sum` in favor of Ruby's native implementation which
408
+ is considerably faster.
642
409
 
643
- * Add `ActiveSupport::Cache::Store#delete_multi` method to delete multiple keys from the cache store.
410
+ Ruby requires an initializer for non-numeric type as per examples below:
644
411
 
645
- *Peter Zhu*
412
+ ```ruby
413
+ %w[foo bar].sum('')
414
+ # instead of %w[foo bar].sum
646
415
 
647
- * Support multiple arguments in `HashWithIndifferentAccess` for `merge` and `update` methods, to
648
- follow Ruby 2.6 addition.
416
+ [[1, 2], [3, 4, 5]].sum([])
417
+ # instead of [[1, 2], [3, 4, 5]].sum
418
+ ```
649
419
 
650
- *Wojciech Wnętrzak*
420
+ *Alberto Mota*
651
421
 
652
- * Allow initializing `thread_mattr_*` attributes via `:default` option.
422
+ * Tests parallelization is now disabled when running individual files to prevent the setup overhead.
653
423
 
654
- class Scraper
655
- thread_mattr_reader :client, default: Api::Client.new
656
- end
424
+ It can still be enforced if the environment variable `PARALLEL_WORKERS` is present and set to a value greater than 1.
657
425
 
658
- *Guilherme Mansur*
426
+ *Ricardo Díaz*
659
427
 
660
- * Add `compact_blank` for those times when you want to remove #blank? values from
661
- an Enumerable (also `compact_blank!` on Hash, Array, ActionController::Parameters).
428
+ * Fix proxying keyword arguments in `ActiveSupport::CurrentAttributes`.
662
429
 
663
- *Dana Sherson*
430
+ *Marcin Kołodziej*
664
431
 
665
- * Make ActiveSupport::Logger Fiber-safe.
432
+ * Add `Enumerable#maximum` and `Enumerable#minimum` to easily calculate the maximum or minimum from extracted
433
+ elements of an enumerable.
666
434
 
667
- Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
668
- to make log level local to Ruby Fibers in addition to Threads.
435
+ ```ruby
436
+ payments = [Payment.new(5), Payment.new(15), Payment.new(10)]
669
437
 
670
- Example:
438
+ payments.minimum(:price) # => 5
439
+ payments.maximum(:price) # => 15
440
+ ```
671
441
 
672
- logger = ActiveSupport::Logger.new(STDOUT)
673
- logger.level = 1
674
- puts "Main is debug? #{logger.debug?}"
442
+ This also allows passing enumerables to `fresh_when` and `stale?` in Action Controller.
443
+ See PR [#41404](https://github.com/rails/rails/pull/41404) for an example.
675
444
 
676
- Fiber.new {
677
- logger.local_level = 0
678
- puts "Thread is debug? #{logger.debug?}"
679
- }.resume
445
+ *Ayrton De Craene*
680
446
 
681
- puts "Main is debug? #{logger.debug?}"
447
+ * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
682
448
 
683
- Before:
449
+ ```ruby
450
+ config.cache_store = :mem_cache_store, nil
684
451
 
685
- Main is debug? false
686
- Thread is debug? true
687
- Main is debug? true
452
+ # is now equivalent to
688
453
 
689
- After:
454
+ config.cache_store = :mem_cache_store
690
455
 
691
- Main is debug? false
692
- Thread is debug? true
693
- Main is debug? false
456
+ # and is also equivalent to
694
457
 
695
- Fixes #36752.
458
+ config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
696
459
 
697
- *Alexander Varnin*
460
+ # which is the fallback behavior of Dalli
461
+ ```
698
462
 
699
- * Allow the `on_rotation` proc used when decrypting/verifying a message to be
700
- passed at the constructor level.
463
+ This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
701
464
 
702
- Before:
465
+ *Michael Overmeyer*
703
466
 
704
- crypt = ActiveSupport::MessageEncryptor.new('long_secret')
705
- crypt.decrypt_and_verify(encrypted_message, on_rotation: proc { ... })
706
- crypt.decrypt_and_verify(another_encrypted_message, on_rotation: proc { ... })
467
+ * Add `Enumerable#in_order_of` to put an Enumerable in a certain order by a key.
707
468
 
708
- After:
469
+ *DHH*
709
470
 
710
- crypt = ActiveSupport::MessageEncryptor.new('long_secret', on_rotation: proc { ... })
711
- crypt.decrypt_and_verify(encrypted_message)
712
- crypt.decrypt_and_verify(another_encrypted_message)
471
+ * `ActiveSupport::Inflector.camelize` behaves expected when provided a symbol `:upper` or `:lower` argument. Matches
472
+ `String#camelize` behavior.
713
473
 
714
- *Edouard Chin*
474
+ *Alex Ghiculescu*
715
475
 
716
- * `delegate_missing_to` would raise a `DelegationError` if the object
717
- delegated to was `nil`. Now the `allow_nil` option has been added to enable
718
- the user to specify they want `nil` returned in this case.
476
+ * Raises an `ArgumentError` when the first argument of `ActiveSupport::Notification.subscribe` is
477
+ invalid.
719
478
 
720
- *Matthew Tanous*
479
+ *Vipul A M*
721
480
 
722
- * `truncate` would return the original string if it was too short to be truncated
723
- and a frozen string if it were long enough to be truncated. Now truncate will
724
- consistently return an unfrozen string regardless. This behavior is consistent
725
- with `gsub` and `strip`.
481
+ * `HashWithIndifferentAccess#deep_transform_keys` now returns a `HashWithIndifferentAccess` instead of a `Hash`.
726
482
 
727
- Before:
483
+ *Nathaniel Woodthorpe*
728
484
 
729
- 'foobar'.truncate(5).frozen?
730
- # => true
731
- 'foobar'.truncate(6).frozen?
732
- # => false
485
+ * Consume dalli’s `cache_nils` configuration as `ActiveSupport::Cache`'s `skip_nil` when using `MemCacheStore`.
733
486
 
734
- After:
487
+ *Ritikesh G*
735
488
 
736
- 'foobar'.truncate(5).frozen?
737
- # => false
738
- 'foobar'.truncate(6).frozen?
739
- # => false
489
+ * Add `RedisCacheStore#stats` method similar to `MemCacheStore#stats`. Calls `redis#info` internally.
740
490
 
741
- *Jordan Thomas*
491
+ *Ritikesh G*
742
492
 
743
493
 
744
- Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activesupport/CHANGELOG.md) for previous changes.
494
+ Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activesupport/CHANGELOG.md) for previous changes.