activesupport 6.0.6.1 → 7.1.3.2
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 +865 -438
- data/MIT-LICENSE +1 -1
- data/README.rdoc +6 -6
- data/lib/active_support/actionable_error.rb +4 -2
- data/lib/active_support/array_inquirer.rb +4 -2
- data/lib/active_support/backtrace_cleaner.rb +30 -10
- data/lib/active_support/benchmarkable.rb +4 -3
- data/lib/active_support/broadcast_logger.rb +250 -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 +208 -63
- data/lib/active_support/cache/memory_store.rb +120 -38
- data/lib/active_support/cache/null_store.rb +16 -2
- data/lib/active_support/cache/redis_cache_store.rb +201 -208
- data/lib/active_support/cache/serializer_with_fallback.rb +175 -0
- data/lib/active_support/cache/strategy/local_cache.rb +73 -66
- data/lib/active_support/cache.rb +539 -261
- data/lib/active_support/callbacks.rb +273 -142
- data/lib/active_support/code_generator.rb +65 -0
- data/lib/active_support/concern.rb +53 -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 +19 -6
- data/lib/active_support/configuration_file.rb +51 -0
- 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/benchmark.rb +2 -2
- data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
- data/lib/active_support/core_ext/class/attribute.rb +34 -44
- data/lib/active_support/core_ext/class/subclasses.rb +19 -29
- 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 +18 -16
- data/lib/active_support/core_ext/date_and_time/calculations.rb +27 -4
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +15 -0
- 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 +146 -72
- 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 +3 -4
- data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +4 -4
- data/lib/active_support/core_ext/hash/indifferent_access.rb +3 -3
- data/lib/active_support/core_ext/hash/keys.rb +5 -5
- data/lib/active_support/core_ext/hash/slice.rb +3 -2
- 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/load_error.rb +1 -1
- data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
- data/lib/active_support/core_ext/module/attribute_accessors.rb +31 -29
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +51 -20
- data/lib/active_support/core_ext/module/concerning.rb +14 -8
- data/lib/active_support/core_ext/module/delegation.rb +75 -42
- data/lib/active_support/core_ext/module/deprecation.rb +15 -12
- data/lib/active_support/core_ext/module/introspection.rb +1 -26
- data/lib/active_support/core_ext/name_error.rb +23 -2
- data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +82 -73
- 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 +15 -4
- 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 +52 -28
- 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 +6 -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/regexp.rb +8 -1
- data/lib/active_support/core_ext/securerandom.rb +25 -13
- data/lib/active_support/core_ext/string/access.rb +5 -24
- data/lib/active_support/core_ext/string/conversions.rb +3 -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 +51 -10
- data/lib/active_support/core_ext/string/inquiry.rb +2 -1
- data/lib/active_support/core_ext/string/multibyte.rb +2 -2
- data/lib/active_support/core_ext/string/output_safety.rb +85 -194
- data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -2
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +6 -0
- data/lib/active_support/core_ext/symbol.rb +3 -0
- data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
- data/lib/active_support/core_ext/time/calculations.rb +46 -8
- data/lib/active_support/core_ext/time/conversions.rb +16 -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/test_helper.rb +13 -0
- data/lib/active_support/current_attributes.rb +54 -22
- 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 -769
- data/lib/active_support/deprecation/behaviors.rb +77 -38
- 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 +54 -0
- data/lib/active_support/deprecation/instance_delegator.rb +31 -5
- data/lib/active_support/deprecation/method_wrappers.rb +12 -28
- data/lib/active_support/deprecation/proxy_wrappers.rb +40 -25
- data/lib/active_support/deprecation/reporting.rb +76 -16
- data/lib/active_support/deprecation.rb +36 -4
- data/lib/active_support/deprecator.rb +7 -0
- data/lib/active_support/descendants_tracker.rb +150 -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 +24 -12
- data/lib/active_support/duration.rb +136 -56
- data/lib/active_support/encrypted_configuration.rb +72 -9
- data/lib/active_support/encrypted_file.rb +46 -13
- data/lib/active_support/environment_inquirer.rb +40 -0
- 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 +86 -137
- 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 +31 -12
- 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 +79 -0
- data/lib/active_support/gem_version.rb +5 -5
- data/lib/active_support/gzip.rb +2 -0
- data/lib/active_support/hash_with_indifferent_access.rb +86 -42
- 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 +29 -27
- data/lib/active_support/inflector/inflections.rb +26 -9
- data/lib/active_support/inflector/methods.rb +54 -64
- data/lib/active_support/inflector/transliterate.rb +7 -5
- data/lib/active_support/isolated_execution_state.rb +76 -0
- data/lib/active_support/json/decoding.rb +6 -5
- data/lib/active_support/json/encoding.rb +31 -45
- data/lib/active_support/key_generator.rb +32 -7
- data/lib/active_support/lazy_load_hooks.rb +33 -7
- data/lib/active_support/locale/en.yml +10 -4
- data/lib/active_support/log_subscriber/test_helper.rb +2 -2
- data/lib/active_support/log_subscriber.rb +101 -32
- data/lib/active_support/logger.rb +9 -60
- data/lib/active_support/logger_silence.rb +2 -26
- data/lib/active_support/logger_thread_safe_level.rb +24 -25
- data/lib/active_support/message_encryptor.rb +205 -58
- 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 +237 -86
- 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_configuration.rb +2 -1
- data/lib/active_support/messages/rotation_coordinator.rb +93 -0
- data/lib/active_support/messages/rotator.rb +35 -32
- data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
- data/lib/active_support/multibyte/chars.rb +15 -52
- data/lib/active_support/multibyte/unicode.rb +8 -122
- data/lib/active_support/multibyte.rb +1 -1
- data/lib/active_support/notifications/fanout.rb +310 -105
- data/lib/active_support/notifications/instrumenter.rb +113 -48
- data/lib/active_support/notifications.rb +56 -29
- data/lib/active_support/number_helper/number_converter.rb +15 -8
- 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_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +5 -5
- data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +9 -5
- data/lib/active_support/number_helper/rounding_helper.rb +12 -32
- data/lib/active_support/number_helper.rb +379 -304
- data/lib/active_support/option_merger.rb +11 -18
- data/lib/active_support/ordered_hash.rb +4 -4
- data/lib/active_support/ordered_options.rb +23 -3
- data/lib/active_support/parameter_filter.rb +104 -75
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/rails.rb +1 -4
- data/lib/active_support/railtie.rb +90 -6
- data/lib/active_support/reloader.rb +12 -4
- 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 +58 -0
- data/lib/active_support/security_utils.rb +19 -12
- data/lib/active_support/string_inquirer.rb +5 -3
- data/lib/active_support/subscriber.rb +23 -47
- data/lib/active_support/syntax_error_proxy.rb +70 -0
- data/lib/active_support/tagged_logging.rb +84 -23
- data/lib/active_support/test_case.rb +166 -27
- data/lib/active_support/testing/assertions.rb +73 -20
- 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 +82 -0
- data/lib/active_support/testing/parallelization/worker.rb +103 -0
- data/lib/active_support/testing/parallelization.rb +16 -95
- data/lib/active_support/testing/parallelize_executor.rb +81 -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 +89 -19
- data/lib/active_support/time_with_zone.rb +105 -70
- data/lib/active_support/values/time_zone.rb +59 -26
- 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 +9 -2
- data/lib/active_support/xml_mini.rb +7 -6
- data/lib/active_support.rb +40 -1
- metadata +127 -40
- data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -5
- data/lib/active_support/core_ext/hash/compact.rb +0 -5
- data/lib/active_support/core_ext/hash/transform_values.rb +0 -5
- data/lib/active_support/core_ext/marshal.rb +0 -24
- data/lib/active_support/core_ext/module/reachable.rb +0 -6
- data/lib/active_support/core_ext/numeric/inquiry.rb +0 -5
- data/lib/active_support/core_ext/range/include_range.rb +0 -9
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -23
- data/lib/active_support/core_ext/range/overlaps.rb +0 -10
- data/lib/active_support/core_ext/uri.rb +0 -25
- 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,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/object/duplicable"
|
4
3
|
require "active_support/core_ext/string/inflections"
|
5
|
-
require "active_support/per_thread_registry"
|
6
4
|
|
7
5
|
module ActiveSupport
|
8
6
|
module Cache
|
9
7
|
module Strategy
|
8
|
+
# = Local \Cache \Strategy
|
9
|
+
#
|
10
10
|
# Caches that implement LocalCache will be backed by an in-memory cache for the
|
11
11
|
# duration of a block. Repeated calls to the cache for the same key will hit the
|
12
12
|
# in-memory cache for faster access.
|
@@ -14,74 +14,58 @@ module ActiveSupport
|
|
14
14
|
autoload :Middleware, "active_support/cache/strategy/local_cache_middleware"
|
15
15
|
|
16
16
|
# Class for storing and registering the local caches.
|
17
|
-
|
18
|
-
extend
|
19
|
-
|
20
|
-
def initialize
|
21
|
-
@registry = {}
|
22
|
-
end
|
17
|
+
module LocalCacheRegistry # :nodoc:
|
18
|
+
extend self
|
23
19
|
|
24
20
|
def cache_for(local_cache_key)
|
25
|
-
|
21
|
+
registry = ActiveSupport::IsolatedExecutionState[:active_support_local_cache_registry] ||= {}
|
22
|
+
registry[local_cache_key]
|
26
23
|
end
|
27
24
|
|
28
25
|
def set_cache_for(local_cache_key, value)
|
29
|
-
|
26
|
+
registry = ActiveSupport::IsolatedExecutionState[:active_support_local_cache_registry] ||= {}
|
27
|
+
registry[local_cache_key] = value
|
30
28
|
end
|
31
|
-
|
32
|
-
def self.set_cache_for(l, v); instance.set_cache_for l, v; end
|
33
|
-
def self.cache_for(l); instance.cache_for l; end
|
34
29
|
end
|
35
30
|
|
31
|
+
# = Local \Cache \Store
|
32
|
+
#
|
36
33
|
# Simple memory backed cache. This cache is not thread safe and is intended only
|
37
34
|
# for serving as a temporary memory cache for a single thread.
|
38
|
-
class LocalStore
|
35
|
+
class LocalStore
|
39
36
|
def initialize
|
40
|
-
super
|
41
37
|
@data = {}
|
42
38
|
end
|
43
39
|
|
44
|
-
# Don't allow synchronizing since it isn't thread safe.
|
45
|
-
def synchronize # :nodoc:
|
46
|
-
yield
|
47
|
-
end
|
48
|
-
|
49
40
|
def clear(options = nil)
|
50
41
|
@data.clear
|
51
42
|
end
|
52
43
|
|
53
|
-
def read_entry(key
|
44
|
+
def read_entry(key)
|
54
45
|
@data[key]
|
55
46
|
end
|
56
47
|
|
57
|
-
def read_multi_entries(keys
|
58
|
-
|
59
|
-
|
60
|
-
keys.each do |name|
|
61
|
-
entry = read_entry(name, **options)
|
62
|
-
values[name] = entry.value if entry
|
63
|
-
end
|
64
|
-
|
65
|
-
values
|
48
|
+
def read_multi_entries(keys)
|
49
|
+
@data.slice(*keys)
|
66
50
|
end
|
67
51
|
|
68
|
-
def write_entry(key,
|
69
|
-
@data[key] =
|
52
|
+
def write_entry(key, entry)
|
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
|
61
|
+
def fetch_entry(key) # :nodoc:
|
78
62
|
@data.fetch(key) { @data[key] = yield }
|
79
63
|
end
|
80
64
|
end
|
81
65
|
|
82
66
|
# Use a local cache for the duration of block.
|
83
|
-
def with_local_cache
|
84
|
-
use_temporary_local_cache(LocalStore.new)
|
67
|
+
def with_local_cache(&block)
|
68
|
+
use_temporary_local_cache(LocalStore.new, &block)
|
85
69
|
end
|
86
70
|
|
87
71
|
# Middleware class can be inserted as a Rack handler to be local cache for the
|
@@ -92,78 +76,101 @@ module ActiveSupport
|
|
92
76
|
local_cache_key)
|
93
77
|
end
|
94
78
|
|
95
|
-
def clear(
|
79
|
+
def clear(options = nil) # :nodoc:
|
96
80
|
return super unless cache = local_cache
|
97
81
|
cache.clear(options)
|
98
82
|
super
|
99
83
|
end
|
100
84
|
|
101
|
-
def cleanup(
|
85
|
+
def cleanup(options = nil) # :nodoc:
|
102
86
|
return super unless cache = local_cache
|
103
|
-
cache.clear
|
87
|
+
cache.clear(options)
|
104
88
|
super
|
105
89
|
end
|
106
90
|
|
107
|
-
def
|
91
|
+
def delete_matched(matcher, options = nil) # :nodoc:
|
92
|
+
return super unless cache = local_cache
|
93
|
+
cache.clear(options)
|
94
|
+
super
|
95
|
+
end
|
96
|
+
|
97
|
+
def increment(name, amount = 1, options = nil) # :nodoc:
|
108
98
|
return super unless local_cache
|
109
99
|
value = bypass_local_cache { super }
|
110
|
-
|
100
|
+
if options
|
101
|
+
write_cache_value(name, value, raw: true, **options)
|
102
|
+
else
|
103
|
+
write_cache_value(name, value, raw: true)
|
104
|
+
end
|
111
105
|
value
|
112
106
|
end
|
113
107
|
|
114
|
-
def decrement(name, amount = 1,
|
108
|
+
def decrement(name, amount = 1, options = nil) # :nodoc:
|
115
109
|
return super unless local_cache
|
116
110
|
value = bypass_local_cache { super }
|
117
|
-
|
111
|
+
if options
|
112
|
+
write_cache_value(name, value, raw: true, **options)
|
113
|
+
else
|
114
|
+
write_cache_value(name, value, raw: true)
|
115
|
+
end
|
118
116
|
value
|
119
117
|
end
|
120
118
|
|
121
119
|
private
|
122
|
-
def
|
120
|
+
def read_serialized_entry(key, raw: false, **options)
|
123
121
|
if cache = local_cache
|
124
|
-
|
122
|
+
hit = true
|
123
|
+
entry = cache.fetch_entry(key) do
|
124
|
+
hit = false
|
125
|
+
super
|
126
|
+
end
|
127
|
+
options[:event][:store] = cache.class.name if hit && options[:event]
|
128
|
+
entry
|
125
129
|
else
|
126
130
|
super
|
127
131
|
end
|
128
132
|
end
|
129
133
|
|
130
|
-
def read_multi_entries(
|
134
|
+
def read_multi_entries(names, **options)
|
131
135
|
return super unless local_cache
|
132
136
|
|
133
|
-
|
134
|
-
missed_keys = keys - local_entries.keys
|
137
|
+
keys_to_names = names.index_by { |name| normalize_key(name, options) }
|
135
138
|
|
136
|
-
|
137
|
-
|
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
|
145
|
+
|
146
|
+
if missed_names.any?
|
147
|
+
local_entries.merge!(super(missed_names, **options))
|
138
148
|
else
|
139
149
|
local_entries
|
140
150
|
end
|
141
151
|
end
|
142
152
|
|
143
|
-
def
|
144
|
-
if
|
145
|
-
local_cache.
|
153
|
+
def write_serialized_entry(key, payload, **)
|
154
|
+
if return_value = super
|
155
|
+
local_cache.write_entry(key, payload) if local_cache
|
146
156
|
else
|
147
|
-
local_cache.
|
157
|
+
local_cache.delete_entry(key) if local_cache
|
148
158
|
end
|
149
|
-
|
150
|
-
super
|
159
|
+
return_value
|
151
160
|
end
|
152
161
|
|
153
|
-
def delete_entry(key, **
|
154
|
-
local_cache.delete_entry(key
|
162
|
+
def delete_entry(key, **)
|
163
|
+
local_cache.delete_entry(key) if local_cache
|
155
164
|
super
|
156
165
|
end
|
157
166
|
|
158
167
|
def write_cache_value(name, value, **options)
|
159
168
|
name = normalize_key(name, options)
|
160
169
|
cache = local_cache
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
cache.delete(name, **options)
|
166
|
-
end
|
170
|
+
if value
|
171
|
+
cache.write_entry(name, serialize_entry(new_entry(value, **options), **options))
|
172
|
+
else
|
173
|
+
cache.delete_entry(name)
|
167
174
|
end
|
168
175
|
end
|
169
176
|
|
@@ -175,8 +182,8 @@ module ActiveSupport
|
|
175
182
|
LocalCacheRegistry.cache_for(local_cache_key)
|
176
183
|
end
|
177
184
|
|
178
|
-
def bypass_local_cache
|
179
|
-
use_temporary_local_cache(nil)
|
185
|
+
def bypass_local_cache(&block)
|
186
|
+
use_temporary_local_cache(nil, &block)
|
180
187
|
end
|
181
188
|
|
182
189
|
def use_temporary_local_cache(temporary_cache)
|