activesupport 6.1.4.4 → 7.0.0.alpha1

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