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 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