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