activesupport 6.0.6.1 → 6.1.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +441 -455
  3. data/MIT-LICENSE +1 -1
  4. data/lib/active_support/array_inquirer.rb +4 -2
  5. data/lib/active_support/backtrace_cleaner.rb +3 -3
  6. data/lib/active_support/benchmarkable.rb +1 -1
  7. data/lib/active_support/cache/file_store.rb +3 -3
  8. data/lib/active_support/cache/mem_cache_store.rb +28 -18
  9. data/lib/active_support/cache/memory_store.rb +46 -26
  10. data/lib/active_support/cache/redis_cache_store.rb +25 -25
  11. data/lib/active_support/cache/strategy/local_cache.rb +20 -5
  12. data/lib/active_support/cache.rb +87 -40
  13. data/lib/active_support/callbacks.rb +65 -56
  14. data/lib/active_support/concern.rb +46 -2
  15. data/lib/active_support/configurable.rb +3 -3
  16. data/lib/active_support/configuration_file.rb +51 -0
  17. data/lib/active_support/core_ext/benchmark.rb +2 -2
  18. data/lib/active_support/core_ext/class/attribute.rb +34 -44
  19. data/lib/active_support/core_ext/class/subclasses.rb +17 -38
  20. data/lib/active_support/core_ext/date/conversions.rb +2 -1
  21. data/lib/active_support/core_ext/date_and_time/calculations.rb +13 -0
  22. data/lib/active_support/core_ext/date_and_time/compatibility.rb +15 -0
  23. data/lib/active_support/core_ext/digest/uuid.rb +1 -0
  24. data/lib/active_support/core_ext/enumerable.rb +76 -4
  25. data/lib/active_support/core_ext/hash/conversions.rb +2 -2
  26. data/lib/active_support/core_ext/hash/deep_transform_values.rb +1 -1
  27. data/lib/active_support/core_ext/hash/keys.rb +1 -1
  28. data/lib/active_support/core_ext/hash/slice.rb +3 -2
  29. data/lib/active_support/core_ext/load_error.rb +1 -1
  30. data/lib/active_support/core_ext/marshal.rb +2 -0
  31. data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
  32. data/lib/active_support/core_ext/module/attribute_accessors.rb +23 -29
  33. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +8 -4
  34. data/lib/active_support/core_ext/module/concerning.rb +8 -2
  35. data/lib/active_support/core_ext/module/delegation.rb +38 -28
  36. data/lib/active_support/core_ext/module/introspection.rb +1 -25
  37. data/lib/active_support/core_ext/name_error.rb +29 -2
  38. data/lib/active_support/core_ext/numeric/conversions.rb +22 -18
  39. data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
  40. data/lib/active_support/core_ext/object/json.rb +12 -1
  41. data/lib/active_support/core_ext/object/try.rb +2 -2
  42. data/lib/active_support/core_ext/range/compare_range.rb +9 -3
  43. data/lib/active_support/core_ext/range/include_time_with_zone.rb +8 -3
  44. data/lib/active_support/core_ext/regexp.rb +8 -1
  45. data/lib/active_support/core_ext/string/access.rb +5 -24
  46. data/lib/active_support/core_ext/string/conversions.rb +1 -0
  47. data/lib/active_support/core_ext/string/inflections.rb +38 -4
  48. data/lib/active_support/core_ext/string/inquiry.rb +1 -0
  49. data/lib/active_support/core_ext/string/multibyte.rb +2 -2
  50. data/lib/active_support/core_ext/string/output_safety.rb +7 -4
  51. data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -2
  52. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +14 -0
  53. data/lib/active_support/core_ext/symbol.rb +3 -0
  54. data/lib/active_support/core_ext/time/calculations.rb +19 -0
  55. data/lib/active_support/core_ext/time/conversions.rb +2 -0
  56. data/lib/active_support/core_ext/uri.rb +5 -1
  57. data/lib/active_support/core_ext.rb +1 -1
  58. data/lib/active_support/current_attributes/test_helper.rb +13 -0
  59. data/lib/active_support/current_attributes.rb +9 -2
  60. data/lib/active_support/dependencies/zeitwerk_integration.rb +4 -1
  61. data/lib/active_support/dependencies.rb +37 -18
  62. data/lib/active_support/deprecation/behaviors.rb +15 -2
  63. data/lib/active_support/deprecation/disallowed.rb +56 -0
  64. data/lib/active_support/deprecation/instance_delegator.rb +0 -1
  65. data/lib/active_support/deprecation/method_wrappers.rb +3 -2
  66. data/lib/active_support/deprecation/proxy_wrappers.rb +2 -2
  67. data/lib/active_support/deprecation/reporting.rb +50 -7
  68. data/lib/active_support/deprecation.rb +6 -1
  69. data/lib/active_support/descendants_tracker.rb +6 -2
  70. data/lib/active_support/digest.rb +2 -0
  71. data/lib/active_support/duration/iso8601_serializer.rb +15 -9
  72. data/lib/active_support/duration.rb +75 -25
  73. data/lib/active_support/encrypted_file.rb +27 -11
  74. data/lib/active_support/environment_inquirer.rb +20 -0
  75. data/lib/active_support/evented_file_update_checker.rb +69 -133
  76. data/lib/active_support/fork_tracker.rb +64 -0
  77. data/lib/active_support/gem_version.rb +3 -3
  78. data/lib/active_support/hash_with_indifferent_access.rb +48 -24
  79. data/lib/active_support/i18n_railtie.rb +14 -19
  80. data/lib/active_support/inflector/inflections.rb +1 -2
  81. data/lib/active_support/inflector/methods.rb +36 -33
  82. data/lib/active_support/inflector/transliterate.rb +4 -4
  83. data/lib/active_support/json/decoding.rb +4 -4
  84. data/lib/active_support/json/encoding.rb +5 -1
  85. data/lib/active_support/key_generator.rb +1 -1
  86. data/lib/active_support/locale/en.yml +7 -3
  87. data/lib/active_support/log_subscriber.rb +8 -0
  88. data/lib/active_support/logger.rb +1 -1
  89. data/lib/active_support/logger_silence.rb +2 -26
  90. data/lib/active_support/logger_thread_safe_level.rb +34 -12
  91. data/lib/active_support/message_encryptor.rb +4 -7
  92. data/lib/active_support/message_verifier.rb +5 -5
  93. data/lib/active_support/messages/rotation_configuration.rb +2 -1
  94. data/lib/active_support/messages/rotator.rb +6 -5
  95. data/lib/active_support/multibyte/chars.rb +4 -42
  96. data/lib/active_support/multibyte/unicode.rb +9 -83
  97. data/lib/active_support/notifications/fanout.rb +23 -8
  98. data/lib/active_support/notifications/instrumenter.rb +6 -15
  99. data/lib/active_support/notifications.rb +32 -5
  100. data/lib/active_support/number_helper/number_converter.rb +1 -1
  101. data/lib/active_support/number_helper/number_to_human_converter.rb +1 -1
  102. data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
  103. data/lib/active_support/number_helper/number_to_rounded_converter.rb +9 -5
  104. data/lib/active_support/number_helper/rounding_helper.rb +12 -28
  105. data/lib/active_support/number_helper.rb +29 -14
  106. data/lib/active_support/option_merger.rb +2 -1
  107. data/lib/active_support/ordered_options.rb +8 -2
  108. data/lib/active_support/parameter_filter.rb +16 -11
  109. data/lib/active_support/per_thread_registry.rb +2 -1
  110. data/lib/active_support/rails.rb +1 -4
  111. data/lib/active_support/railtie.rb +23 -1
  112. data/lib/active_support/rescuable.rb +4 -4
  113. data/lib/active_support/secure_compare_rotator.rb +51 -0
  114. data/lib/active_support/security_utils.rb +19 -12
  115. data/lib/active_support/string_inquirer.rb +4 -2
  116. data/lib/active_support/subscriber.rb +12 -7
  117. data/lib/active_support/tagged_logging.rb +30 -5
  118. data/lib/active_support/testing/assertions.rb +18 -11
  119. data/lib/active_support/testing/parallelization/server.rb +78 -0
  120. data/lib/active_support/testing/parallelization/worker.rb +100 -0
  121. data/lib/active_support/testing/parallelization.rb +12 -95
  122. data/lib/active_support/testing/time_helpers.rb +40 -3
  123. data/lib/active_support/time_with_zone.rb +67 -43
  124. data/lib/active_support/values/time_zone.rb +22 -10
  125. data/lib/active_support/xml_mini/rexml.rb +8 -1
  126. data/lib/active_support.rb +13 -1
  127. metadata +34 -36
  128. data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -5
  129. data/lib/active_support/core_ext/hash/compact.rb +0 -5
  130. data/lib/active_support/core_ext/hash/transform_values.rb +0 -5
  131. data/lib/active_support/core_ext/module/reachable.rb +0 -6
  132. data/lib/active_support/core_ext/numeric/inquiry.rb +0 -5
  133. data/lib/active_support/core_ext/range/include_range.rb +0 -9
