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