legion-cache 1.3.12 → 1.3.14

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: 84f54b95a9a31607080afb2afbad2e85d713cb2d24b0a126dd97cea864d443a6
4
- data.tar.gz: 0be1410d11a82efb137f050b7236f6e7d8cde91d4d75cf1275c0ccc22fbc1ed7
3
+ metadata.gz: fa8e7d0e05c4dbdf4c720b2d431f88ed5a7efa7dcacb8220791c6b5b6044e468
4
+ data.tar.gz: 74bc4911f37e02ee84ef0236a5aaeb31ce40b868fb153e15b85e81479970114f
5
5
  SHA512:
6
- metadata.gz: e581d3e4d49937215c091f309939985b174516a5fa78619e499bc5a2d01e6ac389c438fcf5bdc63d883ca72b08bc082e0926f88ffbc7fbae2578198ca6aad954
7
- data.tar.gz: a1618ccbad942d1c73bb0f549a6485f2883371b67d9bd3beded87aa58eb71bcdf092579c1d640afa80e3e98567c49e4e5cd6e4cd40f1bc0cf179ee188f219688
6
+ metadata.gz: 56c3335ff659f01bc1845a2ca4ce5090e32c2fcfc79b1929d8a6ab42f0c739865d1a8f108d10536010424cfd3bfc804a5640a6ce6329a89eddf3cfaf52bd35bc
7
+ data.tar.gz: 5171886f497a35d5bfdd8cc98af7c2fae9742be0a5dc43ee6b6ccf2163590b85e75903c9b8e1f75d69fa4487e86551c2a587239e7b95b1cf21fb3edad17032f9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.3.14] - 2026-03-24
4
+
5
+ ### Added
6
+ - `username`, `password`, `db`, and `reconnect_attempts` options to Redis `client` and `build_redis_client`
7
+ - Corresponding nil/default entries in `Settings.default` and `Settings.local`
8
+
9
+ ## [1.3.13] - 2026-03-24
10
+
11
+ ### Changed
12
+ - Reindex docs: update CLAUDE.md and README with Memory adapter and Helper mixin docs
13
+
3
14
  ## [1.3.12] - 2026-03-24
4
15
 
5
16
  ### Added
data/CLAUDE.md CHANGED
@@ -8,14 +8,14 @@
8
8
  Caching wrapper for the LegionIO framework. Provides a consistent interface for Memcached (via `dalli`) and Redis (via `redis` gem) with connection pooling. Driver selection is config-driven.
9
9
 
10
10
  **GitHub**: https://github.com/LegionIO/legion-cache
11
- **Version**: 1.3.0
11
+ **Version**: 1.3.12
12
12
  **License**: Apache-2.0
13
13
 
14
14
  ## Architecture
15
15
 
