redis-copy 1.0.0.rc.0 → 1.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -4,9 +4,6 @@ script: "bundle exec rake run"
4
4
  rvm:
5
5
  - 1.9.3
6
6
  - 2.0.0
7
- gemfile:
8
- - .travis/Gemfile.redis-gem-3.0
9
- - .travis/Gemfile.redis-gem-master
10
7
  env:
11
8
  global:
12
9
  - TIMEOUT=1
data/README.md CHANGED
@@ -26,18 +26,18 @@ Usage: redis-copy [options] <source> <destination>
26
26
  like [redis://][<username>:<password>@]<hostname>[:<port>][/<db>]
27
27
 
28
28
  Specific options:
29
- --pattern PATTERN Only transfer matching keys (default *)
29
+ -p, --pattern PATTERN Only transfer matching keys (default *)
30
30
  See http://redis.io/commands/keys for more info.
31
- --[no-]pipeline Use redis pipeline where available (default true)
31
+ -v, --[no-]verify [PERCENT] Verify percentage of transfers -- VERY SLOW (default 0)
32
+ -n, --[no-]allow-nonempty Allow non-empty destination (default false)
33
+ -f, --[no-]fail-fast Abort on first failure (default false)
34
+ --[no-]pipeline Pipeline redis commands where available (default true)
32
35
  -r, --require FILENAME Require a script; useful for loading third-party
33
36
  implementations of key-emitter or copy strategies.
34
37
  Relative paths *must* begin with `../' or `./'.
35
38
  -d, --[no-]debug Write debug output (default false)
36
39
  -t, --[no-]trace Enable backtrace on failure (default false)
37
- -f, --[no-]fail-fast Abort on first failure (default false)
38
- --[no-]verify [PERCENT] Verify percentage of transfers -- VERY SLOW (default 0)
39
40
  --[no-]prompt Prompt for confirmation (default true)
40
- --[no-]allow-nonempty Allow non-empty destination (default false)
41
41
  --[no-]dry-run Output configuration and exit
42
42
  ```
43
43
 
@@ -36,15 +36,36 @@ module RedisCopy
36
36
  opts.separator ''
37
37
  opts.separator "Specific options:"
38
38
 
39
- opts.on('--pattern PATTERN', indent_desc[
39
+ opts.on('-p', '--pattern PATTERN', indent_desc[
40
40
  "Only transfer matching keys (default #{DEFAULTS[:pattern]})\n" +
41
41
  "See http://redis.io/commands/keys for more info."
42
42
  ]) do |pattern|
43
43
  options[:pattern] = pattern
44
44
  end
45
45
 
46
+ opts.on('-v', '--[no-]verify [PERCENT]',
47
+ "Verify percentage of transfers -- VERY SLOW (default #{DEFAULTS[:verify]})"
48
+ ) do |verify|
49
+ options[:verify] = case verify
50
+ when /\A1?[0-9]{2}\z/
51
+ verify.to_i
52
+ when false, 'false', 'none'
53
+ 0
54
+ else
55
+ 100
56
+ end
57
+ end
58
+
59
+ opts.on('-n', '--[no-]allow-nonempty', "Allow non-empty destination (default #{DEFAULTS[:allow_nonempty]})") do |allow_nonempty|
60
+ options[:allow_nonempty] = allow_nonempty
61
+ end
62
+
63
+ opts.on('-f', '--[no-]fail-fast', "Abort on first failure (default #{DEFAULTS[:fail_fast]})") do |ff|
64
+ options[:fail_fast] = ff
65
+ end
66
+
46
67
  opts.on('--[no-]pipeline',
47
- "Use redis pipeline where available (default #{DEFAULTS[:pipeline]})"
68
+ "Pipeline redis commands where available (default #{DEFAULTS[:pipeline]})"
48
69
  ) do |pipeline|
49
70
  options[:pipeline] = pipeline
50
71
  end
@@ -71,31 +92,10 @@ module RedisCopy
71
92
  options[:trace] = trace
72
93
  end
73
94
 
74
- opts.on('-f', '--[no-]fail-fast', "Abort on first failure (default #{DEFAULTS[:fail_fast]})") do |ff|
75
- options[:fail_fast] = ff
76
- end
77
-
78
- opts.on('--[no-]verify [PERCENT]',
79
- "Verify percentage of transfers -- VERY SLOW (default #{DEFAULTS[:verify]})"
80
- ) do |verify|
81
- options[:verify] = case verify
82
- when /\A1?[0-9]{2}\z/
83
- verify.to_i
84
- when false, 'false', 'none'
85
- 0
86
- else
87
- 100
88
- end
89
- end
90
-
91
95
  opts.on('--[no-]prompt', "Prompt for confirmation (default #{DEFAULTS[:prompt]})") do |prompt|
92
96
  options[:prompt] = prompt
93
97
  end
94
98
 
95
- opts.on('--[no-]allow-nonempty', "Allow non-empty destination (default #{DEFAULTS[:allow_nonempty]})") do |allow_nonempty|
96
- options[:allow_nonempty] = allow_nonempty
97
- end
98
-
99
99
  opts.on('--[no-]dry-run', 'Output configuration and exit') do |d|
100
100
  options[:dry_run] = true
101
101
  end
@@ -27,41 +27,58 @@ module RedisCopy
27
27
  def verify?(key)
28
28
  @ui.debug("VERIFY: #{key.dump}")
29
29
  type = @src.type(key)
30
- proc = case type
31
- when 'string' then proc { |r| r.get key }
32
- when 'hash' then proc { |r| r.hgetall key }
33
- when 'zset' then proc { |r| r.zrange(key, 0, -1, :with_scores => true) }
34
- when 'set' then proc { |r| r.smembers(key).sort }
35
- when 'list' then proc { |r| r.lrange(key, 0, -1) }
36
- else
37
- @ui.debug("BORK: #{key.dump} has unknown type #{type.dump}!")
38
- return false
39
- end
40
30
 
41
- return false unless same_response?(&proc)
42
- return false unless same_response? { |r| r.ttl key }
31
+ template = { args: [key],
32
+ proc: ->(x){ x },
33
+ test: ->(a, b) { a == b } }
34
+
35
+ export_command = case type
36
+ when 'string'
37
+ { command: :get }
38
+ when 'hash'
39
+ { command: :hgetall }
40
+ when 'zset'
41
+ { command: :zrange,
42
+ args: [key, 0, -1, {with_scores: true}] }
43
+ when 'set'
44
+ { command: :smembers,
45
+ proc: ->(x){ x.to_set} }
46
+ when 'list'
47
+ { command: :lrange,
48
+ args: [key, 0, -1] }
49
+ else
50
+ @ui.debug("BORK: #{key.dump} has unknown type #{type.dump}!")
51
+ return false
52
+ end
53
+
54
+ # account for drift, ensure within 1 of each other.
55
+ ttl_command = {command: :ttl, test: ->(a,b){ (a - b).abs <= 1 } }
56
+
57
+ return false unless same_response?(template.merge export_command)
58
+ return false unless same_response?(template.merge ttl_command)
43
59
 
44
60
  true
45
61
  end
46
62
 
47
63
  private
48
64
 
49
- def same_response?(&blk)
65
+ def same_response?(hsh)
50
66
  responses = {
51
- source: capture_result(@src, &blk),
52
- destination: capture_result(@dst, &blk)
67
+ source: capture_result(@src, hsh),
68
+ destination: capture_result(@dst, hsh)
53
69
  }
54
- if (responses[:source] == responses[:destination])
70
+ if (hsh[:test].call(responses[:source], responses[:destination]))
55
71
  return true
56
72
  else
57
- @ui.debug("MISMATCH: #{keys.dump} #{responses.inspect}")
73
+ @ui.debug("MISMATCH: #{hsh.inspect} => #{responses.inspect}")
58
74
  return false
59
75
  end
60
76
  end
61
77
 
62
- def capture_result(redis, &block)
63
- return [:returned, block.call(redis)]
64
- rescue Object => exception
78
+ def capture_result(redis, hsh)
79
+ result = redis.send(hsh[:command], *hsh[:args])
80
+ return hsh[:proc].call(result)
81
+ rescue Object => exception
65
82
  return [:raised, exception]
66
83
  end
67
84
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module RedisCopy
4
- VERSION = '1.0.0.rc.0'
4
+ VERSION = '1.0.0.rc.1'
5
5
  end
data/redis-copy.gemspec CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency 'rake'
34
34
  spec.add_development_dependency 'rspec', '~> 2.14'
35
35
 
36
- spec.add_runtime_dependency 'redis'
36
+ spec.add_runtime_dependency 'redis', '~> 3.0', '>= 3.0.6'
37
37
  spec.add_runtime_dependency 'activesupport'
38
38
  spec.add_runtime_dependency 'implements', '~> 0.0.2'
39
39
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-copy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc.0
4
+ version: 1.0.0.rc.1
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-11-15 00:00:00.000000000 Z
13
+ date: 2013-11-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -65,17 +65,23 @@ dependencies:
65
65
  requirement: !ruby/object:Gem::Requirement
66
66
  none: false
67
67
  requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '3.0'
68
71
  - - ! '>='
69
72
  - !ruby/object:Gem::Version
70
- version: '0'
73
+ version: 3.0.6
71
74
  type: :runtime
72
75
  prerelease: false
73
76
  version_requirements: !ruby/object:Gem::Requirement
74
77
  none: false
75
78
  requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
76
82
  - - ! '>='
77
83
  - !ruby/object:Gem::Version
78
- version: '0'
84
+ version: 3.0.6
79
85
  - !ruby/object:Gem::Dependency
80
86
  name: activesupport
81
87
  requirement: !ruby/object:Gem::Requirement
@@ -120,8 +126,6 @@ extra_rdoc_files: []
120
126
  files:
121
127
  - .gitignore
122
128
  - .travis.yml
123
- - .travis/Gemfile.redis-gem-3.0
124
- - .travis/Gemfile.redis-gem-master
125
129
  - Gemfile
126
130
  - LICENSE.txt
127
131
  - README.md
@@ -1,6 +0,0 @@
1
- # encoding: utf-8
2
- source 'https://rubygems.org'
3
-
4
- gem 'redis', '~> 3.0'
5
-
6
- gemspec :path => '../'
@@ -1,6 +0,0 @@
1
- # encoding: utf-8
2
- source 'https://rubygems.org'
3
-
4
- gem 'redis', :git => 'https://github.com/redis/redis-rb.git'
5
-
6
- gemspec :path => '../'