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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +231 -383
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/active_support/actionable_error.rb +1 -1
- data/lib/active_support/array_inquirer.rb +0 -2
- data/lib/active_support/benchmarkable.rb +2 -2
- data/lib/active_support/cache/file_store.rb +16 -10
- data/lib/active_support/cache/mem_cache_store.rb +133 -34
- data/lib/active_support/cache/memory_store.rb +23 -15
- data/lib/active_support/cache/null_store.rb +10 -2
- data/lib/active_support/cache/redis_cache_store.rb +42 -67
- data/lib/active_support/cache/strategy/local_cache.rb +35 -61
- data/lib/active_support/cache.rb +196 -46
- data/lib/active_support/callbacks.rb +180 -81
- data/lib/active_support/code_generator.rb +65 -0
- data/lib/active_support/concern.rb +5 -5
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +2 -4
- data/lib/active_support/concurrency/share_lock.rb +2 -2
- data/lib/active_support/configurable.rb +6 -3
- data/lib/active_support/configuration_file.rb +7 -2
- data/lib/active_support/core_ext/array/access.rb +1 -5
- data/lib/active_support/core_ext/array/conversions.rb +13 -11
- data/lib/active_support/core_ext/array/deprecated_conversions.rb +25 -0
- data/lib/active_support/core_ext/array/grouping.rb +6 -6
- data/lib/active_support/core_ext/array.rb +1 -0
- data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
- data/lib/active_support/core_ext/class/subclasses.rb +25 -17
- data/lib/active_support/core_ext/date/blank.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +4 -4
- data/lib/active_support/core_ext/date/conversions.rb +11 -11
- data/lib/active_support/core_ext/date/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/date.rb +1 -0
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +1 -1
- data/lib/active_support/core_ext/date_time/blank.rb +1 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +13 -13
- data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/date_time.rb +1 -0
- data/lib/active_support/core_ext/digest/uuid.rb +39 -13
- data/lib/active_support/core_ext/enumerable.rb +78 -26
- data/lib/active_support/core_ext/file/atomic.rb +3 -1
- data/lib/active_support/core_ext/hash/keys.rb +1 -1
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
- data/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +19 -10
- data/lib/active_support/core_ext/module/delegation.rb +2 -8
- data/lib/active_support/core_ext/name_error.rb +2 -8
- data/lib/active_support/core_ext/numeric/conversions.rb +79 -76
- data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +60 -0
- data/lib/active_support/core_ext/numeric.rb +1 -0
- data/lib/active_support/core_ext/object/acts_like.rb +29 -5
- data/lib/active_support/core_ext/object/blank.rb +2 -2
- data/lib/active_support/core_ext/object/deep_dup.rb +1 -1
- data/lib/active_support/core_ext/object/duplicable.rb +11 -0
- data/lib/active_support/core_ext/object/json.rb +29 -24
- data/lib/active_support/core_ext/object/to_query.rb +2 -2
- data/lib/active_support/core_ext/object/try.rb +20 -20
- data/lib/active_support/core_ext/object/with_options.rb +20 -1
- data/lib/active_support/core_ext/pathname/existence.rb +21 -0
- data/lib/active_support/core_ext/pathname.rb +3 -0
- data/lib/active_support/core_ext/range/compare_range.rb +0 -25
- data/lib/active_support/core_ext/range/conversions.rb +8 -8
- data/lib/active_support/core_ext/range/deprecated_conversions.rb +26 -0
- data/lib/active_support/core_ext/range/each.rb +1 -1
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +4 -25
- data/lib/active_support/core_ext/range.rb +1 -1
- data/lib/active_support/core_ext/string/filters.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +1 -1
- data/lib/active_support/core_ext/string/output_safety.rb +60 -36
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
- data/lib/active_support/core_ext/time/calculations.rb +7 -5
- data/lib/active_support/core_ext/time/conversions.rb +13 -12
- data/lib/active_support/core_ext/time/deprecated_conversions.rb +22 -0
- data/lib/active_support/core_ext/time/zones.rb +4 -19
- data/lib/active_support/core_ext/time.rb +1 -0
- data/lib/active_support/core_ext/uri.rb +3 -27
- data/lib/active_support/core_ext.rb +1 -0
- data/lib/active_support/current_attributes.rb +32 -14
- data/lib/active_support/dependencies/interlock.rb +10 -18
- data/lib/active_support/dependencies/require_dependency.rb +28 -0
- data/lib/active_support/dependencies.rb +58 -788
- data/lib/active_support/deprecation/behaviors.rb +4 -1
- data/lib/active_support/deprecation/method_wrappers.rb +3 -3
- data/lib/active_support/deprecation/proxy_wrappers.rb +1 -1
- data/lib/active_support/deprecation.rb +1 -1
- data/lib/active_support/descendants_tracker.rb +174 -68
- data/lib/active_support/digest.rb +5 -3
- data/lib/active_support/duration/iso8601_parser.rb +3 -3
- data/lib/active_support/duration/iso8601_serializer.rb +9 -1
- data/lib/active_support/duration.rb +81 -51
- data/lib/active_support/encrypted_configuration.rb +13 -2
- data/lib/active_support/encrypted_file.rb +1 -1
- data/lib/active_support/environment_inquirer.rb +1 -1
- data/lib/active_support/error_reporter.rb +117 -0
- data/lib/active_support/evented_file_update_checker.rb +1 -1
- data/lib/active_support/execution_context/test_helper.rb +13 -0
- data/lib/active_support/execution_context.rb +53 -0
- data/lib/active_support/execution_wrapper.rb +43 -21
- data/lib/active_support/executor/test_helper.rb +7 -0
- data/lib/active_support/fork_tracker.rb +19 -10
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/hash_with_indifferent_access.rb +9 -2
- data/lib/active_support/html_safe_translation.rb +43 -0
- data/lib/active_support/i18n.rb +1 -0
- data/lib/active_support/i18n_railtie.rb +1 -1
- data/lib/active_support/inflector/inflections.rb +23 -7
- data/lib/active_support/inflector/methods.rb +24 -48
- data/lib/active_support/isolated_execution_state.rb +64 -0
- data/lib/active_support/json/encoding.rb +3 -3
- data/lib/active_support/key_generator.rb +18 -1
- data/lib/active_support/locale/en.yml +2 -2
- data/lib/active_support/log_subscriber.rb +13 -3
- data/lib/active_support/logger_thread_safe_level.rb +4 -13
- data/lib/active_support/message_encryptor.rb +8 -3
- data/lib/active_support/message_verifier.rb +46 -14
- data/lib/active_support/messages/metadata.rb +2 -2
- data/lib/active_support/multibyte/chars.rb +10 -11
- data/lib/active_support/multibyte/unicode.rb +0 -12
- data/lib/active_support/multibyte.rb +1 -1
- data/lib/active_support/notifications/fanout.rb +91 -65
- data/lib/active_support/notifications/instrumenter.rb +32 -15
- data/lib/active_support/notifications.rb +16 -22
- data/lib/active_support/number_helper/number_converter.rb +1 -3
- data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +10 -6
- data/lib/active_support/number_helper/rounding_helper.rb +2 -6
- data/lib/active_support/number_helper.rb +0 -2
- data/lib/active_support/option_merger.rb +8 -16
- data/lib/active_support/ordered_hash.rb +1 -1
- data/lib/active_support/parameter_filter.rb +6 -1
- data/lib/active_support/per_thread_registry.rb +5 -0
- data/lib/active_support/railtie.rb +69 -19
- data/lib/active_support/reloader.rb +1 -1
- data/lib/active_support/rescuable.rb +2 -2
- data/lib/active_support/ruby_features.rb +7 -0
- data/lib/active_support/secure_compare_rotator.rb +1 -1
- data/lib/active_support/security_utils.rb +1 -1
- data/lib/active_support/string_inquirer.rb +0 -2
- data/lib/active_support/subscriber.rb +7 -18
- data/lib/active_support/tagged_logging.rb +2 -2
- data/lib/active_support/test_case.rb +9 -21
- data/lib/active_support/testing/assertions.rb +35 -5
- data/lib/active_support/testing/deprecation.rb +52 -1
- data/lib/active_support/testing/isolation.rb +2 -2
- data/lib/active_support/testing/method_call_assertions.rb +5 -5
- data/lib/active_support/testing/parallelization/server.rb +4 -0
- data/lib/active_support/testing/parallelization/worker.rb +3 -0
- data/lib/active_support/testing/parallelization.rb +4 -0
- data/lib/active_support/testing/parallelize_executor.rb +76 -0
- data/lib/active_support/testing/stream.rb +3 -5
- data/lib/active_support/testing/tagged_logging.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +13 -2
- data/lib/active_support/time_with_zone.rb +55 -14
- data/lib/active_support/values/time_zone.rb +31 -10
- data/lib/active_support/xml_mini/jdom.rb +1 -1
- data/lib/active_support/xml_mini/libxml.rb +5 -5
- data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
- data/lib/active_support/xml_mini/nokogiri.rb +4 -4
- data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
- data/lib/active_support/xml_mini/rexml.rb +1 -1
- data/lib/active_support/xml_mini.rb +5 -4
- data/lib/active_support.rb +17 -1
- metadata +26 -23
- data/lib/active_support/core_ext/marshal.rb +0 -26
- data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
data/CHANGELOG.md
CHANGED
@@ -1,571 +1,419 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 7.0.2.3 (March 08, 2022) ##
|
2
2
|
|
3
|
-
*
|
4
|
-
instead of the instance variables of the object.
|
3
|
+
* No changes.
|
5
4
|
|
6
|
-
Before:
|
7
5
|
|
8
|
-
|
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
|
-
|
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
|
11
|
+
## Rails 7.0.2.1 (February 11, 2022) ##
|
22
12
|
|
23
|
-
*
|
24
|
-
`MemoryStore` to its prior rails `5.1` behavior.
|
13
|
+
* No changes.
|
25
14
|
|
26
|
-
*Max Gurewitz*
|
27
15
|
|
28
|
-
|
29
|
-
digits instead of prepending it.
|
16
|
+
## Rails 7.0.2 (February 08, 2022) ##
|
30
17
|
|
31
|
-
|
32
|
-
negative signs for each component.
|
18
|
+
* Fix `ActiveSupport::EncryptedConfiguration` to be compatible with Psych 4
|
33
19
|
|
34
|
-
|
35
|
-
as negatives per component is still retained.
|
20
|
+
*Stephen Sugden*
|
36
21
|
|
37
|
-
|
22
|
+
* Improve `File.atomic_write` error handling.
|
38
23
|
|
39
|
-
|
40
|
-
# => "-P1Y1D"
|
24
|
+
*Daniel Pepper*
|
41
25
|
|
42
|
-
After:
|
43
26
|
|
44
|
-
|
45
|
-
# => "P-1Y-1D"
|
27
|
+
## Rails 7.0.1 (January 06, 2022) ##
|
46
28
|
|
47
|
-
|
29
|
+
* Fix `Class#descendants` and `DescendantsTracker#descendants` compatibility with Ruby 3.1.
|
48
30
|
|
49
|
-
|
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
|
-
*
|
34
|
+
*Jean Boussier*
|
52
35
|
|
53
|
-
* Deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
|
54
36
|
|
55
|
-
|
37
|
+
## Rails 7.0.0 (December 15, 2021) ##
|
56
38
|
|
57
|
-
*
|
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
|
-
|
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
|
-
*
|
46
|
+
*Caleb Buxton*, *Braden Staudacher*
|
66
47
|
|
67
|
-
*Rafael Mendonça França*
|
68
48
|
|
69
|
-
|
49
|
+
## Rails 7.0.0.rc3 (December 14, 2021) ##
|
70
50
|
|
71
|
-
|
51
|
+
* No changes.
|
72
52
|
|
73
|
-
* Remove deprecated file `active_support/core_ext/hash/transform_values`.
|
74
53
|
|
75
|
-
|
54
|
+
## Rails 7.0.0.rc2 (December 14, 2021) ##
|
76
55
|
|
77
|
-
*
|
56
|
+
* No changes.
|
78
57
|
|
79
|
-
|
58
|
+
## Rails 7.0.0.rc1 (December 06, 2021) ##
|
80
59
|
|
81
|
-
*
|
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
|
-
*
|
86
|
-
|
87
|
-
*Rafael Mendonça França*
|
65
|
+
* Document `ActiveSupport::Testing::Deprecation`.
|
88
66
|
|
89
|
-
*
|
67
|
+
*Sam Bostock & Sam Jordan*
|
90
68
|
|
91
|
-
|
69
|
+
* Add `Pathname#existence`.
|
92
70
|
|
93
|
-
|
71
|
+
```ruby
|
72
|
+
Pathname.new("file").existence&.read
|
73
|
+
```
|
94
74
|
|
95
|
-
*
|
75
|
+
*Timo Schilling*
|
96
76
|
|
97
|
-
* Remove
|
77
|
+
* Remove deprecate `ActiveSupport::Multibyte::Unicode.default_normalization_form`.
|
98
78
|
|
99
79
|
*Rafael Mendonça França*
|
100
80
|
|
101
|
-
* Remove deprecated `
|
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
|
86
|
+
* Remove deprecated `URI.parser`.
|
106
87
|
|
107
88
|
*Rafael Mendonça França*
|
108
89
|
|
109
|
-
* Remove
|
90
|
+
* Remove deprecated `config.active_support.use_sha1_digests`.
|
110
91
|
|
111
|
-
|
92
|
+
*Rafael Mendonça França*
|
112
93
|
|
113
|
-
|
94
|
+
* Invoking `Object#with_options` without a `&block` argument returns the
|
95
|
+
`ActiveSupport::OptionMerger` instance.
|
114
96
|
|
115
|
-
*
|
116
|
-
`OpenSSL.fixed_length_secure_compare`, if available.
|
97
|
+
*Sean Doyle*
|
117
98
|
|
118
|
-
|
99
|
+
* `Rails.application.executor` hooks can now be called around every test
|
119
100
|
|
120
|
-
|
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
|
-
|
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
|
-
|
106
|
+
To enable this, set `config.active_support.executor_around_test_case = true` (this is the default in Rails 7).
|
126
107
|
|
127
|
-
|
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
|
-
|
110
|
+
* `ActiveSupport::DescendantsTracker` now mostly delegate to `Class#descendants` on Ruby 3.1
|
135
111
|
|
136
|
-
|
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
|
-
|
140
|
-
class ActionControllerSubscriber < ActiveSupport::Subscriber
|
141
|
-
attach_to :action_controller
|
114
|
+
As a result the following methods are deprecated:
|
142
115
|
|
143
|
-
|
144
|
-
|
145
|
-
end
|
116
|
+
- `ActiveSupport::DescendantsTracker.direct_descendants`
|
117
|
+
- `ActiveSupport::DescendantsTracker#direct_descendants`
|
146
118
|
|
147
|
-
|
148
|
-
info { "Redirected to #{event.payload[:location]}" }
|
149
|
-
end
|
150
|
-
end
|
119
|
+
*Jean Boussier*
|
151
120
|
|
152
|
-
|
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
|
-
|
157
|
-
|
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
|
-
|
160
|
-
|
161
|
-
|
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
|
-
|
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
|
-
|
134
|
+
* `ActiveSupport::Inflector::Inflections#clear(:acronyms)` is now supported,
|
135
|
+
and `inflector.clear` / `inflector.clear(:all)` also clears acronyms.
|
170
136
|
|
171
|
-
*
|
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
|
-
|
140
|
+
## Rails 7.0.0.alpha2 (September 15, 2021) ##
|
176
141
|
|
177
|
-
*
|
142
|
+
* No changes.
|
178
143
|
|
179
|
-
*Jye Lee*
|
180
144
|
|
181
|
-
|
145
|
+
## Rails 7.0.0.alpha1 (September 15, 2021) ##
|
182
146
|
|
183
|
-
|
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
|
-
*
|
149
|
+
*Xavier Noria*
|
186
150
|
|
187
|
-
*
|
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
|
-
*
|
153
|
+
*Xavier Noria*
|
191
154
|
|
192
|
-
*
|
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
|
-
*
|
157
|
+
*Xavier Noria*
|
196
158
|
|
197
|
-
*
|
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
|
-
*
|
161
|
+
*Mike Dalessio*
|
201
162
|
|
202
|
-
*
|
203
|
-
`URI::DEFAULT_PARSER` instead.
|
163
|
+
* Removed rescue block from `ActiveSupport::Cache::RedisCacheStore#handle_exception`
|
204
164
|
|
205
|
-
|
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
|
-
*
|
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
|
-
|
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
|
-
|
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
|
-
|
177
|
+
Now, you can make `ActiveSupport::Deprecation.warn` a no-op:
|
218
178
|
|
219
179
|
```ruby
|
220
|
-
|
221
|
-
:foo.ends_with?("o") # => true
|
180
|
+
config.active_support.report_deprecations = false
|
222
181
|
```
|
223
182
|
|
224
|
-
|
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
|
-
|
234
|
-
|
235
|
-
(+ 1.second).class
|
236
|
-
# => Integer
|
186
|
+
config.active_support.deprecation = :silence
|
187
|
+
config.active_support.disallowed_deprecation = :silence
|
237
188
|
```
|
238
189
|
|
239
|
-
|
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
|
-
|
192
|
+
*Alex Ghiculescu*
|
254
193
|
|
255
|
-
|
256
|
-
|
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
|
-
|
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
|
-
|
265
|
-
|
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
|
-
|
205
|
+
config.active_support.test_parallelization_threshold = 100
|
277
206
|
```
|
278
207
|
|
279
|
-
|
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
|
-
|
305
|
-
|
306
|
-
|
210
|
+
```ruby
|
211
|
+
class ActiveSupport::TestCase
|
212
|
+
parallelize threshold: 100
|
213
|
+
end
|
214
|
+
```
|
307
215
|
|
308
|
-
*
|
216
|
+
*Jorge Manrubia*
|
309
217
|
|
310
|
-
|
218
|
+
* OpenSSL constants are now used for Digest computations.
|
311
219
|
|
312
|
-
*
|
220
|
+
*Dirkjan Bussink*
|
313
221
|
|
314
|
-
|
315
|
-
|
316
|
-
|
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
|
-
|
321
|
-
|
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
|
-
*
|
334
|
-
|
335
|
-
* Support `prepend` with `ActiveSupport::Concern`.
|
231
|
+
*Steve Laing*
|
336
232
|
|
337
|
-
|
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
|
-
|
340
|
-
extend ActiveSupport::Concern
|
237
|
+
Fixes [#42467](https://github.com/rails/rails/issues/42467).
|
341
238
|
|
342
|
-
|
343
|
-
prepended do
|
344
|
-
end
|
345
|
-
end
|
239
|
+
*Alex Ghiculescu*
|
346
240
|
|
347
|
-
|
348
|
-
prepend Imposter
|
349
|
-
end
|
241
|
+
* Allow serializing any module or class to JSON by name.
|
350
242
|
|
351
|
-
|
352
|
-
updated: `concerning :Imposter, prepend: true do`.
|
243
|
+
*Tyler Rick*, *Zachary Scott*
|
353
244
|
|
354
|
-
|
245
|
+
* Raise `ActiveSupport::EncryptedFile::MissingKeyError` when the
|
246
|
+
`RAILS_MASTER_KEY` environment variable is blank (e.g. `""`).
|
355
247
|
|
356
|
-
*
|
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
|
-
|
250
|
+
* The `from:` option is added to `ActiveSupport::TestCase#assert_no_changes`.
|
362
251
|
|
363
|
-
|
252
|
+
It permits asserting on the initial value that is expected not to change.
|
364
253
|
|
365
254
|
```ruby
|
366
|
-
|
367
|
-
|
368
|
-
|
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
|
-
*
|
376
|
-
|
377
|
-
* `Array#to_sentence` no longer returns a frozen string.
|
378
|
-
|
379
|
-
Before:
|
260
|
+
*George Claghorn*
|
380
261
|
|
381
|
-
|
382
|
-
# => true
|
262
|
+
* Deprecate `ActiveSupport::SafeBuffer`'s incorrect implicit conversion of objects into string.
|
383
263
|
|
384
|
-
|
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
|
-
|
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
|
-
|
402
|
-
# 11 days, 13 hours, 46 minutes, and 40 seconds
|
272
|
+
* Allow nested access to keys on `Rails.application.credentials`.
|
403
273
|
|
404
|
-
|
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
|
-
|
408
|
-
# P1W
|
276
|
+
For example, given these secrets:
|
409
277
|
|
410
|
-
|
411
|
-
|
278
|
+
```yml
|
279
|
+
aws:
|
280
|
+
access_key_id: 123
|
281
|
+
secret_access_key: 345
|
412
282
|
```
|
413
283
|
|
414
|
-
|
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
|
-
*
|
287
|
+
*Alex Ghiculescu*
|
417
288
|
|
418
|
-
|
289
|
+
* Added a faster and more compact `ActiveSupport::Cache` serialization format.
|
419
290
|
|
420
|
-
|
421
|
-
`
|
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
|
-
*
|
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
|
-
|
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
|
-
*
|
303
|
+
*Asherah Connor*
|
435
304
|
|
436
|
-
|
305
|
+
* Freeze `ActiveSupport::Duration#parts` and remove writer methods.
|
437
306
|
|
438
|
-
|
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
|
-
|
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
|
-
|
311
|
+
* Fix `ActiveSupport::TimeZone#utc_to_local` with fractional seconds.
|
446
312
|
|
447
|
-
|
448
|
-
|
449
|
-
|
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
|
-
|
452
|
-
# => false
|
318
|
+
*Andrew White*
|
453
319
|
|
454
|
-
|
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
|
-
|
458
|
-
|
322
|
+
```ruby
|
323
|
+
Rails.cache.write(key, value, expires_at: Time.now.at_end_of_hour)
|
324
|
+
```
|
459
325
|
|
460
|
-
|
461
|
-
# => ArgumentError (comparison of String with ActiveSupport::Duration failed)
|
326
|
+
*Jean Boussier*
|
462
327
|
|
463
|
-
|
328
|
+
* Deprecate `ActiveSupport::TimeWithZone.name` so that from Rails 7.1 it will use the default implementation.
|
464
329
|
|
465
|
-
|
466
|
-
# => TypeError (can't build an ActiveSupport::Duration from a String)
|
330
|
+
*Andrew White*
|
467
331
|
|
468
|
-
|
332
|
+
* Deprecates Rails custom `Enumerable#sum` and `Array#sum` in favor of Ruby's native implementation which
|
333
|
+
is considerably faster.
|
469
334
|
|
470
|
-
|
335
|
+
Ruby requires an initializer for non-numeric type as per examples below:
|
471
336
|
|
472
|
-
|
337
|
+
```ruby
|
338
|
+
%w[foo bar].sum('')
|
339
|
+
# instead of %w[foo bar].sum
|
473
340
|
|
474
|
-
|
475
|
-
|
341
|
+
[[1, 2], [3, 4, 5]].sum([])
|
342
|
+
# instead of [[1, 2], [3, 4, 5]].sum
|
343
|
+
```
|
476
344
|
|
477
|
-
*
|
345
|
+
*Alberto Mota*
|
478
346
|
|
479
|
-
*
|
347
|
+
* Tests parallelization is now disabled when running individual files to prevent the setup overhead.
|
480
348
|
|
481
|
-
|
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
|
-
*
|
351
|
+
*Ricardo Díaz*
|
486
352
|
|
487
|
-
*
|
488
|
-
an Enumerable (also `compact_blank!` on Hash, Array, ActionController::Parameters).
|
353
|
+
* Fix proxying keyword arguments in `ActiveSupport::CurrentAttributes`.
|
489
354
|
|
490
|
-
*
|
355
|
+
*Marcin Kołodziej*
|
491
356
|
|
492
|
-
*
|
357
|
+
* Add `Enumerable#maximum` and `Enumerable#minimum` to easily calculate the maximum or minimum from extracted
|
358
|
+
elements of an enumerable.
|
493
359
|
|
494
|
-
|
495
|
-
|
360
|
+
```ruby
|
361
|
+
payments = [Payment.new(5), Payment.new(15), Payment.new(10)]
|
496
362
|
|
497
|
-
|
363
|
+
payments.minimum(:price) # => 5
|
364
|
+
payments.maximum(:price) # => 15
|
365
|
+
```
|
498
366
|
|
499
|
-
|
500
|
-
|
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
|
-
|
504
|
-
logger.local_level = 0
|
505
|
-
puts "Thread is debug? #{logger.debug?}"
|
506
|
-
}.resume
|
370
|
+
*Ayrton De Craene*
|
507
371
|
|
508
|
-
|
372
|
+
* `ActiveSupport::Cache::MemCacheStore` now accepts an explicit `nil` for its `addresses` argument.
|
509
373
|
|
510
|
-
|
374
|
+
```ruby
|
375
|
+
config.cache_store = :mem_cache_store, nil
|
511
376
|
|
512
|
-
|
513
|
-
Thread is debug? true
|
514
|
-
Main is debug? true
|
377
|
+
# is now equivalent to
|
515
378
|
|
516
|
-
|
379
|
+
config.cache_store = :mem_cache_store
|
517
380
|
|
518
|
-
|
519
|
-
Thread is debug? true
|
520
|
-
Main is debug? false
|
381
|
+
# and is also equivalent to
|
521
382
|
|
522
|
-
|
383
|
+
config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211"
|
523
384
|
|
524
|
-
|
385
|
+
# which is the fallback behavior of Dalli
|
386
|
+
```
|
525
387
|
|
526
|
-
|
527
|
-
passed at the constructor level.
|
388
|
+
This helps those migrating from `:dalli_store`, where an explicit `nil` was permitted.
|
528
389
|
|
529
|
-
|
390
|
+
*Michael Overmeyer*
|
530
391
|
|
531
|
-
|
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
|
-
|
394
|
+
*DHH*
|
536
395
|
|
537
|
-
|
538
|
-
|
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
|
-
*
|
399
|
+
*Alex Ghiculescu*
|
542
400
|
|
543
|
-
* `
|
544
|
-
|
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
|
-
*
|
404
|
+
*Vipul A M*
|
548
405
|
|
549
|
-
* `
|
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
|
-
|
408
|
+
*Nathaniel Woodthorpe*
|
555
409
|
|
556
|
-
|
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
|
-
|
412
|
+
*Ritikesh G*
|
562
413
|
|
563
|
-
|
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
|
-
*
|
416
|
+
*Ritikesh G*
|
569
417
|
|
570
418
|
|
571
|
-
Please check [6-
|
419
|
+
Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activesupport/CHANGELOG.md) for previous changes.
|