16
16
  ```
17
17
  Legion::Cache (singleton module)
18
- ├── .setup(**opts) # Connect to cache backend
18
+ ├── .setup(**opts) # Connect to cache backend (auto-detects LEGION_MODE=lite -> Memory adapter)
19
19
  ├── .get(key) # Retrieve cached value
20
20
  ├── .fetch(key, ttl) # Get with block/TTL support (Memcached only; alias for get on Redis)
21
21
  ├── .set(key, value, ttl) # Store value with optional TTL (positional on Memcached, keyword on Redis)
@@ -25,9 +25,10 @@ Legion::Cache (singleton module)
25
25
  ├── .size # Total pool connections
26
26
  ├── .available # Idle pool connections
27
27
  ├── .restart(**opts) # Close and reconnect pool with optional new opts
28
- ├── .shutdown # Close connections, mark disconnected
28
+ ├── .shutdown # Close connections, mark disconnected (handles Memory adapter)
29
29
  ├── .local # Accessor for Legion::Cache::Local
30
30
  ├── .using_local? # Whether fallback to local is active
31
+ ├── .using_memory? # Whether Memory adapter (lite mode) is active
31
32
 
32
33
  ├── Memcached # Dalli-based Memcached driver (default)
33
34
  │ └── Uses connection_pool for thread safety
@@ -35,6 +36,9 @@ Legion::Cache (singleton module)
35
36
  ├── Redis # Redis driver
36
37
  │ └── Uses connection_pool for thread safety
37
38
  │ └── Default pool_size is 20 (Memcached default is 10)
39
+ ├── Memory # Lite mode adapter: pure in-memory cache, TTL expiry, Mutex thread-safety
40
+ │ └── Activated by LEGION_MODE=lite env var; no Redis/Memcached required
41
+ ├── Helper # Injectable cache mixin for LEX extensions (namespaced cache_*/local_cache_*)
38
42
  ├── Local # Local cache tier (localhost Redis/Memcached, fallback target)
39
43
  │ ├── .setup # Connect to local cache server (auto-detect driver)
40
44
  │ ├── .shutdown # Close local connection
@@ -124,9 +128,11 @@ Dalli enforces a 1MB client-side limit by default (`value_max_bytes: 1_048_576`)
124
128
 
125
129
  | Path | Purpose |
126
130
  |------|---------|
127
- | `lib/legion/cache.rb` | Module entry, driver selection, setup/shutdown, fallback wiring |
131
+ | `lib/legion/cache.rb` | Module entry, driver selection, setup/shutdown, fallback wiring, Memory adapter activation |
128
132
  | `lib/legion/cache/memcached.rb` | Dalli/Memcached driver implementation |
129
133
  | `lib/legion/cache/redis.rb` | Redis driver implementation |
134
+ | `lib/legion/cache/memory.rb` | Lite mode Memory adapter: in-memory store with TTL + Mutex thread-safety |
135
+ | `lib/legion/cache/helper.rb` | Injectable cache mixin for LEX extensions |
130
136
  | `lib/legion/cache/local.rb` | Local cache tier (localhost, fallback target) |
131
137
  | `lib/legion/cache/pool.rb` | Connection pool management |
132
138
  | `lib/legion/cache/settings.rb` | Default configuration + local defaults |
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Caching wrapper for the [LegionIO](https://github.com/LegionIO/LegionIO) framework. Provides a consistent interface for Memcached (via `dalli`) and Redis (via `redis` gem) with connection pooling. Driver selection is config-driven.
4
4
 
5
- **Version**: 1.3.2
5
+ **Version**: 1.3.12
6
6
 
7
7
  ## Installation
8
8
 
@@ -40,6 +40,20 @@ Legion::Cache.flush # flushdb
40
40
  Legion::Cache.shutdown
41
41
  ```
42
42
 
43
+ ## Lite Mode (No Infrastructure)
44
+
45
+ When `LEGION_MODE=lite` is set, `Legion::Cache` activates the pure in-memory `Memory` adapter, bypassing Redis and Memcached entirely:
46
+
47
+ ```ruby
48
+ ENV['LEGION_MODE'] = 'lite'
49
+ Legion::Cache.setup
50
+ Legion::Cache.using_memory? # => true
51
+ Legion::Cache.set('key', 'value', 60)
52
+ Legion::Cache.get('key') # => 'value'
53
+ ```
54
+
55
+ The Memory adapter is thread-safe (Mutex), supports TTL expiry, and exposes the same `get`/`set`/`fetch`/`delete`/`flush` interface. Shutdown cleanly tears it down.
56
+
43
57
  ## Two-Tier Cache
44
58
 
45
59
  Legion::Cache supports a two-tier architecture: a shared remote cluster and a local per-machine cache. If the shared cluster is unreachable at setup, all operations transparently fall back to local.
@@ -11,7 +11,8 @@ module Legion
11
11
  include Legion::Cache::Pool
12
12
  extend self
13
13
 
14
- def client(pool_size: 20, timeout: 5, server: nil, servers: [], cluster: nil, replica: false, fixed_hostname: nil, **) # rubocop:disable Metrics/ParameterLists
14
+ def client(pool_size: 20, timeout: 5, server: nil, servers: [], cluster: nil, replica: false, # rubocop:disable Metrics/ParameterLists
15
+ fixed_hostname: nil, username: nil, password: nil, db: nil, reconnect_attempts: 1, **)
15
16
  return @client unless @client.nil?
16
17
 
17
18
  @pool_size = pool_size
@@ -20,26 +21,34 @@ module Legion
20
21
 
21
22
  @client = ConnectionPool.new(size: pool_size, timeout: timeout) do
22
23
  build_redis_client(server: server, servers: servers, cluster: cluster,
23
- replica: replica, fixed_hostname: fixed_hostname)
24
+ replica: replica, fixed_hostname: fixed_hostname,
25
+ username: username, password: password, db: db,
26
+ reconnect_attempts: reconnect_attempts)
24
27
  end