data/CHANGELOG.md CHANGED
@@ -1,782 +1,768 @@
1
- ## Rails 6.0.6.1 (January 17, 2023) ##
1
+ ## Rails 6.1.7.6 (August 22, 2023) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 6.0.6 (September 09, 2022) ##
7
-
8
- * No changes.
6
+ ## Rails 6.1.7.5 (August 22, 2023) ##
9
7
 
8
+ * Use a temporary file for storing unencrypted files while editing
10
9
 
11
- ## Rails 6.0.5.1 (July 12, 2022) ##
12
-
13
- * No changes.
10
+ [CVE-2023-38037]
14
11
 
15
12
 
16
- ## Rails 6.0.5 (May 09, 2022) ##
13
+ ## Rails 6.1.7.4 (June 26, 2023) ##
17
14
 
18
15
  * No changes.
19
16
 
20
17
 
21
- ## Rails 6.0.4.8 (April 26, 2022) ##
18
+ ## Rails 6.1.7.3 (March 13, 2023) ##
22
19
 
23
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
20
+ * Implement SafeBuffer#bytesplice
24
21
 
25
- Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
26
- in names of tags and names of attributes, following the specification of XML.
22
+ [CVE-2023-28120]
27
23
 
28
- *Álvaro Martín Fraguas*
29
24
 
30
-
31
- ## Rails 6.0.4.7 (March 08, 2022) ##
25
+ ## Rails 6.1.7.2 (January 24, 2023) ##
32
26
 
33
27
  * No changes.
34
28
 
35
29
 
36
- ## Rails 6.0.4.6 (February 11, 2022) ##
37
-
38
- * Fix Reloader method signature to work with the new Executor signature
30
+ ## Rails 6.1.7.1 (January 17, 2023) ##
39
31
 
32
+ * Avoid regex backtracking in Inflector.underscore
40
33
 
41
- ## Rails 6.0.4.5 (February 11, 2022) ##
34
+ [CVE-2023-22796]
42
35
 
43
- * No changes.
44
36
 
45
-
46
- ## Rails 6.0.4.4 (December 15, 2021) ##
37
+ ## Rails 6.1.7 (September 09, 2022) ##
47
38
 
48
39
  * No changes.
49
40
 
50
41
 
51
- ## Rails 6.0.4.3 (December 14, 2021) ##
42
+ ## Rails 6.1.6.1 (July 12, 2022) ##
52
43
 
53
44
  * No changes.
54
45
 
55
46
 
56
- ## Rails 6.0.4.2 (December 14, 2021) ##
47
+ ## Rails 6.1.6 (May 09, 2022) ##
57
48
 
58
49
  * No changes.
59
50
 
60
51
 
61
- ## Rails 6.0.4.1 (August 19, 2021) ##
52
+ ## Rails 6.1.5.1 (April 26, 2022) ##
62
53
 
63
- * No changes.
54
+ * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
64
55
 
56
+ Add the method `ERB::Util.xml_name_escape` to escape dangerous characters
57
+ in names of tags and names of attributes, following the specification of XML.
65
58
 
66
- ## Rails 6.0.4 (June 15, 2021) ##
59
+ *Álvaro Martín Fraguas*
67
60
 
68
- * Fixed issue in `ActiveSupport::Cache::RedisCacheStore` not passing options
69
- to `read_multi` causing `fetch_multi` to not work properly.
61
+ ## Rails 6.1.5 (March 09, 2022) ##
70
62
 
71
- *Rajesh Sharma*
63
+ * Fix `ActiveSupport::Duration.build` to support negative values.
72
64
 
73
- * `with_options` copies its options hash again to avoid leaking mutations.
65
+ The algorithm to collect the `parts` of the `ActiveSupport::Duration`
66
+ ignored the sign of the `value` and accumulated incorrect part values. This
67
+ impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
68
+ not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
74
69
 
75
- Fixes #39343.
70
+ *Caleb Buxton*, *Braden Staudacher*
76
71
 
77
- *Eugene Kenny*
72
+ * `Time#change` and methods that call it (eg. `Time#advance`) will now
73
+ return a `Time` with the timezone argument provided, if the caller was
74
+ initialized with a timezone argument.
78
75
 
76
+ Fixes [#42467](https://github.com/rails/rails/issues/42467).
79
77
 
80
- ## Rails 6.0.3.7 (May 05, 2021) ##
78
+ *Alex Ghiculescu*
81
79
 
82
- * No changes.
80
+ * Clone to keep extended Logger methods for tagged logger.
83
81
 
82
+ *Orhan Toy*
84
83
 
85
- ## Rails 6.0.3.6 (March 26, 2021) ##
84
+ * `assert_changes` works on including `ActiveSupport::Assertions` module.
86
85
 
87
- * No changes.
86
+ *Pedro Medeiros*
88
87
 
89
88
 
90
- ## Rails 6.0.3.5 (February 10, 2021) ##
89
+ ## Rails 6.1.4.7 (March 08, 2022) ##
91
90
 
92
91
  * No changes.
93
92
 
94
93
 
95
- ## Rails 6.0.3.4 (October 07, 2020) ##
94
+ ## Rails 6.1.4.6 (February 11, 2022) ##
96
95
 
97
- * No changes.
96
+ * Fix Reloader method signature to work with the new Executor signature
98
97
 
99
98
 
100
- ## Rails 6.0.3.3 (September 09, 2020) ##
99
+ ## Rails 6.1.4.5 (February 11, 2022) ##
101
100
 
102
101
  * No changes.
103
102
 
104
103
 
105
- ## Rails 6.0.3.2 (June 17, 2020) ##
104
+ ## Rails 6.1.4.4 (December 15, 2021) ##
106
105
 
107
106
  * No changes.
108
107
 
109
108
 
110
- ## Rails 6.0.3.1 (May 18, 2020) ##
111
-
112
- * [CVE-2020-8165] Deprecate Marshal.load on raw cache read in RedisCacheStore
113
-
114
- * [CVE-2020-8165] Avoid Marshal.load on raw cache value in MemCacheStore
109
+ ## Rails 6.1.4.3 (December 14, 2021) ##
115
110
 
111
+ * No changes.
116
112
 
117
- ## Rails 6.0.3 (May 06, 2020) ##
118
-
119
- * `Array#to_sentence` no longer returns a frozen string.
120
-
121
- Before:
122
113
 
123
- ['one', 'two'].to_sentence.frozen?
124
- # => true
114
+ ## Rails 6.1.4.2 (December 14, 2021) ##
125
115
 
126
- After:
116
+ * No changes.
127
117
 
128
- ['one', 'two'].to_sentence.frozen?
129
- # => false
130
118
 
131
- *Nicolas Dular*
119
+ ## Rails 6.1.4.1 (August 19, 2021) ##
132
120
 
133
- * Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when
134
- `ActiveSupport.parse_json_times = true`.
121
+ * No changes.
135
122
 
136
- *Christian Gregg*
137
123
 
124
+ ## Rails 6.1.4 (June 24, 2021) ##
138
125
 
139
- ## Rails 6.0.2.2 (March 19, 2020) ##
126
+ * MemCacheStore: convert any underlying value (including `false`) to an `Entry`.
140
127
 
141
- * No changes.
128
+ See [#42559](https://github.com/rails/rails/pull/42559).
142
129
 
130
+ *Alex Ghiculescu*
143
131
 
144
- ## Rails 6.0.2.1 (December 18, 2019) ##
132
+ * Fix bug in `number_with_precision` when using large `BigDecimal` values.
145
133
 
146
- * No changes.
134
+ Fixes #42302.
147
135
 
136
+ *Federico Aldunate*, *Zachary Scott*
148
137
 
149
- ## Rails 6.0.2 (December 13, 2019) ##
138
+ * Check byte size instead of length on `secure_compare`.
150
139
 
151
- * Eager load translations during initialization.
140
+ *Tietew*
152
141
 
153
- *Diego Plentz*
142
+ * Fix `Time.at` to not lose `:in` option.
154
143
 
155
- * Use per-thread CPU time clock on `ActiveSupport::Notifications`.
144
+ *Ryuta Kamizono*
156
145
 
157
- *George Claghorn*
146
+ * Require a path for `config.cache_store = :file_store`.
158
147
 
148
+ *Alex Ghiculescu*
159
149
 
160
- ## Rails 6.0.1 (November 5, 2019) ##
150
+ * Avoid having to store complex object in the default translation file.
161
151
 
162
- * `ActiveSupport::SafeBuffer` supports `Enumerator` methods.
152
+ *Rafael Mendonça França*
163
153
 
164
- *Shugo Maeda*
165
154
 
166
- * The Redis cache store fails gracefully when the server returns a "max number
167
- of clients reached" error.
155
+ ## Rails 6.1.3.2 (May 05, 2021) ##
168
156
 
169
- *Brandon Medenwald*
157
+ * No changes.
170
158
 
171
- * Fixed that mutating a value returned by a memory cache store would
172
- unexpectedly change the cached value.
173
159
 
174
- *Jonathan Hyman*
160
+ ## Rails 6.1.3.1 (March 26, 2021) ##
175
161
 
176
- * The default inflectors in `zeitwerk` mode support overrides:
162
+ * No changes.
177
163
 
178
- ```ruby
179
- # config/initializers/zeitwerk.rb
180
- Rails.autoloaders.each do |autoloader|
181
- autoloader.inflector.inflect(
182
- "html_parser" => "HTMLParser",
183
- "ssl_error" => "SSLError"
184
- )
185
- end
186
- ```
187
164
 
188
- That way, you can tweak how individual basenames are inflected without touching Active Support inflection rules, which are global. These inflectors fallback to `String#camelize`, so existing inflection rules are still taken into account for non-overridden basenames.
165
+ ## Rails 6.1.3 (February 17, 2021) ##
189
166
 
190
- Please, check the [autoloading guide for `zeitwerk` mode](https://guides.rubyonrails.org/v6.0/autoloading_and_reloading_constants.html#customizing-inflections) if you prefer not to depend on `String#camelize` at all.
167
+ * No changes.
191
168
 
192
- *Xavier Noria*
193
169
 
194
- * Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
195
- and endless range targets.
170
+ ## Rails 6.1.2.1 (February 10, 2021) ##
196
171
 
197
- *Allen Hsu*, *Andrew Hodgkinson*
172
+ * No changes.
198
173
 
199
- * Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
200
174
 
201
- *Iain Beeston*
175
+ ## Rails 6.1.2 (February 09, 2021) ##
202
176
 
177
+ * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
203
178
 
204
- ## Rails 6.0.0 (August 16, 2019) ##
179
+ ```ruby
180
+ config.cache_store = :mem_cache_store, nil
205
181
 
206
- * Let `require_dependency` in `zeitwerk` mode look the autoload paths up for
207
- better backwards compatibility.
182
+ # is now equivalent to
208
183
 
209
- *Xavier Noria*
184
+ config.cache_store = :mem_cache_store
210
185
 
211
- * Let `require_dependency` in `zeitwerk` mode support arguments that respond
212
- to `to_path` for better backwards compatibility.
186
+ # and is also equivalent to
213
187
 
214
- *Xavier Noria*
188
+ config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
215
189
 
216
- * Make ActiveSupport::Logger Fiber-safe. Fixes #36752.
190
+ # which is the fallback behavior of Dalli
191
+ ```
217
192
 
218
- Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
219
- to make log level local to Ruby Fibers in addition to Threads.
193
+ This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
220
194
 
221
- Example:
195
+ *Michael Overmeyer*
222
196
 
223
- logger = ActiveSupport::Logger.new(STDOUT)
224
- logger.level = 1
225
- p "Main is debug? #{logger.debug?}"
226
197
 
227
- Fiber.new {
228
- logger.local_level = 0
229
- p "Thread is debug? #{logger.debug?}"
230
- }.resume
198
+ ## Rails 6.1.1 (January 07, 2021) ##
231
199
 
232
- p "Main is debug? #{logger.debug?}"
200
+ * Change `IPAddr#to_json` to match the behavior of the json gem returning the string representation
201
+ instead of the instance variables of the object.
233
202
 
234
203
  Before:
235
204
 
236
- Main is debug? false
237
- Thread is debug? true
238
- Main is debug? true
205
+ ```ruby
206
+ IPAddr.new("127.0.0.1").to_json
207
+ # => "{\"addr\":2130706433,\"family\":2,\"mask_addr\":4294967295}"
208
+ ```
239
209
 
240
210
  After:
241
211
 
242
- Main is debug? false
243
- Thread is debug? true
244
- Main is debug? false
212
+ ```ruby
213
+ IPAddr.new("127.0.0.1").to_json
214
+ # => "\"127.0.0.1\""
215
+ ```
245
216
 
246
- *Alexander Varnin*
247
217
 
248
- * Do not delegate missing `marshal_dump` and `_dump` methods via the
249
- `delegate_missing_to` extension. This avoids unintentionally adding instance
250
- variables when calling `Marshal.dump(object)`, should the delegation target of
251
- `object` be a method which would otherwise add them. Fixes #36522.
218
+ ## Rails 6.1.0 (December 09, 2020) ##
252
219
 
253
- *Aaron Lipman*
220
+ * Ensure `MemoryStore` disables compression by default. Reverts behavior of
221
+ `MemoryStore` to its prior rails `5.1` behavior.
254
222
 
223
+ *Max Gurewitz*
255
224
 
256
- ## Rails 6.0.0.rc2 (July 22, 2019) ##
225
+ * Calling `iso8601` on negative durations retains the negative sign on individual
226
+ digits instead of prepending it.
257
227
 
258
- * `truncate` would return the original string if it was too short to be truncated
259
- and a frozen string if it were long enough to be truncated. Now truncate will
260
- consistently return an unfrozen string regardless. This behavior is consistent
261
- with `gsub` and `strip`.
228
+ This change is required so we can interoperate with PostgreSQL, which prefers
229
+ negative signs for each component.
230
+
231
+ Compatibility with other iso8601 parsers which support leading negatives as well
232
+ as negatives per component is still retained.
262
233
 
263
234
  Before:
264
235
 
265
- 'foobar'.truncate(5).frozen?
266
- # => true
267
- 'foobar'.truncate(6).frozen?
268
- # => false
236
+ (-1.year - 1.day).iso8601
237
+ # => "-P1Y1D"
269
238
 
270
239
  After:
271
240
 
272
- 'foobar'.truncate(5).frozen?
273
- # => false
274
- 'foobar'.truncate(6).frozen?
275
- # => false
276
-
277
- *Jordan Thomas*
278
-
241
+ (-1.year - 1.day).iso8601
242
+ # => "P-1Y-1D"
279
243
 
280
- ## Rails 6.0.0.rc1 (April 24, 2019) ##
244
+ *Vipul A M*
281
245
 
282
- * Speed improvements to `Hash.except` and `HashWithIndifferentAccess#except`.
246
+ * Remove deprecated `ActiveSupport::Notifications::Instrumenter#end=`.
283
247
 
284
- These methods now unset the `default`/`default_proc` on the returned Hash, compatible with Ruby 3.0’s native implementation.
285
-
286
- *Timo Schilling*
287
-
288
- * Introduce `ActiveSupport::ActionableError`.
289
-
290
- Actionable errors let's you dispatch actions from Rails' error pages. This
291
- can help you save time if you have a clear action for the resolution of
292
- common development errors.
248
+ *Rafael Mendonça França*
293
249
 
294
- The de-facto example are pending migrations. Every time pending migrations
295
- are found, a middleware raises an error. With actionable errors, you can
296
- run the migrations right from the error page. Other examples include Rails
297
- plugins that need to run a rake task to setup themselves. They can now
298
- raise actionable errors to run the setup straight from the error pages.
250
+ * Deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
299
251
 
300
- Here is how to define an actionable error:
252
+ *Rafael Mendonça França*
301
253
 
302
- ```ruby
303
- class PendingMigrationError < MigrationError #:nodoc:
304
- include ActiveSupport::ActionableError
254
+ * Remove deprecated `ActiveSupport::Multibyte::Unicode.pack_graphemes`,
255
+ `ActiveSupport::Multibyte::Unicode.unpack_graphemes`,
256
+ `ActiveSupport::Multibyte::Unicode.normalize`,
257
+ `ActiveSupport::Multibyte::Unicode.downcase`,
258
+ `ActiveSupport::Multibyte::Unicode.upcase` and `ActiveSupport::Multibyte::Unicode.swapcase`.
305
259
 
306
- action "Run pending migrations" do
307
- ActiveRecord::Tasks::DatabaseTasks.migrate
308
- end
309
- end
310
- ```
260
+ *Rafael Mendonça França*
311
261
 
312
- To make an error actionable, include the `ActiveSupport::ActionableError`
313
- module and invoke the `action` class macro to define the action. An action
314
- needs a name and a procedure to execute. The name is shown as the name of a
315
- button on the error pages. Once clicked, it will invoke the given
316
- procedure.
262
+ * Remove deprecated `ActiveSupport::Multibyte::Chars#consumes?` and `ActiveSupport::Multibyte::Chars#normalize`.
317
263
 
318
- *Vipul A M*, *Yao Jie*, *Genadi Samokovarov*
264
+ *Rafael Mendonça França*
319
265
 
320
- * Preserve `html_safe?` status on `ActiveSupport::SafeBuffer#*`.
266
+ * Remove deprecated file `active_support/core_ext/range/include_range`.
321
267
 
322
- Before:
268
+ *Rafael Mendonça França*
323
269
 
324
- ("<br />".html_safe * 2).html_safe? #=> nil
270
+ * Remove deprecated file `active_support/core_ext/hash/transform_values`.
325
271
 
326
- After:
272
+ *Rafael Mendonça França*
327
273
 
328
- ("<br />".html_safe * 2).html_safe? #=> true
274
+ * Remove deprecated file `active_support/core_ext/hash/compact`.
329
275
 
330
- *Ryo Nakamura*
276
+ *Rafael Mendonça França*
331
277
 
332
- * Calling test methods with `with_info_handler` method to allow minitest-hooks
333
- plugin to work.
278
+ * Remove deprecated file `active_support/core_ext/array/prepend_and_append`.
334
279
 
335
- *Mauri Mustonen*
280
+ *Rafael Mendonça França*
336
281
 
337
- * The Zeitwerk compatibility interface for `ActiveSupport::Dependencies` no
338
- longer implements `autoloaded_constants` or `autoloaded?` (undocumented,
339
- anyway). Experience shows introspection does not have many use cases, and
340
- troubleshooting is done by logging. With this design trade-off we are able
341
- to use even less memory in all environments.
282
+ * Remove deprecated file `active_support/core_ext/numeric/inquiry`.
342
283
 
343
- *Xavier Noria*
284
+ *Rafael Mendonça França*
344
285
 
345
- * Depends on Zeitwerk 2, which stores less metadata if reloading is disabled
346
- and hence uses less memory when `config.cache_classes` is `true`, a standard
347
- setup in production.
286
+ * Remove deprecated file `active_support/core_ext/module/reachable`.
348
287
 
349
- *Xavier Noria*
288
+ *Rafael Mendonça França*
350
289
 
351
- * In `:zeitwerk` mode, eager load directories in engines and applications only
352
- if present in their respective `config.eager_load_paths`.
290
+ * Remove deprecated `Module#parent_name`, `Module#parent` and `Module#parents`.
353
291
 
354
- A common use case for this is adding `lib` to `config.autoload_paths`, but
355
- not to `config.eager_load_paths`. In that configuration, for example, files
356
- in the `lib` directory should not be eager loaded.
292
+ *Rafael Mendonça França*
357
293
 
358
- *Xavier Noria*
294
+ * Remove deprecated `ActiveSupport::LoggerThreadSafeLevel#after_initialize`.
359
295
 
360
- * Fix bug in Range comparisons when comparing to an excluded-end Range
296
+ *Rafael Mendonça França*
361
297
 
362
- Before:
298
+ * Remove deprecated `LoggerSilence` constant.
363
299
 
364
- (1..10).cover?(1...11) # => false
300
+ *Rafael Mendonça França*
365
301
 
366
- After:
302
+ * Remove deprecated fallback to `I18n.default_local` when `config.i18n.fallbacks` is empty.
367
303
 
368
- (1..10).cover?(1...11) # => true
304
+ *Rafael Mendonça França*
369
305
 
370
- With the same change for `Range#include?` and `Range#===`.
306
+ * Remove entries from local cache on `RedisCacheStore#delete_matched`
371
307
 
372
- *Owen Stephens*
308
+ Fixes #38627
373
309
 
374
- * Use weak references in descendants tracker to allow anonymous subclasses to
375
- be garbage collected.
310
+ *ojab*
376
311
 
377
- *Edgars Beigarts*
312
+ * Speed up `ActiveSupport::SecurityUtils.fixed_length_secure_compare` by using
313
+ `OpenSSL.fixed_length_secure_compare`, if available.
378
314
 
379
- * Update `ActiveSupport::Notifications::Instrumenter#instrument` to make
380
- passing a block optional. This will let users use
381
- `ActiveSupport::Notifications` messaging features outside of
382
- instrumentation.
315
+ *Nate Matykiewicz*
383
316
 
384
- *Ali Ibrahim*
317
+ * `ActiveSupport::Cache::MemCacheStore` now checks `ENV["MEMCACHE_SERVERS"]` before falling back to `"localhost:11211"` if configured without any addresses.
385
318
 
386
- * Fix `Time#advance` to work with dates before 1001-03-07
319
+ ```ruby
320
+ config.cache_store = :mem_cache_store
387
321
 
388
- Before:
322
+ # is now equivalent to
389
323
 
390
- Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC
324
+ config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
391
325
 
392
- After
326
+ # instead of
393
327
 
394
- Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-06 00:00:00 UTC
328
+ config.cache_store = :mem_cache_store, "localhost:11211" # ignores ENV["MEMCACHE_SERVERS"]
329
+ ```
395
330
 
396
- Note that this doesn't affect `DateTime#advance` as that doesn't use a proleptic calendar.
331
+ *Sam Bostock*
397
332
 
398
- *Andrew White*
333
+ * `ActiveSupport::Subscriber#attach_to` now accepts an `inherit_all:` argument. When set to true,
334
+ it allows a subscriber to receive events for methods defined in the subscriber's ancestor class(es).
399
335
 
400
- * In Zeitwerk mode, engines are now managed by the `main` autoloader. Engines may reference application constants, if the application is reloaded and we do not reload engines, they won't use the reloaded application code.
336
+ ```ruby
337
+ class ActionControllerSubscriber < ActiveSupport::Subscriber
338
+ attach_to :action_controller
401
339
 
402
- *Xavier Noria*
340
+ def start_processing(event)
341
+ info "Processing by #{event.payload[:controller]}##{event.payload[:action]} as #{format}"
342
+ end
403
343
 
404
- * Add support for supplying `locale` to `transliterate` and `parameterize`.
344
+ def redirect_to(event)
345
+ info { "Redirected to #{event.payload[:location]}" }
346
+ end
347
+ end
405
348
 
406
- I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ü" => "ue" } } })
349
+ # We detach ActionControllerSubscriber from the :action_controller namespace so that our CustomActionControllerSubscriber
350
+ # can provide its own instrumentation for certain events in the namespace
351
+ ActionControllerSubscriber.detach_from(:action_controller)
407
352
 
408
- ActiveSupport::Inflector.transliterate("ü", locale: :de) # => "ue"
409
- "Fünf autos".parameterize(locale: :de) # => "fuenf-autos"
410
- ActiveSupport::Inflector.parameterize("Fünf autos", locale: :de) # => "fuenf-autos"
353
+ class CustomActionControllerSubscriber < ActionControllerSubscriber
354
+ attach_to :action_controller, inherit_all: true
411
355
 
412
- *Kaan Ozkan*, *Sharang Dashputre*
356
+ def start_processing(event)
357
+ info "A custom response to start_processing events"
358
+ end
413
359
 
414
- * Allow `Array#excluding` and `Enumerable#excluding` to deal with a passed array gracefully.
360
+ # => CustomActionControllerSubscriber will process events for "start_processing.action_controller" notifications
361
+ # using its own #start_processing implementation, while retaining ActionControllerSubscriber's instrumentation
362
+ # for "redirect_to.action_controller" notifications
363
+ end
364
+ ```
415
365
 
416
- [ 1, 2, 3, 4, 5 ].excluding([4, 5]) # => [ 1, 2, 3 ]
366
+ *Adrianna Chang*
417
367
 
418
- *DHH*
368
+ * Allow the digest class used to generate non-sensitive digests to be configured with `config.active_support.hash_digest_class`.
419
369
 
420
- * Renamed `Array#without` and `Enumerable#without` to `Array#excluding` and `Enumerable#excluding`, to create parity with
421
- `Array#including` and `Enumerable#including`. Retained the old names as aliases.
370
+ `config.active_support.use_sha1_digests` is deprecated in favour of `config.active_support.hash_digest_class = ::Digest::SHA1`.
422
371
 
423
- *DHH*
372
+ *Dirkjan Bussink*
424
373
 
425
- * Added `Array#including` and `Enumerable#including` to conveniently enlarge a collection with more members using a method rather than an operator:
374
+ * Fix bug to make memcached write_entry expire correctly with unless_exist
426
375
 
427
- [ 1, 2, 3 ].including(4, 5) # => [ 1, 2, 3, 4, 5 ]
428
- post.authors.including(Current.person) # => All the authors plus the current person!
376
+ *Jye Lee*
429
377
 
430
- *DHH*
378
+ * Add `ActiveSupport::Duration` conversion methods
431
379
 
380
+ `in_seconds`, `in_minutes`, `in_hours`, `in_days`, `in_weeks`, `in_months`, and `in_years` return the respective duration covered.
432
381
 
433
- ## Rails 6.0.0.beta3 (March 11, 2019) ##
382
+ *Jason York*
434
383
 
435
- * No changes.
384
+ * Fixed issue in `ActiveSupport::Cache::RedisCacheStore` not passing options
385
+ to `read_multi` causing `fetch_multi` to not work properly
436
386
 
387
+ *Rajesh Sharma*
437
388
 
438
- ## Rails 6.0.0.beta2 (February 25, 2019) ##
389
+ * Fixed issue in `ActiveSupport::Cache::MemCacheStore` which caused duplicate compression,
390
+ and caused the provided `compression_threshold` to not be respected.
439
391
 
440
- * New autoloading based on [Zeitwerk](https://github.com/fxn/zeitwerk).
392
+ *Max Gurewitz*
441
393
 
442
- *Xavier Noria*
394
+ * Prevent `RedisCacheStore` and `MemCacheStore` from performing compression
395
+ when reading entries written with `raw: true`.
443
396
 
444
- * Revise `ActiveSupport::Notifications.unsubscribe` to correctly handle Regex or other multiple-pattern subscribers.
397
+ *Max Gurewitz*
445
398
 
446
- *Zach Kemp*
399
+ * `URI.parser` is deprecated and will be removed in Rails 7.0. Use
400
+ `URI::DEFAULT_PARSER` instead.
447
401
 
448
- * Add `before_reset` callback to `CurrentAttributes` and define `after_reset` as an alias of `resets` for symmetry.
402
+ *Jean Boussier*
449
403
 
450
- *Rosa Gutierrez*
404
+ * `require_dependency` has been documented to be _obsolete_ in `:zeitwerk`
405
+ mode. The method is not deprecated as such (yet), but applications are
406
+ encouraged to not use it.
451
407
 
452
- * Remove the `` Kernel#` `` override that suppresses ENOENT and accidentally returns nil on Unix systems.
408
+ In `:zeitwerk` mode, semantics match Ruby's and you do not need to be
409
+ defensive with load order. Just refer to classes and modules normally. If
410
+ the constant name is dynamic, camelize if needed, and constantize.
453
411
 
454
- *Akinori Musha*
412
+ *Xavier Noria*
455
413
 
456
- * Add `ActiveSupport::HashWithIndifferentAccess#assoc`.
414
+ * Add 3rd person aliases of `Symbol#start_with?` and `Symbol#end_with?`.
457
415
 
458
- `assoc` can now be called with either a string or a symbol.
416
+ ```ruby
417
+ :foo.starts_with?("f") # => true
418
+ :foo.ends_with?("o") # => true
419
+ ```
459
420
 
460
- *Stefan Schüßler*
421
+ *Ryuta Kamizono*
461
422
 
462
- * Add `Hash#deep_transform_values`, and `Hash#deep_transform_values!`.
423
+ * Add override of unary plus for `ActiveSupport::Duration`.
463
424
 
464
- *Guillermo Iguaran*
425
+ `+ 1.second` is now identical to `+1.second` to prevent errors
426
+ where a seemingly innocent change of formatting leads to a change in the code behavior.
465
427
 
428
+ Before:
429
+ ```ruby
430
+ +1.second.class
431
+ # => ActiveSupport::Duration
432
+ (+ 1.second).class
433
+ # => Integer
434
+ ```
466
435
 
467
- ## Rails 6.0.0.beta1 (January 18, 2019) ##
436
+ After:
437
+ ```ruby
438
+ +1.second.class
439
+ # => ActiveSupport::Duration
440
+ (+ 1.second).class
441
+ # => ActiveSupport::Duration
442
+ ```
468
443
 
469
- * Remove deprecated `Module#reachable?` method.
444
+ Fixes #39079.
470
445
 
471
- *Rafael Mendonça França*
446
+ *Roman Kushnir*
472
447
 
473
- * Remove deprecated `#acronym_regex` method from `Inflections`.
448
+ * Add subsec to `ActiveSupport::TimeWithZone#inspect`.
474
449
 
475
- *Rafael Mendonça França*
450
+ Before:
476
451
 
477
- * Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.
452
+ Time.at(1498099140).in_time_zone.inspect
453
+ # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
454
+ Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
455
+ # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
456
+ Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
457
+ # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
478
458
 
479
- *Keenan Brock*
459
+ After:
480
460
 
481
- * Preserve key order passed to `ActiveSupport::CacheStore#fetch_multi`.
461
+ Time.at(1498099140).in_time_zone.inspect
462
+ # => "Thu, 22 Jun 2017 02:39:00.000000000 UTC +00:00"
463
+ Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
464
+ # => "Thu, 22 Jun 2017 02:39:00.123456780 UTC +00:00"
465
+ Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
466
+ # => "Thu, 22 Jun 2017 02:39:00.333333333 UTC +00:00"
482
467
 
483
- `fetch_multi(*names)` now returns its results in the same order as the `*names` requested, rather than returning cache hits followed by cache misses.
468
+ *akinomaeni*
484
469
 
485
- *Gannon McGibbon*
470
+ * Calling `ActiveSupport::TaggedLogging#tagged` without a block now returns a tagged logger.
486
471
 
487
- * If the same block is `included` multiple times for a Concern, an exception is no longer raised.
472
+ ```ruby
473
+ logger.tagged("BCX").info("Funky time!") # => [BCX] Funky time!
474
+ ```
488
475
 
489
- *Mark J. Titorenko*, *Vlad Bokov*
476
+ *Eugene Kenny*
490
477
 
491
- * Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
492
- would not act as alias for `#symbolize_keys`.
478
+ * Align `Range#cover?` extension behavior with Ruby behavior for backwards ranges.
493
479
 
494
- *Nick Weiland*
480
+ `(1..10).cover?(5..3)` now returns `false`, as it does in plain Ruby.
495
481
 
496
- * Improve the logic that detects non-autoloaded constants.
482
+ Also update `#include?` and `#===` behavior to match.
497
483
 
498
- *Jan Habermann*, *Xavier Noria*
484
+ *Michael Groeneman*
499
485
 
500
- * Deprecate `ActiveSupport::Multibyte::Unicode#pack_graphemes(array)` and `ActiveSupport::Multibyte::Unicode#unpack_graphemes(string)`
501
- in favor of `array.flatten.pack("U*")` and `string.scan(/\X/).map(&:codepoints)`, respectively.
486
+ * Update to TZInfo v2.0.0.
502
487
 
503
- *Francesco Rodríguez*
488
+ This changes the output of `ActiveSupport::TimeZone.utc_to_local`, but
489
+ can be controlled with the
490
+ `ActiveSupport.utc_to_local_returns_utc_offset_times` config.
504
491
 
505
- * Deprecate `ActiveSupport::Multibyte::Chars.consumes?` in favor of `String#is_utf8?`.
492
+ New Rails 6.1 apps have it enabled by default, existing apps can upgrade
493
+ via the config in config/initializers/new_framework_defaults_6_1.rb
506
494
 
507
- *Francesco Rodríguez*
495
+ See the `utc_to_local_returns_utc_offset_times` documentation for details.
508
496
 
509
- * Fix duration being rounded to a full second.
510
- ```
511
- time = DateTime.parse("2018-1-1")
512
- time += 0.51.seconds
513
- ```
514
- Will now correctly add 0.51 second and not 1 full second.
497
+ *Phil Ross*, *Jared Beck*
515
498
 
516
- *Edouard Chin*
499
+ * Add Date and Time `#yesterday?` and `#tomorrow?` alongside `#today?`.
517
500
 
518
- * Deprecate `ActiveSupport::Multibyte::Unicode#normalize` and `ActiveSupport::Multibyte::Chars#normalize`
519
- in favor of `String#unicode_normalize`
501
+ Aliased to `#prev_day?` and `#next_day?` to match the existing `#prev/next_day` methods.
520
502
 
521
- *Francesco Rodríguez*
503
+ *Jatin Dhankhar*
522
504
 
523
- * Deprecate `ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase` in favor of
524
- `String#downcase/upcase/swapcase`.
505
+ * Add `Enumerable#pick` to complement `ActiveRecord::Relation#pick`.
525
506
 
526
- *Francesco Rodríguez*
507
+ *Eugene Kenny*
527
508
 
528
- * Add `ActiveSupport::ParameterFilter`.
509
+ * [Breaking change] `ActiveSupport::Callbacks#halted_callback_hook` now receive a 2nd argument:
529
510
 
530
- *Yoshiyuki Kinjo*
511
+ `ActiveSupport::Callbacks#halted_callback_hook` now receive the name of the callback
512
+ being halted as second argument.
513
+ This change will allow you to differentiate which callbacks halted the chain
514
+ and act accordingly.
531
515
 
532
- * Rename `Module#parent`, `Module#parents`, and `Module#parent_name` to
533
- `module_parent`, `module_parents`, and `module_parent_name`.
516
+ ```ruby
517
+ class Book < ApplicationRecord
518
+ before_save { throw(:abort) }
519
+ before_create { throw(:abort) }
534
520
 
535
- *Gannon McGibbon*
521
+ def halted_callback_hook(filter, callback_name)
522
+ Rails.logger.info("Book couldn't be #{callback_name}d")
523
+ end
536
524
 
537
- * Deprecate the use of `LoggerSilence` in favor of `ActiveSupport::LoggerSilence`
525
+ Book.create # => "Book couldn't be created"
526
+ book.save # => "Book couldn't be saved"
527
+ end
528
+ ```
538
529
 
539
530
  *Edouard Chin*
540
531
 
541
- * Deprecate using negative limits in `String#first` and `String#last`.
532
+ * Support `prepend` with `ActiveSupport::Concern`.
542
533
 
543
- *Gannon McGibbon*, *Eric Turner*
534
+ Allows a module with `extend ActiveSupport::Concern` to be prepended.
544
535
 
545
- * Fix bug where `#without` for `ActiveSupport::HashWithIndifferentAccess` would fail
546
- with symbol arguments
536
+ module Imposter
537
+ extend ActiveSupport::Concern
547
538
 
548
- *Abraham Chan*
549
-
550
- * Treat `#delete_prefix`, `#delete_suffix` and `#unicode_normalize` results as non-`html_safe`.
551
- Ensure safety of arguments for `#insert`, `#[]=` and `#replace` calls on `html_safe` Strings.
552
-
553
- *Janosch Müller*
554
-
555
- * Changed `ActiveSupport::TaggedLogging.new` to return a new logger instance instead
556
- of mutating the one received as parameter.
557
-
558
- *Thierry Joyal*
539
+ # Same as `included`, except only run when prepended.
540
+ prepended do
541
+ end
542
+ end
559
543
 
560
- * Define `unfreeze_time` as an alias of `travel_back` in `ActiveSupport::Testing::TimeHelpers`.
544
+ class Person
545
+ prepend Imposter
546
+ end
561
547
 
562
- The alias is provided for symmetry with `freeze_time`.
548
+ Class methods are prepended to the base class, concerning is also
549
+ updated: `concerning :Imposter, prepend: true do`.
563
550
 
564
- *Ryan Davidson*
551
+ *Jason Karns*, *Elia Schito*
565
552
 
566
- * Add support for tracing constant autoloads. Just throw
553
+ * Deprecate using `Range#include?` method to check the inclusion of a value
554
+ in a date time range. It is recommended to use `Range#cover?` method
555
+ instead of `Range#include?` to check the inclusion of a value
556
+ in a date time range.
567
557
 
568
- ActiveSupport::Dependencies.logger = Rails.logger
569
- ActiveSupport::Dependencies.verbose = true
558
+ *Vishal Telangre*
570
559
 
571
- in an initializer.
560
+ * Support added for a `round_mode` parameter, in all number helpers. (See: `BigDecimal::mode`.)
572
561
 
573
- *Xavier Noria*
574
-
575
- * Maintain `html_safe?` on html_safe strings when sliced.
562
+ ```ruby
563
+ number_to_currency(1234567890.50, precision: 0, round_mode: :half_down) # => "$1,234,567,890"
564
+ number_to_percentage(302.24398923423, precision: 5, round_mode: :down) # => "302.24398%"
565
+ number_to_rounded(389.32314, precision: 0, round_mode: :ceil) # => "390"
566
+ number_to_human_size(483989, precision: 2, round_mode: :up) # => "480 KB"
567
+ number_to_human(489939, precision: 2, round_mode: :floor) # => "480 Thousand"
576
568
 
577
- string = "<div>test</div>".html_safe
578
- string[-1..1].html_safe? # => true
569
+ 485000.to_s(:human, precision: 2, round_mode: :half_even) # => "480 Thousand"
570
+ ```
579
571
 
580
- *Elom Gomez*, *Yumin Wong*
572
+ *Tom Lord*
581
573
 
582
- * Add `Array#extract!`.
574
+ * `Array#to_sentence` no longer returns a frozen string.
583
575
 
584
- The method removes and returns the elements for which the block returns a true value.
585
- If no block is given, an Enumerator is returned instead.
576
+ Before:
586
577
 
587
- numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
588
- odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
589
- numbers # => [0, 2, 4, 6, 8]
578
+ ['one', 'two'].to_sentence.frozen?
579
+ # => true
590
580
 
591
- *bogdanvlviv*
581
+ After:
592
582
 
593
- * Support not to cache `nil` for `ActiveSupport::Cache#fetch`.
583
+ ['one', 'two'].to_sentence.frozen?
584
+ # => false
594
585
 
595
- cache.fetch('bar', skip_nil: true) { nil }
596
- cache.exist?('bar') # => false
586
+ *Nicolas Dular*
597
587
 
598
- *Martin Hong*
588
+ * 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.
589
+ This keeps the parser and serializer on the same page.
599
590
 
600
- * Add "event object" support to the notification system.
601
- Before this change, end users were forced to create hand made artisanal
602
- event objects on their own, like this:
591
+ ```ruby
592
+ duration = ActiveSupport::Duration.build(1000000)
593
+ # 1 week, 4 days, 13 hours, 46 minutes, and 40.0 seconds
603
594
 
604
- ActiveSupport::Notifications.subscribe('wait') do |*args|
605
- @event = ActiveSupport::Notifications::Event.new(*args)
606
- end
595
+ duration_iso = duration.iso8601
596
+ # P11DT13H46M40S
607
597
 
608
- ActiveSupport::Notifications.instrument('wait') do
609
- sleep 1
610
- end
598
+ ActiveSupport::Duration.parse(duration_iso)
599
+ # 11 days, 13 hours, 46 minutes, and 40 seconds
611
600
 
612
- @event.duration # => 1000.138
601
+ duration = ActiveSupport::Duration.build(604800)
602
+ # 1 week
613
603
 
614
- After this change, if the block passed to `subscribe` only takes one
615
- parameter, the framework will yield an event object to the block. Now
616
- end users are no longer required to make their own:
604
+ duration_iso = duration.iso8601
605
+ # P1W
617
606
 
618
- ActiveSupport::Notifications.subscribe('wait') do |event|
619
- @event = event
620
- end
607
+ ActiveSupport::Duration.parse(duration_iso)
608
+ # 1 week
609
+ ```
621
610
 
622
- ActiveSupport::Notifications.instrument('wait') do
623
- sleep 1
624
- end
611
+ *Abhishek Sarkar*
625
612
 
626
- p @event.allocations # => 7
627
- p @event.cpu_time # => 0.256
628
- p @event.idle_time # => 1003.2399
613
+ * Add block support to `ActiveSupport::Testing::TimeHelpers#travel_back`.
629
614
 
630
- Now you can enjoy event objects without making them yourself. Neat!
615
+ *Tim Masliuchenko*
631
616
 
632
- *Aaron "t.lo" Patterson*
617
+ * Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when
618
+ `ActiveSupport.parse_json_times = true`.
633
619
 
634
- * Add cpu_time, idle_time, and allocations to Event.
620
+ *Christian Gregg*
635
621
 
636
- *Eileen M. Uchitelle*, *Aaron Patterson*
622
+ * Support symbolic links for `content_path` in `ActiveSupport::EncryptedFile`.
637
623
 
638
- * RedisCacheStore: support key expiry in increment/decrement.
624
+ *Takumi Shotoku*
639
625
 
640
- Pass `:expires_in` to `#increment` and `#decrement` to set a Redis EXPIRE on the key.
626
+ * Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
627
+ and endless range targets.
641
628
 
642
- If the key is already set to expire, RedisCacheStore won't extend its expiry.
629
+ *Allen Hsu*, *Andrew Hodgkinson*
643
630
 
644
- Rails.cache.increment("some_key", 1, expires_in: 2.minutes)
631
+ * Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
645
632
 
646
- *Jason Lee*
633
+ *Iain Beeston*
647
634
 
648
- * Allow `Range#===` and `Range#cover?` on Range.
635
+ * Prevent `ActiveSupport::Duration.build(value)` from creating instances of
636
+ `ActiveSupport::Duration` unless `value` is of type `Numeric`.
649
637
 
650
- `Range#cover?` can now accept a range argument like `Range#include?` and
651
- `Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved
652
- into a new file, with these two methods.
638
+ Addresses the errant set of behaviours described in #37012 where
639
+ `ActiveSupport::Duration` comparisons would fail confusingly
640
+ or return unexpected results when comparing durations built from instances of `String`.
653
641
 
654
- *Requiring active_support/core_ext/range/include_range is now deprecated.*
655
- *Use `require "active_support/core_ext/range/compare_range"` instead.*
642
+ Before:
656
643
 
657
- *utilum*
644
+ small_duration_from_string = ActiveSupport::Duration.build('9')
645
+ large_duration_from_string = ActiveSupport::Duration.build('100000000000000')
646
+ small_duration_from_int = ActiveSupport::Duration.build(9)
658
647
 
659
- * Add `index_with` to Enumerable.
648
+ large_duration_from_string > small_duration_from_string
649
+ # => false
660
650
 
661
- Allows creating a hash from an enumerable with the value from a passed block
662
- or a default argument.
651
+ small_duration_from_string == small_duration_from_int
652
+ # => false
663
653
 
664
- %i( title body ).index_with { |attr| post.public_send(attr) }
665
- # => { title: "hey", body: "what's up?" }
654
+ small_duration_from_int < large_duration_from_string
655
+ # => ArgumentError (comparison of ActiveSupport::Duration::Scalar with ActiveSupport::Duration failed)
666
656
 
667
- %i( title body ).index_with(nil)
668
- # => { title: nil, body: nil }
657
+ large_duration_from_string > small_duration_from_int
658
+ # => ArgumentError (comparison of String with ActiveSupport::Duration failed)
669
659
 
670
- Closely linked with `index_by`, which creates a hash where the keys are extracted from a block.
660
+ After:
671
661
 
672
- *Kasper Timm Hansen*
662
+ small_duration_from_string = ActiveSupport::Duration.build('9')
663
+ # => TypeError (can't build an ActiveSupport::Duration from a String)
673
664
 
674
- * Fix bug where `ActiveSupport::TimeZone.all` would fail when tzinfo data for
675
- any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
665
+ *Alexei Emam*
676
666
 
677
- *Dominik Sander*
667
+ * Add `ActiveSupport::Cache::Store#delete_multi` method to delete multiple keys from the cache store.
678
668
 
679
- * Redis cache store: `delete_matched` no longer blocks the Redis server.
680
- (Switches from evaled Lua to a batched SCAN + DEL loop.)
669
+ *Peter Zhu*
681
670
 
682
- *Gleb Mazovetskiy*
671
+ * Support multiple arguments in `HashWithIndifferentAccess` for `merge` and `update` methods, to
672
+ follow Ruby 2.6 addition.
683
673
 
684
- * Fix bug where `ActiveSupport::Cache` will massively inflate the storage
685
- size when compression is enabled (which is true by default). This patch
686
- does not attempt to repair existing data: please manually flush the cache
687
- to clear out the problematic entries.
674
+ *Wojciech Wnętrzak*
688
675
 
689
- *Godfrey Chan*
676
+ * Allow initializing `thread_mattr_*` attributes via `:default` option.
690
677
 
691
- * Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
678
+ class Scraper
679
+ thread_mattr_reader :client, default: Api::Client.new
680
+ end
692
681
 
693
- URI.unescape("\xe3\x83\x90") # => "バ"
694
- URI.unescape("%E3%83%90") # => "バ"
695
- URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError
682
+ *Guilherme Mansur*
696
683
 
697
- *Ashe Connor*, *Aaron Patterson*
684
+ * Add `compact_blank` for those times when you want to remove #blank? values from
685
+ an Enumerable (also `compact_blank!` on Hash, Array, ActionController::Parameters).
698
686
 
699
- * Add `before?` and `after?` methods to `Date`, `DateTime`,
700
- `Time`, and `TimeWithZone`.
687
+ *Dana Sherson*
701
688
 
702
- *Nick Holden*
689
+ * Make ActiveSupport::Logger Fiber-safe.
703
690
 
704
- * `ActiveSupport::Inflector#ordinal` and `ActiveSupport::Inflector#ordinalize` now support
705
- translations through I18n.
691
+ Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
692
+ to make log level local to Ruby Fibers in addition to Threads.
706
693
 
707
- # locale/fr.rb
694
+ Example:
708
695
 
709
- {
710
- fr: {
711
- number: {
712
- nth: {
713
- ordinals: lambda do |_key, number:, **_options|
714
- if number.to_i.abs == 1
715
- 'er'
716
- else
717
- 'e'
718
- end
719
- end,
696
+ logger = ActiveSupport::Logger.new(STDOUT)
697
+ logger.level = 1
698
+ puts "Main is debug? #{logger.debug?}"
720
699
 
721
- ordinalized: lambda do |_key, number:, **_options|
722
- "#{number}#{ActiveSupport::Inflector.ordinal(number)}"
723
- end
724
- }
725
- }
726
- }
727
- }
700
+ Fiber.new {
701
+ logger.local_level = 0
702
+ puts "Thread is debug? #{logger.debug?}"
703
+ }.resume
728
704
 
705
+ puts "Main is debug? #{logger.debug?}"
729
706
 
730
- *Christian Blais*
707
+ Before:
731
708
 
732
- * Add `:private` option to ActiveSupport's `Module#delegate`
733
- in order to delegate methods as private:
709
+ Main is debug? false
710
+ Thread is debug? true
711
+ Main is debug? true
734
712
 
735
- class User < ActiveRecord::Base
736
- has_one :profile
737
- delegate :date_of_birth, to: :profile, private: true
713
+ After:
738
714
 
739
- def age
740
- Date.today.year - date_of_birth.year
741
- end
742
- end
715
+ Main is debug? false
716
+ Thread is debug? true
717
+ Main is debug? false
743
718
 
744
- # User.new.age # => 29
745
- # User.new.date_of_birth
746
- # => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>
719
+ Fixes #36752.
747
720
 
748
- *Tomas Valent*
721
+ *Alexander Varnin*
749
722
 
750
- * `String#truncate_bytes` to truncate a string to a maximum bytesize without
751
- breaking multibyte characters or grapheme clusters like 👩‍👩‍👦‍👦.
723
+ * Allow the `on_rotation` proc used when decrypting/verifying a message to be
724
+ passed at the constructor level.
752
725
 
753
- *Jeremy Daer*
726
+ Before:
754
727
 
755
- * `String#strip_heredoc` preserves frozenness.
728
+ crypt = ActiveSupport::MessageEncryptor.new('long_secret')
729
+ crypt.decrypt_and_verify(encrypted_message, on_rotation: proc { ... })
730
+ crypt.decrypt_and_verify(another_encrypted_message, on_rotation: proc { ... })
756
731
 
757
- "foo".freeze.strip_heredoc.frozen? # => true
732
+ After:
758
733
 
759
- Fixes that frozen string literals would inadvertently become unfrozen:
734
+ crypt = ActiveSupport::MessageEncryptor.new('long_secret', on_rotation: proc { ... })
735
+ crypt.decrypt_and_verify(encrypted_message)
736
+ crypt.decrypt_and_verify(another_encrypted_message)
760
737
 
761
- # frozen_string_literal: true
738
+ *Edouard Chin*
762
739
 
763
- foo = <<-MSG.strip_heredoc
764
- la la la
765
- MSG
740
+ * `delegate_missing_to` would raise a `DelegationError` if the object
741
+ delegated to was `nil`. Now the `allow_nil` option has been added to enable
742
+ the user to specify they want `nil` returned in this case.
766
743
 
767
- foo.frozen? # => false !??
744
+ *Matthew Tanous*
768
745
 
769
- *Jeremy Daer*
746
+ * `truncate` would return the original string if it was too short to be truncated
747
+ and a frozen string if it were long enough to be truncated. Now truncate will
748
+ consistently return an unfrozen string regardless. This behavior is consistent
749
+ with `gsub` and `strip`.
770
750
 
771
- * Rails 6 requires Ruby 2.5.0 or newer.
751
+ Before:
772
752
 
773
- *Jeremy Daer*, *Kasper Timm Hansen*
753
+ 'foobar'.truncate(5).frozen?
754
+ # => true
755
+ 'foobar'.truncate(6).frozen?
756
+ # => false
774
757
 
775
- * Adds parallel testing to Rails.
758
+ After:
776
759
 
777
- Parallelize your test suite with forked processes or threads.
760
+ 'foobar'.truncate(5).frozen?
761
+ # => false
762
+ 'foobar'.truncate(6).frozen?
763
+ # => false
778
764
 
779
- *Eileen M. Uchitelle*, *Aaron Patterson*
765
+ *Jordan Thomas*
780
766
 
781
767
 
782
- Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activesupport/CHANGELOG.md) for previous changes.
768
+ Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activesupport/CHANGELOG.md) for previous changes.