activesupport 7.2.2 → 8.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +41 -232
- data/lib/active_support/backtrace_cleaner.rb +1 -1
- data/lib/active_support/benchmark.rb +21 -0
- data/lib/active_support/benchmarkable.rb +3 -2
- data/lib/active_support/cache/file_store.rb +12 -2
- data/lib/active_support/cache/memory_store.rb +6 -2
- data/lib/active_support/cache/redis_cache_store.rb +5 -2
- data/lib/active_support/cache.rb +14 -9
- data/lib/active_support/callbacks.rb +1 -2
- data/lib/active_support/class_attribute.rb +26 -0
- data/lib/active_support/code_generator.rb +9 -0
- data/lib/active_support/concurrency/share_lock.rb +0 -1
- data/lib/active_support/configuration_file.rb +15 -6
- data/lib/active_support/core_ext/benchmark.rb +6 -9
- data/lib/active_support/core_ext/class/attribute.rb +10 -19
- data/lib/active_support/core_ext/date/conversions.rb +2 -0
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +2 -2
- data/lib/active_support/core_ext/enumerable.rb +8 -3
- data/lib/active_support/core_ext/hash/except.rb +0 -12
- data/lib/active_support/core_ext/object/json.rb +18 -14
- data/lib/active_support/core_ext/string/multibyte.rb +1 -1
- data/lib/active_support/core_ext/time/calculations.rb +14 -2
- data/lib/active_support/core_ext/time/conversions.rb +2 -0
- data/lib/active_support/core_ext/time/zones.rb +1 -1
- data/lib/active_support/deprecation.rb +1 -1
- data/lib/active_support/encrypted_configuration.rb +20 -2
- data/lib/active_support/error_reporter.rb +25 -1
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/hash_with_indifferent_access.rb +16 -12
- data/lib/active_support/i18n_railtie.rb +19 -10
- data/lib/active_support/isolated_execution_state.rb +0 -1
- data/lib/active_support/json/encoding.rb +2 -2
- data/lib/active_support/number_helper.rb +22 -0
- data/lib/active_support/railtie.rb +4 -0
- data/lib/active_support/tagged_logging.rb +5 -0
- data/lib/active_support/testing/assertions.rb +72 -21
- data/lib/active_support/testing/isolation.rb +0 -2
- data/lib/active_support/testing/time_helpers.rb +2 -1
- data/lib/active_support/time_with_zone.rb +22 -13
- data/lib/active_support/values/time_zone.rb +17 -15
- data/lib/active_support.rb +10 -2
- metadata +22 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 492cd4c9d2ec59d97060d7949b3b68badc089d97ea467a30a0e6614d65e69c21
|
4
|
+
data.tar.gz: 98af51f7ec102b694fbd17f636cdf942b965a9a845561f05b1569b07efc56747
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b720480df1c4117bf85c0f9066f7015dc750ca1279bba4c07a66a429effa06101adab40eda21f76c6d14ee1c57d46b6aff5cffd494e0e55d18600fe764c9d0e5
|
7
|
+
data.tar.gz: 13d40213e5c9720bda46e71d696a6f011547ca95ade865061df922cc9abd5adfbf6a0daa651e0732314dfb67faf3c9ad3fde39bb3490f4e3fd7577fb24b8221b
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 8.0.0.beta1 (September 26, 2024) ##
|
2
2
|
|
3
3
|
* Include options when instrumenting `ActiveSupport::Cache::Store#delete` and `ActiveSupport::Cache::Store#delete_multi`.
|
4
4
|
|
@@ -8,272 +8,81 @@
|
|
8
8
|
|
9
9
|
*John Hawthorn*, *Abeid Ahmed*
|
10
10
|
|
11
|
+
* Deprecate `Benchmark.ms` core extension.
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
* No changes.
|
15
|
-
|
16
|
-
|
17
|
-
## Rails 7.2.1.1 (October 15, 2024) ##
|
18
|
-
|
19
|
-
* No changes.
|
20
|
-
|
21
|
-
|
22
|
-
## Rails 7.2.1 (August 22, 2024) ##
|
23
|
-
|
24
|
-
* No changes.
|
25
|
-
|
26
|
-
|
27
|
-
## Rails 7.2.0 (August 09, 2024) ##
|
28
|
-
|
29
|
-
* Fix `delegate_missing_to allow_nil: true` when called with implict self
|
30
|
-
|
31
|
-
```ruby
|
32
|
-
class Person
|
33
|
-
delegate_missing_to :address, allow_nil: true
|
34
|
-
|
35
|
-
def address
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
|
39
|
-
def berliner?
|
40
|
-
city == "Berlin"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
Person.new.city # => nil
|
45
|
-
Person.new.berliner? # undefined local variable or method `city' for an instance of Person (NameError)
|
46
|
-
```
|
47
|
-
|
48
|
-
*Jean Boussier*
|
49
|
-
|
50
|
-
* Add `logger` as a dependency since it is a bundled gem candidate for Ruby 3.5
|
51
|
-
|
52
|
-
*Earlopain*
|
53
|
-
|
54
|
-
* Define `Digest::UUID.nil_uuid`, which returns the so-called nil UUID.
|
55
|
-
|
56
|
-
*Xavier Noria*
|
57
|
-
|
58
|
-
* Support `duration` type in `ActiveSupport::XmlMini`.
|
59
|
-
|
60
|
-
*heka1024*
|
61
|
-
|
62
|
-
* Remove deprecated `ActiveSupport::Notifications::Event#children` and `ActiveSupport::Notifications::Event#parent_of?`.
|
63
|
-
|
64
|
-
*Rafael Mendonça França*
|
65
|
-
|
66
|
-
* Remove deprecated support to call the following methods without passing a deprecator:
|
67
|
-
|
68
|
-
- `deprecate`
|
69
|
-
- `deprecate_constant`
|
70
|
-
- `ActiveSupport::Deprecation::DeprecatedObjectProxy.new`
|
71
|
-
- `ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new`
|
72
|
-
- `ActiveSupport::Deprecation::DeprecatedConstantProxy.new`
|
73
|
-
- `assert_deprecated`
|
74
|
-
- `assert_not_deprecated`
|
75
|
-
- `collect_deprecations`
|
76
|
-
|
77
|
-
*Rafael Mendonça França*
|
78
|
-
|
79
|
-
* Remove deprecated `ActiveSupport::Deprecation` delegation to instance.
|
80
|
-
|
81
|
-
*Rafael Mendonça França*
|
82
|
-
|
83
|
-
* Remove deprecated `SafeBuffer#clone_empty`.
|
84
|
-
|
85
|
-
*Rafael Mendonça França*
|
86
|
-
|
87
|
-
* Remove deprecated `#to_default_s` from `Array`, `Date`, `DateTime` and `Time`.
|
88
|
-
|
89
|
-
*Rafael Mendonça França*
|
90
|
-
|
91
|
-
* Remove deprecated support to passing `Dalli::Client` instances to `MemCacheStore`.
|
92
|
-
|
93
|
-
*Rafael Mendonça França*
|
94
|
-
|
95
|
-
* Remove deprecated `config.active_support.use_rfc4122_namespaced_uuids`.
|
96
|
-
|
97
|
-
*Rafael Mendonça França*
|
98
|
-
|
99
|
-
* Remove deprecated `config.active_support.remove_deprecated_time_with_zone_name`.
|
100
|
-
|
101
|
-
*Rafael Mendonça França*
|
102
|
-
|
103
|
-
* Remove deprecated `config.active_support.disable_to_s_conversion`.
|
104
|
-
|
105
|
-
*Rafael Mendonça França*
|
106
|
-
|
107
|
-
* Remove deprecated support to bolding log text with positional boolean in `ActiveSupport::LogSubscriber#color`.
|
108
|
-
|
109
|
-
*Rafael Mendonça França*
|
110
|
-
|
111
|
-
* Remove deprecated constants `ActiveSupport::LogSubscriber::CLEAR` and `ActiveSupport::LogSubscriber::BOLD`.
|
112
|
-
|
113
|
-
*Rafael Mendonça França*
|
114
|
-
|
115
|
-
* Remove deprecated support for `config.active_support.cache_format_version = 6.1`.
|
116
|
-
|
117
|
-
*Rafael Mendonça França*
|
118
|
-
|
119
|
-
* Remove deprecated `:pool_size` and `:pool_timeout` options for the cache storage.
|
120
|
-
|
121
|
-
*Rafael Mendonça França*
|
122
|
-
|
123
|
-
* Warn on tests without assertions.
|
124
|
-
|
125
|
-
`ActiveSupport::TestCase` now warns when tests do not run any assertions.
|
126
|
-
This is helpful in detecting broken tests that do not perform intended assertions.
|
127
|
-
|
128
|
-
*fatkodima*
|
129
|
-
|
130
|
-
* Support `hexBinary` type in `ActiveSupport::XmlMini`.
|
131
|
-
|
132
|
-
*heka1024*
|
133
|
-
|
134
|
-
* Deprecate `ActiveSupport::ProxyObject` in favor of Ruby's built-in `BasicObject`.
|
13
|
+
The `benchmark` gem will become bundled in Ruby 3.5
|
135
14
|
|
136
15
|
*Earlopain*
|
137
16
|
|
138
|
-
* `
|
17
|
+
* `ActiveSupport::TimeWithZone#inspect` now uses ISO 8601 style time like `Time#inspect`
|
139
18
|
|
140
|
-
*
|
19
|
+
*John Hawthorn*
|
141
20
|
|
142
|
-
*
|
21
|
+
* `ActiveSupport::ErrorReporter#report` now assigns a backtrace to unraised exceptions.
|
143
22
|
|
144
|
-
Previously
|
145
|
-
|
23
|
+
Previously reporting an un-raised exception would result in an error report without
|
24
|
+
a backtrace. Now it automatically generates one.
|
146
25
|
|
147
26
|
*Jean Boussier*
|
148
27
|
|
149
|
-
*
|
28
|
+
* Add `escape_html_entities` option to `ActiveSupport::JSON.encode`.
|
150
29
|
|
151
|
-
|
152
|
-
|
153
|
-
* Add filename support for `ActiveSupport::Logger.logger_outputs_to?`.
|
154
|
-
|
155
|
-
```ruby
|
156
|
-
logger = Logger.new('/var/log/rails.log')
|
157
|
-
ActiveSupport::Logger.logger_outputs_to?(logger, '/var/log/rails.log')
|
158
|
-
```
|
159
|
-
|
160
|
-
*Christian Schmidt*
|
161
|
-
|
162
|
-
* Include `IPAddr#prefix` when serializing an `IPAddr` using the
|
163
|
-
`ActiveSupport::MessagePack` serializer.
|
164
|
-
|
165
|
-
This change is backward and forward compatible — old payloads can
|
166
|
-
still be read, and new payloads will be readable by older versions of Rails.
|
167
|
-
|
168
|
-
*Taiki Komaba*
|
169
|
-
|
170
|
-
* Add `default:` support for `ActiveSupport::CurrentAttributes.attribute`.
|
30
|
+
This allows for overriding the global configuration found at
|
31
|
+
`ActiveSupport.escape_html_entities_in_json` for specific calls to `to_json`.
|
171
32
|
|
33
|
+
This should be usable from controllers in the following manner:
|
172
34
|
```ruby
|
173
|
-
class
|
174
|
-
|
175
|
-
|
176
|
-
```
|
177
|
-
|
178
|
-
*Sean Doyle*
|
179
|
-
|
180
|
-
* Yield instance to `Object#with` block.
|
181
|
-
|
182
|
-
```ruby
|
183
|
-
client.with(timeout: 5_000) do |c|
|
184
|
-
c.get("/commits")
|
185
|
-
end
|
186
|
-
```
|
187
|
-
|
188
|
-
*Sean Doyle*
|
189
|
-
|
190
|
-
* Use logical core count instead of physical core count to determine the
|
191
|
-
default number of workers when parallelizing tests.
|
192
|
-
|
193
|
-
*Jonathan Hefner*
|
194
|
-
|
195
|
-
* Fix `Time.now/DateTime.now/Date.today` to return results in a system timezone after `#travel_to`.
|
196
|
-
|
197
|
-
There is a bug in the current implementation of #travel_to:
|
198
|
-
it remembers a timezone of its argument, and all stubbed methods start
|
199
|
-
returning results in that remembered timezone. However, the expected
|
200
|
-
behavior is to return results in a system timezone.
|
201
|
-
|
202
|
-
*Aleksei Chernenkov*
|
203
|
-
|
204
|
-
* Add `ErrorReported#unexpected` to report precondition violations.
|
205
|
-
|
206
|
-
For example:
|
207
|
-
|
208
|
-
```ruby
|
209
|
-
def edit
|
210
|
-
if published?
|
211
|
-
Rails.error.unexpected("[BUG] Attempting to edit a published article, that shouldn't be possible")
|
212
|
-
return false
|
35
|
+
class MyController < ApplicationController
|
36
|
+
def index
|
37
|
+
render json: { hello: "world" }, escape_html_entities: false
|
213
38
|
end
|
214
|
-
# ...
|
215
39
|
end
|
216
40
|
```
|
217
41
|
|
218
|
-
|
219
|
-
|
220
|
-
*Jean Boussier*
|
221
|
-
|
222
|
-
* Make the order of read_multi and write_multi notifications for `Cache::Store#fetch_multi` operations match the order they are executed in.
|
42
|
+
*Nigel Baillie*
|
223
43
|
|
224
|
-
|
225
|
-
|
226
|
-
* Make return values of `Cache::Store#write` consistent.
|
227
|
-
|
228
|
-
The return value was not specified before. Now it returns `true` on a successful write,
|
229
|
-
`nil` if there was an error talking to the cache backend, and `false` if the write failed
|
230
|
-
for another reason (e.g. the key already exists and `unless_exist: true` was passed).
|
44
|
+
* Raise when using key which can't respond to `#to_sym` in `EncryptedConfiguration`.
|
231
45
|
|
232
|
-
|
46
|
+
As is the case when trying to use an Integer or Float as a key, which is unsupported.
|
233
47
|
|
234
|
-
*
|
48
|
+
*zzak*
|
235
49
|
|
236
|
-
|
50
|
+
* Deprecate addition and since between two `Time` and `ActiveSupport::TimeWithZone`.
|
237
51
|
|
238
|
-
|
52
|
+
Previously adding time instances together such as `10.days.ago + 10.days.ago` or `10.days.ago.since(10.days.ago)` produced a nonsensical future date. This behavior is deprecated and will be removed in Rails 8.1.
|
239
53
|
|
240
|
-
|
241
|
-
to differentiate nil from empty strings, strings from symbols, etc.
|
242
|
-
`assert_no_changes` error messages now surface the actual value.
|
54
|
+
*Nick Schwaderer*
|
243
55
|
|
244
|
-
|
245
|
-
|
246
|
-
* Fix `#to_fs(:human_size)` to correctly work with negative numbers.
|
247
|
-
|
248
|
-
*Earlopain*
|
56
|
+
* Support rfc2822 format for Time#to_fs & Date#to_fs.
|
249
57
|
|
250
|
-
*
|
58
|
+
*Akshay Birajdar*
|
251
59
|
|
252
|
-
|
60
|
+
* Optimize load time for `Railtie#initialize_i18n`. Filter `I18n.load_path`s passed to the file watcher to only those
|
61
|
+
under `Rails.root`. Previously the watcher would grab all available locales, including those in gems
|
62
|
+
which do not require a watcher because they won't change.
|
253
63
|
|
254
|
-
*
|
64
|
+
*Nick Schwaderer*
|
255
65
|
|
256
|
-
|
66
|
+
* Add a `filter` option to `in_order_of` to prioritize certain values in the sorting without filtering the results
|
67
|
+
by these values.
|
257
68
|
|
258
|
-
*
|
69
|
+
*Igor Depolli*
|
259
70
|
|
260
|
-
|
261
|
-
|
71
|
+
* Improve error message when using `assert_difference` or `assert_changes` with a
|
72
|
+
proc by printing the proc's source code (MRI only).
|
262
73
|
|
263
|
-
|
264
|
-
`SemanticLogger` instance.
|
74
|
+
*Richard Böhme*, *Jean Boussier*
|
265
75
|
|
266
|
-
|
76
|
+
* Add a new configuration value `:zone` for `ActiveSupport.to_time_preserves_timezone` and rename the previous `true` value to `:offset`. The new default value is `:zone`.
|
267
77
|
|
268
|
-
*
|
78
|
+
*Jason Kim*, *John Hawthorn*
|
269
79
|
|
270
|
-
|
80
|
+
* Align instrumentation `payload[:key]` in ActiveSupport::Cache to follow the same pattern, with namespaced and normalized keys.
|
271
81
|
|
272
|
-
*
|
82
|
+
*Frederik Erbs Spang Thomsen*
|
273
83
|
|
274
|
-
|
275
|
-
method from the `Hash` class, which was not able to access values using indifferent keys.
|
84
|
+
* Fix `travel_to` to set usec 0 when `with_usec` is `false` and the given argument String or DateTime.
|
276
85
|
|
277
|
-
*
|
86
|
+
*mopp*
|
278
87
|
|
279
|
-
Please check [7-
|
88
|
+
Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activesupport/CHANGELOG.md) for previous changes.
|
@@ -18,7 +18,7 @@ module ActiveSupport
|
|
18
18
|
#
|
19
19
|
# bc = ActiveSupport::BacktraceCleaner.new
|
20
20
|
# root = "#{Rails.root}/"
|
21
|
-
# bc.add_filter { |line| line.
|
21
|
+
# bc.add_filter { |line| line.delete_prefix(root) } # strip the Rails.root prefix
|
22
22
|
# bc.add_silencer { |line| /puma|rubygems/.match?(line) } # skip any lines from puma or rubygems
|
23
23
|
# bc.clean(exception.backtrace) # perform the cleanup
|
24
24
|
#
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveSupport
|
4
|
+
module Benchmark # :nodoc:
|
5
|
+
# Benchmark realtime in the specified time unit. By default,
|
6
|
+
# the returned unit is in seconds.
|
7
|
+
#
|
8
|
+
# ActiveSupport::Benchmark.realtime { sleep 0.1 }
|
9
|
+
# # => 0.10007
|
10
|
+
#
|
11
|
+
# ActiveSupport::Benchmark.realtime(:float_millisecond) { sleep 0.1 }
|
12
|
+
# # => 100.07
|
13
|
+
#
|
14
|
+
# `unit` can be any of the values accepted by Ruby's `Process.clock_gettime`.
|
15
|
+
def self.realtime(unit = :float_second, &block)
|
16
|
+
time_start = Process.clock_gettime(Process::CLOCK_MONOTONIC, unit)
|
17
|
+
yield
|
18
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC, unit) - time_start
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/benchmark"
|
4
3
|
require "active_support/core_ext/hash/keys"
|
5
4
|
|
6
5
|
module ActiveSupport
|
@@ -41,7 +40,9 @@ module ActiveSupport
|
|
41
40
|
options[:level] ||= :info
|
42
41
|
|
43
42
|
result = nil
|
44
|
-
ms = Benchmark.
|
43
|
+
ms = ActiveSupport::Benchmark.realtime(:float_millisecond) do
|
44
|
+
result = options[:silence] ? logger.silence(&block) : yield
|
45
|
+
end
|
45
46
|
logger.public_send(options[:level], "%s (%.1fms)" % [ message, ms ])
|
46
47
|
result
|
47
48
|
else
|
@@ -58,7 +58,12 @@ module ActiveSupport
|
|
58
58
|
# cache.increment("baz") # => 6
|
59
59
|
#
|
60
60
|
def increment(name, amount = 1, options = nil)
|
61
|
-
|
61
|
+
options = merged_options(options)
|
62
|
+
key = normalize_key(name, options)
|
63
|
+
|
64
|
+
instrument(:increment, key, amount: amount) do
|
65
|
+
modify_value(name, amount, options)
|
66
|
+
end
|
62
67
|
end
|
63
68
|
|
64
69
|
# Decrement a cached integer value. Returns the updated value.
|
@@ -73,7 +78,12 @@ module ActiveSupport
|
|
73
78
|
# cache.decrement("baz") # => 4
|
74
79
|
#
|
75
80
|
def decrement(name, amount = 1, options = nil)
|
76
|
-
|
81
|
+
options = merged_options(options)
|
82
|
+
key = normalize_key(name, options)
|
83
|
+
|
84
|
+
instrument(:decrement, key, amount: amount) do
|
85
|
+
modify_value(name, -amount, options)
|
86
|
+
end
|
77
87
|
end
|
78
88
|
|
79
89
|
def delete_matched(matcher, options = nil)
|
@@ -147,7 +147,9 @@ module ActiveSupport
|
|
147
147
|
# cache.increment("baz") # => 6
|
148
148
|
#
|
149
149
|
def increment(name, amount = 1, options = nil)
|
150
|
-
|
150
|
+
instrument(:increment, name, amount: amount) do
|
151
|
+
modify_value(name, amount, options)
|
152
|
+
end
|
151
153
|
end
|
152
154
|
|
153
155
|
# Decrement a cached integer value. Returns the updated value.
|
@@ -162,7 +164,9 @@ module ActiveSupport
|
|
162
164
|
# cache.decrement("baz") # => 4
|
163
165
|
#
|
164
166
|
def decrement(name, amount = 1, options = nil)
|
165
|
-
|
167
|
+
instrument(:decrement, name, amount: amount) do
|
168
|
+
modify_value(name, -amount, options)
|
169
|
+
end
|
166
170
|
end
|
167
171
|
|
168
172
|
# Deletes cache entries if the cache key matches a given pattern.
|
@@ -173,9 +173,12 @@ module ActiveSupport
|
|
173
173
|
return {} if names.empty?
|
174
174
|
|
175
175
|
options = names.extract_options!
|
176
|
-
|
176
|
+
options = merged_options(options)
|
177
|
+
keys = names.map { |name| normalize_key(name, options) }
|
178
|
+
|
179
|
+
instrument_multi(:read_multi, keys, options) do |payload|
|
177
180
|
read_multi_entries(names, **options).tap do |results|
|
178
|
-
payload[:hits] = results.keys
|
181
|
+
payload[:hits] = results.keys.map { |name| normalize_key(name, options) }
|
179
182
|
end
|
180
183
|
end
|
181
184
|
end
|
data/lib/active_support/cache.rb
CHANGED
@@ -538,10 +538,11 @@ module ActiveSupport
|
|
538
538
|
|
539
539
|
options = names.extract_options!
|
540
540
|
options = merged_options(options)
|
541
|
+
keys = names.map { |name| normalize_key(name, options) }
|
541
542
|
|
542
|
-
instrument_multi :read_multi,
|
543
|
+
instrument_multi :read_multi, keys, options do |payload|
|
543
544
|
read_multi_entries(names, **options, event: payload).tap do |results|
|
544
|
-
payload[:hits] = results.keys
|
545
|
+
payload[:hits] = results.keys.map { |name| normalize_key(name, options) }
|
545
546
|
end
|
546
547
|
end
|
547
548
|
end
|
@@ -551,8 +552,9 @@ module ActiveSupport
|
|
551
552
|
return hash if hash.empty?
|
552
553
|
|
553
554
|
options = merged_options(options)
|
555
|
+
normalized_hash = hash.transform_keys { |key| normalize_key(key, options) }
|
554
556
|
|
555
|
-
instrument_multi :write_multi,
|
557
|
+
instrument_multi :write_multi, normalized_hash, options do |payload|
|
556
558
|
entries = hash.each_with_object({}) do |(name, value), memo|
|
557
559
|
memo[normalize_key(name, options)] = Entry.new(value, **options.merge(version: normalize_version(name, options)))
|
558
560
|
end
|
@@ -596,9 +598,9 @@ module ActiveSupport
|
|
596
598
|
|
597
599
|
options = names.extract_options!
|
598
600
|
options = merged_options(options)
|
599
|
-
|
601
|
+
keys = names.map { |name| normalize_key(name, options) }
|
600
602
|
writes = {}
|
601
|
-
ordered = instrument_multi :read_multi,
|
603
|
+
ordered = instrument_multi :read_multi, keys, options do |payload|
|
602
604
|
if options[:force]
|
603
605
|
reads = {}
|
604
606
|
else
|
@@ -610,7 +612,7 @@ module ActiveSupport
|
|
610
612
|
end
|
611
613
|
writes.compact! if options[:skip_nil]
|
612
614
|
|
613
|
-
payload[:hits] = reads.keys
|
615
|
+
payload[:hits] = reads.keys.map { |name| normalize_key(name, options) }
|
614
616
|
payload[:super_operation] = :fetch_multi
|
615
617
|
|
616
618
|
ordered
|
@@ -943,9 +945,12 @@ module ActiveSupport
|
|
943
945
|
#
|
944
946
|
# namespace_key 'foo', namespace: -> { 'cache' }
|
945
947
|
# # => 'cache:foo'
|
946
|
-
def namespace_key(key,
|
947
|
-
|
948
|
-
|
948
|
+
def namespace_key(key, call_options = nil)
|
949
|
+
namespace = if call_options&.key?(:namespace)
|
950
|
+
call_options[:namespace]
|
951
|
+
else
|
952
|
+
options[:namespace]
|
953
|
+
end
|
949
954
|
|
950
955
|
if namespace.respond_to?(:call)
|
951
956
|
namespace = namespace.call
|
@@ -6,7 +6,6 @@ require "active_support/core_ext/array/extract_options"
|
|
6
6
|
require "active_support/core_ext/class/attribute"
|
7
7
|
require "active_support/core_ext/string/filters"
|
8
8
|
require "active_support/core_ext/object/blank"
|
9
|
-
require "thread"
|
10
9
|
|
11
10
|
module ActiveSupport
|
12
11
|
# = Active Support \Callbacks
|
@@ -67,7 +66,7 @@ module ActiveSupport
|
|
67
66
|
|
68
67
|
included do
|
69
68
|
extend ActiveSupport::DescendantsTracker
|
70
|
-
class_attribute :__callbacks, instance_writer: false, default: {}
|
69
|
+
class_attribute :__callbacks, instance_writer: false, instance_predicate: false, default: {}
|
71
70
|
end
|
72
71
|
|
73
72
|
CALLBACK_FILTER_TYPES = [:before, :after, :around].freeze
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveSupport
|
4
|
+
module ClassAttribute # :nodoc:
|
5
|
+
class << self
|
6
|
+
def redefine(owner, name, value)
|
7
|
+
if owner.singleton_class?
|
8
|
+
owner.redefine_method(name) { value }
|
9
|
+
owner.send(:public, name)
|
10
|
+
end
|
11
|
+
|
12
|
+
owner.redefine_singleton_method(name) { value }
|
13
|
+
owner.singleton_class.send(:public, name)
|
14
|
+
|
15
|
+
owner.redefine_singleton_method("#{name}=") do |new_value|
|
16
|
+
if owner.equal?(self)
|
17
|
+
value = new_value
|
18
|
+
else
|
19
|
+
::ActiveSupport::ClassAttribute.redefine(self, name, new_value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
owner.singleton_class.send(:public, "#{name}=")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -55,6 +55,11 @@ module ActiveSupport
|
|
55
55
|
@path = path
|
56
56
|
@line = line
|
57
57
|
@namespaces = Hash.new { |h, k| h[k] = MethodSet.new(k) }
|
58
|
+
@sources = []
|
59
|
+
end
|
60
|
+
|
61
|
+
def class_eval
|
62
|
+
yield @sources
|
58
63
|
end
|
59
64
|
|
60
65
|
def define_cached_method(canonical_name, namespace:, as: nil, &block)
|
@@ -65,6 +70,10 @@ module ActiveSupport
|
|
65
70
|
@namespaces.each_value do |method_set|
|
66
71
|
method_set.apply(@owner, @path, @line - 1)
|
67
72
|
end
|
73
|
+
|
74
|
+
unless @sources.empty?
|
75
|
+
@owner.class_eval("# frozen_string_literal: true\n" + @sources.join(";"), @path, @line - 1)
|
76
|
+
end
|
68
77
|
end
|
69
78
|
end
|
70
79
|
end
|
@@ -19,11 +19,20 @@ module ActiveSupport
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def parse(context: nil, **options)
|
22
|
-
source = render(context)
|
23
|
-
|
24
|
-
|
22
|
+
source = @content.include?("<%") ? render(context) : @content
|
23
|
+
|
24
|
+
if source == @content
|
25
|
+
if YAML.respond_to?(:unsafe_load)
|
26
|
+
YAML.unsafe_load_file(@content_path, **options) || {}
|
27
|
+
else
|
28
|
+
YAML.load_file(@content_path, **options) || {}
|
29
|
+
end
|
25
30
|
else
|
26
|
-
YAML.
|
31
|
+
if YAML.respond_to?(:unsafe_load)
|
32
|
+
YAML.unsafe_load(source, **options) || {}
|
33
|
+
else
|
34
|
+
YAML.load(source, **options) || {}
|
35
|
+
end
|
27
36
|
end
|
28
37
|
rescue Psych::SyntaxError => error
|
29
38
|
raise "YAML syntax error occurred while parsing #{@content_path}. " \
|
@@ -33,8 +42,7 @@ module ActiveSupport
|
|
33
42
|
|
34
43
|
private
|
35
44
|
def read(content_path)
|
36
|
-
require "yaml"
|
37
|
-
require "erb"
|
45
|
+
require "yaml" unless defined?(YAML)
|
38
46
|
|
39
47
|
File.read(content_path).tap do |content|
|
40
48
|
if content.include?("\u00A0")
|
@@ -44,6 +52,7 @@ module ActiveSupport
|
|
44
52
|
end
|
45
53
|
|
46
54
|
def render(context)
|
55
|
+
require "erb" unless defined?(ERB)
|
47
56
|
erb = ERB.new(@content).tap { |e| e.filename = @content_path }
|
48
57
|
context ? erb.result(context) : erb.result
|
49
58
|
end
|
@@ -3,14 +3,11 @@
|
|
3
3
|
require "benchmark"
|
4
4
|
|
5
5
|
class << Benchmark
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# # => 0.074
|
13
|
-
def ms(&block)
|
14
|
-
1000 * realtime(&block)
|
6
|
+
def ms(&block) # :nodoc
|
7
|
+
# NOTE: Please also remove the Active Support `benchmark` dependency when removing this
|
8
|
+
ActiveSupport.deprecator.warn <<~TEXT
|
9
|
+
`Benchmark.ms` is deprecated and will be removed in Rails 8.1 without replacement.
|
10
|
+
TEXT
|
11
|
+
ActiveSupport::Benchmark.realtime(:float_millisecond, &block)
|
15
12
|
end
|
16
13
|
end
|