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