couch-replicate 0.0.1 → 0.0.2
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.
- data/VERSION +1 -1
- data/lib/couch_replicate.rb +21 -2
- data/lib/couch_replicate/command_line.rb +18 -0
- data/spec/couch_replicate_spec.rb +34 -0
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/couch_replicate.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'restclient'
|
2
2
|
|
3
3
|
module CouchReplicate
|
4
|
+
def self.version
|
5
|
+
File.read(File.expand_path(File.dirname(__FILE__) + '/../VERSION')).chomp
|
6
|
+
end
|
4
7
|
|
5
8
|
def self.replicate(source_host, target_host, db)
|
6
|
-
|
7
|
-
|
9
|
+
source = hostify(source_host)
|
10
|
+
target = hostify(target_host)
|
11
|
+
RestClient.post("#{source}/_replicate",
|
12
|
+
%Q|{"source":"#{db}", "target":"#{target}/#{db}", "continuous":true}|)
|
8
13
|
end
|
9
14
|
|
10
15
|
def self.link(db, hosts)
|
@@ -19,8 +24,22 @@ module CouchReplicate
|
|
19
24
|
end
|
20
25
|
|
21
26
|
def self.nth(n, db, hosts)
|
27
|
+
return if n == db.length + 1
|
22
28
|
(Array(hosts) + Array(hosts)[0..n]).each_cons(n+1) do |src, *n_hosts|
|
23
29
|
self.replicate(src, n_hosts.last, db)
|
24
30
|
end
|
25
31
|
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
def self.hostify(raw_host)
|
35
|
+
host = raw_host.dup
|
36
|
+
host.sub!(%r{/$}, '')
|
37
|
+
unless host =~ /\:\d+$/
|
38
|
+
host += ":5984"
|
39
|
+
end
|
40
|
+
unless host =~ %r{^http://}
|
41
|
+
host = "http://" + host
|
42
|
+
end
|
43
|
+
host
|
44
|
+
end
|
26
45
|
end
|
@@ -47,12 +47,30 @@ module CouchReplicate
|
|
47
47
|
opts.on("-n", "-number [LINK_EVERY=3]", "link every n hosts") do |n|
|
48
48
|
@options[:n] = n.to_i > 0 ? n.to_i : 3
|
49
49
|
end
|
50
|
+
|
51
|
+
opts.separator ""
|
52
|
+
|
53
|
+
opts.on_tail("-v", "--version", "Show version") do
|
54
|
+
puts File.basename($0) + " " + CouchReplicate.version
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
|
58
|
+
# No argument, shows at tail. This will print an options summary.
|
59
|
+
# Try it and see!
|
60
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
61
|
+
puts opts
|
62
|
+
exit
|
63
|
+
end
|
50
64
|
end
|
51
65
|
|
52
66
|
begin
|
53
67
|
options_parser.parse!(args)
|
54
68
|
@database = args.shift
|
55
69
|
@hosts = args
|
70
|
+
|
71
|
+
if @options[:n] && (@options[:n] == @hosts.length + 1)
|
72
|
+
raise OptionParser::InvalidOption.new("The number of hosts cannot equal the replication shift.")
|
73
|
+
end
|
56
74
|
rescue OptionParser::InvalidOption => e
|
57
75
|
raise e
|
58
76
|
end
|
@@ -16,6 +16,33 @@ describe "CouchReplicate" do
|
|
16
16
|
CouchReplicate.replicate(@src_host, @target_host, @db)
|
17
17
|
end
|
18
18
|
|
19
|
+
it "should default replication to port 5984" do
|
20
|
+
RestClient.
|
21
|
+
should_receive(:post).
|
22
|
+
with("#{@src_host}/_replicate",
|
23
|
+
%Q|{"source":"#{@db}", "target":"#{@target_host}/#{@db}", "continuous":true}|)
|
24
|
+
|
25
|
+
CouchReplicate.replicate(@src_host.sub(/:5984/, ''), @target_host, @db)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should default replication to HTTP" do
|
29
|
+
RestClient.
|
30
|
+
should_receive(:post).
|
31
|
+
with("#{@src_host}/_replicate",
|
32
|
+
%Q|{"source":"#{@db}", "target":"#{@target_host}/#{@db}", "continuous":true}|)
|
33
|
+
|
34
|
+
CouchReplicate.replicate(@src_host.sub(/http:\/\//, ''), @target_host, @db)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should not care if URL ends with a slash" do
|
38
|
+
RestClient.
|
39
|
+
should_receive(:post).
|
40
|
+
with("#{@src_host}/_replicate",
|
41
|
+
%Q|{"source":"#{@db}", "target":"#{@target_host}/#{@db}", "continuous":true}|)
|
42
|
+
|
43
|
+
CouchReplicate.replicate(@src_host + '/', @target_host, @db)
|
44
|
+
end
|
45
|
+
|
19
46
|
context "replicating to multiple hosts" do
|
20
47
|
before(:each) do
|
21
48
|
@host01 = 'http://couch01.example.org:5984'
|
@@ -66,5 +93,12 @@ describe "CouchReplicate" do
|
|
66
93
|
|
67
94
|
CouchReplicate.nth(3, @db, [@host01, @host02, @host03, @host04, @host05])
|
68
95
|
end
|
96
|
+
|
97
|
+
it "should do nothing when node replicate to themselves" do
|
98
|
+
CouchReplicate.
|
99
|
+
should_not_receive(:replicate)
|
100
|
+
|
101
|
+
CouchReplicate.nth(5, @db, [@host01, @host02, @host03, @host04, @host05])
|
102
|
+
end
|
69
103
|
end
|
70
104
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couch-replicate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Strom
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-23 00:00:00 -04:00
|
13
13
|
default_executable: couch-replicate
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|