rediska 0.1.12 → 0.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
  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