rediska 0.1.12 → 0.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
  SHA1:
3
- metadata.gz: ee3e607def340d44152c492874e91e1d21c07301
4
- data.tar.gz: aba31e6673023fd5d254c7d65996a5a3a6cbe050
3
+ metadata.gz: 4ec9829d3cd104273bee44047fcf203d762013c8
4
+ data.tar.gz: 61e479768ba49b7b1ab7d9def68c60ef8648fb24
5
5
  SHA512:
6
- metadata.gz: 38728760fed7d2465bf0535b3d2e13a4b58a20e15d249dc1c0fd2adaa282f4b3e816dfe5a8c132317359c131339a6167090ca376d5a623e4a530df7a73474135
7
- data.tar.gz: 203b466010ffa3fecec2155dc97e805f7c199e5b597bbfe17c82cd5d8dd5ac2c92bbba669ef4ae6c14463c58f65ada9958272f1038cc97ec10d7b6a1ba6e41ea
6
+ metadata.gz: 35d0a35359099b4dfa0efa37085a17d277155cbc2caaf67e92bc66d016a826a64eb64ddacc887912063a38e1fba410016e1e3a98b9aeaea56dc5716215280f1b
7
+ data.tar.gz: a3b49dc3a061032054fc54123b5f3e3939cf7240555c10439333964a9aa5c1a532614d83d8833a0b25ea0243802c10a819f631f33083a033c55b48adb9272b1c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rediska (0.1.12)
4
+ rediska (0.2.0)
5
5
  redis (>= 3)
6
6
 
7
7
  GEM
@@ -35,12 +35,12 @@ GEM
35
35
  rspec-core (~> 3.1.0)
36
36
  rspec-expectations (~> 3.1.0)
37
37
  rspec-mocks (~> 3.1.0)
38
- rspec-core (3.1.2)
38
+ rspec-core (3.1.4)
39
39
  rspec-support (~> 3.1.0)
40
- rspec-expectations (3.1.0)
40
+ rspec-expectations (3.1.1)
41
41
  diff-lcs (>= 1.2.0, < 2.0)
42
42
  rspec-support (~> 3.1.0)
43
- rspec-mocks (3.1.0)
43
+ rspec-mocks (3.1.1)
44
44
  rspec-support (~> 3.1.0)
45
45
  rspec-support (3.1.0)
46
46
  sidekiq (3.2.5)
@@ -49,16 +49,16 @@ GEM
49
49
  json
50
50
  redis (>= 3.0.6)
51
51
  redis-namespace (>= 1.3.1)
52
- simplecov (0.9.0)
52
+ simplecov (0.9.1)
53
53
  docile (~> 1.1.0)
54
- multi_json
54
+ multi_json (~> 1.0)
55
55
  simplecov-html (~> 0.8.0)
56
56
  simplecov-html (0.8.0)
57
57
  term-ansicolor (1.3.0)
58
58
  tins (~> 1.0)
59
59
  thor (0.19.1)
60
60
  timers (1.1.0)
61
- tins (1.3.2)
61
+ tins (1.3.3)
62
62
 
63
63
  PLATFORMS
64
64
  ruby
@@ -84,6 +84,41 @@ module Rediska
84
84
  true
85
85
  end
86
86
 
87
+ def dump(key)
88
+ return nil unless exists(key)
89
+
90
+ Marshal.dump(value: data[key], version: Rediska::VERSION)
91
+ end
92
+
93
+ def restore(key, ttl, serialized_value)
94
+ raise Redis::CommandError, 'ERR Target key name is busy.' if exists(key)
95
+
96
+ if serialized_value.nil?
97
+ raise Redis::CommandError, 'ERR DUMP payload version or checksum are wrong'
98
+ end
99
+
100
+ parsed_value = begin
101
+ Marshal.load(serialized_value)
102
+ rescue TypeError
103
+ raise Redis::CommandError, 'ERR DUMP payload version or checksum are wrong'
104
+ end
105
+
106
+ if parsed_value[:version] != Rediska::VERSION
107
+ raise Redis::CommandError, 'ERR DUMP payload version or checksum are wrong'
108
+ end
109
+
110
+ # We could figure out what type the key was and set it with the public API here, or we could
111
+ # just assign the value. If we presume the serialized_value is only ever a return value from
112
+ # `dump` then we've only been given something that was in the internal data structure anyway.
113
+ data[key] = parsed_value[:value]
114
+
115
+ # Set a TTL if one has been passed
116
+ ttl = ttl.to_i # Makes nil into 0
117
+ expire(key, ttl / 1000) unless ttl.zero?
118
+
119
+ 'OK'
120
+ end
121
+
87
122
  def get(key)
