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 +4 -4
- data/.github/CODEOWNERS +7 -0
- data/.github/dependabot.yml +18 -0
- data/CHANGELOG.md +8 -0
- data/lib/legion/cache/redis_hash.rb +118 -0
- data/lib/legion/cache/version.rb +1 -1
- data/lib/legion/cache.rb +1 -0
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2d0de0aa53a2886b16a2d2e10bb18e37128a0e0d50d118d689c8f87aa15fcb72
|
|
4
|
+
data.tar.gz: 49387e7f795a779e595b700c2afe8eda19b7bc0e07273306ae57ca9ec71b2782
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: af05e3b8f771a81307f9c3fb81c6dcb6a9fad154bd127660d71a9e645c44636fb1317ef70db618fa5e139fb617d012747bb477017226b829cc5d26ff3db6cd5a
|
|
7
|
+
data.tar.gz: 0e31e8c387e44ff1c8e4089cabd04536df39e373cbc38bc90dc1beba85b080d92d77887ee1f4faccf4ef96bb0a02bc51d43bdebda53231e627d26f57e014775f
|
data/.github/CODEOWNERS
ADDED
|
@@ -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
|
data/lib/legion/cache/version.rb
CHANGED
data/lib/legion/cache.rb
CHANGED
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.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
|