legion-cache 1.3.10 → 1.3.12
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 +15 -0
- data/lib/legion/cache/helper.rb +68 -0
- data/lib/legion/cache/memory.rb +89 -0
- data/lib/legion/cache/version.rb +1 -1
- data/lib/legion/cache.rb +23 -2
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 84f54b95a9a31607080afb2afbad2e85d713cb2d24b0a126dd97cea864d443a6
|
|
4
|
+
data.tar.gz: 0be1410d11a82efb137f050b7236f6e7d8cde91d4d75cf1275c0ccc22fbc1ed7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e581d3e4d49937215c091f309939985b174516a5fa78619e499bc5a2d01e6ac389c438fcf5bdc63d883ca72b08bc082e0926f88ffbc7fbae2578198ca6aad954
|
|
7
|
+
data.tar.gz: a1618ccbad942d1c73bb0f549a6485f2883371b67d9bd3beded87aa58eb71bcdf092579c1d640afa80e3e98567c49e4e5cd6e4cd40f1bc0cf179ee188f219688
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.3.12] - 2026-03-24
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- `Legion::Cache::Memory` adapter module for lite mode: pure in-memory cache with TTL expiry and thread-safe Mutex synchronization
|
|
7
|
+
- Cache `setup` auto-detects `LEGION_MODE=lite` and activates Memory adapter, skipping Redis/Memcached
|
|
8
|
+
- `@using_memory` flag routes `get`/`set`/`fetch`/`delete`/`flush` through Memory adapter
|
|
9
|
+
- `shutdown` cleanly tears down Memory adapter when active
|
|
10
|
+
|
|
11
|
+
## [1.3.11] - 2026-03-22
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- `Legion::Cache::Helper` module: injectable cache mixin for LEX extensions
|
|
15
|
+
- Namespaced `cache_set`, `cache_get`, `cache_delete`, `cache_fetch` for shared cache
|
|
16
|
+
- Namespaced `local_cache_set`, `local_cache_get`, `local_cache_delete`, `local_cache_fetch` for per-node local cache
|
|
17
|
+
|
|
3
18
|
## [1.3.10] - 2026-03-22
|
|
4
19
|
|
|
5
20
|
### Changed
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Cache
|
|
5
|
+
module Helper
|
|
6
|
+
def cache_namespace
|
|
7
|
+
@cache_namespace ||= derive_cache_namespace
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def cache_set(key, value, ttl: 60)
|
|
11
|
+
Legion::Cache.set(cache_namespace + key, value, ttl)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def cache_get(key)
|
|
15
|
+
Legion::Cache.get(cache_namespace + key)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def cache_delete(key)
|
|
19
|
+
Legion::Cache.delete(cache_namespace + key)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def cache_fetch(key, ttl: 60, &)
|
|
23
|
+
Legion::Cache.fetch(cache_namespace + key, ttl, &)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def local_cache_set(key, value, ttl: 60)
|
|
27
|
+
Legion::Cache::Local.set(cache_namespace + key, value, ttl)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def local_cache_get(key)
|
|
31
|
+
Legion::Cache::Local.get(cache_namespace + key)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def local_cache_delete(key)
|
|
35
|
+
Legion::Cache::Local.delete(cache_namespace + key)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def local_cache_fetch(key, ttl: 60, &)
|
|
39
|
+
Legion::Cache::Local.fetch(cache_namespace + key, ttl, &)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def derive_cache_namespace
|
|
45
|
+
if respond_to?(:lex_filename)
|
|
46
|
+
fname = lex_filename
|
|
47
|
+
fname.is_a?(Array) ? fname.first : fname
|
|
48
|
+
else
|
|
49
|
+
derive_cache_namespace_from_class
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def derive_cache_namespace_from_class
|
|
54
|
+
name = respond_to?(:ancestors) ? ancestors.first.to_s : self.class.to_s
|
|
55
|
+
parts = name.split('::')
|
|
56
|
+
ext_idx = parts.index('Extensions')
|
|
57
|
+
target = if ext_idx && parts[ext_idx + 1]
|
|
58
|
+
parts[ext_idx + 1]
|
|
59
|
+
else
|
|
60
|
+
parts.last
|
|
61
|
+
end
|
|
62
|
+
target.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
|
63
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
|
64
|
+
.downcase
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Cache
|
|
5
|
+
module Memory
|
|
6
|
+
extend self
|
|
7
|
+
|
|
8
|
+
@store = {}
|
|
9
|
+
@expiry = {}
|
|
10
|
+
@mutex = Mutex.new
|
|
11
|
+
@connected = false
|
|
12
|
+
|
|
13
|
+
def setup(**)
|
|
14
|
+
@connected = true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def client(**) = self
|
|
18
|
+
|
|
19
|
+
def connected?
|
|
20
|
+
@connected
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def get(key)
|
|
24
|
+
@mutex.synchronize do
|
|
25
|
+
expire_if_needed(key)
|
|
26
|
+
@store[key]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def set(key, value, ttl = nil)
|
|
31
|
+
@mutex.synchronize do
|
|
32
|
+
@store[key] = value
|
|
33
|
+
@expiry[key] = Time.now + ttl if ttl&.positive?
|
|
34
|
+
value
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def fetch(key, ttl = nil)
|
|
39
|
+
val = get(key)
|
|
40
|
+
return val unless val.nil?
|
|
41
|
+
|
|
42
|
+
val = yield if block_given?
|
|
43
|
+
set(key, val, ttl)
|
|
44
|
+
val
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def delete(key)
|
|
48
|
+
@mutex.synchronize do
|
|
49
|
+
@store.delete(key)
|
|
50
|
+
@expiry.delete(key)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def flush(_delay = 0)
|
|
55
|
+
@mutex.synchronize do
|
|
56
|
+
@store.clear
|
|
57
|
+
@expiry.clear
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def close = nil
|
|
62
|
+
|
|
63
|
+
def shutdown
|
|
64
|
+
flush
|
|
65
|
+
@connected = false
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def reset!
|
|
69
|
+
@mutex.synchronize do
|
|
70
|
+
@store.clear
|
|
71
|
+
@expiry.clear
|
|
72
|
+
@connected = false
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def size = 1
|
|
77
|
+
def available = 1
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def expire_if_needed(key)
|
|
82
|
+
return unless @expiry.key?(key) && Time.now > @expiry[key]
|
|
83
|
+
|
|
84
|
+
@store.delete(key)
|
|
85
|
+
@expiry.delete(key)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
data/lib/legion/cache/version.rb
CHANGED
data/lib/legion/cache.rb
CHANGED
|
@@ -6,7 +6,9 @@ require 'legion/cache/cacheable'
|
|
|
6
6
|
|
|
7
7
|
require 'legion/cache/memcached'
|
|
8
8
|
require 'legion/cache/redis'
|
|
9
|
+
require 'legion/cache/memory'
|
|
9
10
|
require 'legion/cache/local'
|
|
11
|
+
require 'legion/cache/helper'
|
|
10
12
|
|
|
11
13
|
module Legion
|
|
12
14
|
module Cache
|
|
@@ -20,15 +22,29 @@ module Legion
|
|
|
20
22
|
def setup(**)
|
|
21
23
|
return Legion::Settings[:cache][:connected] = true if connected?
|
|
22
24
|
|
|
25
|
+
if ENV['LEGION_MODE'] == 'lite'
|
|
26
|
+
Legion::Cache::Memory.setup
|
|
27
|
+
@using_memory = true
|
|
28
|
+
@connected = true
|
|
29
|
+
Legion::Settings[:cache][:connected] = true
|
|
30
|
+
Legion::Logging.info 'Legion::Cache using in-memory adapter (lite mode)' if defined?(Legion::Logging)
|
|
31
|
+
return
|
|
32
|
+
end
|
|
33
|
+
|
|
23
34
|
setup_local
|
|
24
35
|
setup_shared(**)
|
|
25
36
|
end
|
|
26
37
|
|
|
27
38
|
def shutdown
|
|
28
39
|
Legion::Logging.info 'Shutting down Legion::Cache'
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
if @using_memory
|
|
41
|
+
Legion::Cache::Memory.shutdown
|
|
42
|
+
else
|
|
43
|
+
close unless @using_local
|
|
44
|
+
Legion::Cache::Local.shutdown if Legion::Cache::Local.connected?
|
|
45
|
+
end
|
|
31
46
|
@using_local = false
|
|
47
|
+
@using_memory = false
|
|
32
48
|
@connected = false
|
|
33
49
|
Legion::Settings[:cache][:connected] = false
|
|
34
50
|
end
|
|
@@ -42,30 +58,35 @@ module Legion
|
|
|
42
58
|
end
|
|
43
59
|
|
|
44
60
|
def get(key)
|
|
61
|
+
return Legion::Cache::Memory.get(key) if @using_memory
|
|
45
62
|
return Legion::Cache::Local.get(key) if @using_local
|
|
46
63
|
|
|
47
64
|
super
|
|
48
65
|
end
|
|
49
66
|
|
|
50
67
|
def set(key, value, ttl = 180)
|
|
68
|
+
return Legion::Cache::Memory.set(key, value, ttl) if @using_memory
|
|
51
69
|
return Legion::Cache::Local.set(key, value, ttl) if @using_local
|
|
52
70
|
|
|
53
71
|
super
|
|
54
72
|
end
|
|
55
73
|
|
|
56
74
|
def fetch(key, ttl = nil)
|
|
75
|
+
return Legion::Cache::Memory.fetch(key, ttl) if @using_memory
|
|
57
76
|
return Legion::Cache::Local.fetch(key, ttl) if @using_local
|
|
58
77
|
|
|
59
78
|
super
|
|
60
79
|
end
|
|
61
80
|
|
|
62
81
|
def delete(key)
|
|
82
|
+
return Legion::Cache::Memory.delete(key) if @using_memory
|
|
63
83
|
return Legion::Cache::Local.delete(key) if @using_local
|
|
64
84
|
|
|
65
85
|
super
|
|
66
86
|
end
|
|
67
87
|
|
|
68
88
|
def flush(delay = 0)
|
|
89
|
+
return Legion::Cache::Memory.flush(delay) if @using_memory
|
|
69
90
|
return Legion::Cache::Local.flush(delay) if @using_local
|
|
70
91
|
|
|
71
92
|
super
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: legion-cache
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.3.
|
|
4
|
+
version: 1.3.12
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esity
|
|
@@ -101,8 +101,10 @@ files:
|
|
|
101
101
|
- legion-cache.gemspec
|
|
102
102
|
- lib/legion/cache.rb
|
|
103
103
|
- lib/legion/cache/cacheable.rb
|
|
104
|
+
- lib/legion/cache/helper.rb
|
|
104
105
|
- lib/legion/cache/local.rb
|
|
105
106
|
- lib/legion/cache/memcached.rb
|
|
107
|
+
- lib/legion/cache/memory.rb
|
|
106
108
|
- lib/legion/cache/pool.rb
|
|
107
109
|
- lib/legion/cache/redis.rb
|
|
108
110
|
- lib/legion/cache/settings.rb
|