25
28
  @connected = true
26
29
  Legion::Logging.info "Redis connected to #{resolved_redis_address(server: server, servers: servers, cluster: cluster)}" if defined?(Legion::Logging)
27
30
  @client
28
31
  end
29
32
 
30
- def build_redis_client(server: nil, servers: [], cluster: nil, replica: false, fixed_hostname: nil)
33
+ def build_redis_client(server: nil, servers: [], cluster: nil, replica: false, fixed_hostname: nil, # rubocop:disable Metrics/ParameterLists
34
+ username: nil, password: nil, db: nil, reconnect_attempts: 1)
31
35
  nodes = Array(cluster).compact
32
36
  if nodes.any?
33
- opts = { cluster: nodes }
37
+ opts = { cluster: nodes, reconnect_attempts: reconnect_attempts }
34
38
  opts[:replica] = true if replica
35
39
  opts[:fixed_hostname] = fixed_hostname unless fixed_hostname.nil?
40
+ opts[:username] = username unless username.nil?
41
+ opts[:password] = password unless password.nil?
36
42
  ::Redis.new(**opts)
37
43
  else
38
44
  resolved = Legion::Cache::Settings.resolve_servers(
39
45
  driver: 'redis', server: server, servers: servers
40
46
  )
41
47
  host, port = resolved.first.split(':')
42
- redis_opts = { host: host, port: port.to_i }
48
+ redis_opts = { host: host, port: port.to_i, reconnect_attempts: reconnect_attempts }
49
+ redis_opts[:username] = username unless username.nil?
50
+ redis_opts[:password] = password unless password.nil?
51
+ redis_opts[:db] = db unless db.nil?
43
52
  redis_opts.merge!(redis_tls_options(port: port.to_i))
44
53
  ::Redis.new(**redis_opts)
45
54
  end
@@ -13,40 +13,48 @@ module Legion
13
13
  Legion::Settings.merge_settings(:cache_local, local) if Legion::Settings.method_defined? :merge_settings
14
14
  def self.default
15
15
  {
16
- driver: driver,
17
- servers: resolve_servers(driver: driver),
18
- connected: false,
19
- enabled: true,
20
- namespace: 'legion',
21
- compress: false,
22
- failover: true,
23
- threadsafe: true,
24
- expires_in: 0,
25
- cache_nils: false,
26
- pool_size: 10,
27
- timeout: 5,
28
- serializer: Legion::JSON,
29
- cluster: nil,
30
- replica: false,
31
- fixed_hostname: nil
16
+ driver: driver,
17
+ servers: resolve_servers(driver: driver),
18
+ connected: false,
19
+ enabled: true,
20
+ namespace: 'legion',
21
+ compress: false,
22
+ failover: true,
23
+ threadsafe: true,
24
+ expires_in: 0,
25
+ cache_nils: false,
26
+ pool_size: 10,
27
+ timeout: 5,
28
+ serializer: Legion::JSON,
29
+ cluster: nil,
30
+ replica: false,
31
+ fixed_hostname: nil,
32
+ username: nil,
33
+ password: nil,
34
+ db: nil,
35
+ reconnect_attempts: 1
32
36
  }
33
37
  end
34
38
 
35
39
  def self.local
36
40
  {
37
- driver: driver,
38
- servers: resolve_servers(driver: driver),
39
- connected: false,
40
- enabled: true,
41
- namespace: 'legion_local',
42
- compress: false,
43
- failover: true,
44
- threadsafe: true,
45
- expires_in: 0,
46
- cache_nils: false,
47
- pool_size: 5,
48
- timeout: 3,
49
- serializer: Legion::JSON
41
+ driver: driver,
42
+ servers: resolve_servers(driver: driver),
43
+ connected: false,
44
+ enabled: true,
45
+ namespace: 'legion_local',
46
+ compress: false,
47
+ failover: true,
48
+ threadsafe: true,
49
+ expires_in: 0,
50
+ cache_nils: false,
51
+ pool_size: 5,
52
+ timeout: 3,
53
+ serializer: Legion::JSON,
54
+ username: nil,
55
+ password: nil,
56
+ db: nil,
57
+ reconnect_attempts: 1
50
58
  }
51
59
  end
52
60
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Cache
5
- VERSION = '1.3.12'
5
+ VERSION = '1.3.14'
6
6
  end
7
7
  end
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.12
4
+ version: 1.3.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity