typed_cache 0.3.2 → 0.4.0
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
- checksums.yaml.gz.sig +0 -0
- data/lib/typed_cache/backend.rb +72 -2
- data/lib/typed_cache/backends/active_support.rb +24 -98
- data/lib/typed_cache/backends/memory.rb +22 -73
- data/lib/typed_cache/backends.rb +2 -2
- data/lib/typed_cache/cache_builder.rb +131 -46
- data/lib/typed_cache/cache_key.rb +1 -1
- data/lib/typed_cache/cache_ref.rb +24 -55
- data/lib/typed_cache/decorator.rb +22 -12
- data/lib/typed_cache/decorators/instrumented.rb +12 -19
- data/lib/typed_cache/decorators.rb +7 -1
- data/lib/typed_cache/either.rb +28 -0
- data/lib/typed_cache/instrumenters.rb +6 -2
- data/lib/typed_cache/maybe.rb +28 -0
- data/lib/typed_cache/namespace.rb +1 -3
- data/lib/typed_cache/snapshot.rb +6 -0
- data/lib/typed_cache/store.rb +130 -78
- data/lib/typed_cache/version.rb +1 -1
- data/lib/typed_cache.rb +5 -2
- data/rbi/typed_cache/backend.rbi +41 -2
- data/rbi/typed_cache/backends/active_support.rbi +1 -1
- data/rbi/typed_cache/backends/memory.rbi +1 -1
- data/rbi/typed_cache/cache_builder.rbi +34 -10
- data/rbi/typed_cache/cache_key.rbi +14 -0
- data/rbi/typed_cache/cache_ref.rbi +6 -15
- data/rbi/typed_cache/decorator.rbi +23 -40
- data/rbi/typed_cache/decorators/instrumented.rbi +1 -1
- data/rbi/typed_cache/either.rbi +24 -0
- data/rbi/typed_cache/maybe.rbi +24 -0
- data/rbi/typed_cache/namespace.rbi +14 -0
- data/rbi/typed_cache/snapshot.rbi +6 -0
- data/rbi/typed_cache/store.rbi +26 -24
- data/rbi/typed_cache.rbi +1 -1
- data/sig/generated/typed_cache/backend.rbs +60 -2
- data/sig/generated/typed_cache/backends/active_support.rbs +13 -21
- data/sig/generated/typed_cache/backends/memory.rbs +10 -30
- data/sig/generated/typed_cache/backends.rbs +2 -2
- data/sig/generated/typed_cache/cache_builder.rbs +57 -16
- data/sig/generated/typed_cache/cache_ref.rbs +16 -37
- data/sig/generated/typed_cache/decorator.rbs +18 -6
- data/sig/generated/typed_cache/decorators/instrumented.rbs +3 -7
- data/sig/generated/typed_cache/decorators.rbs +9 -1
- data/sig/generated/typed_cache/either.rbs +24 -0
- data/sig/generated/typed_cache/instrumenters.rbs +4 -3
- data/sig/generated/typed_cache/maybe.rbs +24 -0
- data/sig/generated/typed_cache/namespace.rbs +0 -2
- data/sig/generated/typed_cache/snapshot.rbs +6 -0
- data/sig/generated/typed_cache/store.rbs +47 -40
- data/sig/generated/typed_cache.rbs +6 -2
- data.tar.gz.sig +0 -0
- metadata +3 -3
- metadata.gz.sig +4 -3
data/lib/typed_cache/store.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module TypedCache
|
4
|
-
# @rbs!
|
5
|
-
#
|
6
|
-
|
7
4
|
# Generic interface for type-safe cache storage implementations
|
8
5
|
# All stores are assumed to handle namespacing internally
|
9
6
|
#
|
@@ -12,31 +9,38 @@ module TypedCache
|
|
12
9
|
# - Queries (get, key?, fetch) ask questions without side effects
|
13
10
|
#
|
14
11
|
# @rbs generic V
|
15
|
-
|
12
|
+
class Store
|
16
13
|
# @rbs! type cache_key = String | CacheKey
|
17
14
|
|
18
15
|
# @rbs!
|
19
16
|
# interface _Store[V]
|
20
|
-
# def read: (cache_key) -> either[Error, Snapshot[V]]
|
21
|
-
# def read_all: (Array[cache_key]) -> either[Error,
|
17
|
+
# def read: (cache_key) -> either[Error, Snapshot[maybe[V]]]
|
18
|
+
# def read_all: (Array[cache_key]) -> either[Error, Hash[CacheKey, Snapshot[V]]]
|
22
19
|
# def ref: (cache_key) -> CacheRef[V]
|
23
20
|
# def write: (cache_key, V) -> either[Error, Snapshot[V]]
|
24
|
-
# def write_all: (Hash[cache_key, V]) -> either[Error,
|
25
|
-
# def delete: (cache_key) -> either[Error,
|
21
|
+
# def write_all: (Hash[cache_key, V]) -> either[Error, Hash[CacheKey, Snapshot[V]]]
|
22
|
+
# def delete: (cache_key) -> either[Error, maybe[V]]
|
26
23
|
# def key?: (cache_key) -> bool
|
27
|
-
# def clear: () ->
|
28
|
-
# def fetch: (cache_key) { () -> V? } -> either[Error, Snapshot[maybe[V]]]
|
24
|
+
# def clear: () -> void
|
25
|
+
# def fetch: (cache_key) { (CacheKey) -> V? } -> either[Error, Snapshot[maybe[V]]]
|
29
26
|
# def fetch_all: (Array[cache_key]) { (CacheKey) -> V? } -> either[Error, Array[Snapshot[V]]]
|
27
|
+
# def fetch_or_compute_all: (Array[cache_key]) { (Array[CacheKey]) -> Hash[CacheKey, V] } -> either[Error, Hash[CacheKey, Snapshot[V]]]
|
30
28
|
# def namespace: () -> Namespace
|
31
29
|
# def with_namespace: (Namespace) -> Store[V]
|
32
|
-
# def
|
30
|
+
# def at_namespace: (Namespace) -> Store[V]
|
31
|
+
# def cache_for: [T] (Class[T], at: (Namespace | String | Array[String])) -> Store[T]
|
32
|
+
# def backend: () -> Backend[V]
|
33
33
|
# end
|
34
34
|
# include _Store[V]
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
#
|
36
|
+
attr_reader :namespace #: Namespace
|
37
|
+
attr_reader :backend #: Backend[V]
|
38
|
+
|
39
|
+
# @rbs (Namespace, Backend[V]) -> void
|
40
|
+
def initialize(namespace, backend)
|
41
|
+
@namespace = namespace
|
42
|
+
@backend = backend
|
43
|
+
end
|
40
44
|
|
41
45
|
# @rbs (Store[V]) -> void
|
42
46
|
def initialize_copy(other)
|
@@ -45,18 +49,33 @@ module TypedCache
|
|
45
49
|
end
|
46
50
|
|
47
51
|
# Retrieves a value from the cache
|
48
|
-
# @rbs (cache_key, **top) -> either[Error, Snapshot[V]]
|
52
|
+
# @rbs (cache_key, **top) -> either[Error, Snapshot[maybe[V]]]
|
49
53
|
def read(key, **kwargs)
|
50
|
-
|
54
|
+
key = namespaced_key(key)
|
55
|
+
|
56
|
+
value = backend.read(key, **kwargs)
|
57
|
+
|
58
|
+
Either.right(
|
59
|
+
if value.nil?
|
60
|
+
Snapshot.cached(key, Maybe.none)
|
61
|
+
else
|
62
|
+
Snapshot.cached(key, Maybe.some(value))
|
63
|
+
end,
|
64
|
+
)
|
65
|
+
rescue => e
|
66
|
+
Either.left(StoreError.new(:read, key, "Failed to read from cache: #{e.message}", e))
|
51
67
|
end
|
52
68
|
|
53
|
-
# @rbs (Array[cache_key], **top) -> either[Error, Hash[
|
69
|
+
# @rbs (Array[cache_key], **top) -> either[Error, Hash[CacheKey, Snapshot[V]]]
|
54
70
|
def read_all(keys, **kwargs)
|
55
|
-
keys.map { |key|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
71
|
+
keys = keys.map { |key| namespaced_key(key) }
|
72
|
+
cached_values = backend.read_multi(keys, **kwargs)
|
73
|
+
|
74
|
+
keys.filter_map do |key|
|
75
|
+
next unless cached_values.key?(key.to_s)
|
76
|
+
|
77
|
+
[key, Snapshot.cached(key, cached_values[key.to_s])]
|
78
|
+
end.to_h
|
60
79
|
end
|
61
80
|
|
62
81
|
# Retrieves a cache reference for a key
|
@@ -68,76 +87,105 @@ module TypedCache
|
|
68
87
|
# Stores a value in the cache
|
69
88
|
# @rbs (cache_key, V, **top) -> either[Error, Snapshot[V]]
|
70
89
|
def write(key, value, **kwargs)
|
71
|
-
|
90
|
+
key = namespaced_key(key)
|
91
|
+
backend.write(key, value, **kwargs)
|
92
|
+
|
93
|
+
Either.right(Snapshot.cached(key, value))
|
94
|
+
rescue => e
|
95
|
+
Either.left(StoreError.new(:write, key, "Failed to write to cache: #{e.message}", e))
|
72
96
|
end
|
73
97
|
|
74
|
-
# @rbs (Hash[cache_key, V], **top) -> either[Error, Hash[
|
98
|
+
# @rbs (Hash[cache_key, V], **top) -> either[Error, Hash[CacheKey, Snapshot[V]]]
|
99
|
+
|
75
100
|
def write_all(values, **kwargs)
|
76
|
-
values.
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
101
|
+
values.transform_keys! { |key| namespaced_key(key) }
|
102
|
+
|
103
|
+
written_values = backend.write_multi(values, **kwargs)
|
104
|
+
written_values.transform_values { |value| Snapshot.cached(key, value) }
|
81
105
|
end
|
82
106
|
|
83
107
|
# Removes a value from the cache, returning the removed value
|
84
|
-
# @rbs (cache_key) -> either[Error,
|
108
|
+
# @rbs (cache_key) -> either[Error, maybe[V]]
|
85
109
|
def delete(key)
|
86
|
-
|
110
|
+
key = namespaced_key(key)
|
111
|
+
deleted_value = backend.delete(key)
|
112
|
+
|
113
|
+
Either.right(Maybe.wrap(deleted_value))
|
114
|
+
rescue => e
|
115
|
+
Either.left(StoreError.new(:delete, key, "Failed to delete from cache: #{e.message}", e))
|
87
116
|
end
|
88
117
|
|
89
118
|
# Checks if a key exists in the cache (query operation)
|
90
119
|
# @rbs (cache_key) -> bool
|
91
120
|
def key?(key)
|
92
|
-
|
121
|
+
key = namespaced_key(key)
|
122
|
+
backend.key?(key)
|
93
123
|
end
|
94
124
|
|
95
125
|
# Clears all values from the cache namespace (command operation)
|
96
|
-
# @rbs () ->
|
126
|
+
# @rbs () -> void
|
97
127
|
def clear
|
98
|
-
|
128
|
+
backend.clear
|
99
129
|
end
|
100
130
|
|
101
131
|
# Fetches a value from cache, computing and storing it if not found
|
102
132
|
# This is an atomic operation that combines read and write
|
103
|
-
# @rbs (cache_key, **top) { () -> V } -> either[Error, Snapshot[V]]
|
133
|
+
# @rbs (cache_key, **top) { (CacheKey) -> V? } -> either[Error, Snapshot[maybe[V]]]
|
104
134
|
def fetch(key, **kwargs, &block)
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
Either.right(
|
117
|
-
rescue => e
|
118
|
-
Either.left(StoreError.new(:fetch, key, "Failed to compute value for key '#{key}': #{e.message}", e))
|
135
|
+
key = namespaced_key(key)
|
136
|
+
computed = false
|
137
|
+
result = backend.fetch(key, **kwargs) do
|
138
|
+
computed = true
|
139
|
+
yield(key)
|
140
|
+
end
|
141
|
+
|
142
|
+
if result.nil?
|
143
|
+
Either.right(Snapshot.cached(key, Maybe.none))
|
144
|
+
else
|
145
|
+
snapshot = computed ? Snapshot.computed(key, result) : Snapshot.cached(key, result)
|
146
|
+
Either.right(snapshot.map { Maybe.wrap(_1) })
|
119
147
|
end
|
148
|
+
rescue => e
|
149
|
+
Either.left(StoreError.new(:fetch, key, "Failed to fetch from cache: #{e.message}", e))
|
120
150
|
end
|
121
151
|
|
122
|
-
# @rbs (Array[cache_key], **top) { (CacheKey) -> V } -> either[Error,
|
152
|
+
# @rbs (Array[cache_key], **top) { (CacheKey) -> V? } -> either[Error, Hash[CacheKey, Snapshot[V]]]
|
123
153
|
def fetch_all(keys, **kwargs, &block)
|
124
154
|
keys = keys.map { |key| namespaced_key(key) }
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
155
|
+
computed_keys = Set.new
|
156
|
+
fetched_values = backend.fetch_multi(keys, **kwargs) do |key|
|
157
|
+
computed_keys << key
|
158
|
+
yield(key)
|
129
159
|
end
|
160
|
+
|
161
|
+
Either.right(keys.to_h do |key|
|
162
|
+
snapshot = computed_keys.include?(key) ? Snapshot.computed(key, fetched_values[key]) : Snapshot.cached(key, fetched_values[key])
|
163
|
+
[key, snapshot]
|
164
|
+
end)
|
165
|
+
rescue => e
|
166
|
+
Either.left(StoreError.new(:fetch_all, keys, "Failed to fetch from cache: #{e.message}", e))
|
130
167
|
end
|
131
168
|
|
132
|
-
# @rbs () ->
|
133
|
-
def
|
169
|
+
# @rbs (Array[cache_key], **top) { (Array[CacheKey]) -> Hash[CacheKey, V] } -> either[Error, Hash[CacheKey, Snapshot[V]]]
|
170
|
+
def fetch_or_compute_all(keys, **kwargs, &block)
|
171
|
+
keys = keys.map { |key| namespaced_key(key) }
|
172
|
+
cached_values = backend.read_multi(keys, **kwargs)
|
173
|
+
missing_keys = keys - cached_values.keys
|
174
|
+
|
175
|
+
if missing_keys.any?
|
176
|
+
computed_values = yield(missing_keys)
|
177
|
+
backend.write_multi(computed_values, **kwargs)
|
178
|
+
end
|
134
179
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
180
|
+
cached_values.transform_values! { |value| Snapshot.cached(key, value) }
|
181
|
+
computed_values.transform_values! { |value| Snapshot.computed(key, value) }
|
182
|
+
|
183
|
+
cached_values.merge(computed_values)
|
139
184
|
end
|
140
185
|
|
186
|
+
# @rbs () -> Instrumenter
|
187
|
+
def instrumenter = @instrumenter ||= Instrumenters::Null.new(namespace:)
|
188
|
+
|
141
189
|
# Accepts a String segment or a fully-formed Namespace and returns a cloned
|
142
190
|
# store scoped to that namespace.
|
143
191
|
#: (Namespace | String | Array[String]) -> Store[V]
|
@@ -154,34 +202,38 @@ module TypedCache
|
|
154
202
|
clone.tap { |store| store.namespace = new_namespace }
|
155
203
|
end
|
156
204
|
|
157
|
-
#
|
158
|
-
|
159
|
-
|
160
|
-
|
205
|
+
# @rbs [T] (Class[T], at: (Namespace | String | Array[String])) -> Store[T]
|
206
|
+
def cache_for(klass, at: nil)
|
207
|
+
new_namespace =
|
208
|
+
case at
|
209
|
+
when Namespace then at
|
210
|
+
when Array then namespace.join(*at)
|
211
|
+
else
|
212
|
+
namespace.nested(at.to_s)
|
213
|
+
end
|
214
|
+
|
215
|
+
clone.tap { |store| store.namespace = new_namespace }
|
161
216
|
end
|
162
217
|
|
218
|
+
alias at_namespace with_namespace
|
219
|
+
|
220
|
+
# @rbs () -> String
|
221
|
+
def to_s = "Store(#{namespace})"
|
222
|
+
|
223
|
+
# @rbs () -> String
|
224
|
+
def inspect = "Store(#{namespace}, #{backend.inspect})"
|
225
|
+
|
163
226
|
protected
|
164
227
|
|
165
|
-
attr_writer :namespace
|
228
|
+
attr_writer :namespace
|
166
229
|
|
167
230
|
private
|
168
231
|
|
169
|
-
#: (String) -> String
|
170
|
-
def snake_case(string)
|
171
|
-
string
|
172
|
-
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
173
|
-
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
174
|
-
.tr('-', '_')
|
175
|
-
.downcase
|
176
|
-
end
|
177
|
-
|
178
232
|
#: (cache_key) -> CacheKey
|
179
233
|
def namespaced_key(key)
|
180
234
|
key.is_a?(CacheKey) ? key : CacheKey.new(namespace, key)
|
181
235
|
end
|
182
236
|
end
|
183
237
|
|
184
|
-
# @rbs! type
|
185
|
-
# @rbs! type decorator[V] = backend[V] & Store::_Decorator[V]
|
186
|
-
# @rbs! type store[V] = backend[V] | decorator[V]
|
238
|
+
# @rbs! type store[V] = Store::_Store[V]
|
187
239
|
end
|
data/lib/typed_cache/version.rb
CHANGED
data/lib/typed_cache.rb
CHANGED
@@ -34,6 +34,7 @@ module TypedCache
|
|
34
34
|
# interface _TypedCacheInstrumentationConfig
|
35
35
|
# def enabled: -> bool
|
36
36
|
# def namespace: -> String
|
37
|
+
# def instrumenter: -> Symbol
|
37
38
|
# end
|
38
39
|
|
39
40
|
# @rbs!
|
@@ -56,10 +57,12 @@ module TypedCache
|
|
56
57
|
end
|
57
58
|
|
58
59
|
class << self
|
60
|
+
# @rbs! type cache_definition = TypedCache::_CacheDefinition
|
61
|
+
|
59
62
|
# Returns a CacheBuilder with the fluent interface
|
60
|
-
# @rbs
|
63
|
+
# @rbs () -> cache_definition
|
61
64
|
def builder
|
62
|
-
CacheBuilder.new(
|
65
|
+
CacheBuilder.new(CacheDefinition.new, Backends, Decorators)
|
63
66
|
end
|
64
67
|
|
65
68
|
# @rbs! def config: -> _TypedCacheConfig
|
data/rbi/typed_cache/backend.rbi
CHANGED
@@ -3,7 +3,46 @@
|
|
3
3
|
module TypedCache
|
4
4
|
module Backend
|
5
5
|
extend T::Generic
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
abstract!
|
8
|
+
|
9
|
+
BackendType = type_member
|
10
|
+
|
11
|
+
KeyValue = T.type_alias { T.any(::TypedCache::CacheKey, String) }
|
12
|
+
|
13
|
+
sig { abstract.params(key: KeyValue, opts: T::Hash[Symbol, T.untyped]).returns(T.nilable(BackendType)) }
|
14
|
+
def read(key, **opts); end
|
15
|
+
|
16
|
+
sig { abstract.params(key: KeyValue, value: BackendType, opts: T::Hash[Symbol, T.untyped]).returns(BackendType) }
|
17
|
+
def write(key, value, **opts); end
|
18
|
+
|
19
|
+
sig { abstract.params(key: KeyValue, opts: T::Hash[Symbol, T.untyped]).returns(T.nilable(BackendType)) }
|
20
|
+
def delete(key, **opts); end
|
21
|
+
|
22
|
+
sig { abstract.params(keys: T::Array[KeyValue], opts: T::Hash[Symbol, T.untyped]).returns(T::Hash[KeyValue, BackendType]) }
|
23
|
+
def read_multi(keys, **opts); end
|
24
|
+
|
25
|
+
sig { abstract.params(values: T::Hash[KeyValue, BackendType], opts: T::Hash[Symbol, T.untyped]).returns(T::Hash[KeyValue, BackendType]) }
|
26
|
+
def write_multi(values, **opts); end
|
27
|
+
|
28
|
+
sig { abstract.void }
|
29
|
+
def clear; end
|
30
|
+
|
31
|
+
sig { abstract.params(key: KeyValue).returns(T::Boolean) }
|
32
|
+
def key?(key); end
|
33
|
+
|
34
|
+
sig do
|
35
|
+
abstract
|
36
|
+
.type_parameters(:K)
|
37
|
+
.params(key: T.all(KeyValue, T.type_parameter(:K)), opts: T::Hash[Symbol, T.untyped], block: T.proc.params(key: T.all(KeyValue, T.type_parameter(:K))).returns(T.nilable(BackendType))).returns(T.nilable(BackendType))
|
38
|
+
end
|
39
|
+
def fetch(key, **opts, &block); end
|
40
|
+
|
41
|
+
sig do
|
42
|
+
abstract
|
43
|
+
.type_parameters(:K)
|
44
|
+
.params(keys: T::Array[T.all(KeyValue, T.type_parameter(:K))], opts: T::Hash[Symbol, T.untyped], block: T.proc.params(key: T.all(KeyValue, T.type_parameter(:K))).returns(T.nilable(BackendType))).returns(T::Hash[T.all(KeyValue, T.type_parameter(:K)), BackendType])
|
45
|
+
end
|
46
|
+
def fetch_multi(keys, **opts, &block); end
|
8
47
|
end
|
9
48
|
end
|
@@ -1,23 +1,47 @@
|
|
1
1
|
# typed: strict
|
2
2
|
|
3
3
|
module TypedCache
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
InstrumenterSource = T.type_alias { T.any(Symbol, ::TypedCache::Instrumenter) }
|
4
|
+
module CacheDefinition
|
5
|
+
extend T::Sig
|
6
|
+
extend T::Helpers
|
8
7
|
|
9
|
-
|
8
|
+
InstrumenterSource = T.type_alias { T.any(Symbol, ::TypedCache::Instrumenter) }
|
10
9
|
|
11
|
-
|
12
|
-
|
10
|
+
abstract!
|
11
|
+
sealed!
|
13
12
|
|
14
|
-
sig { params(name: Symbol, args: T.untyped, options: T::Hash[Symbol, T.anything]).returns(T.
|
13
|
+
sig { abstract.params(name: Symbol, args: T.untyped, options: T::Hash[Symbol, T.anything]).returns(T.all(::TypedCache::CacheDefinition, ::TypedCache::CacheBuilding)) }
|
15
14
|
def with_backend(name, *args, **options); end
|
16
15
|
|
17
|
-
sig { params(name: Symbol, options: T::Hash[Symbol, T.anything]).returns(T.self_type) }
|
16
|
+
sig { abstract.params(name: Symbol, options: T::Hash[Symbol, T.anything]).returns(T.self_type) }
|
18
17
|
def with_decorator(name, **options); end
|
19
18
|
|
20
|
-
sig { params(source: InstrumenterSource).returns(T.self_type) }
|
19
|
+
sig { abstract.params(source: InstrumenterSource).returns(T.self_type) }
|
21
20
|
def with_instrumentation(source = T.unsafe(nil)); end
|
22
21
|
end
|
22
|
+
|
23
|
+
module CacheBuilding
|
24
|
+
extend T::Sig
|
25
|
+
extend T::Helpers
|
26
|
+
|
27
|
+
abstract!
|
28
|
+
sealed!
|
29
|
+
|
30
|
+
sig { abstract.params(namespace: ::TypedCache::Namespace).returns(::TypedCache::Either[::TypedCache::Error, ::TypedCache::Store[T.untyped]]) }
|
31
|
+
def build(namespace = T.unsafe(nil)); end
|
32
|
+
|
33
|
+
sig { abstract.params(namespace: ::TypedCache::Namespace).returns(::TypedCache::Store[T.untyped]) }
|
34
|
+
def build!(namespace = T.unsafe(nil)); end
|
35
|
+
|
36
|
+
sig { abstract.returns(::TypedCache::Either[::TypedCache::Error, ::TypedCache::Backend[T.untyped]]) }
|
37
|
+
def build_backend; end
|
38
|
+
|
39
|
+
sig { abstract.returns(::TypedCache::Backend[T.untyped]) }
|
40
|
+
def build_backend!; end
|
41
|
+
end
|
42
|
+
|
43
|
+
class CacheBuilder
|
44
|
+
include ::TypedCache::CacheBuilding
|
45
|
+
include ::TypedCache::CacheDefinition
|
46
|
+
end
|
23
47
|
end
|
@@ -12,5 +12,19 @@ module TypedCache
|
|
12
12
|
|
13
13
|
sig { returns(String) }
|
14
14
|
def to_s; end
|
15
|
+
|
16
|
+
sig { returns(String) }
|
17
|
+
def inspect; end
|
18
|
+
|
19
|
+
sig { returns(Integer) }
|
20
|
+
def hash; end
|
21
|
+
|
22
|
+
sig { params(other: Object).returns(T::Boolean) }
|
23
|
+
def ==(other); end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
sig { returns(String) }
|
28
|
+
def delimiter; end
|
15
29
|
end
|
16
30
|
end
|
@@ -29,28 +29,19 @@ module TypedCache
|
|
29
29
|
sig { params(block: T.proc.params(value: RefType).returns(RefType)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
|
30
30
|
def update(&block); end
|
31
31
|
|
32
|
-
sig { params(default: RefType).returns(RefType) }
|
33
|
-
def value_or(default); end
|
34
|
-
|
35
|
-
sig { returns(::TypedCache::Maybe[RefType]) }
|
36
|
-
def value_maybe; end
|
37
|
-
|
38
32
|
sig { params(block: T.proc.params(value: RefType).returns(RefType)).returns(::TypedCache::Either[Error, ::TypedCache::Snapshot[RefType]]) }
|
39
33
|
def compute_if_absent(&block); end
|
40
34
|
|
41
|
-
sig { params(new_key: String).returns(::TypedCache::CacheRef[RefType]) }
|
42
|
-
def with_key(new_key); end
|
43
|
-
|
44
|
-
sig { params(scope_key: String).returns(::TypedCache::CacheRef[RefType]) }
|
45
|
-
def scope(scope_key); end
|
46
|
-
|
47
|
-
sig { type_parameters(:T).params(left_fn: T.proc.params(value: Error).returns(T.type_parameter(:T)), right_fn: T.proc.params(value: ::TypedCache::Snapshot[RefType]).returns(T.type_parameter(:T))).returns(T.type_parameter(:T)) }
|
48
|
-
def fold(left_fn, right_fn); end
|
49
|
-
|
50
35
|
sig { type_parameters(:T).params(block: T.proc.params(value: ::TypedCache::Snapshot[RefType]).returns(T.type_parameter(:T))).returns(::TypedCache::Either[Error, T.type_parameter(:T)]) }
|
51
36
|
def with_snapshot(&block); end
|
52
37
|
|
53
38
|
sig { type_parameters(:T).params(block: T.proc.params(value: RefType).returns(T.type_parameter(:T))).returns(::TypedCache::Either[Error, T.type_parameter(:T)]) }
|
54
39
|
def with(&block); end
|
40
|
+
|
41
|
+
sig { returns(String) }
|
42
|
+
def to_s; end
|
43
|
+
|
44
|
+
sig { returns(String) }
|
45
|
+
def inspect; end
|
55
46
|
end
|
56
47
|
end
|
@@ -4,64 +4,47 @@ module TypedCache
|
|
4
4
|
module Decorator
|
5
5
|
extend T::Generic
|
6
6
|
|
7
|
-
include ::TypedCache::
|
7
|
+
include ::TypedCache::Backend
|
8
8
|
|
9
9
|
abstract!
|
10
10
|
|
11
|
-
|
11
|
+
BackendType = type_member
|
12
|
+
KeyValue = T.type_alias { TypedCache::Backend::KeyValue }
|
12
13
|
|
13
|
-
sig { params(
|
14
|
-
def initialize(
|
14
|
+
sig { params(backend: ::TypedCache::Backend[BackendType]).void }
|
15
|
+
def initialize(backend); end
|
15
16
|
|
16
|
-
sig {
|
17
|
-
def
|
17
|
+
sig { abstract.returns(::TypedCache::Backend[BackendType]) }
|
18
|
+
def backend; end
|
18
19
|
|
19
|
-
sig
|
20
|
-
def
|
20
|
+
sig { override.overridable.params(key: KeyValue, opts: T::Hash[Symbol, T.untyped]).returns(T.nilable(BackendType)) }
|
21
|
+
def read(key, **opts); end
|
21
22
|
|
22
|
-
sig { overridable.params(key:
|
23
|
-
def
|
23
|
+
sig { override.overridable.params(key: KeyValue, value: BackendType, opts: T::Hash[Symbol, T.untyped]).returns(BackendType) }
|
24
|
+
def write(key, value, **opts); end
|
24
25
|
|
25
|
-
sig { overridable.params(key:
|
26
|
-
def
|
26
|
+
sig { override.overridable.params(key: KeyValue, opts: T::Hash[Symbol, T.untyped]).returns(T.nilable(BackendType)) }
|
27
|
+
def delete(key, **opts); end
|
27
28
|
|
28
|
-
sig { overridable.params(key:
|
29
|
-
def delete(key); end
|
30
|
-
|
31
|
-
sig { overridable.params(key: T.any(String, ::TypedCache::CacheKey)).returns(T::Boolean) }
|
29
|
+
sig { override.overridable.params(key: KeyValue).returns(T::Boolean) }
|
32
30
|
def key?(key); end
|
33
31
|
|
34
|
-
sig { overridable.params(key:
|
35
|
-
def fetch(key, &block); end
|
32
|
+
sig { override.overridable.params(key: KeyValue, opts: T::Hash[Symbol, T.untyped], block: T.proc.returns(T.nilable(BackendType))).returns(T.nilable(BackendType)) }
|
33
|
+
def fetch(key, **opts, &block); end
|
36
34
|
|
37
|
-
sig { overridable.params(keys: T::Array[T
|
38
|
-
def
|
35
|
+
sig { override.overridable.params(keys: T::Array[KeyValue], opts: T::Hash[Symbol, T.untyped]).returns(T::Hash[KeyValue, BackendType]) }
|
36
|
+
def read_multi(keys, **opts); end
|
39
37
|
|
40
|
-
sig { overridable.params(keys: T::Array[T
|
41
|
-
def
|
38
|
+
sig { override.overridable.params(keys: T::Array[KeyValue], opts: T::Hash[Symbol, T.untyped], block: T.proc.params(key: KeyValue).returns(T.nilable(BackendType))).returns(T::Hash[KeyValue, BackendType]) }
|
39
|
+
def fetch_multi(keys, **opts, &block); end
|
42
40
|
|
43
|
-
sig { overridable.params(values: T::Hash[
|
44
|
-
def
|
41
|
+
sig { override.overridable.params(values: T::Hash[KeyValue, BackendType], opts: T::Hash[Symbol, T.untyped]).returns(T::Hash[KeyValue, BackendType]) }
|
42
|
+
def write_multi(values, **opts); end
|
45
43
|
|
46
|
-
sig { overridable.void }
|
44
|
+
sig { override.overridable.void }
|
47
45
|
def clear; end
|
48
46
|
|
49
|
-
sig(:final) { returns(::TypedCache::Namespace) }
|
50
|
-
def namespace; end
|
51
|
-
|
52
|
-
sig(:final) { params(namespace: ::TypedCache::Namespace).returns(::TypedCache::Store[CachedType]) }
|
53
|
-
def with_namespace(namespace); end
|
54
|
-
|
55
|
-
sig { abstract.returns(String) }
|
56
|
-
def store_type; end
|
57
|
-
|
58
47
|
sig { overridable.params(other: T.self_type).void }
|
59
48
|
def initialize_copy(other); end
|
60
|
-
|
61
|
-
sig(:final) { params(key: T.any(String, ::TypedCache::CacheKey)).returns(::TypedCache::CacheKey) }
|
62
|
-
def namespaced_key(key); end
|
63
|
-
|
64
|
-
sig { overridable.returns(::TypedCache::Instrumenter) }
|
65
|
-
def instrumenter; end
|
66
49
|
end
|
67
50
|
end
|
data/rbi/typed_cache/either.rbi
CHANGED
@@ -78,6 +78,18 @@ module TypedCache
|
|
78
78
|
|
79
79
|
sig { returns(T.noreturn) }
|
80
80
|
def right_or_raise!; end
|
81
|
+
|
82
|
+
sig { returns(String) }
|
83
|
+
def to_s; end
|
84
|
+
|
85
|
+
sig { returns(String) }
|
86
|
+
def inspect; end
|
87
|
+
|
88
|
+
sig { params(other: Object).returns(T::Boolean) }
|
89
|
+
def ==(other); end
|
90
|
+
|
91
|
+
sig { returns(Integer) }
|
92
|
+
def hash; end
|
81
93
|
end
|
82
94
|
|
83
95
|
class Right
|
@@ -118,5 +130,17 @@ module TypedCache
|
|
118
130
|
|
119
131
|
sig { returns(R) }
|
120
132
|
def right_or_raise!; end
|
133
|
+
|
134
|
+
sig { returns(String) }
|
135
|
+
def to_s; end
|
136
|
+
|
137
|
+
sig { returns(String) }
|
138
|
+
def inspect; end
|
139
|
+
|
140
|
+
sig { params(other: Object).returns(T::Boolean) }
|
141
|
+
def ==(other); end
|
142
|
+
|
143
|
+
sig { returns(Integer) }
|
144
|
+
def hash; end
|
121
145
|
end
|
122
146
|
end
|