legion-cache 1.3.16 → 1.3.17

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: b737f804b6327030853b50a1c0fb76a5a06c8c26219ae23a0c0ac767a8d62d53
4
- data.tar.gz: 31d960c23bea1c3426c476cce67ce30cee27879b2f3b917fdf98e02aa4d5670a
3
+ metadata.gz: 2d0de0aa53a2886b16a2d2e10bb18e37128a0e0d50d118d689c8f87aa15fcb72
4
+ data.tar.gz: 49387e7f795a779e595b700c2afe8eda19b7bc0e07273306ae57ca9ec71b2782
5
5
  SHA512:
6
- metadata.gz: 1828c469b2d162eca345ca255e0489e98fee32249516552c922f56163c4066cb27364215b60a727af7c71b38f021f7d077107df826aadaafb95cbfd36ed04884
7
- data.tar.gz: c4303cb9185f7d793fb4d383c690d7b48c90739a574ce2a03d0e1c93af6066cb62d6384738323336ccf3796c197cdd5f382b383e148537dafbccc165965d2670
6
+ metadata.gz: af05e3b8f771a81307f9c3fb81c6dcb6a9fad154bd127660d71a9e645c44636fb1317ef70db618fa5e139fb617d012747bb477017226b829cc5d26ff3db6cd5a
7
+ data.tar.gz: 0e31e8c387e44ff1c8e4089cabd04536df39e373cbc38bc90dc1beba85b080d92d77887ee1f4faccf4ef96bb0a02bc51d43bdebda53231e627d26f57e014775f
@@ -0,0 +1,7 @@
1
+ # Auto-generated from team-config.yml
2
+ # Team: core
3
+ #
4
+ # To apply: scripts/apply-codeowners.sh legion-cache
5
+
6
+ * @LegionIO/maintainers
7
+ * @LegionIO/core
@@ -0,0 +1,18 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ open-pull-requests-limit: 5
9
+ labels:
10
+ - "type:dependencies"
11
+ - package-ecosystem: github-actions
12
+ directory: /
13
+ schedule:
14
+ interval: weekly
15
+ day: monday
16
+ open-pull-requests-limit: 5
17
+ labels:
18
+ - "type:dependencies"
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.3.17] - 2026-03-25
6
+
7
+ ### Added
8
+ - `Legion::Cache::RedisHash` module: Redis hash and sorted-set operations (`hset`, `hgetall`, `hdel`, `zadd`, `zrangebyscore`, `zrem`, `expire`) with `redis_available?` guard and safe defaults when Redis is not connected
9
+ - Auto-required from `legion/cache.rb` alongside the existing Redis adapter
10
+
11
+ ## [1.3.16] - 2026-03-25
12
+
5
13
  ### Fixed
6
14
  - Accept ttl as positional or keyword argument in Cache.set for caller flexibility
