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