mongo-db-utils 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4b606d4315fee51104eb916d246ddb99f72f1e7
4
- data.tar.gz: 1fa85aef6b8ba85fc9003816104a5fa148f58cfa
3
+ metadata.gz: 0ebe472c1c71790c06618838dac17a6da13db206
4
+ data.tar.gz: e8a5fa1960f3a5c988818fdab24657f167adeaf6
5
5
  SHA512:
6
- metadata.gz: c3b8e02d0069b541d7c65da085dc6df197e4adf96206ec9f54b47e79ae013a115802a5e35b062295eda0a5ed2737d28243f1494853cd34d4cea3a18737ad0f61
7
- data.tar.gz: 64fdf69be96e95b613d8daff5ecd81c243d4db1efe10f3f4e03cf862d2b205802df8c75ceefd9ea79ab99bb381106acdffbee5df7f16f4a6eff60e7b64f0712a
6
+ metadata.gz: 825c9dd5b70b4729afaea862888d5cd308c36ed9edf004dd60aa5e66e4b8f31d17fc3b1cffcfe2dc4761151dd60aa770208c104c0cd53996fea9c25d24338dd5
7
+ data.tar.gz: ac3a00ea228736521b54495d38ad0bae15b1bda24993cf93bc94c08d8fc44e8ae0c7d9d65030e77d44de3f08095a88598df0d9766deabceb2851e9cc1e016878
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Build Status](https://travis-ci.org/edeustace/mongo-db-utils.png)](https://travis-ci.org/edeustace/mongo-db-utils)
4
4
 
5
5
 
6
- ### !Current version 0.0.9.3 is in Beta - for a safer version use 0.0.9
6
+ ### !Current version 0.1.1 is in Beta - for a safer version use 0.0.9
7
7
 
8
8
  A little gem that simplifies backing up and copying your mongo dbs.
9
9
 
@@ -55,6 +55,12 @@ When it does backups it stores them in ````~/.mongo-db-utils/backups/````. The n
55
55
 
56
56
 
57
57
  ## Release Notes
58
+ * 0.1.2 - BETA
59
+ - Added 'host' and 'port' getters to Db AND 'hosts' getter to ReplicaSetDb
60
+
61
+ * 0.1.1 - BETA
62
+ - Tidy up Tools - add Import and Restore to tool set
63
+
58
64
  * 0.1.0 - BETA
59
65
  - Fixed CLI backup and backup_s3 not using the config-loader correctly.
60
66
 
@@ -4,6 +4,8 @@ require 'mongo'
4
4
  module MongoDbUtils
5
5
  class Cmd
6
6
 
7
+ include MongoDbUtils::Tools
8
+
7
9
  def self.backup(db, folder, final_path = nil, tar_it = true)
8
10
  puts ">> Backing up: #{db}, #{folder}, #{final_path}"
9
11
  unless( db_exists?(db) )
@@ -21,12 +23,12 @@ module MongoDbUtils
21
23
  puts ">> final backup path: #{full_path}"
22
24
 
23
25
  FileUtils.mkdir_p(full_path)
24
- MongoDbUtils::Tools::Dump.run(
26
+ Dump.new(
25
27
  db.to_host_s,
26
28
  db.name,
27
29
  full_path,
28
30
  db.username,
29
- db.password)
31
+ db.password).run
30
32
 
31
33
  if( tar_it )
32
34
  Dir.chdir(full_path)
@@ -66,12 +68,12 @@ module MongoDbUtils
66
68
  password = ""
67
69
  end
68
70
 
69
- MongoDbUtils::Tools::Restore.run(
71
+ Restore.new(
70
72
  destination.to_host_s,
71
73
  destination.name,
72
74
  "#{tmp_dump_path}",
73
75
  username,
74
- password)
76
+ password).run
75
77
 
76
78
  `rm -fr #{tmp_path}`
77
79
  end
@@ -1,6 +1,23 @@
1
1
  module MongoDbUtils
2
2
  module Model
3
3
 
4
+
5
+ # This method accepts 2 possible uri formats
6
+ # 1. the conventional mongo_uri format: mongodb://xxxxxxxx
7
+ # 2. the non standard way of representing a replicaset uri:
8
+ # --> replica_set|mongo_uri
9
+ # --> Eg: my-set|mongodb://xxxxxxx
10
+ # This is useful because many mongo commands require the set name
11
+ # when invoking them and this bundles the 2 things together
12
+ def self.db_from_uri(uri)
13
+ if(uri.include? "|")
14
+ split = uri.split("|")
15
+ ReplicaSetDb.new(split[1], split[0])
16
+ else
17
+ Db.new(uri)
18
+ end
19
+ end
20
+
4
21
  # A Db stored in the config
5
22
  class Db
6
23
 
@@ -33,6 +50,14 @@ module MongoDbUtils
33
50
  has?(self.username) && has?(self.password)
34
51
  end
35
52
 
53
+ def host
54
+ host_and_port[:host]
55
+ end
56
+
57
+ def port
58
+ host_and_port[:port]
59
+ end
60
+
36
61
  # Return the host string in a format that is compatable with mongo binary tools
37
62
  # See: http://docs.mongodb.org/manual/reference/program/mongodump/#cmdoption-mongodump--host
38
63
  def to_host_s
@@ -55,6 +80,12 @@ module MongoDbUtils
55
80
  def has?(s)
56
81
  !s.nil? && !s.empty?
57
82
  end
83
+
84
+
85
+ def host_and_port
86
+ match, host,port = *@host_port.match(/(.*):(.*)/)
87
+ { :host => host, :port => port }
88
+ end
58
89
  end
59
90
 
60
91
 
@@ -66,6 +97,22 @@ module MongoDbUtils
66
97
  @set_name = name
67
98
  end
68
99
 
100
+
101
+ # Return an array of host:port strings
102
+ def hosts
103
+ @host_port.split(",")
104
+ end
105
+
106
+ # Block usage of this method from the super
107
+ def host
108
+ raise "'host' is not a valid method for a ReplicaSetDb - use 'hosts' instead."
109
+ end
110
+
111
+ # Block usage of this method from the super
112
+ def port
113
+ raise "'port' is not a valid method for a ReplicaSetDb - use 'hosts' instead."
114
+ end
115
+
69
116
  # Note: we override this to provide a replica set format
70
117
  def to_host_s
71
118
  "#{@set_name}/#{@host_port}"
@@ -13,13 +13,30 @@ module MongoDbUtils
13
13
  end
14
14
 
15
15
  class BaseCmd
16
+
17
+ def initialize(cmd_name, host_and_port, db, username = "", password = "")
18
+ @options = build_base_options(host_and_port, db, username, password)
19
+ @cmd_name = cmd_name
20
+ end
21
+
22
+ def run
23
+ puts "[#{self.class}] run: #{cmd}"
24
+ output = `#{cmd}`
25
+ raise ToolsException.new("#{cmd}", output) unless $?.to_i == 0
26
+ end
27
+
28
+ def cmd
29
+ "#{@cmd_name} #{options_string(@options)}"
30
+ end
31
+
16
32
  private
17
- def self.o(key,value)
33
+
34
+ def o(key,value)
18
35
  Option.new(key,value)
19
36
  end
20
37
 
21
38
  # options common to all commands
22
- def self.build_base_options(host_and_port,db,username="",password="")
39
+ def build_base_options(host_and_port,db,username="",password="")
23
40
  options = []
24
41
  options << o("-h", host_and_port)
25
42
  options << o("-db", db)
@@ -29,57 +46,73 @@ module MongoDbUtils
29
46
  end
30
47
 
31
48
  # given an array of options build a string of those options unless the option is empty
32
- def self.options_string(opts)
33
- out = ""
34
- opts.each do |o|
35
- out << "#{o.key} #{o.value} " unless o.empty?
36
- end
37
- out.strip
49
+ def options_string(opts)
50
+ opt_strings = opts.reject{ |o| o.empty? }.map { |o| o.to_s }
51
+ opt_strings.join(" ").strip
38
52
  end
39
53
  end
40
54
 
41
55
  class Dump < BaseCmd
42
- # create the cmd string that will be executed by the system
43
- def self.cmd(host_and_port,db,output,username = "", password = "")
44
- options = build_base_options(host_and_port,db,username,password)
45
- options << o("-o", output)
46
- "mongodump #{options_string(options)}"
47
- end
48
-
49
- # run the command
50
- def self.run(host_and_port,db,output,username="", password ="")
51
- cmd_string = self.cmd(host_and_port,db,output,username,password)
52
- puts "[Dump] run: #{cmd_string}"
53
- output = `#{cmd_string}`
54
- raise ToolsException.new("#{cmd_string}", output) unless $?.to_i == 0
56
+ def initialize(host_and_port,db,output,username = "", password = "")
57
+ super("mongodump", host_and_port, db, username, password)
58
+ @options << o("-o", output)
55
59
  end
56
60
  end
57
61
 
58
62
  class Restore < BaseCmd
59
- def self.cmd(host_and_port,db,source_folder,username = "", password = "")
60
- options = build_base_options(host_and_port,db,username,password)
61
- params = options_string(options) << " --drop #{source_folder}"
62
- "mongorestore #{params}"
63
+ def initialize(host_and_port,db,source_folder,username = "", password = "")
64
+ super("mongorestore", host_and_port, db, username, password)
65
+ @options << "--drop"
66
+ @source_folder = source_folder
63
67
  end
64
68
 
65
- def self.run(host_and_port,db,source_folder,username="", password ="")
66
- cmd_string = self.cmd(host_and_port,db,source_folder,username,password)
67
- puts "[Restore] run: #{cmd_string}"
68
- output = `#{cmd_string}`
69
- raise ToolsException.new("#{cmd_string}", output) unless $?.to_i == 0
69
+ def cmd
70
+ "#{super} #{@source_folder}"
70
71
  end
71
72
  end
72
73
 
74
+ class Import < BaseCmd
75
+ def initialize(host_and_port, db, collection, file, username = "", password = "", opts = {})
76
+ super("mongoimport", host_and_port, db, username, password)
77
+ @options << o("-c", collection)
78
+ @options << o("--file", file)
79
+ @options << "--jsonArray" if opts[:json_array]
80
+ end
81
+ end
82
+
83
+ class Export < BaseCmd
84
+
85
+ def initialize(host_and_port, db, collection, query, output, username = "", password = "", opts = {})
86
+ super("mongoexport", host_and_port, db, username, password)
87
+ @options << o("-c", collection)
88
+ @options << o("-o", output)
89
+ @options << o("--query", "'#{query}'")
90
+ @options << "--jsonArray" if opts[:json_array]
91
+ end
92
+ end
73
93
 
74
94
  class Option
75
95
  attr_accessor :key, :value
76
96
 
77
- def initialize(key,value)
97
+ def initialize(key,value = nil)
78
98
  @key = key
79
99
  @value = value
80
100
  end
81
101
 
82
102
  def empty?
103
+ (@value.nil? || @value.empty?)
104
+ end
105
+
106
+ def to_s
107
+ if empty?
108
+ nil
109
+ else
110
+ "#{@key} #{@value}"
111
+ end
112
+ end
113
+
114
+ private
115
+ def value_empty?
83
116
  @value.nil? || @value.empty?
84
117
  end
85
118
  end
@@ -1,4 +1,4 @@
1
1
  module MongoDbUtils
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.2"
3
3
  READY_FOR_USE = "(Beta version)"
4
4
  end
@@ -13,6 +13,8 @@ describe MongoDbUtils::Model::Db do
13
13
  db.password.should == "pass"
14
14
  db.uri == "mongodb://user:pass@localhost:27017/db"
15
15
  db.authentication_required?.should == true
16
+ db.host.should == "localhost"
17
+ db.port.should == "27017"
16
18
  end
17
19
 
18
20
  it "should construct - no user/pass" do
@@ -23,6 +25,8 @@ describe MongoDbUtils::Model::Db do
23
25
  db.password.should == ""
24
26
  db.uri == "mongodb://localhost:27017/db"
25
27
  db.authentication_required?.should == false
28
+ db.host.should == "localhost"
29
+ db.port.should == "27017"
26
30
  end
27
31
 
28
32
  it "should build a replicaset db" do
@@ -31,6 +35,28 @@ describe MongoDbUtils::Model::Db do
31
35
  rs.to_host_s === "my-set/host:port,host2:port2"
32
36
  rs.uri.should == "mongodb://user:pass@host:port,host2:port2/db"
33
37
  rs.authentication_required?.should == true
38
+
39
+ expect{ rs.host }.to raise_error
40
+ expect{ rs.port }.to raise_error
41
+
42
+ rs.hosts.should == ["host:port", "host2:port2"]
43
+
44
+ end
45
+
46
+
47
+ it "should parse the uri correctly" do
48
+ MongoDbUtils::Model.db_from_uri("mongodb://localhost:27017/db").class.to_s.should == "MongoDbUtils::Model::Db"
49
+ MongoDbUtils::Model.db_from_uri("set|mongodb://s:2,s:3/db").class.to_s.should == "MongoDbUtils::Model::ReplicaSetDb"
50
+ end
51
+
52
+
53
+ it "should parse a full url" do
54
+
55
+ uri = "rs-ds063347|mongodb://user:pass@ds063347-a0.mongolab.com:63347,ds063347-a1.mongolab.com:63347/staging"
56
+ db = MongoDbUtils::Model.db_from_uri(uri)
57
+ db.username.should eql "user"
58
+ db.password.should == "pass"
59
+ db.to_host_s.should == "rs-ds063347/ds063347-a0.mongolab.com:63347,ds063347-a1.mongolab.com:63347"
34
60
  end
35
61
 
36
62
  end
@@ -1,38 +1,78 @@
1
1
  require 'mongo-db-utils/tools/commands'
2
2
 
3
- describe MongoDbUtils::Tools::Dump do
3
+ include MongoDbUtils::Tools
4
4
 
5
- dump = MongoDbUtils::Tools::Dump
5
+ describe Dump do
6
6
 
7
7
  it "should work with single uris" do
8
- dump.cmd("host:port", "db", "out", "user", "pass").should eql "mongodump -h host:port -db db -u user -p pass -o out"
8
+ Dump.new("host:port", "db", "out", "user", "pass").cmd.should eql "mongodump -h host:port -db db -u user -p pass -o out"
9
9
  end
10
-
11
10
  it "should work with single uris - no user/pass" do
12
- dump.cmd("host:port", "db", "out").should eql "mongodump -h host:port -db db -o out"
11
+ Dump.new("host:port", "db", "out").cmd.should eql "mongodump -h host:port -db db -o out"
13
12
  end
14
13
 
15
14
  it "should work with replica set uris" do
16
15
  expected = "mongodump -h setname/host1:port1,host2:port2 -db db -u user -p pass -o out"
17
- dump.cmd("setname/host1:port1,host2:port2","db", "out", "user", "pass").should eql expected
16
+ Dump.new("setname/host1:port1,host2:port2","db", "out", "user", "pass").cmd.should eql expected
18
17
  end
19
18
  end
20
19
 
21
-
22
- describe MongoDbUtils::Tools::Restore do
23
-
24
- restore = MongoDbUtils::Tools::Restore
20
+ describe Restore do
25
21
 
26
22
  it "should work with single uris" do
27
- restore.cmd("host:port", "db", "source", "user", "pass").should eql "mongorestore -h host:port -db db -u user -p pass --drop source"
23
+ Restore.new("host:port", "db", "source", "user", "pass").cmd.should eql "mongorestore -h host:port -db db -u user -p pass --drop source"
28
24
  end
29
25
 
30
26
  it "should work with single uris" do
31
- restore.cmd("host:port", "db", "source").should eql "mongorestore -h host:port -db db --drop source"
27
+ Restore.new("host:port", "db", "source").cmd.should eql "mongorestore -h host:port -db db --drop source"
32
28
  end
33
29
 
34
30
  it "should work with replica set uris" do
35
31
  expected = "mongorestore -h setname/host1:port1,host2:port2 -db db -u user -p pass --drop source"
36
- restore.cmd("setname/host1:port1,host2:port2","db", "source", "user", "pass").should eql expected
32
+ Restore.new("setname/host1:port1,host2:port2","db", "source", "user", "pass").cmd.should eql expected
33
+ end
34
+ end
35
+
36
+ describe Import do
37
+
38
+ it "should work with single uris - with user/pass" do
39
+ Import.new("host:port", "db", "coll", "myfile.json", "user", "pass").cmd.should eql "mongoimport -h host:port -db db -u user -p pass -c coll --file myfile.json"
37
40
  end
38
- end
41
+
42
+ it "should work with single uris - no user/pass" do
43
+ Import.new("host:port", "db", "coll", "myfile.json").cmd.should eql "mongoimport -h host:port -db db -c coll --file myfile.json"
44
+ end
45
+
46
+ it "should work with replica set uris" do
47
+ expected = "mongoimport -h setname/host1:port1,host2:port2 -db db -u user -p pass -c coll --file myfile.json --jsonArray"
48
+ Import.new("setname/host1:port1,host2:port2","db", "coll", "myfile.json", "user", "pass", { :json_array => true} ).cmd.should eql expected
49
+ end
50
+ end
51
+
52
+ describe Export do
53
+
54
+ it "should work with single uris - with user/pass" do
55
+ Export.new("host:port", "db", "coll", "{query}", "myfile.json", "user", "pass").cmd.should eql "mongoexport -h host:port -db db -u user -p pass -c coll -o myfile.json --query '{query}'"
56
+ end
57
+
58
+ it "should work with single uris - no user/pass" do
59
+ Export.new("host:port", "db", "coll", "{query}", "myfile.json").cmd.should eql "mongoexport -h host:port -db db -c coll -o myfile.json --query '{query}'"
60
+ end
61
+
62
+ it "should work with replica set uris" do
63
+ expected = "mongoexport -h setname/host1:port1,host2:port2 -db db -u user -p pass -c coll -o myfile.json --query '{query}' --jsonArray"
64
+ Export.new("setname/host1:port1,host2:port2","db", "coll", "{query}", "myfile.json", "user", "pass", { :json_array => true} ).cmd.should eql expected
65
+ end
66
+ end
67
+
68
+ describe Option do
69
+
70
+ it "should return empty? correctly" do
71
+ Option.new("a", "b").empty?.should eql false
72
+ Option.new("a", "b").to_s.should eql "a b"
73
+ Option.new("a").empty?.should eql true
74
+ Option.new("a").to_s.should eql nil
75
+ Option.new("").empty?.should eql true
76
+ end
77
+
78
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo-db-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - edeustace
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-28 00:00:00.000000000 Z
11
+ date: 2013-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec