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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55564d67820fd4fe967dda95b7bc33d6c52fb78db138513a3dc2112766ca6154
4
- data.tar.gz: 13fdaa235bba02a090b20b7b9b500099f41c660e0ad492ec1d19bcec9e8b0db0
3
+ metadata.gz: 84f54b95a9a31607080afb2afbad2e85d713cb2d24b0a126dd97cea864d443a6
4
+ data.tar.gz: 0be1410d11a82efb137f050b7236f6e7d8cde91d4d75cf1275c0ccc22fbc1ed7
5
5
  SHA512:
6
- metadata.gz: bd16d23507c10117ffd1acab7d286fcde27e2843b264c6a60e45b3825b159cee2c865746aee8800187e964144e2b3b57b0ea1909246afabab0ed1bfc4f59a14f
7
- data.tar.gz: 4d4572b182caf141e0033cb2fd4068406c74889fd0c9cf737cc18a89139cc50c13761b42c69760415a2e45b4831ea80900f3f9be8e7bfa71a2ee76355d951988
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Cache
5
- VERSION = '1.3.10'
5
+ VERSION = '1.3.12'
6
6
  end
7
7
  end
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
- close unless @using_local
30
- Legion::Cache::Local.shutdown if Legion::Cache::Local.connected?
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.10
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