legion-cache 1.3.0 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e74d63805b57a8da13750d3a281d1ef6b25989454bd7dfa385da9d0ba3087a0b
4
- data.tar.gz: 2949f0b310c3653516e4dedd0f1def27e8cc9621baf1bace393fcb439c722ace
3
+ metadata.gz: 657e7afe142d9420c0414c416fdf612ef75456262c91165d545112960bf44e71
4
+ data.tar.gz: 137d4eb307b337bcda85f91db10fddc42319793a99cde3038fbf9799db960d78
5
5
  SHA512:
6
- metadata.gz: 9f549b3501d9bdfe38e9a3fb19cb5afba9418be9676dfa6a1a0086f7d1f8dbfe6a9e9a64a19dc8a6f60be4282b91096cabcd404cff7a0938257073fdd224fbec
7
- data.tar.gz: 7c2a1d4d2adf6357d619961f6bc02d4945a6d23b43807079f4c58ebaaf939b38128965f21934538cfaff64833892acb92f6b9bbe2b5ecacd9c8eb4e978c33698
6
+ metadata.gz: e167c6f650ad38373f8794f9cfc209857fd5053b9751375cf77f7ae9537eab23c40cd33947cc656c64dd77e7832f1312987739b4c95c1d2873b5cdf377aeff0d
7
+ data.tar.gz: 7e38075e7257b4b04fbdefb22de3da21d0055be631f8a6ca4f17d0c78f5669e153d0590aabd3742c05990f88c4e7c55d85409dfae90a5ec6741f36913af54f92
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.3.1] - 2026-03-20
4
+
5
+ ### Added
6
+ - `Settings.normalize_driver` — maps `:memcached`, `:dalli`, `:redis` to internal gem names
7
+ - `Settings.resolve_servers` — merges `server:` (string) and `servers:` (array), injects default port per driver (memcached: 11211, redis: 6379), deduplicates
8
+ - `Settings::DEFAULT_PORTS` constant for driver default ports
9
+
10
+ ### Fixed
11
+ - Redis driver now uses configured `server:`/`servers:` instead of hardcoded localhost
12
+ - Memcached driver accepts `server:` (singular) in addition to `servers:` (plural)
13
+
14
+ ### Changed
15
+ - `Settings.default` and `Settings.local` use `resolve_servers` for driver-aware server defaults
16
+ - Driver selection in `cache.rb` and `local.rb` uses `normalize_driver` for consistent name handling
17
+
3
18
  ## [1.3.0] - 2026-03-16
4
19
 
5
20
  ### Added
data/CLAUDE.md CHANGED
@@ -8,6 +8,7 @@
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
12
  **License**: Apache-2.0
12
13
 
13
14
  ## Architecture
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.0
5
+ **Version**: 1.3.1
6
6
 
7
7
  ## Installation
8
8
 
@@ -80,6 +80,24 @@ Local uses a separate namespace (`legion_local`) and independent connection pool
80
80
 
81
81
  The driver is auto-detected at load time: prefers `dalli` (Memcached) if available, falls back to `redis`. Override with `"driver": "redis"` and update `servers` to point at your Redis instance.
82
82
 
83
+ ### Driver Names
84
+
85
+ Supported driver names: `memcached` (or `dalli`), `redis`. All names are normalized internally — `"memcached"` and `"dalli"` are equivalent.
86
+
87
+ ### Server Resolution
88
+
89
+ Both `server` (singular string) and `servers` (array) are accepted and merged. Default ports are injected per driver when omitted: 11211 for memcached, 6379 for redis. Duplicates are removed.
90
+
91
+ ```json
92
+ {
93
+ "cache": {
94
+ "driver": "memcached",
95
+ "server": "10.0.0.5",
96
+ "servers": ["10.0.0.6", "10.0.0.7:22122"]
97
+ }
98
+ }
99
+ ```
100
+
83
101
  ### Memcached notes
84
102
 
85
103
  - `value_max_bytes` defaults to **8MB**. Dalli enforces a 1MB client-side limit by default, which silently rejects large values. This default overrides that. Your Memcached server should also be started with `-I 8m` to match.
@@ -94,7 +94,7 @@ module Legion
94
94
  private
95
95
 
96
96
  def build_driver(driver_name)
97
- case driver_name
97
+ case Legion::Cache::Settings.normalize_driver(driver_name)
98
98
  when 'redis'
99
99
  require 'legion/cache/redis'
100
100
  Legion::Cache::Redis.dup
@@ -9,18 +9,25 @@ module Legion
9
9
  include Legion::Cache::Pool
10
10
  extend self # rubocop:disable Style/ModuleFunction
11
11
 
12
- def client(servers: Legion::Settings[:cache][:servers], **opts)
12
+ def client(server: nil, servers: nil, **opts)
13
13
  return @client unless @client.nil?
14
14
 
