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