dbmanager 0.0.6 → 0.1.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.
- data/CHANGELOG.md +6 -0
- data/README.md +16 -15
- data/lib/dbmanager.rb +8 -2
- data/lib/dbmanager/adapters/mysql.rb +30 -52
- data/lib/dbmanager/adapters/mysql2.rb +1 -2
- data/lib/dbmanager/dumpable.rb +40 -0
- data/lib/dbmanager/environment.rb +37 -0
- data/lib/dbmanager/importable.rb +36 -0
- data/lib/dbmanager/runner.rb +21 -18
- data/lib/dbmanager/version.rb +1 -1
- data/lib/dbmanager/yml_parser.rb +0 -3
- data/lib/tasks/dbmanager.rake +2 -2
- data/spec/fixtures/adapter_sample.rb +0 -4
- data/spec/fixtures/config/database.yml +8 -16
- data/spec/fixtures/config/dbmanager_override.yml +1 -9
- data/spec/lib/adapters/mysql_spec.rb +41 -86
- data/spec/lib/dbmanager_spec.rb +2 -2
- data/spec/lib/dumpable_spec.rb +38 -0
- data/spec/lib/environment_spec.rb +45 -0
- data/spec/lib/importable_spec.rb +67 -0
- data/spec/lib/runner_spec.rb +17 -44
- data/spec/lib/yml_parser_spec.rb +2 -2
- metadata +69 -78
- data/lib/dbmanager/dumper.rb +0 -31
- data/lib/dbmanager/importer.rb +0 -22
- data/spec/lib/dumper_spec.rb +0 -28
- data/spec/lib/importer_spec.rb +0 -24
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -32,9 +32,9 @@ rake db:dump
|
|
32
32
|
```
|
33
33
|
This rake task will dump the requested db to a file on the local machine.
|
34
34
|
|
35
|
-
You will be prompted to choose the target dir (defaults to tmp
|
36
|
-
name (sql extension will be added automatically). If the
|
37
|
-
will be overwritten.
|
35
|
+
**You will be prompted to choose the target dir** (defaults to *tmp* in the rails
|
36
|
+
root) and the sql file name (sql extension will be added automatically). If the
|
37
|
+
file already exists, it will be overwritten.
|
38
38
|
|
39
39
|
|
40
40
|
#### Database Imports
|
@@ -43,25 +43,25 @@ will be overwritten.
|
|
43
43
|
rake db:import
|
44
44
|
```
|
45
45
|
|
46
|
-
|
47
|
-
|
46
|
+
**You will be prompted to choose the source and the target environment db**, and the
|
47
|
+
source db will be imported into the target db.
|
48
48
|
|
49
|
-
|
50
|
-
|
49
|
+
This task will import a source db to a destination db. Tipical use is to import
|
50
|
+
the production db into your development one. All environments containing the
|
51
51
|
string 'production' in their name are protected by default, which means you cannot
|
52
52
|
overwrite them unless you explicitly override this setting in the override file
|
53
53
|
(see next section for more info).
|
54
54
|
|
55
55
|
#### BEWARE
|
56
56
|
|
57
|
-
import process is destructive
|
58
|
-
overwite. I take no responsibility for misuse or bugs in the code ;-)
|
57
|
+
**the import process is destructive** so be careful on which environment you
|
58
|
+
choose to overwite. I take no responsibility for misuse or bugs in the code ;-)
|
59
59
|
|
60
60
|
|
61
61
|
#### Override database.yml
|
62
62
|
|
63
63
|
Since some settings may be specific to the server environment (ie. host could
|
64
|
-
be a private ip not reachable from
|
64
|
+
be a private ip not reachable from elsewhere) you can override the settings in
|
65
65
|
database.yml by adding a dbmanager_override.yml file in your rails config dir.
|
66
66
|
|
67
67
|
You can also use this file to tell the dumper to ignore certain tables with
|
@@ -74,16 +74,17 @@ the ignoretables directive:
|
|
74
74
|
- prods_view
|
75
75
|
```
|
76
76
|
|
77
|
-
Another use is to set some
|
78
|
-
|
79
|
-
|
77
|
+
Another use is to set some environment as protected, or on the other hand allow
|
78
|
+
overwriting if it's protected by default (ie. production env).
|
79
|
+
|
80
|
+
For example if you want to override the following setting, and make the database
|
80
81
|
protected from overwriting:
|
81
82
|
|
82
83
|
```yaml
|
83
84
|
beta:
|
84
85
|
host: 192.168.0.1
|
85
86
|
```
|
86
|
-
|
87
|
+
you should put this in dbmanager_override.yml:
|
87
88
|
|
88
89
|
```yaml
|
89
90
|
beta:
|
@@ -91,7 +92,7 @@ beta:
|
|
91
92
|
protected: true
|
92
93
|
```
|
93
94
|
|
94
|
-
Instead, if
|
95
|
+
Instead, if you want to make the production env writable you should add this:
|
95
96
|
|
96
97
|
```yaml
|
97
98
|
production:
|
data/lib/dbmanager.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
module Dbmanager
|
2
|
-
class
|
2
|
+
class EnvironmentProtectedError < StandardError
|
3
|
+
def initialize(message=nil)
|
4
|
+
super message || 'sorry the environment is protected from writing'
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class MixedAdapterError < StandardError
|
3
9
|
def initialize(message=nil)
|
4
10
|
super message || 'You cannot mix different adapters!'
|
5
11
|
end
|
@@ -37,6 +43,6 @@ require 'active_support/ordered_hash'
|
|
37
43
|
require 'active_support/core_ext/enumerable'
|
38
44
|
require 'active_support/core_ext/object/blank'
|
39
45
|
|
40
|
-
%w[yml_parser adapters/mysql adapters/mysql2 runner
|
46
|
+
%w[environment yml_parser adapters/mysql adapters/mysql2 runner importable dumpable].each do |string|
|
41
47
|
require File.expand_path "../dbmanager/#{string}", __FILE__
|
42
48
|
end
|
@@ -3,48 +3,19 @@ require 'time'
|
|
3
3
|
module Dbmanager
|
4
4
|
module Adapters
|
5
5
|
module Mysql
|
6
|
-
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
delegate :host, :adapter, :database, :username, :password, :ignoretables,
|
16
|
-
:encoding, :protected, :name, :port , :to => :environment
|
17
|
-
|
18
|
-
def initialize(environment)
|
19
|
-
@environment = environment
|
20
|
-
end
|
21
|
-
|
22
|
-
def params
|
23
|
-
"-u#{username} #{flag :password, :p} #{flag :host, :h} #{flag :port, :P} #{database}"
|
24
|
-
end
|
25
|
-
|
26
|
-
def ignore_tables
|
27
|
-
if ignoretables.present?
|
28
|
-
ignoretables.inject('') do |s, view|
|
29
|
-
s << " --ignore-table=#{database}.#{view}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def flag(name, flag)
|
35
|
-
send(name).present? ? "-#{flag}#{send(name)}" : ''
|
36
|
-
end
|
37
|
-
|
38
|
-
def protected?
|
39
|
-
if name =~ /production/
|
40
|
-
protected != false
|
41
|
-
else
|
42
|
-
protected == true
|
43
|
-
end
|
6
|
+
module Connectable
|
7
|
+
def params(environment)
|
8
|
+
[ "-u#{environment.username}",
|
9
|
+
environment.flag(:password, :p),
|
10
|
+
environment.flag(:host, :h),
|
11
|
+
environment.flag(:port, :P),
|
12
|
+
environment.database
|
13
|
+
].compact.join(' ')
|
44
14
|
end
|
45
15
|
end
|
46
16
|
|
47
17
|
class Dumper
|
18
|
+
include Connectable
|
48
19
|
attr_reader :source, :filename
|
49
20
|
|
50
21
|
def initialize(source, filename)
|
@@ -57,38 +28,45 @@ module Dbmanager
|
|
57
28
|
end
|
58
29
|
|
59
30
|
def dump_command
|
60
|
-
"mysqldump #{
|
31
|
+
"mysqldump #{ignoretables} #{params(source)} > #{filename}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def ignoretables
|
35
|
+
if source.ignoretables.present?
|
36
|
+
source.ignoretables.inject [] do |arr, table|
|
37
|
+
arr << "--ignore-table=#{source.database}.#{table}"
|
38
|
+
end.join ' '
|
39
|
+
end
|
61
40
|
end
|
62
41
|
end
|
63
42
|
|
64
43
|
class Importer
|
65
|
-
|
44
|
+
include Connectable
|
45
|
+
attr_reader :source, :target, :tmp_file
|
66
46
|
|
67
|
-
def initialize(source, target)
|
68
|
-
@source
|
69
|
-
@target
|
47
|
+
def initialize(source, target, tmp_file)
|
48
|
+
@source = source
|
49
|
+
@target = target
|
50
|
+
@tmp_file = tmp_file
|
70
51
|
end
|
71
52
|
|
72
53
|
def run
|
73
|
-
Dumper.new(source,
|
54
|
+
Dumper.new(source, tmp_file).run
|
74
55
|
Dbmanager.execute! import_command
|
75
|
-
|
56
|
+
ensure
|
57
|
+
remove_tmp_file
|
76
58
|
end
|
77
59
|
|
78
60
|
def import_command
|
79
61
|
unless target.protected?
|
80
|
-
"mysql #{target
|
62
|
+
"mysql #{params(target)} < #{tmp_file}"
|
81
63
|
else
|
82
64
|
raise EnvironmentProtectedError
|
83
65
|
end
|
84
66
|
end
|
85
67
|
|
86
|
-
def
|
87
|
-
Dbmanager.execute "rm #{
|
88
|
-
end
|
89
|
-
|
90
|
-
def temp_file
|
91
|
-
@temp_file ||= "/tmp/#{Time.now.strftime '%y%m%d%H%M%S'}"
|
68
|
+
def remove_tmp_file
|
69
|
+
Dbmanager.execute "rm #{tmp_file}"
|
92
70
|
end
|
93
71
|
end
|
94
72
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Extends the runner with database dumping capabilities.
|
2
|
+
#
|
3
|
+
# The user will be prompted to enter the target filename path, pressing enter
|
4
|
+
# will set it to the default which is the value returned by #default_filename.
|
5
|
+
#
|
6
|
+
# The dump process happens in the #run method, and is eventually delegated to
|
7
|
+
# the specific database adapter which must implement the #run method.
|
8
|
+
module Dbmanager
|
9
|
+
module Dumpable
|
10
|
+
def self.extended(base)
|
11
|
+
class << base; attr_accessor :filename; end
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
output.puts "\nPlease choose target file (defaults to #{default_filename}):\n\n"
|
16
|
+
@filename = get_filename
|
17
|
+
dumper.run
|
18
|
+
output.puts "Database successfully dumped in #{filename} file."
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def dumper
|
24
|
+
adapter::Dumper.new(source, filename)
|
25
|
+
end
|
26
|
+
|
27
|
+
def adapter
|
28
|
+
Dbmanager::Adapters.const_get source.adapter.capitalize
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_filename
|
32
|
+
Dbmanager.rails_root.join "tmp/#{source.database}.sql"
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_filename
|
36
|
+
filename = input.gets.chomp
|
37
|
+
filename.blank? ? default_filename : Dbmanager.rails_root.join(filename)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
# An +Environment+ object is created for each environment listed in the
|
3
|
+
# database.yml file.
|
4
|
+
#
|
5
|
+
# Common useful options are:
|
6
|
+
# +ignore_tables+: a list of tables that will not be dumped.
|
7
|
+
#
|
8
|
+
# +protected+: makes the environment protected from overwriting.
|
9
|
+
# By default every environment except for the ones that contain the
|
10
|
+
# +production+ string can be overwritten. This is dangerous of course, so you
|
11
|
+
# can protect an environment from overwriting adding +protected: true+ to
|
12
|
+
# that environment in the database.yml file.
|
13
|
+
# If on the other hand you want to be free to overwrite the production db
|
14
|
+
# you need to explicitly set +protected: false+ to that environment in the
|
15
|
+
# database.yml file.
|
16
|
+
module Dbmanager
|
17
|
+
class Environment < OpenStruct
|
18
|
+
|
19
|
+
# verifies whether the environment is protected from overwriting or not.
|
20
|
+
def protected?
|
21
|
+
if name =~ /production/
|
22
|
+
protected != false
|
23
|
+
else
|
24
|
+
protected == true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# returns the flag formatted for the requested attribute, if present.
|
29
|
+
# env = Environment.new(:password => 'secret')
|
30
|
+
# env.flag('password', 'p') # => -psecret
|
31
|
+
# env.flag('foo', 'f') # => nil
|
32
|
+
def flag(attribute, flag)
|
33
|
+
value = send attribute
|
34
|
+
"-#{flag}#{value}" if value.present?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Extends the runner with database importing capabilities.
|
2
|
+
#
|
3
|
+
# The import process happens in the #run method, and is eventually delegated to
|
4
|
+
# the specific database adapter which must implement the #run method. This
|
5
|
+
# adapter will receive the source and target environment plus the path for the
|
6
|
+
# sql dump file.
|
7
|
+
#
|
8
|
+
# The source and target environment must use the same adapter, ie you cannot
|
9
|
+
# import a mysql database on a sqlite3 database. For that purpose you can use
|
10
|
+
# the taps gem.
|
11
|
+
module Dbmanager
|
12
|
+
module Importable
|
13
|
+
def self.extended(base)
|
14
|
+
class << base; attr_reader :target; end
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
@target = get_env('target')
|
19
|
+
execute_import
|
20
|
+
output.puts 'Database Import completed.'
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute_import
|
24
|
+
adapter::Importer.new(source, target, tmp_file).run
|
25
|
+
end
|
26
|
+
|
27
|
+
def adapter
|
28
|
+
raise MixedAdapterError if source.adapter != target.adapter
|
29
|
+
Dbmanager::Adapters.const_get source.adapter.capitalize
|
30
|
+
end
|
31
|
+
|
32
|
+
def tmp_file
|
33
|
+
@tmp_file ||= File.join Dbmanager.rails_root, 'tmp', Time.now.strftime('%y%m%d%H%M%S')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/dbmanager/runner.rb
CHANGED
@@ -1,34 +1,37 @@
|
|
1
|
+
# The runner main responsibility is to interact with the user in order to gather
|
2
|
+
# the information to accomplish the task.
|
3
|
+
#
|
4
|
+
# The runner object cannot do much when freshly instantiated, so for each kind
|
5
|
+
# of available task there is a corresponding module that can extend the runner
|
6
|
+
# so that it can accomplish its goal.
|
7
|
+
#
|
8
|
+
# Extension modules must define the #run method which contains the specific
|
9
|
+
# behaviour they provide.
|
1
10
|
module Dbmanager
|
2
11
|
class Runner
|
3
|
-
attr_reader :input, :output, :environments, :source
|
12
|
+
attr_reader :input, :output, :environments, :source
|
4
13
|
|
5
|
-
def self.run
|
6
|
-
new
|
14
|
+
def self.run(module_name)
|
15
|
+
runner = new
|
16
|
+
runner.extend Dbmanager.const_get(module_name.capitalize)
|
17
|
+
runner.run
|
7
18
|
end
|
8
19
|
|
9
|
-
def initialize(input, output)
|
20
|
+
def initialize(input=STDIN, output=STDOUT)
|
10
21
|
@input = input
|
11
22
|
@output = output
|
12
23
|
@environments = YmlParser.environments
|
13
|
-
@
|
14
|
-
@source = adapter::Connection.new(set_source)
|
24
|
+
@source = get_env
|
15
25
|
end
|
16
26
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
raise AdapterError
|
21
|
-
else
|
22
|
-
Dbmanager::Adapters.const_get adapters.first.capitalize
|
23
|
-
end
|
27
|
+
def get_env(type='source')
|
28
|
+
output.puts "\nPlease choose #{type} db:\n\n"
|
29
|
+
get_environment
|
24
30
|
end
|
25
31
|
|
26
|
-
|
27
|
-
output.puts "\nPlease choose source db:\n\n"
|
28
|
-
get_env
|
29
|
-
end
|
32
|
+
private
|
30
33
|
|
31
|
-
def
|
34
|
+
def get_environment
|
32
35
|
environments.keys.each_with_index do |name, i|
|
33
36
|
output.puts "#{i+1}) #{name}"
|
34
37
|
end
|
data/lib/dbmanager/version.rb
CHANGED
data/lib/dbmanager/yml_parser.rb
CHANGED
data/lib/tasks/dbmanager.rake
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
namespace :db do
|
2
2
|
desc 'import specific environment db data into another environment db'
|
3
3
|
task :import do
|
4
|
-
Dbmanager::
|
4
|
+
Dbmanager::Runner.run('importable')
|
5
5
|
end
|
6
6
|
|
7
7
|
desc 'dump specific environment db data in tmp directory'
|
8
8
|
task :dump do
|
9
|
-
Dbmanager::
|
9
|
+
Dbmanager::Runner.run('dumpable')
|
10
10
|
end
|
11
11
|
end
|
@@ -3,16 +3,13 @@ development:
|
|
3
3
|
database: demo_development
|
4
4
|
encoding: utf8
|
5
5
|
username: root
|
6
|
-
password:
|
7
|
-
|
8
|
-
# ale i tuoi settaggi specifici devi metterli in config/dbloginyml, non qui
|
9
|
-
# socket: /Applications/MAMP/tmp/mysql/mysql.sock
|
6
|
+
password: secret
|
10
7
|
|
11
8
|
beta:
|
12
9
|
adapter: mysql
|
13
10
|
database: demo_beta
|
14
|
-
username:
|
15
|
-
password:
|
11
|
+
username: beta_user
|
12
|
+
password: beta_pass
|
16
13
|
port: 3306
|
17
14
|
host: 123.123.123.123
|
18
15
|
encoding: utf8
|
@@ -20,26 +17,21 @@ beta:
|
|
20
17
|
production:
|
21
18
|
adapter: mysql
|
22
19
|
database: demo_production
|
23
|
-
username:
|
24
|
-
password:
|
20
|
+
username: prod_user
|
21
|
+
password: prod_pass
|
25
22
|
port: 3306
|
26
23
|
host: 123.123.123.123
|
27
24
|
encoding: utf8
|
28
25
|
|
29
26
|
test:
|
30
|
-
adapter:
|
27
|
+
adapter: sqlite3
|
31
28
|
database: demo_test
|
32
|
-
encoding: utf8
|
33
|
-
port: 3306
|
34
|
-
host: 345.345.345.345
|
35
|
-
username: root
|
36
|
-
password: devil
|
37
29
|
|
38
30
|
shop:
|
39
31
|
adapter: mysql
|
40
32
|
database: demo_shop
|
41
|
-
username:
|
42
|
-
password:
|
33
|
+
username: demo_user
|
34
|
+
password: demo_pass
|
43
35
|
port: 3306
|
44
36
|
host: 123.123.123.123
|
45
37
|
encoding: utf8
|
@@ -3,93 +3,64 @@ require 'spec_helper'
|
|
3
3
|
module Dbmanager
|
4
4
|
module Adapters
|
5
5
|
module Mysql
|
6
|
-
describe
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
it 'returns expected string' do
|
18
|
-
subject.params.should == '-uroot -pdevil -h345.345.345.345 -P3306 demo_test'
|
19
|
-
end
|
20
|
-
end
|
6
|
+
describe Dumper do
|
7
|
+
let :source do
|
8
|
+
Environment.new(
|
9
|
+
:username => 'root',
|
10
|
+
:ignoretables => ['a_view', 'another_view'],
|
11
|
+
:database => 'database',
|
12
|
+
:password => 'secret',
|
13
|
+
:port => 42,
|
14
|
+
:host => '0.0.0.0'
|
15
|
+
)
|
16
|
+
end
|
21
17
|
|
22
|
-
|
23
|
-
context 'when there are tables to be skipped' do
|
24
|
-
it 'returns expected string' do
|
25
|
-
subject.ignore_tables.should == ' --ignore-table=demo_test.view0 --ignore-table=demo_test.view1'
|
26
|
-
end
|
27
|
-
end
|
18
|
+
subject { Dumper.new(source, '/tmp/dump_file.sql') }
|
28
19
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
20
|
+
describe '#ignoretables' do
|
21
|
+
context 'when there are tables to be ignored' do
|
22
|
+
it 'returns a string containing ignore-table flags' do
|
23
|
+
string = '--ignore-table=database.a_view --ignore-table=database.another_view'
|
24
|
+
subject.ignoretables.should == string
|
34
25
|
end
|
35
26
|
end
|
36
27
|
|
37
|
-
|
38
|
-
it '
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
context 'when name matches production string' do
|
43
|
-
it 'is true by default ' do
|
44
|
-
subject.stub! :name => 'production-merge'
|
45
|
-
subject.should be_protected
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when protected is set to false' do
|
49
|
-
it 'is false' do
|
50
|
-
subject.stub! :name => 'production', :protected => false
|
51
|
-
subject.should_not be_protected
|
52
|
-
end
|
53
|
-
end
|
28
|
+
context 'when there are no tables to be ignored' do
|
29
|
+
it 'returns nil' do
|
30
|
+
source.stub!(:ignoretables => nil)
|
31
|
+
subject.ignoretables.should be_nil
|
54
32
|
end
|
55
33
|
end
|
34
|
+
end
|
56
35
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
it 'returns a blank string' do
|
66
|
-
subject.stub!(:password => nil)
|
67
|
-
subject.flag(:password, :p).should == ''
|
68
|
-
end
|
69
|
-
end
|
36
|
+
describe '#dump_command' do
|
37
|
+
it 'returns expected command' do
|
38
|
+
command = [
|
39
|
+
'mysqldump --ignore-table=database.a_view',
|
40
|
+
'--ignore-table=database.another_view -uroot',
|
41
|
+
'-psecret -h0.0.0.0 -P42 database > /tmp/dump_file.sql'
|
42
|
+
].join(' ')
|
43
|
+
subject.dump_command.should == command
|
70
44
|
end
|
71
45
|
end
|
72
46
|
end
|
73
47
|
|
74
48
|
describe Importer do
|
75
49
|
describe 'an importer instance' do
|
76
|
-
before
|
77
|
-
let(:target)
|
78
|
-
let(:source)
|
79
|
-
|
50
|
+
before { Time.stub! :now => Time.parse('2012/03/23 12:30:32') }
|
51
|
+
let(:target) { Environment.new :protected => false, :name => 'beta', :username => 'beta_user' }
|
52
|
+
let(:source) { Environment.new :protected => false, :name => 'development', :username => 'root' }
|
53
|
+
let(:tmp_file) { '/some/arbitrary/path' }
|
54
|
+
subject { Importer.new source, target, tmp_file }
|
80
55
|
|
81
56
|
it 'has target and source attribute methods' do
|
82
|
-
%w[source target].each { |m| subject.should respond_to
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'has a timestamped temporary file' do
|
86
|
-
subject.temp_file.should == '/tmp/120323123032'
|
57
|
+
%w[source target tmp_file].each { |m| subject.should respond_to m }
|
87
58
|
end
|
88
59
|
|
89
60
|
describe '#import_command' do
|
90
61
|
context 'when environment is not protected' do
|
91
62
|
it 'returns expected command' do
|
92
|
-
subject.import_command.should == 'mysql
|
63
|
+
subject.import_command.should == 'mysql -ubeta_user < /some/arbitrary/path'
|
93
64
|
end
|
94
65
|
end
|
95
66
|
|
@@ -101,10 +72,10 @@ module Dbmanager
|
|
101
72
|
end
|
102
73
|
end
|
103
74
|
|
104
|
-
describe '#
|
75
|
+
describe '#remove_tmp_file' do
|
105
76
|
it 'tries to remove the temporary file' do
|
106
|
-
Dbmanager.should_receive(:execute).with("rm #{subject.
|
107
|
-
subject.
|
77
|
+
Dbmanager.should_receive(:execute).with("rm #{subject.tmp_file}")
|
78
|
+
subject.remove_tmp_file
|
108
79
|
end
|
109
80
|
end
|
110
81
|
|
@@ -117,29 +88,13 @@ module Dbmanager
|
|
117
88
|
|
118
89
|
it 'imports the db' do
|
119
90
|
Dumper.stub! :new => mock.as_null_object
|
120
|
-
subject.stub!(:
|
91
|
+
subject.stub!(:remove_tmp_file => true)
|
121
92
|
Dbmanager.should_receive(:execute!).with(subject.import_command)
|
122
93
|
subject.run
|
123
94
|
end
|
124
95
|
end
|
125
96
|
end
|
126
97
|
end
|
127
|
-
|
128
|
-
describe Dumper do
|
129
|
-
subject do
|
130
|
-
Dumper.new(
|
131
|
-
mock(:params => 'source-params', :ignore_tables => '--ignore-table=view'),
|
132
|
-
'/tmp/dump_file.sql'
|
133
|
-
)
|
134
|
-
end
|
135
|
-
|
136
|
-
describe '#dump_command' do
|
137
|
-
it 'returns expected command' do
|
138
|
-
command = 'mysqldump source-params --ignore-table=view > /tmp/dump_file.sql'
|
139
|
-
subject.dump_command.should == command
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
98
|
end
|
144
99
|
end
|
145
100
|
end
|
data/spec/lib/dbmanager_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Dbmanager do
|
4
4
|
describe '#rails_root' do
|
5
|
-
it '
|
5
|
+
it 'wraps Rails.root' do
|
6
6
|
Rails = mock unless defined? Rails
|
7
7
|
Rails.should_receive :root
|
8
8
|
Dbmanager.rails_root
|
@@ -10,7 +10,7 @@ describe Dbmanager do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
describe '#execute' do
|
13
|
-
it '
|
13
|
+
it 'executes a system command' do
|
14
14
|
Dbmanager.should_receive(:system)
|
15
15
|
Dbmanager.execute('echo')
|
16
16
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dbmanager
|
4
|
+
describe Dumpable do
|
5
|
+
subject do
|
6
|
+
Object.new.tap {|o| o.extend Dumpable}
|
7
|
+
end
|
8
|
+
|
9
|
+
before do
|
10
|
+
subject.stub :output => STDStub.new, :input => STDStub.new
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#run' do
|
14
|
+
before do
|
15
|
+
subject.stub(
|
16
|
+
:get_filename => 'filename',
|
17
|
+
:default_filename => 'defaultname',
|
18
|
+
:dumper => mock.as_null_object
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'sends expected output' do
|
23
|
+
subject.run
|
24
|
+
[
|
25
|
+
'Please choose target file (defaults to defaultname):',
|
26
|
+
'Database successfully dumped in filename file.'
|
27
|
+
].each do |message|
|
28
|
+
subject.output.content.should include(message)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'delegates the actual dumping to the dumper' do
|
33
|
+
subject.send(:dumper).should_receive(:run)
|
34
|
+
subject.run
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dbmanager
|
4
|
+
describe Environment do
|
5
|
+
describe 'a generic environment' do
|
6
|
+
subject { Environment.new :name => 'beta' }
|
7
|
+
|
8
|
+
it { subject.should_not be_protected }
|
9
|
+
|
10
|
+
context 'when the protected attribute is changed to true' do
|
11
|
+
before { subject.protected = true }
|
12
|
+
|
13
|
+
it { subject.should be_protected }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'the production environment' do
|
18
|
+
subject { Environment.new(:name => 'production') }
|
19
|
+
|
20
|
+
it { subject.should be_protected }
|
21
|
+
|
22
|
+
context 'when the protected attribute is explicitly set to false' do
|
23
|
+
before { subject.protected = false }
|
24
|
+
|
25
|
+
it { subject.should_not be_protected }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#flag' do
|
30
|
+
context 'when requested attribute is present' do
|
31
|
+
before { subject.stub(:password => 'secret') }
|
32
|
+
|
33
|
+
it 'returns a string containing the expected flag' do
|
34
|
+
subject.flag(:password, :p).should == '-psecret'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when the requested attribute is not present' do
|
39
|
+
it 'returns nil' do
|
40
|
+
subject.flag(:foo, :p).should be_nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dbmanager
|
4
|
+
describe Importable do
|
5
|
+
subject do
|
6
|
+
Object.new.tap {|o| o.extend Importable}
|
7
|
+
end
|
8
|
+
|
9
|
+
before do
|
10
|
+
stub_rails_root
|
11
|
+
subject.stub :output => STDStub.new, :input => STDStub.new, :get_env => nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'has target attribute reader' do
|
15
|
+
subject.instance_eval { @target = 'something'}
|
16
|
+
subject.target.should == 'something'
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when source and target have same adapter' do
|
20
|
+
before do
|
21
|
+
subject.stub(
|
22
|
+
:source => mock(:adapter => 'mysql2'),
|
23
|
+
:target => mock(:adapter => 'mysql2')
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'uses the expected adapter' do
|
28
|
+
subject.adapter.should == Dbmanager::Adapters::Mysql2
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'delegates importing process to the adapter importer' do
|
32
|
+
adapter_importer = Dbmanager::Adapters::Mysql2::Importer
|
33
|
+
adapter_importer.should_receive(:new).and_return mock.as_null_object
|
34
|
+
subject.run
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when source and target adapters differ' do
|
39
|
+
before do
|
40
|
+
subject.stub(
|
41
|
+
:source => mock(:adapter => 'sqlite3'),
|
42
|
+
:target => mock(:adapter => 'mysql2')
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'adapter raises MixedAdapterError' do
|
47
|
+
expect {subject.adapter}.to raise_error(MixedAdapterError)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#run' do
|
52
|
+
it 'outputs expected messages' do
|
53
|
+
subject.stub(:execute_import => nil)
|
54
|
+
subject.run
|
55
|
+
message = 'Database Import completed.'
|
56
|
+
subject.output.content.should include(message)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#tmp_file' do
|
61
|
+
it 'includes expected path' do
|
62
|
+
Time.stub :now => Time.parse('1974/09/20 14:12:33')
|
63
|
+
subject.tmp_file.should =~ Regexp.new('dbmanager/spec/fixtures/tmp/740920141233')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/lib/runner_spec.rb
CHANGED
@@ -3,68 +3,41 @@ require 'fixtures/adapter_sample'
|
|
3
3
|
|
4
4
|
module Dbmanager
|
5
5
|
describe Runner do
|
6
|
-
let(:
|
6
|
+
let(:envs) { [mock] }
|
7
|
+
let(:input) { STDStub.new }
|
7
8
|
let(:output) { STDStub.new }
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
before do
|
11
|
+
YmlParser.stub!(:environments => envs)
|
12
|
+
Runner.any_instance.stub(:get_environment => envs.first)
|
13
|
+
end
|
11
14
|
|
15
|
+
describe '#initialize' do
|
12
16
|
subject { Runner.new(input, output) }
|
13
17
|
|
14
|
-
before do
|
15
|
-
YmlParser.stub!(:environments => envs)
|
16
|
-
Runner.any_instance.stub(:set_adapter => Adapters::SomeAdapter, :set_source => nil)
|
17
|
-
end
|
18
|
-
|
19
18
|
it 'sets expected attributes' do
|
20
19
|
subject.input.should == input
|
21
20
|
subject.output.should == output
|
22
21
|
subject.environments.should == envs
|
23
|
-
subject.
|
24
|
-
subject.source.should be_a(Adapters::SomeAdapter::Connection)
|
22
|
+
subject.source.should == envs.first
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
|
-
describe '#
|
26
|
+
describe '#get_env' do
|
29
27
|
subject { Runner.new(input, output) }
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
it 'raises an error' do
|
35
|
-
envs = {:beta => mock(:adapter => 'Mysql'), :development => mock(:adapter => 'Sqlite3')}
|
36
|
-
subject.stub!(:environments => envs)
|
37
|
-
expect { subject.set_adapter }.to raise_error(AdapterError)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when there is only one kind of adapter' do
|
42
|
-
it 'returns an adapter class' do
|
43
|
-
envs = {:beta => mock(:adapter => 'Mysql'), :development => mock(:adapter => 'Mysql')}
|
44
|
-
subject.instance_variable_set '@environments', envs
|
45
|
-
Dbmanager::Adapters.should_receive(:const_get).and_return(Adapters::SomeAdapter)
|
46
|
-
subject.set_adapter.should == Adapters::SomeAdapter
|
47
|
-
end
|
29
|
+
it 'outputs default message' do
|
30
|
+
subject.get_env
|
31
|
+
output.content.should include('Please choose source db:')
|
48
32
|
end
|
49
33
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
subject.instance_variable_set '@environments', envs
|
54
|
-
subject.set_adapter.should == Adapters::Mysql2
|
55
|
-
end
|
34
|
+
it 'outputs expected message' do
|
35
|
+
subject.get_env('target')
|
36
|
+
output.content.should include('Please choose target db:')
|
56
37
|
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe '#set_source' do
|
60
|
-
subject { Runner.new(input, output) }
|
61
|
-
|
62
|
-
before { Runner.any_instance.stub(:set_adapter => Adapters::SomeAdapter) }
|
63
38
|
|
64
|
-
it '
|
65
|
-
|
66
|
-
subject.set_source
|
67
|
-
output.content.should include('Please choose source db:')
|
39
|
+
it 'returns the chosen environment' do
|
40
|
+
subject.get_env.should == envs.first
|
68
41
|
end
|
69
42
|
end
|
70
43
|
end
|
data/spec/lib/yml_parser_spec.rb
CHANGED
@@ -52,12 +52,12 @@ module Dbmanager
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'removes old unchanged settings' do
|
55
|
-
YmlParser.config['beta']['username'].should == '
|
55
|
+
YmlParser.config['beta']['username'].should == 'beta_user'
|
56
56
|
end
|
57
57
|
|
58
58
|
context 'when the environment has a ignoretables directive' do
|
59
59
|
it 'should populate ignoretables with the expected array' do
|
60
|
-
YmlParser.config['beta']['ignoretables'].should == ['
|
60
|
+
YmlParser.config['beta']['ignoretables'].should == ['some_view']
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
metadata
CHANGED
@@ -1,74 +1,71 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbmanager
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 6
|
10
|
-
version: 0.0.6
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- andrea longhi
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-06-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: activesupport
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: rspec
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
25
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
46
38
|
type: :development
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: rake
|
50
39
|
prerelease: false
|
51
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
41
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
60
54
|
type: :development
|
61
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
62
|
description: helps manage db dumps and imports via rake tasks
|
63
|
-
email:
|
63
|
+
email:
|
64
64
|
- andrea.longhi@mikamai.com
|
65
65
|
executables: []
|
66
|
-
|
67
66
|
extensions: []
|
68
|
-
|
69
67
|
extra_rdoc_files: []
|
70
|
-
|
71
|
-
files:
|
68
|
+
files:
|
72
69
|
- .gitignore
|
73
70
|
- CHANGELOG.md
|
74
71
|
- Gemfile
|
@@ -79,8 +76,9 @@ files:
|
|
79
76
|
- lib/dbmanager.rb
|
80
77
|
- lib/dbmanager/adapters/mysql.rb
|
81
78
|
- lib/dbmanager/adapters/mysql2.rb
|
82
|
-
- lib/dbmanager/
|
83
|
-
- lib/dbmanager/
|
79
|
+
- lib/dbmanager/dumpable.rb
|
80
|
+
- lib/dbmanager/environment.rb
|
81
|
+
- lib/dbmanager/importable.rb
|
84
82
|
- lib/dbmanager/runner.rb
|
85
83
|
- lib/dbmanager/version.rb
|
86
84
|
- lib/dbmanager/yml_parser.rb
|
@@ -92,53 +90,46 @@ files:
|
|
92
90
|
- spec/fixtures/config/dbmanager_override.yml
|
93
91
|
- spec/lib/adapters/mysql_spec.rb
|
94
92
|
- spec/lib/dbmanager_spec.rb
|
95
|
-
- spec/lib/
|
96
|
-
- spec/lib/
|
93
|
+
- spec/lib/dumpable_spec.rb
|
94
|
+
- spec/lib/environment_spec.rb
|
95
|
+
- spec/lib/importable_spec.rb
|
97
96
|
- spec/lib/runner_spec.rb
|
98
97
|
- spec/lib/yml_parser_spec.rb
|
99
98
|
- spec/spec_helper.rb
|
100
99
|
- spec/support/std_stub.rb
|
101
|
-
homepage:
|
100
|
+
homepage: ''
|
102
101
|
licenses: []
|
103
|
-
|
104
102
|
post_install_message:
|
105
103
|
rdoc_options: []
|
106
|
-
|
107
|
-
require_paths:
|
104
|
+
require_paths:
|
108
105
|
- lib
|
109
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
107
|
none: false
|
111
|
-
requirements:
|
112
|
-
- -
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
|
115
|
-
|
116
|
-
- 0
|
117
|
-
version: "0"
|
118
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
113
|
none: false
|
120
|
-
requirements:
|
121
|
-
- -
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
|
124
|
-
segments:
|
125
|
-
- 0
|
126
|
-
version: "0"
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
127
118
|
requirements: []
|
128
|
-
|
129
119
|
rubyforge_project: dbmanager
|
130
120
|
rubygems_version: 1.8.24
|
131
121
|
signing_key:
|
132
122
|
specification_version: 3
|
133
123
|
summary: database manager
|
134
|
-
test_files:
|
124
|
+
test_files:
|
135
125
|
- spec/fixtures/adapter_sample.rb
|
136
126
|
- spec/fixtures/config/database.yml
|
137
127
|
- spec/fixtures/config/dbmanager_override.yml
|
138
128
|
- spec/lib/adapters/mysql_spec.rb
|
139
129
|
- spec/lib/dbmanager_spec.rb
|
140
|
-
- spec/lib/
|
141
|
-
- spec/lib/
|
130
|
+
- spec/lib/dumpable_spec.rb
|
131
|
+
- spec/lib/environment_spec.rb
|
132
|
+
- spec/lib/importable_spec.rb
|
142
133
|
- spec/lib/runner_spec.rb
|
143
134
|
- spec/lib/yml_parser_spec.rb
|
144
135
|
- spec/spec_helper.rb
|
data/lib/dbmanager/dumper.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Dbmanager
|
2
|
-
class Dumper < Runner
|
3
|
-
attr_reader :filename
|
4
|
-
|
5
|
-
def initialize(input=STDIN, output=STDOUT)
|
6
|
-
super
|
7
|
-
@filename = set_filename
|
8
|
-
end
|
9
|
-
|
10
|
-
def run
|
11
|
-
adapter::Dumper.new(source, filename).run
|
12
|
-
output.puts "Database Dump completed to #{filename}"
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def set_filename
|
18
|
-
output.puts "\nPlease choose target file (defaults to #{default_filename})\n\n"
|
19
|
-
get_filename
|
20
|
-
end
|
21
|
-
|
22
|
-
def default_filename
|
23
|
-
"#{Dbmanager.rails_root.join 'tmp', "#{source.database}.sql"}"
|
24
|
-
end
|
25
|
-
|
26
|
-
def get_filename
|
27
|
-
filename = input.gets.chomp
|
28
|
-
filename.blank? ? default_filename : Dbmanager.rails_root.join(filename)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/dbmanager/importer.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Dbmanager
|
2
|
-
class Importer < Runner
|
3
|
-
attr_reader :target
|
4
|
-
|
5
|
-
def initialize(input=STDIN, output=STDOUT)
|
6
|
-
super
|
7
|
-
@target = adapter::Connection.new(set_target)
|
8
|
-
end
|
9
|
-
|
10
|
-
def run
|
11
|
-
adapter::Importer.new(source, target).run
|
12
|
-
output.puts 'Database Import completed.'
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def set_target
|
18
|
-
output.puts "\nPlease choose target db:\n\n"
|
19
|
-
get_env
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/spec/lib/dumper_spec.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fixtures/adapter_sample'
|
3
|
-
|
4
|
-
module Dbmanager
|
5
|
-
describe Dumper do
|
6
|
-
describe '#run' do
|
7
|
-
let(:input) { STDStub.new }
|
8
|
-
let(:output) { STDStub.new }
|
9
|
-
|
10
|
-
subject { Dumper.new(input, output) }
|
11
|
-
|
12
|
-
before do
|
13
|
-
stub_rails_root
|
14
|
-
input.stub!(:gets => mock.as_null_object)
|
15
|
-
Dumper.any_instance.stub(
|
16
|
-
:set_source => nil,
|
17
|
-
:adapter => Adapters::SomeAdapter,
|
18
|
-
:default_filename => 'default_filename'
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'dumps a db' do
|
23
|
-
Adapters::SomeAdapter::Dumper.should_receive(:new).and_return(mock(:run => nil))
|
24
|
-
subject.run
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/spec/lib/importer_spec.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fixtures/adapter_sample'
|
3
|
-
|
4
|
-
module Dbmanager
|
5
|
-
describe Importer do
|
6
|
-
describe '#run' do
|
7
|
-
let(:input) { STDStub.new }
|
8
|
-
let(:output) { STDStub.new }
|
9
|
-
|
10
|
-
subject { Importer.new(input, output) }
|
11
|
-
|
12
|
-
before do
|
13
|
-
stub_rails_root
|
14
|
-
input.stub!(:gets => "1\n")
|
15
|
-
Importer.any_instance.stub(:adapter => Adapters::SomeAdapter)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'imports a db' do
|
19
|
-
Adapters::SomeAdapter::Importer.should_receive(:new).and_return(mock(:run => nil))
|
20
|
-
subject.run
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|