15
- @pool_size = opts.key?(:pool_size) ? opts[:pool_size] : Legion::Settings[:cache][:pool_size] || 10
16
- @timeout = opts.key?(:timeout) ? opts[:timeout] : Legion::Settings[:cache][:timeout] || 5
15
+ settings = defined?(Legion::Settings) ? Legion::Settings[:cache] : {}
16
+ servers ||= settings[:servers] || []
17
+
18
+ @pool_size = opts.key?(:pool_size) ? opts[:pool_size] : settings[:pool_size] || 10
19
+ @timeout = opts.key?(:timeout) ? opts[:timeout] : settings[:timeout] || 5
20
+
21
+ resolved = Legion::Cache::Settings.resolve_servers(
22
+ driver: 'memcached', server: server, servers: Array(servers)
23
+ )
17
24
 
18
25
  Dalli.logger = Legion::Logging
19
- cache_opts = Legion::Settings[:cache].merge(opts)
26
+ cache_opts = settings.merge(opts)
20
27
  cache_opts[:value_max_bytes] ||= 8 * 1024 * 1024
21
28
 
22
29
  @client = ConnectionPool.new(size: pool_size, timeout: timeout) do
23
- Dalli::Client.new(servers, cache_opts)
30
+ Dalli::Client.new(resolved, cache_opts)
24
31
  end
25
32
 
26
33
  @connected = true
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'redis'
4
4
  require 'legion/cache/pool'
5
+ require 'legion/cache/settings'
5
6
 
6
7
  module Legion
7
8
  module Cache
@@ -9,14 +10,19 @@ module Legion
9
10
  include Legion::Cache::Pool
10
11
  extend self # rubocop:disable Style/ModuleFunction
11
12
 
12
- def client(pool_size: 20, timeout: 5, **)
13
+ def client(pool_size: 20, timeout: 5, server: nil, servers: [], **)
13
14
  return @client unless @client.nil?
14
15
 
15
16
  @pool_size = pool_size
16
17
  @timeout = timeout
17
18
 
19
+ resolved = Legion::Cache::Settings.resolve_servers(
20
+ driver: 'redis', server: server, servers: servers
21
+ )
22
+ host, port = resolved.first.split(':')
23
+
18
24
  @client = ConnectionPool.new(size: pool_size, timeout: timeout) do
19
- ::Redis.new
25
+ ::Redis.new(host: host, port: port.to_i)
20
26
  end
21
27
  @connected = true
22
28
  @client
@@ -14,7 +14,7 @@ module Legion
14
14
  def self.default
15
15
  {
16
16
  driver: driver,
17
- servers: ['127.0.0.1:11211'],
17
+ servers: resolve_servers(driver: driver),
18
18
  connected: false,
19
19
  enabled: true,
20
20
  namespace: 'legion',
@@ -32,7 +32,7 @@ module Legion
32
32
  def self.local
33
33
  {
34
34
  driver: driver,
35
- servers: ['127.0.0.1:11211'],
35
+ servers: resolve_servers(driver: driver),
36
36
  connected: false,
37
37
  enabled: true,
38
38
  namespace: 'legion_local',
@@ -47,6 +47,27 @@ module Legion
47
47
  }
48
48
  end
49
49
 
50
+ DEFAULT_PORTS = { 'dalli' => 11_211, 'redis' => 6379 }.freeze
51
+
52
+ def self.resolve_servers(driver:, server: nil, servers: [], port: nil)
53
+ gem_driver = normalize_driver(driver)
54
+ port ||= DEFAULT_PORTS.fetch(gem_driver, 11_211)
55
+
56
+ all = Array(servers) + Array(server)
57
+ all = ["127.0.0.1:#{port}"] if all.empty?
58
+
59
+ all.map! { |s| s.include?(':') ? s : "#{s}:#{port}" }
60
+ all.uniq
61
+ end
62
+
63
+ def self.normalize_driver(name)
64
+ case name.to_s
65
+ when 'redis' then 'redis'
66
+ when 'memcached', 'dalli' then 'dalli'
67
+ else name.to_s
68
+ end
69
+ end
70
+
50
71
  def self.driver(prefer = 'dalli')
51
72
  secondary = prefer == 'dalli' ? 'redis' : 'dalli'
52
73
  if Gem::Specification.find_all_by_name(prefer).any?
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Cache
5
- VERSION = '1.3.0'
5
+ VERSION = '1.3.1'
6
6
  end
7
7
  end
data/lib/legion/cache.rb CHANGED
@@ -9,7 +9,7 @@ require 'legion/cache/local'
9
9
 
10
10
  module Legion
11
11
  module Cache
12
- if Legion::Settings[:cache][:driver] == 'redis'
12
+ if Legion::Cache::Settings.normalize_driver(Legion::Settings[:cache][:driver]) == 'redis'
13
13
  extend Legion::Cache::Redis
14
14
  else
15
15
  extend Legion::Cache::Memcached
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.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity