redis_ui_rails 1.1.0 → 1.2.0
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/CHANGELOG.md +4 -0
- data/app/controllers/redis_ui_rails/key_searches_controller.rb +10 -2
- data/app/views/redis_ui_rails/key_searches/show.html.erb +1 -1
- data/lib/redis_ui_rails/errors.rb +4 -0
- data/{app/models → lib}/redis_ui_rails/instance.rb +13 -1
- data/lib/redis_ui_rails/redis_value.rb +25 -0
- data/lib/redis_ui_rails/version.rb +1 -1
- data/lib/redis_ui_rails.rb +2 -0
- data/spec/redis_ui_rails/redis_value_spec.rb +108 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e74c6167c2329118d6223cf7c11ac899eeb192a989c1db1cfa3a07cfa2545dae
|
4
|
+
data.tar.gz: 8d42cbc5618b945115be2175ac091a38458e2ed36a6ea9ebd36c629e3f370126
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07ad0dee546ad59160a8e82bf60e43d73ef750978f6e1570acb36cc8612ba14d222a8cb3edfa1deee829d2e95c499617b11d61b898f4bd78c3e3deb79b230f19
|
7
|
+
data.tar.gz: e58ae0465fa758f6b8f342ca103e8be3d49244ae3f63bf35aec2be6626eb1e8fa69a0811124f9041bd0f5a118d71aecfd8530f8df95dc5afbe65239e94361bd7
|
data/CHANGELOG.md
CHANGED
@@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
9
9
|
|
10
10
|
<!-- Add unreleased changes here -->
|
11
11
|
|
12
|
+
## [1.2.0] - 2022-09-30
|
13
|
+
|
14
|
+
- Added ability to find-and-delete more than just Redis "string" keys.
|
15
|
+
|
12
16
|
## [1.1.0] - 2022-09-16
|
13
17
|
|
14
18
|
- Fix `vertical-align` class to properly align text in Firefox
|
@@ -7,7 +7,12 @@ module RedisUiRails
|
|
7
7
|
def create
|
8
8
|
@instance = Instance.find(params[:id])
|
9
9
|
key = params[:key]
|
10
|
-
|
10
|
+
|
11
|
+
value = case @instance.type(key)
|
12
|
+
when "none" then nil
|
13
|
+
else
|
14
|
+
"found"
|
15
|
+
end
|
11
16
|
|
12
17
|
if value.nil?
|
13
18
|
flash[:warning] = "No key '#{key}' found in Redis instance '#{@instance.id}'"
|
@@ -20,12 +25,15 @@ module RedisUiRails
|
|
20
25
|
def show
|
21
26
|
@instance = Instance.find(params[:id])
|
22
27
|
@key = params[:key]
|
23
|
-
@value = @instance
|
28
|
+
@value = RedisValue.find(@key, instance: @instance)
|
24
29
|
|
25
30
|
if @value.nil?
|
26
31
|
flash[:warning] = "No key '#{params[:key]}' found in Redis instance '#{@instance.id}'"
|
27
32
|
render :new
|
28
33
|
end
|
34
|
+
rescue => e
|
35
|
+
flash[:error] = e.message
|
36
|
+
render :new
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
@@ -16,7 +16,7 @@
|
|
16
16
|
<b class="has-text-weight-bold">Key:</b> <%= @key %>
|
17
17
|
</div>
|
18
18
|
<div>
|
19
|
-
<b class="has-text-weight-bold">Value:</b> <%= @value %>
|
19
|
+
<b class="has-text-weight-bold">Value (long lists may be truncated):</b> <%= @value %>
|
20
20
|
</div>
|
21
21
|
<br>
|
22
22
|
<%= link_to new_instance_key_search_path(@instance.id) do %>
|
@@ -19,7 +19,19 @@ module RedisUiRails
|
|
19
19
|
end
|
20
20
|
|
21
21
|
delegate :name, :id, :url, :resource_links, to: :config_redis_instance
|
22
|
-
delegate
|
22
|
+
delegate(
|
23
|
+
:randomkey,
|
24
|
+
:info,
|
25
|
+
:get,
|
26
|
+
:set,
|
27
|
+
:type,
|
28
|
+
:hgetall,
|
29
|
+
:llen,
|
30
|
+
:lrange,
|
31
|
+
:srandmember,
|
32
|
+
:del,
|
33
|
+
to: :redis
|
34
|
+
)
|
23
35
|
|
24
36
|
private
|
25
37
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RedisUiRails
|
2
|
+
class RedisValue
|
3
|
+
MAX_RETRIEVED_LIST_LENGTH = 10
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def find(key, instance:)
|
7
|
+
case instance.type(key)
|
8
|
+
when "string"
|
9
|
+
instance.get(key)
|
10
|
+
when "hash"
|
11
|
+
instance.hgetall(key)
|
12
|
+
when "list"
|
13
|
+
max = [instance.llen(key), MAX_RETRIEVED_LIST_LENGTH].min
|
14
|
+
instance.lrange(key, 0, max)
|
15
|
+
when "set"
|
16
|
+
instance.srandmember(key, MAX_RETRIEVED_LIST_LENGTH)
|
17
|
+
when "none"
|
18
|
+
raise RedisValueMissing.new("Unable to find key '#{key}' in Redis instance '#{name}'")
|
19
|
+
else
|
20
|
+
raise UnsupportedValueType.new("Unsupported Redis key value type of '#{instance.type(key)}'")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/redis_ui_rails.rb
CHANGED
@@ -8,6 +8,8 @@ require "redis"
|
|
8
8
|
require "redis_ui_rails/version"
|
9
9
|
require "redis_ui_rails/errors"
|
10
10
|
require "redis_ui_rails/config_redis_instance"
|
11
|
+
require "redis_ui_rails/instance"
|
12
|
+
require "redis_ui_rails/redis_value"
|
11
13
|
require "redis_ui_rails/config"
|
12
14
|
require "redis_ui_rails/engine"
|
13
15
|
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe RedisUiRails::RedisValue do
|
4
|
+
describe "#find" do
|
5
|
+
let(:mock_redis) { MockRedis.new }
|
6
|
+
let(:config_redis_instance) { RedisUiRails::ConfigRedisInstance.new(name: "dummy") }
|
7
|
+
let(:instance) { RedisUiRails::Instance.new(config_redis_instance) }
|
8
|
+
let(:result) { find! }
|
9
|
+
|
10
|
+
def find!
|
11
|
+
described_class.find(key, instance: instance)
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
allow(Redis).to receive(:new).and_return(mock_redis)
|
16
|
+
end
|
17
|
+
|
18
|
+
context "given a string key" do
|
19
|
+
let(:key) { "key" }
|
20
|
+
let(:value) { "val" }
|
21
|
+
|
22
|
+
before(:each) { mock_redis.set(key, value) }
|
23
|
+
|
24
|
+
it "returns the value" do
|
25
|
+
expect(result).to eq(value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "given a hash key" do
|
30
|
+
let(:key) { "key" }
|
31
|
+
let(:value) { {"value" => "1"} }
|
32
|
+
|
33
|
+
before(:each) { mock_redis.hset(key, value) }
|
34
|
+
|
35
|
+
it "returns the value" do
|
36
|
+
expect(result).to eq(value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "given a list key" do
|
41
|
+
let(:key) { "key" }
|
42
|
+
let(:value) { "value" }
|
43
|
+
|
44
|
+
before(:each) { mock_redis.lpush(key, value) }
|
45
|
+
|
46
|
+
it "returns the value" do
|
47
|
+
expect(result).to eq([value])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "given a set key" do
|
52
|
+
let(:key) { "key" }
|
53
|
+
let(:value) { "value" }
|
54
|
+
|
55
|
+
before(:each) { mock_redis.sadd(key, value) }
|
56
|
+
|
57
|
+
it "returns the value" do
|
58
|
+
expect(result).to eq([value])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "given no value" do
|
63
|
+
let(:key) { "missing" }
|
64
|
+
|
65
|
+
it "raises an error" do
|
66
|
+
expect { find! }.to raise_error(RedisUiRails::RedisValueMissing)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "given an unsupported value type" do
|
71
|
+
let(:key) { "unsupported" }
|
72
|
+
|
73
|
+
before(:each) { allow(instance).to receive(:type).and_return("other") }
|
74
|
+
|
75
|
+
it "raises an error" do
|
76
|
+
expect { find! }.to raise_error(RedisUiRails::UnsupportedValueType)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "trunaction of values" do
|
81
|
+
context "given a very long list" do
|
82
|
+
let(:key) { "key" }
|
83
|
+
let(:large_size) { 100 }
|
84
|
+
|
85
|
+
before(:each) do
|
86
|
+
large_size.times { |i| mock_redis.lpush(key, i) }
|
87
|
+
end
|
88
|
+
|
89
|
+
it "truncates the returned list" do
|
90
|
+
expect(result.size).to be < large_size
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "given a very long set" do
|
95
|
+
let(:key) { "key" }
|
96
|
+
let(:large_size) { 100 }
|
97
|
+
|
98
|
+
before(:each) do
|
99
|
+
large_size.times { |i| mock_redis.sadd(key, i) }
|
100
|
+
end
|
101
|
+
|
102
|
+
it "truncates the returned list" do
|
103
|
+
expect(result.size).to be < large_size
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_ui_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stitch Fix Engineering
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-09-
|
12
|
+
date: 2022-09-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -236,7 +236,6 @@ files:
|
|
236
236
|
- app/controllers/redis_ui_rails/instances_controller.rb
|
237
237
|
- app/controllers/redis_ui_rails/key_searches_controller.rb
|
238
238
|
- app/controllers/redis_ui_rails/keys_controller.rb
|
239
|
-
- app/models/redis_ui_rails/instance.rb
|
240
239
|
- app/views/layouts/redis_ui_rails/application.html.erb
|
241
240
|
- app/views/redis_ui_rails/configs/show.html.erb
|
242
241
|
- app/views/redis_ui_rails/dashboard/index.html.erb
|
@@ -254,6 +253,8 @@ files:
|
|
254
253
|
- lib/redis_ui_rails/config_redis_instance.rb
|
255
254
|
- lib/redis_ui_rails/engine.rb
|
256
255
|
- lib/redis_ui_rails/errors.rb
|
256
|
+
- lib/redis_ui_rails/instance.rb
|
257
|
+
- lib/redis_ui_rails/redis_value.rb
|
257
258
|
- lib/redis_ui_rails/version.rb
|
258
259
|
- redis_ui_rails.gemspec
|
259
260
|
- spec/feature_spec_helper.rb
|
@@ -263,6 +264,7 @@ files:
|
|
263
264
|
- spec/integration/instance_keys_spec.rb
|
264
265
|
- spec/redis_ui_rails/config_redis_instance_spec.rb
|
265
266
|
- spec/redis_ui_rails/config_spec.rb
|
267
|
+
- spec/redis_ui_rails/redis_value_spec.rb
|
266
268
|
- spec/redis_ui_rails_spec.rb
|
267
269
|
- spec/spec_helper.rb
|
268
270
|
- spec/support/dummy/app/assets/config/manifest.js
|