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