7
15
  - Align Redis.set signature to positional ttl arg matching parent module convention
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Cache
5
+ module RedisHash
6
+ module_function
7
+
8
+ # Returns true when the Redis driver is loaded and the connection pool is live.
9
+ def redis_available?
10
+ pool = Legion::Cache.instance_variable_get(:@client)
11
+ return false if pool.nil?
12
+
13
+ Legion::Cache.connected?
14
+ rescue StandardError
15
+ false
16
+ end
17
+
18
+ # Set hash fields from a Ruby Hash.
19
+ # Uses Redis HSET key field value [field value ...]
20
+ def hset(key, hash)
21
+ return false unless redis_available?
22
+
23
+ Legion::Cache.instance_variable_get(:@client).with do |conn|
24
+ flat = hash.flat_map { |k, v| [k.to_s, v.to_s] }
25
+ conn.hset(key, *flat)
26
+ end
27
+ true
28
+ rescue StandardError => e
29
+ log_redis_error('hset', e)
30
+ false
31
+ end
32
+
33
+ # Returns a Ruby Hash (string keys) of all field-value pairs for the key.
34
+ def hgetall(key)
35
+ return nil unless redis_available?
36
+
37
+ Legion::Cache.instance_variable_get(:@client).with do |conn|
38
+ conn.hgetall(key)
39
+ end
40
+ rescue StandardError => e
41
+ log_redis_error('hgetall', e)
42
+ nil
43
+ end
44
+
45
+ # Delete one or more hash fields.
46
+ def hdel(key, *fields)
47
+ return 0 unless redis_available?
48
+
49
+ Legion::Cache.instance_variable_get(:@client).with do |conn|
50
+ conn.hdel(key, *fields)
51
+ end
52
+ rescue StandardError => e
53
+ log_redis_error('hdel', e)
54
+ 0
55
+ end
56
+
57
+ # Add a member to a sorted set with the given score.
58
+ def zadd(key, score, member)
59
+ return false unless redis_available?
60
+
61
+ Legion::Cache.instance_variable_get(:@client).with do |conn|
62
+ conn.zadd(key, score.to_f, member.to_s)
63
+ end
64
+ true
65
+ rescue StandardError => e
66
+ log_redis_error('zadd', e)
67
+ false
68
+ end
69
+
70
+ # Range query on a sorted set by score. Returns an array of members.
71
+ # limit: accepts [offset, count] array matching Redis LIMIT semantics.
72
+ def zrangebyscore(key, min, max, limit: nil)
73
+ return [] unless redis_available?
74
+
75
+ opts = {}
76
+ opts[:limit] = limit if limit
77
+
78
+ Legion::Cache.instance_variable_get(:@client).with do |conn|
79
+ conn.zrangebyscore(key, min, max, **opts)
80
+ end
81
+ rescue StandardError => e
82
+ log_redis_error('zrangebyscore', e)
83
+ []
84
+ end
85
+
86
+ # Remove a member from a sorted set.
87
+ def zrem(key, member)
88
+ return false unless redis_available?
89
+
90
+ Legion::Cache.instance_variable_get(:@client).with do |conn|
91
+ conn.zrem(key, member.to_s)
92
+ end
93
+ true
94
+ rescue StandardError => e
95
+ log_redis_error('zrem', e)
96
+ false
97
+ end
98
+
99
+ # Set a TTL (in seconds) on a key.
100
+ def expire(key, seconds)
101
+ return false unless redis_available?
102
+
103
+ Legion::Cache.instance_variable_get(:@client).with do |conn|
104
+ conn.expire(key, seconds.to_i) == 1
105
+ end
106
+ rescue StandardError => e
107
+ log_redis_error('expire', e)
108
+ false
109
+ end
110
+
111
+ def log_redis_error(method, error)
112
+ return unless defined?(Legion::Logging)
113
+
114
+ Legion::Logging.warn "[cache:redis_hash] #{method} failed: #{error.class} — #{error.message}"
115
+ end
116
+ end
117
+ end
118
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Cache
5
- VERSION = '1.3.16'
5
+ VERSION = '1.3.17'
6
6
  end
7
7
  end
data/lib/legion/cache.rb CHANGED
@@ -6,6 +6,7 @@ require 'legion/cache/cacheable'
6
6
 
7
7
  require 'legion/cache/memcached'
8
8
  require 'legion/cache/redis'
9
+ require 'legion/cache/redis_hash'
9
10
  require 'legion/cache/memory'
10
11
  require 'legion/cache/local'
11
12
  require 'legion/cache/helper'
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.16
4
+ version: 1.3.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -90,6 +90,8 @@ extra_rdoc_files:
90
90
  - LICENSE
91
91
  - README.md
92
92
  files:
93
+ - ".github/CODEOWNERS"
94
+ - ".github/dependabot.yml"
93
95
  - ".github/workflows/ci.yml"
94
96
  - ".gitignore"
95
97
  - ".rubocop.yml"
@@ -107,6 +109,7 @@ files:
107
109
  - lib/legion/cache/memory.rb
108
110
  - lib/legion/cache/pool.rb
109
111
  - lib/legion/cache/redis.rb
112
+ - lib/legion/cache/redis_hash.rb
110
113
  - lib/legion/cache/settings.rb
111
114
  - lib/legion/cache/version.rb
112
115
  - sonar-project.properties