activesupport 6.0.4 → 6.1.0.rc1

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