88
123
  data_type_check(key, String)
89
124
  data[key]
@@ -1,3 +1,3 @@
1
1
  module Rediska
2
- VERSION = '0.1.12'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/spec/support/keys.rb CHANGED
@@ -388,5 +388,97 @@ shared_examples 'keys' do
388
388
  expect(subject.set('key2', '1', nx: true, xx: true)).to be_falsey
389
389
  expect(subject.get('key2')).to be_nil
390
390
  end
391
+
392
+ describe '#dump' do
393
+ it 'returns nil for unknown key' do
394
+ expect(subject.exists('key1')).to be_falsey
395
+ expect(subject.dump('key1')).to be_nil
396
+ end
397
+
398
+ it 'dumps a single known key successfully' do
399
+ subject.set('key1', 'zomgwtf')
400
+
401
+ value = subject.dump('key1')
402
+ expect(value).not_to be_nil
403
+ expect(value).to be_a_kind_of(String)
404
+ end
405
+
406
+ it 'errors with more than one argument' do
407
+ expect {
408
+ subject.dump('key1', 'key2')
409
+ }.to raise_error(ArgumentError, /wrong number of arguments/)
410
+ end
411
+ end
412
+
413
+ describe "#restore" do
414
+ it 'errors with a missing payload' do
415
+ expect {
416
+ subject.restore('key1', 0, nil)
417
+ }.to raise_error(Redis::CommandError, 'ERR DUMP payload version or checksum are wrong')
418
+ end
419
+
420
+ it 'errors with an invalid payload' do
421
+ expect {
422
+ subject.restore('key1', 0, 'zomgwtf not valid')
423
+ }.to raise_error(Redis::CommandError, 'ERR DUMP payload version or checksum are wrong')
424
+ end
425
+
426
+ describe 'with a dumped value' do
427
+ before do
428
+ subject.set('key1', 'original value')
429
+ @dumped_value = subject.dump('key1')
430
+
431
+ subject.del('key1')
432
+ expect(subject.exists('key1')).to be_falsey
433
+ end
434
+
435
+ it 'restores to a new key successfully' do
436
+ response = subject.restore('key1', 0, @dumped_value)
437
+ expect(response).to eq('OK')
438
+ end
439
+
440
+ it 'errors trying to restore to an existing key' do
441
+ subject.set('key1', 'something else')
442
+
443
+ expect {
444
+ subject.restore('key1', 0, @dumped_value)
445
+ }.to raise_error(Redis::CommandError, 'ERR Target key name is busy.')
446
+ end
447
+
448
+ it 'restores successfully with a given expire time' do
449
+ subject.restore('key2', 2000, @dumped_value)
450
+
451
+ expect(subject.ttl('key2')).to eq(2)
452
+ end
453
+
454
+ it 'restores a list successfully' do
455
+ subject.lpush('key1', 'val1')
456
+ subject.lpush('key1', 'val2')
457
+
458
+ expect(subject.type('key1')).to eq('list')
459
+
460
+ dumped_value = subject.dump('key1')
461
+
462
+ response = subject.restore('key2', 0, dumped_value)
463
+ expect(response).to eq('OK')
464
+
465
+ expect(subject.type('key2')).to eq('list')
466
+ end
467
+
468
+ it 'restores a set successfully' do
469
+ subject.sadd('key1', 'val1')
470
+ subject.sadd('key1', 'val2')
471
+
472
+ expect(subject.type('key1')).to eq('set')
473
+
474
+ dumped_value = subject.dump('key1')
475
+
476
+ response = subject.restore('key2', 0, dumped_value)
477
+ expect(response).to eq('OK')
478
+
479
+ expect(subject.type('key2')).to eq('set')
480
+ end
481
+ end
482
+ end
391
483
  end
392
484
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rediska
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.12
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leonid Beder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-15 00:00:00.000000000 Z
11
+ date: 2014-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis