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