redis_ui_rails 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 022043af6bf4282e5d29a4983943786b3b12e77596f7f843a10f7d6363efd770
4
- data.tar.gz: 5e35877700ad1aab0fb1292b3dcad16beba355e35cac51b995cb32d5decb8888
3
+ metadata.gz: e74c6167c2329118d6223cf7c11ac899eeb192a989c1db1cfa3a07cfa2545dae
4
+ data.tar.gz: 8d42cbc5618b945115be2175ac091a38458e2ed36a6ea9ebd36c629e3f370126
5
5
  SHA512:
6
- metadata.gz: fb2ab5ace7fbbeece6e33111aebbe4c2ed3441f378d6b1dfeca05ee9ac07df55d4e7316b9a19099ea4e86137ac4a8e9dd2420d22cc72cc87f233febfbc3d4126
7
- data.tar.gz: 6796f8d8f1fa4a986e1bdfa47d6df6b1d25b8292e72494d434d7836918299ec8ec5c57d067e888fce7d0caa2ee3727fb7ef8ecd0b7fdc2b3a0b5cc07ca986495
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
- value = @instance.get(params[:key])
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.get(params[:key])
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 %>
@@ -1,3 +1,7 @@
1
1
  module RedisUiRails
2
2
  class InstanceMissing < StandardError; end
3
+
4
+ class RedisValueMissing < StandardError; end
5
+
6
+ class UnsupportedValueType < StandardError; end
3
7
  end
@@ -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 :randomkey, :info, :get, :set, :del, to: :redis
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
@@ -1,3 +1,3 @@
1
1
  module RedisUiRails
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -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.1.0
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-21 00:00:00.000000000 Z
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