activesupport 6.1.0 → 7.1.5.1
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 +1075 -325
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/lib/active_support/actionable_error.rb +4 -2
- data/lib/active_support/array_inquirer.rb +2 -2
- data/lib/active_support/backtrace_cleaner.rb +32 -7
- data/lib/active_support/benchmarkable.rb +3 -2
- data/lib/active_support/broadcast_logger.rb +251 -0
- data/lib/active_support/builder.rb +1 -1
- data/lib/active_support/cache/coder.rb +153 -0
- data/lib/active_support/cache/entry.rb +134 -0
- data/lib/active_support/cache/file_store.rb +53 -20
- data/lib/active_support/cache/mem_cache_store.rb +201 -62
- data/lib/active_support/cache/memory_store.rb +86 -24
- data/lib/active_support/cache/null_store.rb +16 -2
- data/lib/active_support/cache/redis_cache_store.rb +186 -193
- data/lib/active_support/cache/serializer_with_fallback.rb +175 -0
- data/lib/active_support/cache/strategy/local_cache.rb +63 -71
- data/lib/active_support/cache.rb +487 -249
- data/lib/active_support/callbacks.rb +227 -105
- data/lib/active_support/code_generator.rb +70 -0
- data/lib/active_support/concern.rb +9 -7
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +44 -7
- data/lib/active_support/concurrency/null_lock.rb +13 -0
- data/lib/active_support/concurrency/share_lock.rb +2 -2
- data/lib/active_support/configurable.rb +18 -5
- 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 +15 -13
- data/lib/active_support/core_ext/array/grouping.rb +6 -6
- data/lib/active_support/core_ext/array/inquiry.rb +2 -2
- data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
- data/lib/active_support/core_ext/class/subclasses.rb +37 -26
- data/lib/active_support/core_ext/date/blank.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +24 -9
- data/lib/active_support/core_ext/date/conversions.rb +16 -15
- data/lib/active_support/core_ext/date_and_time/calculations.rb +14 -4
- 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/calculations.rb +4 -0
- data/lib/active_support/core_ext/date_time/conversions.rb +19 -15
- data/lib/active_support/core_ext/digest/uuid.rb +30 -13
- data/lib/active_support/core_ext/enumerable.rb +85 -83
- data/lib/active_support/core_ext/erb/util.rb +196 -0
- data/lib/active_support/core_ext/file/atomic.rb +3 -1
- data/lib/active_support/core_ext/hash/conversions.rb +1 -2
- data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +3 -3
- data/lib/active_support/core_ext/hash/indifferent_access.rb +3 -3
- data/lib/active_support/core_ext/hash/keys.rb +4 -4
- data/lib/active_support/core_ext/integer/inflections.rb +12 -12
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
- data/lib/active_support/core_ext/kernel/singleton_class.rb +1 -1
- data/lib/active_support/core_ext/module/attribute_accessors.rb +8 -0
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +49 -22
- data/lib/active_support/core_ext/module/concerning.rb +6 -6
- data/lib/active_support/core_ext/module/delegation.rb +81 -43
- data/lib/active_support/core_ext/module/deprecation.rb +15 -12
- data/lib/active_support/core_ext/module/introspection.rb +0 -1
- data/lib/active_support/core_ext/name_error.rb +2 -8
- data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +82 -77
- 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 +17 -1
- data/lib/active_support/core_ext/object/duplicable.rb +31 -11
- data/lib/active_support/core_ext/object/inclusion.rb +13 -5
- data/lib/active_support/core_ext/object/instance_variables.rb +22 -12
- data/lib/active_support/core_ext/object/json.rb +49 -27
- data/lib/active_support/core_ext/object/to_query.rb +2 -4
- data/lib/active_support/core_ext/object/try.rb +20 -20
- data/lib/active_support/core_ext/object/with.rb +44 -0
- data/lib/active_support/core_ext/object/with_options.rb +25 -6
- data/lib/active_support/core_ext/object.rb +1 -0
- data/lib/active_support/core_ext/pathname/blank.rb +16 -0
- data/lib/active_support/core_ext/pathname/existence.rb +23 -0
- data/lib/active_support/core_ext/pathname.rb +4 -0
- data/lib/active_support/core_ext/range/compare_range.rb +0 -25
- data/lib/active_support/core_ext/range/conversions.rb +34 -13
- data/lib/active_support/core_ext/range/each.rb +1 -1
- data/lib/active_support/core_ext/range/overlap.rb +40 -0
- data/lib/active_support/core_ext/range.rb +1 -2
- data/lib/active_support/core_ext/securerandom.rb +25 -13
- data/lib/active_support/core_ext/string/conversions.rb +2 -2
- data/lib/active_support/core_ext/string/filters.rb +21 -15
- data/lib/active_support/core_ext/string/indent.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +17 -10
- data/lib/active_support/core_ext/string/inquiry.rb +1 -1
- data/lib/active_support/core_ext/string/output_safety.rb +85 -165
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
- data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
- data/lib/active_support/core_ext/time/calculations.rb +30 -8
- data/lib/active_support/core_ext/time/conversions.rb +15 -13
- data/lib/active_support/core_ext/time/zones.rb +12 -28
- data/lib/active_support/core_ext.rb +2 -1
- data/lib/active_support/current_attributes.rb +47 -20
- data/lib/active_support/deep_mergeable.rb +53 -0
- data/lib/active_support/dependencies/autoload.rb +17 -12
- 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 +66 -40
- data/lib/active_support/deprecation/constant_accessor.rb +5 -4
- data/lib/active_support/deprecation/deprecators.rb +104 -0
- data/lib/active_support/deprecation/disallowed.rb +6 -8
- data/lib/active_support/deprecation/instance_delegator.rb +31 -4
- data/lib/active_support/deprecation/method_wrappers.rb +9 -26
- data/lib/active_support/deprecation/proxy_wrappers.rb +38 -23
- data/lib/active_support/deprecation/reporting.rb +43 -26
- data/lib/active_support/deprecation.rb +32 -5
- data/lib/active_support/deprecator.rb +7 -0
- data/lib/active_support/descendants_tracker.rb +150 -72
- 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 -3
- data/lib/active_support/duration.rb +83 -52
- data/lib/active_support/encrypted_configuration.rb +72 -9
- data/lib/active_support/encrypted_file.rb +29 -13
- data/lib/active_support/environment_inquirer.rb +23 -3
- data/lib/active_support/error_reporter/test_helper.rb +15 -0
- data/lib/active_support/error_reporter.rb +203 -0
- data/lib/active_support/evented_file_update_checker.rb +20 -7
- 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 +44 -22
- data/lib/active_support/executor/test_helper.rb +7 -0
- data/lib/active_support/file_update_checker.rb +4 -2
- data/lib/active_support/fork_tracker.rb +28 -11
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/gzip.rb +2 -0
- data/lib/active_support/hash_with_indifferent_access.rb +44 -19
- data/lib/active_support/html_safe_translation.rb +53 -0
- data/lib/active_support/i18n.rb +2 -1
- data/lib/active_support/i18n_railtie.rb +21 -14
- data/lib/active_support/inflector/inflections.rb +25 -7
- data/lib/active_support/inflector/methods.rb +50 -64
- data/lib/active_support/inflector/transliterate.rb +4 -2
- data/lib/active_support/isolated_execution_state.rb +76 -0
- data/lib/active_support/json/decoding.rb +2 -1
- data/lib/active_support/json/encoding.rb +27 -45
- data/lib/active_support/key_generator.rb +31 -6
- data/lib/active_support/lazy_load_hooks.rb +33 -7
- data/lib/active_support/locale/en.yml +4 -2
- data/lib/active_support/log_subscriber/test_helper.rb +2 -2
- data/lib/active_support/log_subscriber.rb +97 -35
- data/lib/active_support/logger.rb +9 -60
- data/lib/active_support/logger_thread_safe_level.rb +11 -34
- data/lib/active_support/message_encryptor.rb +206 -56
- data/lib/active_support/message_encryptors.rb +141 -0
- data/lib/active_support/message_pack/cache_serializer.rb +23 -0
- data/lib/active_support/message_pack/extensions.rb +292 -0
- data/lib/active_support/message_pack/serializer.rb +63 -0
- data/lib/active_support/message_pack.rb +50 -0
- data/lib/active_support/message_verifier.rb +235 -84
- data/lib/active_support/message_verifiers.rb +135 -0
- data/lib/active_support/messages/codec.rb +65 -0
- data/lib/active_support/messages/metadata.rb +112 -46
- data/lib/active_support/messages/rotation_coordinator.rb +93 -0
- data/lib/active_support/messages/rotator.rb +34 -32
- data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
- data/lib/active_support/multibyte/chars.rb +12 -11
- data/lib/active_support/multibyte/unicode.rb +9 -49
- data/lib/active_support/multibyte.rb +1 -1
- data/lib/active_support/notifications/fanout.rb +304 -114
- data/lib/active_support/notifications/instrumenter.rb +117 -35
- data/lib/active_support/notifications.rb +25 -25
- data/lib/active_support/number_helper/number_converter.rb +14 -7
- 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 +4 -4
- data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -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 +379 -319
- data/lib/active_support/option_merger.rb +10 -18
- data/lib/active_support/ordered_hash.rb +4 -4
- data/lib/active_support/ordered_options.rb +15 -1
- data/lib/active_support/parameter_filter.rb +105 -81
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/railtie.rb +83 -21
- data/lib/active_support/reloader.rb +13 -5
- data/lib/active_support/rescuable.rb +18 -16
- data/lib/active_support/ruby_features.rb +7 -0
- data/lib/active_support/secure_compare_rotator.rb +18 -11
- data/lib/active_support/security_utils.rb +1 -1
- data/lib/active_support/string_inquirer.rb +3 -3
- data/lib/active_support/subscriber.rb +11 -40
- data/lib/active_support/syntax_error_proxy.rb +60 -0
- data/lib/active_support/tagged_logging.rb +65 -25
- data/lib/active_support/test_case.rb +166 -27
- data/lib/active_support/testing/assertions.rb +61 -15
- data/lib/active_support/testing/autorun.rb +0 -2
- data/lib/active_support/testing/constant_stubbing.rb +32 -0
- data/lib/active_support/testing/deprecation.rb +53 -2
- data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
- data/lib/active_support/testing/isolation.rb +30 -29
- data/lib/active_support/testing/method_call_assertions.rb +24 -11
- 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 +81 -0
- data/lib/active_support/testing/setup_and_teardown.rb +2 -0
- data/lib/active_support/testing/stream.rb +4 -6
- data/lib/active_support/testing/strict_warnings.rb +39 -0
- data/lib/active_support/testing/tagged_logging.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +49 -16
- data/lib/active_support/time_with_zone.rb +39 -28
- data/lib/active_support/values/time_zone.rb +50 -18
- data/lib/active_support/version.rb +1 -1
- data/lib/active_support/xml_mini/jdom.rb +4 -11
- 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 +5 -5
- data/lib/active_support/xml_mini/nokogirisax.rb +2 -2
- data/lib/active_support/xml_mini/rexml.rb +2 -2
- data/lib/active_support/xml_mini.rb +7 -6
- data/lib/active_support.rb +28 -1
- metadata +150 -18
- data/lib/active_support/core_ext/marshal.rb +0 -26
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -28
- data/lib/active_support/core_ext/range/overlaps.rb +0 -10
- data/lib/active_support/core_ext/uri.rb +0 -29
- data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
- data/lib/active_support/per_thread_registry.rb +0 -60
@@ -0,0 +1,175 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "zlib"
|
4
|
+
require "active_support/core_ext/kernel/reporting"
|
5
|
+
|
6
|
+
module ActiveSupport
|
7
|
+
module Cache
|
8
|
+
module SerializerWithFallback # :nodoc:
|
9
|
+
def self.[](format)
|
10
|
+
if format.to_s.include?("message_pack") && !defined?(ActiveSupport::MessagePack)
|
11
|
+
require "active_support/message_pack"
|
12
|
+
end
|
13
|
+
|
14
|
+
SERIALIZERS.fetch(format)
|
15
|
+
end
|
16
|
+
|
17
|
+
def load(dumped)
|
18
|
+
if dumped.is_a?(String)
|
19
|
+
case
|
20
|
+
when MessagePackWithFallback.dumped?(dumped)
|
21
|
+
MessagePackWithFallback._load(dumped)
|
22
|
+
when Marshal71WithFallback.dumped?(dumped)
|
23
|
+
Marshal71WithFallback._load(dumped)
|
24
|
+
when Marshal70WithFallback.dumped?(dumped)
|
25
|
+
Marshal70WithFallback._load(dumped)
|
26
|
+
else
|
27
|
+
Cache::Store.logger&.warn("Unrecognized payload prefix #{dumped.byteslice(0).inspect}; deserializing as nil")
|
28
|
+
nil
|
29
|
+
end
|
30
|
+
elsif PassthroughWithFallback.dumped?(dumped)
|
31
|
+
PassthroughWithFallback._load(dumped)
|
32
|
+
else
|
33
|
+
Cache::Store.logger&.warn("Unrecognized payload class #{dumped.class}; deserializing as nil")
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def marshal_load(payload)
|
40
|
+
Marshal.load(payload)
|
41
|
+
rescue ArgumentError => error
|
42
|
+
raise Cache::DeserializationError, error.message
|
43
|
+
end
|
44
|
+
|
45
|
+
module PassthroughWithFallback
|
46
|
+
include SerializerWithFallback
|
47
|
+
extend self
|
48
|
+
|
49
|
+
def dump(entry)
|
50
|
+
entry
|
51
|
+
end
|
52
|
+
|
53
|
+
def dump_compressed(entry, threshold)
|
54
|
+
entry.compressed(threshold)
|
55
|
+
end
|
56
|
+
|
57
|
+
def _load(entry)
|
58
|
+
entry
|
59
|
+
end
|
60
|
+
|
61
|
+
def dumped?(dumped)
|
62
|
+
dumped.is_a?(Cache::Entry)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
module Marshal61WithFallback
|
67
|
+
include SerializerWithFallback
|
68
|
+
extend self
|
69
|
+
|
70
|
+
MARSHAL_SIGNATURE = "\x04\x08".b.freeze
|
71
|
+
|
72
|
+
def dump(entry)
|
73
|
+
Marshal.dump(entry)
|
74
|
+
end
|
75
|
+
|
76
|
+
def dump_compressed(entry, threshold)
|
77
|
+
Marshal.dump(entry.compressed(threshold))
|
78
|
+
end
|
79
|
+
|
80
|
+
alias_method :_load, :marshal_load
|
81
|
+
public :_load
|
82
|
+
|
83
|
+
def dumped?(dumped)
|
84
|
+
dumped.start_with?(MARSHAL_SIGNATURE)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
module Marshal70WithFallback
|
89
|
+
include SerializerWithFallback
|
90
|
+
extend self
|
91
|
+
|
92
|
+
MARK_UNCOMPRESSED = "\x00".b.freeze
|
93
|
+
MARK_COMPRESSED = "\x01".b.freeze
|
94
|
+
|
95
|
+
def dump(entry)
|
96
|
+
MARK_UNCOMPRESSED + Marshal.dump(entry.pack)
|
97
|
+
end
|
98
|
+
|
99
|
+
def dump_compressed(entry, threshold)
|
100
|
+
dumped = Marshal.dump(entry.pack)
|
101
|
+
|
102
|
+
if dumped.bytesize >= threshold
|
103
|
+
compressed = Zlib::Deflate.deflate(dumped)
|
104
|
+
return MARK_COMPRESSED + compressed if compressed.bytesize < dumped.bytesize
|
105
|
+
end
|
106
|
+
|
107
|
+
MARK_UNCOMPRESSED + dumped
|
108
|
+
end
|
109
|
+
|
110
|
+
def _load(marked)
|
111
|
+
dumped = marked.byteslice(1..-1)
|
112
|
+
dumped = Zlib::Inflate.inflate(dumped) if marked.start_with?(MARK_COMPRESSED)
|
113
|
+
Cache::Entry.unpack(marshal_load(dumped))
|
114
|
+
end
|
115
|
+
|
116
|
+
def dumped?(dumped)
|
117
|
+
dumped.start_with?(MARK_UNCOMPRESSED, MARK_COMPRESSED)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
module Marshal71WithFallback
|
122
|
+
include SerializerWithFallback
|
123
|
+
extend self
|
124
|
+
|
125
|
+
MARSHAL_SIGNATURE = "\x04\x08".b.freeze
|
126
|
+
|
127
|
+
def dump(value)
|
128
|
+
Marshal.dump(value)
|
129
|
+
end
|
130
|
+
|
131
|
+
def _load(dumped)
|
132
|
+
marshal_load(dumped)
|
133
|
+
end
|
134
|
+
|
135
|
+
def dumped?(dumped)
|
136
|
+
dumped.start_with?(MARSHAL_SIGNATURE)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
module MessagePackWithFallback
|
141
|
+
include SerializerWithFallback
|
142
|
+
extend self
|
143
|
+
|
144
|
+
def dump(value)
|
145
|
+
ActiveSupport::MessagePack::CacheSerializer.dump(value)
|
146
|
+
end
|
147
|
+
|
148
|
+
def _load(dumped)
|
149
|
+
ActiveSupport::MessagePack::CacheSerializer.load(dumped)
|
150
|
+
end
|
151
|
+
|
152
|
+
def dumped?(dumped)
|
153
|
+
available? && ActiveSupport::MessagePack.signature?(dumped)
|
154
|
+
end
|
155
|
+
|
156
|
+
private
|
157
|
+
def available?
|
158
|
+
return @available if defined?(@available)
|
159
|
+
silence_warnings { require "active_support/message_pack" }
|
160
|
+
@available = true
|
161
|
+
rescue LoadError
|
162
|
+
@available = false
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
SERIALIZERS = {
|
167
|
+
passthrough: PassthroughWithFallback,
|
168
|
+
marshal_6_1: Marshal61WithFallback,
|
169
|
+
marshal_7_0: Marshal70WithFallback,
|
170
|
+
marshal_7_1: Marshal71WithFallback,
|
171
|
+
message_pack: MessagePackWithFallback,
|
172
|
+
}
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/core_ext/string/inflections"
|
4
|
-
require "active_support/per_thread_registry"
|
5
4
|
|
6
5
|
module ActiveSupport
|
7
6
|
module Cache
|
8
7
|
module Strategy
|
8
|
+
# = Local \Cache \Strategy
|
9
|
+
#
|
9
10
|
# Caches that implement LocalCache will be backed by an in-memory cache for the
|
10
11
|
# duration of a block. Repeated calls to the cache for the same key will hit the
|
11
12
|
# in-memory cache for faster access.
|
@@ -13,78 +14,58 @@ module ActiveSupport
|
|
13
14
|
autoload :Middleware, "active_support/cache/strategy/local_cache_middleware"
|
14
15
|
|
15
16
|
# Class for storing and registering the local caches.
|
16
|
-
|
17
|
-
extend
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@registry = {}
|
21
|
-
end
|
17
|
+
module LocalCacheRegistry # :nodoc:
|
18
|
+
extend self
|
22
19
|
|
23
20
|
def cache_for(local_cache_key)
|
24
|
-
|
21
|
+
registry = ActiveSupport::IsolatedExecutionState[:active_support_local_cache_registry] ||= {}
|
22
|
+
registry[local_cache_key]
|
25
23
|
end
|
26
24
|
|
27
25
|
def set_cache_for(local_cache_key, value)
|
28
|
-
|
26
|
+
registry = ActiveSupport::IsolatedExecutionState[:active_support_local_cache_registry] ||= {}
|
27
|
+
registry[local_cache_key] = value
|
29
28
|
end
|
30
|
-
|
31
|
-
def self.set_cache_for(l, v); instance.set_cache_for l, v; end
|
32
|
-
def self.cache_for(l); instance.cache_for l; end
|
33
29
|
end
|
34
30
|
|
31
|
+
# = Local \Cache \Store
|
32
|
+
#
|
35
33
|
# Simple memory backed cache. This cache is not thread safe and is intended only
|
36
34
|
# for serving as a temporary memory cache for a single thread.
|
37
|
-
class LocalStore
|
35
|
+
class LocalStore
|
38
36
|
def initialize
|
39
|
-
super
|
40
37
|
@data = {}
|
41
38
|
end
|
42
39
|
|
43
|
-
# Don't allow synchronizing since it isn't thread safe.
|
44
|
-
def synchronize # :nodoc:
|
45
|
-
yield
|
46
|
-
end
|
47
|
-
|
48
40
|
def clear(options = nil)
|
49
41
|
@data.clear
|
50
42
|
end
|
51
43
|
|
52
|
-
def read_entry(key
|
44
|
+
def read_entry(key)
|
53
45
|
@data[key]
|
54
46
|
end
|
55
47
|
|
56
|
-
def read_multi_entries(keys
|
57
|
-
|
58
|
-
|
59
|
-
keys.each do |name|
|
60
|
-
entry = read_entry(name, **options)
|
61
|
-
values[name] = entry.value if entry
|
62
|
-
end
|
63
|
-
|
64
|
-
values
|
48
|
+
def read_multi_entries(keys)
|
49
|
+
@data.slice(*keys)
|
65
50
|
end
|
66
51
|
|
67
|
-
def write_entry(key, entry
|
68
|
-
entry.dup_value!
|
52
|
+
def write_entry(key, entry)
|
69
53
|
@data[key] = entry
|
70
54
|
true
|
71
55
|
end
|
72
56
|
|
73
|
-
def delete_entry(key
|
57
|
+
def delete_entry(key)
|
74
58
|
!!@data.delete(key)
|
75
59
|
end
|
76
60
|
|
77
|
-
def fetch_entry(key
|
78
|
-
|
79
|
-
dup_entry = entry.dup
|
80
|
-
dup_entry&.dup_value!
|
81
|
-
dup_entry
|
61
|
+
def fetch_entry(key) # :nodoc:
|
62
|
+
@data.fetch(key) { @data[key] = yield }
|
82
63
|
end
|
83
64
|
end
|
84
65
|
|
85
66
|
# Use a local cache for the duration of block.
|
86
|
-
def with_local_cache
|
87
|
-
use_temporary_local_cache(LocalStore.new)
|
67
|
+
def with_local_cache(&block)
|
68
|
+
use_temporary_local_cache(LocalStore.new, &block)
|
88
69
|
end
|
89
70
|
|
90
71
|
# Middleware class can be inserted as a Rack handler to be local cache for the
|
@@ -95,90 +76,101 @@ module ActiveSupport
|
|
95
76
|
local_cache_key)
|
96
77
|
end
|
97
78
|
|
98
|
-
def clear(
|
79
|
+
def clear(options = nil) # :nodoc:
|
99
80
|
return super unless cache = local_cache
|
100
81
|
cache.clear(options)
|
101
82
|
super
|
102
83
|
end
|
103
84
|
|
104
|
-
def cleanup(
|
85
|
+
def cleanup(options = nil) # :nodoc:
|
105
86
|
return super unless cache = local_cache
|
106
|
-
cache.clear
|
87
|
+
cache.clear(options)
|
107
88
|
super
|
108
89
|
end
|
109
90
|
|
110
91
|
def delete_matched(matcher, options = nil) # :nodoc:
|
111
92
|
return super unless cache = local_cache
|
112
|
-
cache.clear
|
93
|
+
cache.clear(options)
|
113
94
|
super
|
114
95
|
end
|
115
96
|
|
116
|
-
def increment(name, amount = 1,
|
97
|
+
def increment(name, amount = 1, options = nil) # :nodoc:
|
117
98
|
return super unless local_cache
|
118
99
|
value = bypass_local_cache { super }
|
119
|
-
|
100
|
+
if options
|
101
|
+
write_cache_value(name, value, raw: true, **options)
|
102
|
+
else
|
103
|
+
write_cache_value(name, value, raw: true)
|
104
|
+
end
|
120
105
|
value
|
121
106
|
end
|
122
107
|
|
123
|
-
def decrement(name, amount = 1,
|
108
|
+
def decrement(name, amount = 1, options = nil) # :nodoc:
|
124
109
|
return super unless local_cache
|
125
110
|
value = bypass_local_cache { super }
|
126
|
-
|
111
|
+
if options
|
112
|
+
write_cache_value(name, value, raw: true, **options)
|
113
|
+
else
|
114
|
+
write_cache_value(name, value, raw: true)
|
115
|
+
end
|
127
116
|
value
|
128
117
|
end
|
129
118
|
|
130
119
|
private
|
131
|
-
def
|
120
|
+
def read_serialized_entry(key, raw: false, **options)
|
132
121
|
if cache = local_cache
|
133
122
|
hit = true
|
134
|
-
|
123
|
+
entry = cache.fetch_entry(key) do
|
135
124
|
hit = false
|
136
125
|
super
|
137
126
|
end
|
138
127
|
options[:event][:store] = cache.class.name if hit && options[:event]
|
139
|
-
|
128
|
+
entry
|
140
129
|
else
|
141
130
|
super
|
142
131
|
end
|
143
132
|
end
|
144
133
|
|
145
|
-
def read_multi_entries(
|
134
|
+
def read_multi_entries(names, **options)
|
146
135
|
return super unless local_cache
|
147
136
|
|
148
|
-
|
149
|
-
|
137
|
+
keys_to_names = names.index_by { |name| normalize_key(name, options) }
|
138
|
+
|
139
|
+
local_entries = local_cache.read_multi_entries(keys_to_names.keys)
|
140
|
+
local_entries.transform_keys! { |key| keys_to_names[key] }
|
141
|
+
local_entries.transform_values! do |payload|
|
142
|
+
deserialize_entry(payload, **options)&.value
|
143
|
+
end
|
144
|
+
missed_names = names - local_entries.keys
|
150
145
|
|
151
|
-
if
|
152
|
-
local_entries.merge!(super(
|
146
|
+
if missed_names.any?
|
147
|
+
local_entries.merge!(super(missed_names, **options))
|
153
148
|
else
|
154
149
|
local_entries
|
155
150
|
end
|
156
151
|
end
|
157
152
|
|
158
|
-
def
|
159
|
-
if
|
160
|
-
local_cache.
|
153
|
+
def write_serialized_entry(key, payload, **)
|
154
|
+
if return_value = super
|
155
|
+
local_cache.write_entry(key, payload) if local_cache
|
161
156
|
else
|
162
|
-
local_cache.
|
157
|
+
local_cache.delete_entry(key) if local_cache
|
163
158
|
end
|
164
|
-
|
165
|
-
super
|
159
|
+
return_value
|
166
160
|
end
|
167
161
|
|
168
|
-
def delete_entry(key, **
|
169
|
-
local_cache.delete_entry(key
|
162
|
+
def delete_entry(key, **)
|
163
|
+
local_cache.delete_entry(key) if local_cache
|
170
164
|
super
|
171
165
|
end
|
172
166
|
|
173
167
|
def write_cache_value(name, value, **options)
|
174
168
|
name = normalize_key(name, options)
|
175
169
|
cache = local_cache
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
cache.delete(name, **options)
|
181
|
-
end
|
170
|
+
if value
|
171
|
+
cache.write_entry(name, serialize_entry(new_entry(value, **options), **options))
|
172
|
+
else
|
173
|
+
cache.delete_entry(name)
|
182
174
|
end
|
183
175
|
end
|
184
176
|
|
@@ -190,8 +182,8 @@ module ActiveSupport
|
|
190
182
|
LocalCacheRegistry.cache_for(local_cache_key)
|
191
183
|
end
|
192
184
|
|
193
|
-
def bypass_local_cache
|
194
|
-
use_temporary_local_cache(nil)
|
185
|
+
def bypass_local_cache(&block)
|
186
|
+
use_temporary_local_cache(nil, &block)
|
195
187
|
end
|
196
188
|
|
197
189
|
def use_temporary_local_cache(temporary_cache)
|