activesupport 6.1.1 → 7.0.2.3

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 (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +231 -383
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/lib/active_support/actionable_error.rb +1 -1
  6. data/lib/active_support/array_inquirer.rb +0 -2
  7. data/lib/active_support/benchmarkable.rb +2 -2
  8. data/lib/active_support/cache/file_store.rb +16 -10
  9. data/lib/active_support/cache/mem_cache_store.rb +133 -34
  10. data/lib/active_support/cache/memory_store.rb +23 -15
  11. data/lib/active_support/cache/null_store.rb +10 -2
  12. data/lib/active_support/cache/redis_cache_store.rb +42 -67
  13. data/lib/active_support/cache/strategy/local_cache.rb +35 -61
  14. data/lib/active_support/cache.rb +196 -46
  15. data/lib/active_support/callbacks.rb +180 -81
  16. data/lib/active_support/code_generator.rb +65 -0
  17. data/lib/active_support/concern.rb +5 -5
  18. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
  19. data/lib/active_support/concurrency/share_lock.rb +2 -2
  20. data/lib/active_support/configurable.rb +6 -3
  21. data/lib/active_support/configuration_file.rb +7 -2
  22. data/lib/active_support/core_ext/array/access.rb +1 -5
  23. data/lib/active_support/core_ext/array/conversions.rb +13 -11
  24. data/lib/active_support/core_ext/array/deprecated_conversions.rb +25 -0
  25. data/lib/active_support/core_ext/array/grouping.rb +6 -6
  26. data/lib/active_support/core_ext/array.rb +1 -0
  27. data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
  28. data/lib/active_support/core_ext/class/subclasses.rb +25 -17
  29. data/lib/active_support/core_ext/date/blank.rb +1 -1
  30. data/lib/active_support/core_ext/date/calculations.rb +4 -4
  31. data/lib/active_support/core_ext/date/conversions.rb +11 -11
  32. data/lib/active_support/core_ext/date/deprecated_conversions.rb +26 -0
  33. data/lib/active_support/core_ext/date.rb +1 -0
  34. data/lib/active_support/core_ext/date_and_time/compatibility.rb +1 -1
  35. data/lib/active_support/core_ext/date_time/blank.rb +1 -1
  36. data/lib/active_support/core_ext/date_time/conversions.rb +13 -13
  37. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +22 -0
  38. data/lib/active_support/core_ext/date_time.rb +1 -0
  39. data/lib/active_support/core_ext/digest/uuid.rb +39 -13
  40. data/lib/active_support/core_ext/enumerable.rb +78 -26
  41. data/lib/active_support/core_ext/file/atomic.rb +3 -1
  42. data/lib/active_support/core_ext/hash/keys.rb +1 -1
  43. data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
  44. data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
  45. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +19 -10
  46. data/lib/active_support/core_ext/module/delegation.rb +2 -8
  47. data/lib/active_support/core_ext/name_error.rb +2 -8
  48. data/lib/active_support/core_ext/numeric/conversions.rb +79 -76
  49. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +60 -0
  50. data/lib/active_support/core_ext/numeric.rb +1 -0
  51. data/lib/active_support/core_ext/object/acts_like.rb +29 -5
  52. data/lib/active_support/core_ext/object/blank.rb +2 -2
  53. data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
  54. data/lib/active_support/core_ext/object/duplicable.rb +11 -0
  55. data/lib/active_support/core_ext/object/json.rb +29 -24
  56. data/lib/active_support/core_ext/object/to_query.rb +2 -2
  57. data/lib/active_support/core_ext/object/try.rb +20 -20
  58. data/lib/active_support/core_ext/object/with_options.rb +20 -1
  59. data/lib/active_support/core_ext/pathname/existence.rb +21 -0
  60. data/lib/active_support/core_ext/pathname.rb +3 -0
  61. data/lib/active_support/core_ext/range/compare_range.rb +0 -25
  62. data/lib/active_support/core_ext/range/conversions.rb +8 -8
  63. data/lib/active_support/core_ext/range/deprecated_conversions.rb +26 -0
  64. data/lib/active_support/core_ext/range/each.rb +1 -1
  65. data/lib/active_support/core_ext/range/include_time_with_zone.rb +4 -25
  66. data/lib/active_support/core_ext/range.rb +1 -1
  67. data/lib/active_support/core_ext/string/filters.rb +1 -1
  68. data/lib/active_support/core_ext/string/inflections.rb +1 -1
  69. data/lib/active_support/core_ext/string/output_safety.rb +60 -36
  70. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
  71. data/lib/active_support/core_ext/time/calculations.rb +7 -5
  72. data/lib/active_support/core_ext/time/conversions.rb +13 -12
  73. data/lib/active_support/core_ext/time/deprecated_conversions.rb +22 -0
  74. data/lib/active_support/core_ext/time/zones.rb +4 -19
  75. data/lib/active_support/core_ext/time.rb +1 -0
  76. data/lib/active_support/core_ext/uri.rb +3 -27
  77. data/lib/active_support/core_ext.rb +1 -0
  78. data/lib/active_support/current_attributes.rb +32 -14
  79. data/lib/active_support/dependencies/interlock.rb +10 -18
  80. data/lib/active_support/dependencies/require_dependency.rb +28 -0
  81. data/lib/active_support/dependencies.rb +58 -788
  82. data/lib/active_support/deprecation/behaviors.rb +4 -1
  83. data/lib/active_support/deprecation/method_wrappers.rb +3 -3
  84. data/lib/active_support/deprecation/proxy_wrappers.rb +1 -1
  85. data/lib/active_support/deprecation.rb +1 -1
  86. data/lib/active_support/descendants_tracker.rb +174 -68
  87. data/lib/active_support/digest.rb +5 -3
  88. data/lib/active_support/duration/iso8601_parser.rb +3 -3
  89. data/lib/active_support/duration/iso8601_serializer.rb +9 -1
  90. data/lib/active_support/duration.rb +81 -51
  91. data/lib/active_support/encrypted_configuration.rb +13 -2
  92. data/lib/active_support/encrypted_file.rb +1 -1
  93. data/lib/active_support/environment_inquirer.rb +1 -1
  94. data/lib/active_support/error_reporter.rb +117 -0
  95. data/lib/active_support/evented_file_update_checker.rb +1 -1
  96. data/lib/active_support/execution_context/test_helper.rb +13 -0
  97. data/lib/active_support/execution_context.rb +53 -0
  98. data/lib/active_support/execution_wrapper.rb +43 -21
  99. data/lib/active_support/executor/test_helper.rb +7 -0
  100. data/lib/active_support/fork_tracker.rb +19 -10
  101. data/lib/active_support/gem_version.rb +4 -4
  102. data/lib/active_support/hash_with_indifferent_access.rb +9 -2
  103. data/lib/active_support/html_safe_translation.rb +43 -0
  104. data/lib/active_support/i18n.rb +1 -0
  105. data/lib/active_support/i18n_railtie.rb +1 -1
  106. data/lib/active_support/inflector/inflections.rb +23 -7
  107. data/lib/active_support/inflector/methods.rb +24 -48
  108. data/lib/active_support/isolated_execution_state.rb +64 -0
  109. data/lib/active_support/json/encoding.rb +3 -3
  110. data/lib/active_support/key_generator.rb +18 -1
  111. data/lib/active_support/locale/en.yml +2 -2
  112. data/lib/active_support/log_subscriber.rb +13 -3
  113. data/lib/active_support/logger_thread_safe_level.rb +4 -13
  114. data/lib/active_support/message_encryptor.rb +8 -3
  115. data/lib/active_support/message_verifier.rb +46 -14
  116. data/lib/active_support/messages/metadata.rb +2 -2
  117. data/lib/active_support/multibyte/chars.rb +10 -11
  118. data/lib/active_support/multibyte/unicode.rb +0 -12
  119. data/lib/active_support/multibyte.rb +1 -1
  120. data/lib/active_support/notifications/fanout.rb +91 -65
  121. data/lib/active_support/notifications/instrumenter.rb +32 -15
  122. data/lib/active_support/notifications.rb +16 -22
  123. data/lib/active_support/number_helper/number_converter.rb +1 -3
  124. data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
  125. data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
  126. data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
  127. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
  128. data/lib/active_support/number_helper/number_to_rounded_converter.rb +10 -6
  129. data/lib/active_support/number_helper/rounding_helper.rb +2 -6
  130. data/lib/active_support/number_helper.rb +0 -2
  131. data/lib/active_support/option_merger.rb +8 -16
  132. data/lib/active_support/ordered_hash.rb +1 -1
  133. data/lib/active_support/parameter_filter.rb +6 -1
  134. data/lib/active_support/per_thread_registry.rb +5 -0
  135. data/lib/active_support/railtie.rb +69 -19
  136. data/lib/active_support/reloader.rb +1 -1
  137. data/lib/active_support/rescuable.rb +2 -2
  138. data/lib/active_support/ruby_features.rb +7 -0
  139. data/lib/active_support/secure_compare_rotator.rb +1 -1
  140. data/lib/active_support/security_utils.rb +1 -1
  141. data/lib/active_support/string_inquirer.rb +0 -2
  142. data/lib/active_support/subscriber.rb +7 -18
  143. data/lib/active_support/tagged_logging.rb +2 -2
  144. data/lib/active_support/test_case.rb +9 -21
  145. data/lib/active_support/testing/assertions.rb +35 -5
  146. data/lib/active_support/testing/deprecation.rb +52 -1
  147. data/lib/active_support/testing/isolation.rb +2 -2
  148. data/lib/active_support/testing/method_call_assertions.rb +5 -5
  149. data/lib/active_support/testing/parallelization/server.rb +4 -0
  150. data/lib/active_support/testing/parallelization/worker.rb +3 -0
  151. data/lib/active_support/testing/parallelization.rb +4 -0
  152. data/lib/active_support/testing/parallelize_executor.rb +76 -0
  153. data/lib/active_support/testing/stream.rb +3 -5
  154. data/lib/active_support/testing/tagged_logging.rb +1 -1
  155. data/lib/active_support/testing/time_helpers.rb +13 -2
  156. data/lib/active_support/time_with_zone.rb +55 -14
  157. data/lib/active_support/values/time_zone.rb +31 -10
  158. data/lib/active_support/xml_mini/jdom.rb +1 -1
  159. data/lib/active_support/xml_mini/libxml.rb +5 -5
  160. data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
  161. data/lib/active_support/xml_mini/nokogiri.rb +4 -4
  162. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  163. data/lib/active_support/xml_mini/rexml.rb +1 -1
  164. data/lib/active_support/xml_mini.rb +5 -4
  165. data/lib/active_support.rb +17 -1
  166. metadata +26 -23
  167. data/lib/active_support/core_ext/marshal.rb +0 -26
  168. data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
data/CHANGELOG.md CHANGED
@@ -1,571 +1,419 @@
1
- ## Rails 6.1.1 (January 07, 2021) ##
1
+ ## Rails 7.0.2.3 (March 08, 2022) ##
2
2
 
3
- * Change `IPAddr#to_json` to match the behavior of the json gem returning the string representation
4
- instead of the instance variables of the object.
3
+ * No changes.
5
4
 
6
- Before:
7
5
 
8
- ```ruby
9
- IPAddr.new("127.0.0.1").to_json
10
- # => "{\"addr\":2130706433,\"family\":2,\"mask_addr\":4294967295}"
11
- ```
12
-
13
- After:
6
+ ## Rails 7.0.2.2 (February 11, 2022) ##
14
7
 
15
- ```ruby
16
- IPAddr.new("127.0.0.1").to_json
17
- # => "\"127.0.0.1\""
18
- ```
8
+ * Fix Reloader method signature to work with the new Executor signature
19
9
 
20
10
 
21
- ## Rails 6.1.0 (December 09, 2020) ##
11
+ ## Rails 7.0.2.1 (February 11, 2022) ##
22
12
 
23
- * Ensure `MemoryStore` disables compression by default. Reverts behavior of
24
- `MemoryStore` to its prior rails `5.1` behavior.
13
+ * No changes.
25
14
 
26
- *Max Gurewitz*
27
15
 
28
- * Calling `iso8601` on negative durations retains the negative sign on individual
29
- digits instead of prepending it.
16
+ ## Rails 7.0.2 (February 08, 2022) ##
30
17
 
31
- This change is required so we can interoperate with PostgreSQL, which prefers
32
- negative signs for each component.
18
+ * Fix `ActiveSupport::EncryptedConfiguration` to be compatible with Psych 4
33
19
 
34
- Compatibility with other iso8601 parsers which support leading negatives as well
35
- as negatives per component is still retained.
20
+ *Stephen Sugden*
36
21
 
37
- Before:
22
+ * Improve `File.atomic_write` error handling.
38
23
 
39
- (-1.year - 1.day).iso8601
40
- # => "-P1Y1D"
24
+ *Daniel Pepper*
41
25
 
42
- After:
43
26
 
44
- (-1.year - 1.day).iso8601
45
- # => "P-1Y-1D"
27
+ ## Rails 7.0.1 (January 06, 2022) ##
46
28
 
47
- *Vipul A M*
29
+ * Fix `Class#descendants` and `DescendantsTracker#descendants` compatibility with Ruby 3.1.
48
30
 
49
- * Remove deprecated `ActiveSupport::Notifications::Instrumenter#end=`.
31
+ [The native `Class#descendants` was reverted prior to Ruby 3.1 release](https://bugs.ruby-lang.org/issues/14394#note-33),
32
+ but `Class#subclasses` was kept, breaking the feature detection.
50
33
 
51
- *Rafael Mendonça França*
34
+ *Jean Boussier*
52
35
 
53
- * Deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
54
36
 
55
- *Rafael Mendonça França*
37
+ ## Rails 7.0.0 (December 15, 2021) ##
56
38
 
57
- * Remove deprecated `ActiveSupport::Multibyte::Unicode.pack_graphemes`,
58
- `ActiveSupport::Multibyte::Unicode.unpack_graphemes`,
59
- `ActiveSupport::Multibyte::Unicode.normalize`,
60
- `ActiveSupport::Multibyte::Unicode.downcase`,
61
- `ActiveSupport::Multibyte::Unicode.upcase` and `ActiveSupport::Multibyte::Unicode.swapcase`.
39
+ * Fix `ActiveSupport::Duration.build` to support negative values.
62
40
 
63
- *Rafael Mendonça França*
41
+ The algorithm to collect the `parts` of the `ActiveSupport::Duration`
42
+ ignored the sign of the `value` and accumulated incorrect part values. This
43
+ impacted `ActiveSupport::Duration#sum` (which is dependent on `parts`) but
44
+ not `ActiveSupport::Duration#eql?` (which is dependent on `value`).
64
45
 
65
- * Remove deprecated `ActiveSupport::Multibyte::Chars#consumes?` and `ActiveSupport::Multibyte::Chars#normalize`.
46
+ *Caleb Buxton*, *Braden Staudacher*
66
47
 
67
- *Rafael Mendonça França*
68
48
 
69
- * Remove deprecated file `active_support/core_ext/range/include_range`.
49
+ ## Rails 7.0.0.rc3 (December 14, 2021) ##
70
50
 
71
- *Rafael Mendonça França*
51
+ * No changes.
72
52
 
73
- * Remove deprecated file `active_support/core_ext/hash/transform_values`.
74
53
 
75
- *Rafael Mendonça França*
54
+ ## Rails 7.0.0.rc2 (December 14, 2021) ##
76
55
 
77
- * Remove deprecated file `active_support/core_ext/hash/compact`.
56
+ * No changes.
78
57
 
79
- *Rafael Mendonça França*
58
+ ## Rails 7.0.0.rc1 (December 06, 2021) ##
80
59
 
81
- * Remove deprecated file `active_support/core_ext/array/prepend_and_append`.
60
+ * Deprecate passing a format to `#to_s` in favor of `#to_formatted_s` in `Array`, `Range`, `Date`, `DateTime`, `Time`,
61
+ `BigDecimal`, `Float` and, `Integer`.
82
62
 
83
63
  *Rafael Mendonça França*
84
64
 
85
- * Remove deprecated file `active_support/core_ext/numeric/inquiry`.
86
-
87
- *Rafael Mendonça França*
65
+ * Document `ActiveSupport::Testing::Deprecation`.
88
66
 
89
- * Remove deprecated file `active_support/core_ext/module/reachable`.
67
+ *Sam Bostock & Sam Jordan*
90
68
 
91
- *Rafael Mendonça França*
69
+ * Add `Pathname#existence`.
92
70
 
93
- * Remove deprecated `Module#parent_name`, `Module#parent` and `Module#parents`.
71
+ ```ruby
72
+ Pathname.new("file").existence&.read
73
+ ```
94
74
 
95
- *Rafael Mendonça França*
75
+ *Timo Schilling*
96
76
 
97
- * Remove deprecated `ActiveSupport::LoggerThreadSafeLevel#after_initialize`.
77
+ * Remove deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
98
78
 
99
79
  *Rafael Mendonça França*
100
80
 
101
- * Remove deprecated `LoggerSilence` constant.
81
+ * Remove deprecated support to use `Range#include?` to check the inclusion of a value in
82
+ a date time range is deprecated.
102
83
 
103
84
  *Rafael Mendonça França*
104
85
 
105
- * Remove deprecated fallback to `I18n.default_local` when `config.i18n.fallbacks` is empty.
86
+ * Remove deprecated `URI.parser`.
106
87
 
107
88
  *Rafael Mendonça França*
108
89
 
109
- * Remove entries from local cache on `RedisCacheStore#delete_matched`
90
+ * Remove deprecated `config.active_support.use_sha1_digests`.
110
91
 
111
- Fixes #38627
92
+ *Rafael Mendonça França*
112
93
 
113
- *ojab*
94
+ * Invoking `Object#with_options` without a `&block` argument returns the
95
+ `ActiveSupport::OptionMerger` instance.
114
96
 
115
- * Speed up `ActiveSupport::SecurityUtils.fixed_length_secure_compare` by using
116
- `OpenSSL.fixed_length_secure_compare`, if available.
97
+ *Sean Doyle*
117
98
 
118
- *Nate Matykiewicz*
99
+ * `Rails.application.executor` hooks can now be called around every test
119
100
 
120
- * `ActiveSupport::Cache::MemCacheStore` now checks `ENV["MEMCACHE_SERVERS"]` before falling back to `"localhost:11211"` if configured without any addresses.
101
+ This helps to better simulate request or job local state being reset around tests and prevents state
102
+ leaking from one test to another.
121
103
 
122
- ```ruby
123
- config.cache_store = :mem_cache_store
104
+ However it requires the executor hooks executed in the test environment to be re-entrant.
124
105
 
125
- # is now equivalent to
106
+ To enable this, set `config.active_support.executor_around_test_case = true` (this is the default in Rails 7).
126
107
 
127
- config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
128
-
129
- # instead of
130
-
131
- config.cache_store = :mem_cache_store, "localhost:11211" # ignores ENV["MEMCACHE_SERVERS"]
132
- ```
108
+ *Jean Boussier*
133
109
 
134
- *Sam Bostock*
110
+ * `ActiveSupport::DescendantsTracker` now mostly delegate to `Class#descendants` on Ruby 3.1
135
111
 
136
- * `ActiveSupport::Subscriber#attach_to` now accepts an `inherit_all:` argument. When set to true,
137
- it allows a subscriber to receive events for methods defined in the subscriber's ancestor class(es).
112
+ Ruby now provides a fast `Class#descendants` making `ActiveSupport::DescendantsTracker` mostly useless.
138
113
 
139
- ```ruby
140
- class ActionControllerSubscriber < ActiveSupport::Subscriber
141
- attach_to :action_controller
114
+ As a result the following methods are deprecated:
142
115
 
143
- def start_processing(event)
144
- info "Processing by #{event.payload[:controller]}##{event.payload[:action]} as #{format}"
145
- end
116
+ - `ActiveSupport::DescendantsTracker.direct_descendants`
117
+ - `ActiveSupport::DescendantsTracker#direct_descendants`
146
118
 
147
- def redirect_to(event)
148
- info { "Redirected to #{event.payload[:location]}" }
149
- end
150
- end
119
+ *Jean Boussier*
151
120
 
152
- # We detach ActionControllerSubscriber from the :action_controller namespace so that our CustomActionControllerSubscriber
153
- # can provide its own instrumentation for certain events in the namespace
154
- ActionControllerSubscriber.detach_from(:action_controller)
121
+ * Fix the `Digest::UUID.uuid_from_hash` behavior for namespace IDs that are different from the ones defined on `Digest::UUID`.
155
122
 
156
- class CustomActionControllerSubscriber < ActionControllerSubscriber
157
- attach_to :action_controller, inherit_all: true
123
+ The new behavior will be enabled by setting the
124
+ `config.active_support.use_rfc4122_namespaced_uuids` option to `true`
125
+ and is the default for new apps.
158
126
 
159
- def start_processing(event)
160
- info "A custom response to start_processing events"
161
- end
127
+ The old behavior is the default for upgraded apps and will output a
128
+ deprecation warning every time a value that is different than one of
129
+ the constants defined on the `Digest::UUID` extension is used as the
130
+ namespace ID.
162
131
 
163
- # => CustomActionControllerSubscriber will process events for "start_processing.action_controller" notifications
164
- # using its own #start_processing implementation, while retaining ActionControllerSubscriber's instrumentation
165
- # for "redirect_to.action_controller" notifications
166
- end
167
- ```
132
+ *Alex Robbin*, *Erich Soares Machado*, *Eugene Kenny*
168
133
 
169
- *Adrianna Chang*
134
+ * `ActiveSupport::Inflector::Inflections#clear(:acronyms)` is now supported,
135
+ and `inflector.clear` / `inflector.clear(:all)` also clears acronyms.
170
136
 
171
- * Allow the digest class used to generate non-sensitive digests to be configured with `config.active_support.hash_digest_class`.
137
+ *Alex Ghiculescu*, *Oliver Peate*
172
138
 
173
- `config.active_support.use_sha1_digests` is deprecated in favour of `config.active_support.hash_digest_class = ::Digest::SHA1`.
174
139
 
175
- *Dirkjan Bussink*
140
+ ## Rails 7.0.0.alpha2 (September 15, 2021) ##
176
141
 
177
- * Fix bug to make memcached write_entry expire correctly with unless_exist
142
+ * No changes.
178
143
 
179
- *Jye Lee*
180
144
 
181
- * Add `ActiveSupport::Duration` conversion methods
145
+ ## Rails 7.0.0.alpha1 (September 15, 2021) ##
182
146
 
183
- `in_seconds`, `in_minutes`, `in_hours`, `in_days`, `in_weeks`, `in_months`, and `in_years` return the respective duration covered.
147
+ * `ActiveSupport::Dependencies` no longer installs a `const_missing` hook. Before this, you could push to the autoload paths and have constants autoloaded. This feature, known as the `classic` autoloader, has been removed.
184
148
 
185
- *Jason York*
149
+ *Xavier Noria*
186
150
 
187
- * Fixed issue in `ActiveSupport::Cache::RedisCacheStore` not passing options
188
- to `read_multi` causing `fetch_multi` to not work properly
151
+ * Private internal classes of `ActiveSupport::Dependencies` have been deleted, like `ActiveSupport::Dependencies::Reference`, `ActiveSupport::Dependencies::Blamable`, and others.
189
152
 
190
- *Rajesh Sharma*
153
+ *Xavier Noria*
191
154
 
192
- * Fixed issue in `ActiveSupport::Cache::MemCacheStore` which caused duplicate compression,
193
- and caused the provided `compression_threshold` to not be respected.
155
+ * The private API of `ActiveSupport::Dependencies` has been deleted. That includes methods like `hook!`, `unhook!`, `depend_on`, `require_or_load`, `mechanism`, and many others.
194
156
 
195
- *Max Gurewitz*
157
+ *Xavier Noria*
196
158
 
197
- * Prevent `RedisCacheStore` and `MemCacheStore` from performing compression
198
- when reading entries written with `raw: true`.
159
+ * Improves the performance of `ActiveSupport::NumberHelper` formatters by avoiding the use of exceptions as flow control.
199
160
 
200
- *Max Gurewitz*
161
+ *Mike Dalessio*
201
162
 
202
- * `URI.parser` is deprecated and will be removed in Rails 6.2. Use
203
- `URI::DEFAULT_PARSER` instead.
163
+ * Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception`
204
164
 
205
- *Jean Boussier*
165
+ Previously, if you provided a `error_handler` to `redis_cache_store`, any errors thrown by
166
+ the error handler would be rescued and logged only. Removed the `rescue` clause from `handle_exception`
167
+ to allow these to be thrown.
206
168
 
207
- * `require_dependency` has been documented to be _obsolete_ in `:zeitwerk`
208
- mode. The method is not deprecated as such (yet), but applications are
209
- encouraged to not use it.
169
+ *Nicholas A. Stuart*
210
170
 
211
- In `:zeitwerk` mode, semantics match Ruby's and you do not need to be
212
- defensive with load order. Just refer to classes and modules normally. If
213
- the constant name is dynamic, camelize if needed, and constantize.
171
+ * Allow entirely opting out of deprecation warnings.
214
172
 
215
- *Xavier Noria*
173
+ Previously if you did `app.config.active_support.deprecation = :silence`, some work would
174
+ still be done on each call to `ActiveSupport::Deprecation.warn`. In very hot paths, this could
175
+ cause performance issues.
216
176
 
217
- * Add 3rd person aliases of `Symbol#start_with?` and `Symbol#end_with?`.
177
+ Now, you can make `ActiveSupport::Deprecation.warn` a no-op:
218
178
 
219
179
  ```ruby
220
- :foo.starts_with?("f") # => true
221
- :foo.ends_with?("o") # => true
180
+ config.active_support.report_deprecations = false
222
181
  ```
223
182
 
224
- *Ryuta Kamizono*
225
-
226
- * Add override of unary plus for `ActiveSupport::Duration`.
227
-
228
- `+ 1.second` is now identical to `+1.second` to prevent errors
229
- where a seemingly innocent change of formatting leads to a change in the code behavior.
183
+ This is the default in production for new apps. It is the equivalent to:
230
184
 
231
- Before:
232
185
  ```ruby
233
- +1.second.class
234
- # => ActiveSupport::Duration
235
- (+ 1.second).class
236
- # => Integer
186
+ config.active_support.deprecation = :silence
187
+ config.active_support.disallowed_deprecation = :silence
237
188
  ```
238
189
 
239
- After:
240
- ```ruby
241
- +1.second.class
242
- # => ActiveSupport::Duration
243
- (+ 1.second).class
244
- # => ActiveSupport::Duration
245
- ```
246
-
247
- Fixes #39079.
248
-
249
- *Roman Kushnir*
250
-
251
- * Add subsec to `ActiveSupport::TimeWithZone#inspect`.
190
+ but will take a more optimised code path.
252
191
 
253
- Before:
192
+ *Alex Ghiculescu*
254
193
 
255
- Time.at(1498099140).in_time_zone.inspect
256
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
257
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
258
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
259
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
260
- # => "Thu, 22 Jun 2017 02:39:00 UTC +00:00"
194
+ * Faster tests by parallelizing only when overhead is justified by the number
195
+ of them.
261
196
 
262
- After:
197
+ Running tests in parallel adds overhead in terms of database
198
+ setup and fixture loading. Now, Rails will only parallelize test executions when
199
+ there are enough tests to make it worth it.
263
200
 
264
- Time.at(1498099140).in_time_zone.inspect
265
- # => "Thu, 22 Jun 2017 02:39:00.000000000 UTC +00:00"
266
- Time.at(1498099140, 123456780, :nsec).in_time_zone.inspect
267
- # => "Thu, 22 Jun 2017 02:39:00.123456780 UTC +00:00"
268
- Time.at(1498099140 + Rational("1/3")).in_time_zone.inspect
269
- # => "Thu, 22 Jun 2017 02:39:00.333333333 UTC +00:00"
270
-
271
- *akinomaeni*
272
-
273
- * Calling `ActiveSupport::TaggedLogging#tagged` without a block now returns a tagged logger.
201
+ This threshold is 50 by default, and is configurable via config setting in
202
+ your test.rb:
274
203
 
275
204
  ```ruby
276
- logger.tagged("BCX").info("Funky time!") # => [BCX] Funky time!
205
+ config.active_support.test_parallelization_threshold = 100
277
206
  ```
278
207
 
279
- *Eugene Kenny*
280
-
281
- * Align `Range#cover?` extension behavior with Ruby behavior for backwards ranges.
282
-
283
- `(1..10).cover?(5..3)` now returns `false`, as it does in plain Ruby.
284
-
285
- Also update `#include?` and `#===` behavior to match.
286
-
287
- *Michael Groeneman*
288
-
289
- * Update to TZInfo v2.0.0.
290
-
291
- This changes the output of `ActiveSupport::TimeZone.utc_to_local`, but
292
- can be controlled with the
293
- `ActiveSupport.utc_to_local_returns_utc_offset_times` config.
294
-
295
- New Rails 6.1 apps have it enabled by default, existing apps can upgrade
296
- via the config in config/initializers/new_framework_defaults_6_1.rb
297
-
298
- See the `utc_to_local_returns_utc_offset_times` documentation for details.
299
-
300
- *Phil Ross*, *Jared Beck*
301
-
302
- * Add Date and Time `#yesterday?` and `#tomorrow?` alongside `#today?`.
208
+ It's also configurable at the test case level:
303
209
 
304
- Aliased to `#prev_day?` and `#next_day?` to match the existing `#prev/next_day` methods.
305
-
306
- *Jatin Dhankhar*
210
+ ```ruby
211
+ class ActiveSupport::TestCase
212
+ parallelize threshold: 100
213
+ end
214
+ ```
307
215
 
308
- * Add `Enumerable#pick` to complement `ActiveRecord::Relation#pick`.
216
+ *Jorge Manrubia*
309
217
 
310
- *Eugene Kenny*
218
+ * OpenSSL constants are now used for Digest computations.
311
219
 
312
- * [Breaking change] `ActiveSupport::Callbacks#halted_callback_hook` now receive a 2nd argument:
220
+ *Dirkjan Bussink*
313
221
 
314
- `ActiveSupport::Callbacks#halted_callback_hook` now receive the name of the callback
315
- being halted as second argument.
316
- This change will allow you to differentiate which callbacks halted the chain
317
- and act accordingly.
222
+ * `TimeZone.iso8601` now accepts valid ordinal values similar to Ruby's `Date._iso8601` method.
223
+ A valid ordinal value will be converted to an instance of `TimeWithZone` using the `:year`
224
+ and `:yday` fragments returned from `Date._iso8601`.
318
225
 
319
226
  ```ruby
320
- class Book < ApplicationRecord
321
- before_save { throw(:abort) }
322
- before_create { throw(:abort) }
323
-
324
- def halted_callback_hook(filter, callback_name)
325
- Rails.logger.info("Book couldn't be #{callback_name}d")
326
- end
327
-
328
- Book.create # => "Book couldn't be created"
329
- book.save # => "Book couldn't be saved"
330
- end
227
+ twz = ActiveSupport::TimeZone["Eastern Time (US & Canada)"].iso8601("21087")
228
+ twz.to_a[0, 6] == [0, 0, 0, 28, 03, 2021]
331
229
  ```
332
230
 
333
- *Edouard Chin*
334
-
335
- * Support `prepend` with `ActiveSupport::Concern`.
231
+ *Steve Laing*
336
232
 
337
- Allows a module with `extend ActiveSupport::Concern` to be prepended.
233
+ * `Time#change` and methods that call it (e.g. `Time#advance`) will now
234
+ return a `Time` with the timezone argument provided, if the caller was
235
+ initialized with a timezone argument.
338
236
 
339
- module Imposter
340
- extend ActiveSupport::Concern
237
+ Fixes [#42467](https://github.com/rails/rails/issues/42467).
341
238
 
342
- # Same as `included`, except only run when prepended.
343
- prepended do
344
- end
345
- end
239
+ *Alex Ghiculescu*
346
240
 
347
- class Person
348
- prepend Imposter
349
- end
241
+ * Allow serializing any module or class to JSON by name.
350
242
 
351
- Class methods are prepended to the base class, concerning is also
352
- updated: `concerning :Imposter, prepend: true do`.
243
+ *Tyler Rick*, *Zachary Scott*
353
244
 
354
- *Jason Karns*, *Elia Schito*
245
+ * Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the
246
+ `RAILS_MASTER_KEY` environment variable is blank (e.g. `""`).
355
247
 
356
- * Deprecate using `Range#include?` method to check the inclusion of a value
357
- in a date time range. It is recommended to use `Range#cover?` method
358
- instead of `Range#include?` to check the inclusion of a value
359
- in a date time range.
248
+ *Sunny Ripert*
360
249
 
361
- *Vishal Telangre*
250
+ * The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`.
362
251
 
363
- * Support added for a `round_mode` parameter, in all number helpers. (See: `BigDecimal::mode`.)
252
+ It permits asserting on the initial value that is expected not to change.
364
253
 
365
254
  ```ruby
366
- number_to_currency(1234567890.50, precision: 0, round_mode: :half_down) # => "$1,234,567,890"
367
- number_to_percentage(302.24398923423, precision: 5, round_mode: :down) # => "302.24398%"
368
- number_to_rounded(389.32314, precision: 0, round_mode: :ceil) # => "390"
369
- number_to_human_size(483989, precision: 2, round_mode: :up) # => "480 KB"
370
- number_to_human(489939, precision: 2, round_mode: :floor) # => "480 Thousand"
371
-
372
- 485000.to_s(:human, precision: 2, round_mode: :half_even) # => "480 Thousand"
255
+ assert_no_changes -> { Status.all_good? }, from: true do
256
+ post :create, params: { status: { ok: true } }
257
+ end
373
258
  ```
374
259
 
375
- *Tom Lord*
376
-
377
- * `Array#to_sentence` no longer returns a frozen string.
378
-
379
- Before:
260
+ *George Claghorn*
380
261
 
381
- ['one', 'two'].to_sentence.frozen?
382
- # => true
262
+ * Deprecate `ActiveSupport::SafeBuffer`'s incorrect implicit conversion of objects into string.
383
263
 
384
- After:
264
+ Except for a few methods like `String#%`, objects must implement `#to_str`
265
+ to be implicitly converted to a String in string operations. In some
266
+ circumstances `ActiveSupport::SafeBuffer` was incorrectly calling the
267
+ explicit conversion method (`#to_s`) on them. This behavior is now
268
+ deprecated.
385
269
 
386
- ['one', 'two'].to_sentence.frozen?
387
- # => false
388
-
389
- *Nicolas Dular*
390
-
391
- * 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.
392
- This keeps the parser and serializer on the same page.
393
-
394
- ```ruby
395
- duration = ActiveSupport::Duration.build(1000000)
396
- # 1 week, 4 days, 13 hours, 46 minutes, and 40.0 seconds
397
-
398
- duration_iso = duration.iso8601
399
- # P11DT13H46M40S
270
+ *Jean Boussier*
400
271
 
401
- ActiveSupport::Duration.parse(duration_iso)
402
- # 11 days, 13 hours, 46 minutes, and 40 seconds
272
+ * Allow nested access to keys on `Rails.application.credentials`.
403
273
 
404
- duration = ActiveSupport::Duration.build(604800)
405
- # 1 week
274
+ Previously only top level keys in `credentials.yml.enc` could be accessed with method calls. Now any key can.
406
275
 
407
- duration_iso = duration.iso8601
408
- # P1W
276
+ For example, given these secrets:
409
277
 
410
- ActiveSupport::Duration.parse(duration_iso)
411
- # 1 week
278
+ ```yml
279
+ aws:
280
+ access_key_id: 123
281
+ secret_access_key: 345
412
282
  ```
413
283
 
414
- *Abhishek Sarkar*
284
+ `Rails.application.credentials.aws.access_key_id` will now return the same thing as
285
+ `Rails.application.credentials.aws[:access_key_id]`.
415
286
 
416
- * Add block support to `ActiveSupport::Testing::TimeHelpers#travel_back`.
287
+ *Alex Ghiculescu*
417
288
 
418
- *Tim Masliuchenko*
289
+ * Added a faster and more compact `ActiveSupport::Cache` serialization format.
419
290
 
420
- * Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when
421
- `ActiveSupport.parse_json_times = true`.
291
+ It can be enabled with `config.active_support.cache_format_version = 7.0` or
292
+ `config.load_defaults 7.0`. Regardless of the configuration Active Support
293
+ 7.0 can read cache entries serialized by Active Support 6.1 which allows to
294
+ upgrade without invalidating the cache. However Rails 6.1 can't read the
295
+ new format, so all readers must be upgraded before the new format is enabled.
422
296
 
423
- *Christian Gregg*
424
-
425
- * Support symbolic links for `content_path` in `ActiveSupport::EncryptedFile`.
426
-
427
- *Takumi Shotoku*
428
-
429
- * Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
430
- and endless range targets.
297
+ *Jean Boussier*
431
298
 
432
- *Allen Hsu*, *Andrew Hodgkinson*
299
+ * Add `Enumerable#sole`, per `ActiveRecord::FinderMethods#sole`. Returns the
300
+ sole item of the enumerable, raising if no items are found, or if more than
301
+ one is.
433
302
 
434
- * Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
303
+ *Asherah Connor*
435
304
 
436
- *Iain Beeston*
305
+ * Freeze `ActiveSupport::Duration#parts` and remove writer methods.
437
306
 
438
- * Prevent `ActiveSupport::Duration.build(value)` from creating instances of
439
- `ActiveSupport::Duration` unless `value` is of type `Numeric`.
307
+ Durations are meant to be value objects and should not be mutated.
440
308
 
441
- Addresses the errant set of behaviours described in #37012 where
442
- `ActiveSupport::Duration` comparisons would fail confusingly
443
- or return unexpected results when comparing durations built from instances of `String`.
309
+ *Andrew White*
444
310
 
445
- Before:
311
+ * Fix `ActiveSupport::TimeZone#utc_to_local` with fractional seconds.
446
312
 
447
- small_duration_from_string = ActiveSupport::Duration.build('9')
448
- large_duration_from_string = ActiveSupport::Duration.build('100000000000000')
449
- small_duration_from_int = ActiveSupport::Duration.build(9)
313
+ When `utc_to_local_returns_utc_offset_times` is false and the time
314
+ instance had fractional seconds the new UTC time instance was out by
315
+ a factor of 1,000,000 as the `Time.utc` constructor takes a usec
316
+ value and not a fractional second value.
450
317
 
451
- large_duration_from_string > small_duration_from_string
452
- # => false
318
+ *Andrew White*
453
319
 
454
- small_duration_from_string == small_duration_from_int
455
- # => false
320
+ * Add `expires_at` argument to `ActiveSupport::Cache` `write` and `fetch` to set a cache entry TTL as an absolute time.
456
321
 
457
- small_duration_from_int < large_duration_from_string
458
- # => ArgumentError (comparison of ActiveSupport::Duration::Scalar with ActiveSupport::Duration failed)
322
+ ```ruby
323
+ Rails.cache.write(key, value, expires_at: Time.now.at_end_of_hour)
324
+ ```
459
325
 
460
- large_duration_from_string > small_duration_from_int
461
- # => ArgumentError (comparison of String with ActiveSupport::Duration failed)
326
+ *Jean Boussier*
462
327
 
463
- After:
328
+ * Deprecate `ActiveSupport::TimeWithZone.name` so that from Rails 7.1 it will use the default implementation.
464
329
 
465
- small_duration_from_string = ActiveSupport::Duration.build('9')
466
- # => TypeError (can't build an ActiveSupport::Duration from a String)
330
+ *Andrew White*
467
331
 
468
- *Alexei Emam*
332
+ * Deprecates Rails custom `Enumerable#sum` and `Array#sum` in favor of Ruby's native implementation which
333
+ is considerably faster.
469
334
 
470
- * Add `ActiveSupport::Cache::Store#delete_multi` method to delete multiple keys from the cache store.
335
+ Ruby requires an initializer for non-numeric type as per examples below:
471
336
 
472
- *Peter Zhu*
337
+ ```ruby
338
+ %w[foo bar].sum('')
339
+ # instead of %w[foo bar].sum
473
340
 
474
- * Support multiple arguments in `HashWithIndifferentAccess` for `merge` and `update` methods, to
475
- follow Ruby 2.6 addition.
341
+ [[1, 2], [3, 4, 5]].sum([])
342
+ # instead of [[1, 2], [3, 4, 5]].sum
343
+ ```
476
344
 
477
- *Wojciech Wnętrzak*
345
+ *Alberto Mota*
478
346
 
479
- * Allow initializing `thread_mattr_*` attributes via `:default` option.
347
+ * Tests parallelization is now disabled when running individual files to prevent the setup overhead.
480
348
 
481
- class Scraper
482
- thread_mattr_reader :client, default: Api::Client.new
483
- end
349
+ It can still be enforced if the environment variable `PARALLEL_WORKERS` is present and set to a value greater than 1.
484
350
 
485
- *Guilherme Mansur*
351
+ *Ricardo Díaz*
486
352
 
487
- * Add `compact_blank` for those times when you want to remove #blank? values from
488
- an Enumerable (also `compact_blank!` on Hash, Array, ActionController::Parameters).
353
+ * Fix proxying keyword arguments in `ActiveSupport::CurrentAttributes`.
489
354
 
490
- *Dana Sherson*
355
+ *Marcin Kołodziej*
491
356
 
492
- * Make ActiveSupport::Logger Fiber-safe.
357
+ * Add `Enumerable#maximum` and `Enumerable#minimum` to easily calculate the maximum or minimum from extracted
358
+ elements of an enumerable.
493
359
 
494
- Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
495
- to make log level local to Ruby Fibers in addition to Threads.
360
+ ```ruby
361
+ payments = [Payment.new(5), Payment.new(15), Payment.new(10)]
496
362
 
497
- Example:
363
+ payments.minimum(:price) # => 5
364
+ payments.maximum(:price) # => 15
365
+ ```
498
366
 
499
- logger = ActiveSupport::Logger.new(STDOUT)
500
- logger.level = 1
501
- puts "Main is debug? #{logger.debug?}"
367
+ This also allows passing enumerables to `fresh_when` and `stale?` in Action Controller.
368
+ See PR [#41404](https://github.com/rails/rails/pull/41404) for an example.
502
369
 
503
- Fiber.new {
504
- logger.local_level = 0
505
- puts "Thread is debug? #{logger.debug?}"
506
- }.resume
370
+ *Ayrton De Craene*
507
371
 
508
- puts "Main is debug? #{logger.debug?}"
372
+ * `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
509
373
 
510
- Before:
374
+ ```ruby
375
+ config.cache_store = :mem_cache_store, nil
511
376
 
512
- Main is debug? false
513
- Thread is debug? true
514
- Main is debug? true
377
+ # is now equivalent to
515
378
 
516
- After:
379
+ config.cache_store = :mem_cache_store
517
380
 
518
- Main is debug? false
519
- Thread is debug? true
520
- Main is debug? false
381
+ # and is also equivalent to
521
382
 
522
- Fixes #36752.
383
+ config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
523
384
 
524
- *Alexander Varnin*
385
+ # which is the fallback behavior of Dalli
386
+ ```
525
387
 
526
- * Allow the `on_rotation` proc used when decrypting/verifying a message to be
527
- passed at the constructor level.
388
+ This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
528
389
 
529
- Before:
390
+ *Michael Overmeyer*
530
391
 
531
- crypt = ActiveSupport::MessageEncryptor.new('long_secret')
532
- crypt.decrypt_and_verify(encrypted_message, on_rotation: proc { ... })
533
- crypt.decrypt_and_verify(another_encrypted_message, on_rotation: proc { ... })
392
+ * Add `Enumerable#in_order_of` to put an Enumerable in a certain order by a key.
534
393
 
535
- After:
394
+ *DHH*
536
395
 
537
- crypt = ActiveSupport::MessageEncryptor.new('long_secret', on_rotation: proc { ... })
538
- crypt.decrypt_and_verify(encrypted_message)
539
- crypt.decrypt_and_verify(another_encrypted_message)
396
+ * `ActiveSupport::Inflector.camelize` behaves expected when provided a symbol `:upper` or `:lower` argument. Matches
397
+ `String#camelize` behavior.
540
398
 
541
- *Edouard Chin*
399
+ *Alex Ghiculescu*
542
400
 
543
- * `delegate_missing_to` would raise a `DelegationError` if the object
544
- delegated to was `nil`. Now the `allow_nil` option has been added to enable
545
- the user to specify they want `nil` returned in this case.
401
+ * Raises an `ArgumentError` when the first argument of `ActiveSupport::Notification.subscribe` is
402
+ invalid.
546
403
 
547
- *Matthew Tanous*
404
+ *Vipul A M*
548
405
 
549
- * `truncate` would return the original string if it was too short to be truncated
550
- and a frozen string if it were long enough to be truncated. Now truncate will
551
- consistently return an unfrozen string regardless. This behavior is consistent
552
- with `gsub` and `strip`.
406
+ * `HashWithIndifferentAccess#deep_transform_keys` now returns a `HashWithIndifferentAccess` instead of a `Hash`.
553
407
 
554
- Before:
408
+ *Nathaniel Woodthorpe*
555
409
 
556
- 'foobar'.truncate(5).frozen?
557
- # => true
558
- 'foobar'.truncate(6).frozen?
559
- # => false
410
+ * Consume dalli’s `cache_nils` configuration as `ActiveSupport::Cache`'s `skip_nil` when using `MemCacheStore`.
560
411
 
561
- After:
412
+ *Ritikesh G*
562
413
 
563
- 'foobar'.truncate(5).frozen?
564
- # => false
565
- 'foobar'.truncate(6).frozen?
566
- # => false
414
+ * Add `RedisCacheStore#stats` method similar to `MemCacheStore#stats`. Calls `redis#info` internally.
567
415
 
568
- *Jordan Thomas*
416
+ *Ritikesh G*
569
417
 
570
418
 
571
- Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activesupport/CHANGELOG.md) for previous changes.
419
+ Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activesupport/CHANGELOG.md) for previous changes.