safe_memoize 1.6.0 → 1.7.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/.github/workflows/ci.yml +31 -0
- data/CHANGELOG.md +28 -1
- data/README.md +185 -91
- data/ROADMAP.md +0 -11
- data/benchmarks/BENCHMARK.md +114 -0
- data/benchmarks/README.md +3 -1
- data/lib/safe_memoize/cache_record_methods.rb +4 -2
- data/lib/safe_memoize/class_methods.rb +65 -15
- data/lib/safe_memoize/ractor_shared_methods.rb +59 -8
- data/lib/safe_memoize/release_tooling.rb +19 -1
- data/lib/safe_memoize/stores/multilevel.rb +86 -0
- data/lib/safe_memoize/stores/xfetch.rb +129 -0
- data/lib/safe_memoize/version.rb +1 -1
- data/lib/safe_memoize.rb +2 -0
- data/sig/safe_memoize.rbs +42 -2
- metadata +5 -16
data/sig/safe_memoize.rbs
CHANGED
|
@@ -66,7 +66,7 @@ module SafeMemoize
|
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
module ClassMethods
|
|
69
|
-
def memoize: (Symbol | String method_name, ?ttl: Numeric?, ?max_size: Integer?, ?ttl_refresh: bool, ?if: (^(untyped result) -> boolish)?, ?unless: (^(untyped result) -> boolish)?, ?shared: bool, ?key: (^(*untyped args, **untyped kwargs) -> untyped)?, ?store: Stores::Base
|
|
69
|
+
def memoize: (Symbol | String method_name, ?ttl: Numeric?, ?max_size: Integer?, ?ttl_refresh: bool, ?if: (^(untyped result) -> boolish)?, ?unless: (^(untyped result) -> boolish)?, ?shared: bool, ?key: (^(*untyped args, **untyped kwargs) -> untyped)?, ?store: Stores::Base | Array[Stores::Base] | nil, ?fiber_local: bool, ?ractor_safe: bool, ?namespace: String?, ?shared_cache: String?, ?cache_bust: (^() -> untyped) | Symbol | nil, ?copy_on_read: bool, ?group: Symbol | String | nil, ?circuit_breaker: bool | Hash[Symbol, untyped] | nil, ?stampede_protection: bool | Numeric | nil, **untyped extension_options) -> void
|
|
70
70
|
def safe_memoize_store: () -> Stores::Base?
|
|
71
71
|
def safe_memoize_store=: (Stores::Base?) -> Stores::Base?
|
|
72
72
|
def safe_memoize_namespace: () -> String?
|
|
@@ -148,7 +148,7 @@ module SafeMemoize
|
|
|
148
148
|
|
|
149
149
|
def memo_ttl: (Numeric? ttl) -> Float?
|
|
150
150
|
def memo_expires_at: (Float? ttl) -> Float?
|
|
151
|
-
def memo_record: (untyped value, expires_at: Float?) -> memo_record
|
|
151
|
+
def memo_record: (untyped value, expires_at: Float?, ?delta: Float?) -> memo_record
|
|
152
152
|
def memo_record_value: (memo_record record) -> untyped
|
|
153
153
|
def memo_record_live?: (memo_record? record) -> bool
|
|
154
154
|
def memo_prune_expired_entries!: (Hash[memo_key, memo_record] cache) -> void
|
|
@@ -251,6 +251,14 @@ module SafeMemoize
|
|
|
251
251
|
end
|
|
252
252
|
|
|
253
253
|
module RactorSharedMethods
|
|
254
|
+
MUTEX_KEY: Symbol
|
|
255
|
+
PORTS: bool
|
|
256
|
+
|
|
257
|
+
def self.round_trip: (untyped supervisor, Symbol op, *untyped args) -> untyped
|
|
258
|
+
def self.round_trip_via_port: (untyped supervisor, Symbol op, *untyped args) -> untyped
|
|
259
|
+
def self.round_trip_via_queue: (untyped supervisor, Symbol op, *untyped args) -> untyped
|
|
260
|
+
def self.ractor_mutex: () -> Thread::Mutex
|
|
261
|
+
|
|
254
262
|
def reset_ractor_memo: (Symbol | String method_name, *untyped args, **untyped kwargs) -> void
|
|
255
263
|
def reset_all_ractor_memos: () -> void
|
|
256
264
|
def ractor_memoized?: (Symbol | String method_name, *untyped args, **untyped kwargs) -> bool
|
|
@@ -301,6 +309,38 @@ module SafeMemoize
|
|
|
301
309
|
def expired?: ({ expires_at: Float?, value: untyped, cached_at: Float }) -> bool
|
|
302
310
|
end
|
|
303
311
|
|
|
312
|
+
class Multilevel < Base
|
|
313
|
+
attr_reader stores: Array[Base]
|
|
314
|
+
|
|
315
|
+
def initialize: (*Base stores, ?promote_expires_in: Numeric?) -> void
|
|
316
|
+
def read: (untyped key) -> untyped
|
|
317
|
+
def write: (untyped key, untyped value, ?expires_in: Numeric?) -> void
|
|
318
|
+
def delete: (untyped key) -> void
|
|
319
|
+
def clear: () -> void
|
|
320
|
+
def keys: () -> Array[untyped]
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
class XFetch < Base
|
|
324
|
+
ENVELOPE_KEY: Symbol
|
|
325
|
+
DEFAULT_BETA: Float
|
|
326
|
+
DEFAULT_DELTA: Float
|
|
327
|
+
|
|
328
|
+
attr_reader wrapped_store: Base
|
|
329
|
+
attr_reader beta: Float
|
|
330
|
+
attr_reader delta: Float
|
|
331
|
+
|
|
332
|
+
def initialize: (Base store, ?beta: Numeric, ?delta: Numeric) -> void
|
|
333
|
+
def read: (untyped key) -> untyped
|
|
334
|
+
def write: (untyped key, untyped value, ?expires_in: Numeric?) -> void
|
|
335
|
+
def delete: (untyped key) -> void
|
|
336
|
+
def clear: () -> void
|
|
337
|
+
def keys: () -> Array[untyped]
|
|
338
|
+
|
|
339
|
+
private
|
|
340
|
+
|
|
341
|
+
def envelope?: (untyped value) -> bool
|
|
342
|
+
end
|
|
343
|
+
|
|
304
344
|
class CircuitBreaker < Base
|
|
305
345
|
DEFAULT_ERROR_THRESHOLD: Integer
|
|
306
346
|
DEFAULT_PROBE_INTERVAL: Float
|
metadata
CHANGED
|
@@ -1,28 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: safe_memoize
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.7.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chuck Smith
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
-
dependencies:
|
|
12
|
-
- !ruby/object:Gem::Dependency
|
|
13
|
-
name: simplecov
|
|
14
|
-
requirement: !ruby/object:Gem::Requirement
|
|
15
|
-
requirements:
|
|
16
|
-
- - "~>"
|
|
17
|
-
- !ruby/object:Gem::Version
|
|
18
|
-
version: '0.22'
|
|
19
|
-
type: :development
|
|
20
|
-
prerelease: false
|
|
21
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
-
requirements:
|
|
23
|
-
- - "~>"
|
|
24
|
-
- !ruby/object:Gem::Version
|
|
25
|
-
version: '0.22'
|
|
11
|
+
dependencies: []
|
|
26
12
|
description: 'SafeMemoize is a production-ready, zero-dependency memoization library
|
|
27
13
|
for Ruby. It uses Ruby''s prepend mechanism to wrap methods with a thread-safe cache
|
|
28
14
|
(Mutex + double-check locking) that correctly handles nil and false return values
|
|
@@ -49,6 +35,7 @@ files:
|
|
|
49
35
|
- ROADMAP.md
|
|
50
36
|
- Rakefile
|
|
51
37
|
- UPGRADING.md
|
|
38
|
+
- benchmarks/BENCHMARK.md
|
|
52
39
|
- benchmarks/README.md
|
|
53
40
|
- benchmarks/benchmark.rb
|
|
54
41
|
- codecov.yml
|
|
@@ -79,8 +66,10 @@ files:
|
|
|
79
66
|
- lib/safe_memoize/stores/base.rb
|
|
80
67
|
- lib/safe_memoize/stores/circuit_breaker.rb
|
|
81
68
|
- lib/safe_memoize/stores/memory.rb
|
|
69
|
+
- lib/safe_memoize/stores/multilevel.rb
|
|
82
70
|
- lib/safe_memoize/stores/rails_cache.rb
|
|
83
71
|
- lib/safe_memoize/stores/redis.rb
|
|
72
|
+
- lib/safe_memoize/stores/xfetch.rb
|
|
84
73
|
- lib/safe_memoize/version.rb
|
|
85
74
|
- rbi/safe_memoize.rbi
|
|
86
75
|
- sig/safe_memoize.rbs
|