dump 1.0.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/.autotest +13 -0
- data/.gitignore +12 -0
- data/LICENSE.txt +20 -0
- data/README.markdown +250 -0
- data/dump.gemspec +22 -0
- data/lib/dump.rb +3 -0
- data/lib/dump/capistrano.rb +1 -0
- data/lib/dump/railtie.rb +8 -0
- data/lib/dump_rake.rb +85 -0
- data/lib/dump_rake/archive_tar_minitar_fix.rb +8 -0
- data/lib/dump_rake/assets.rb +22 -0
- data/lib/dump_rake/continious_timeout.rb +38 -0
- data/lib/dump_rake/dump.rb +175 -0
- data/lib/dump_rake/dump_reader.rb +289 -0
- data/lib/dump_rake/dump_writer.rb +119 -0
- data/lib/dump_rake/env.rb +139 -0
- data/lib/dump_rake/env/filter.rb +26 -0
- data/lib/dump_rake/rails_root.rb +12 -0
- data/lib/dump_rake/table_manipulation.rb +131 -0
- data/lib/generators/assets_config/assets_config_generator.rb +16 -0
- data/lib/generators/assets_config/templates/assets +8 -0
- data/lib/tasks/assets.rake +17 -0
- data/lib/tasks/dump.rake +27 -0
- data/recipes/dump.rb +343 -0
- data/script/update_readme +21 -0
- data/spec/.gitignore +1 -0
- data/spec/.tmignore +1 -0
- data/spec/cycle_spec.rb +229 -0
- data/spec/db/database.example.yml +19 -0
- data/spec/db/schema.rb +7 -0
- data/spec/dummy-3.1.3/.gitignore +15 -0
- data/spec/dummy-3.1.3/.rspec +1 -0
- data/spec/dummy-3.1.3/Gemfile +23 -0
- data/spec/dummy-3.1.3/Gemfile.lock +159 -0
- data/spec/dummy-3.1.3/README +261 -0
- data/spec/dummy-3.1.3/Rakefile +7 -0
- data/spec/dummy-3.1.3/app/assets/images/rails.png +0 -0
- data/spec/dummy-3.1.3/app/assets/javascripts/application.js +9 -0
- data/spec/dummy-3.1.3/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy-3.1.3/app/controllers/application_controller.rb +3 -0
- data/spec/dummy-3.1.3/app/helpers/application_helper.rb +2 -0
- data/spec/dummy-3.1.3/app/mailers/.gitkeep +0 -0
- data/spec/dummy-3.1.3/app/models/.gitkeep +0 -0
- data/spec/dummy-3.1.3/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy-3.1.3/config.ru +4 -0
- data/spec/dummy-3.1.3/config/application.rb +54 -0
- data/spec/dummy-3.1.3/config/boot.rb +6 -0
- data/spec/dummy-3.1.3/config/database.yml +25 -0
- data/spec/dummy-3.1.3/config/environment.rb +5 -0
- data/spec/dummy-3.1.3/config/environments/development.rb +30 -0
- data/spec/dummy-3.1.3/config/environments/production.rb +60 -0
- data/spec/dummy-3.1.3/config/environments/test.rb +39 -0
- data/spec/dummy-3.1.3/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy-3.1.3/config/initializers/inflections.rb +10 -0
- data/spec/dummy-3.1.3/config/initializers/mime_types.rb +5 -0
- data/spec/dummy-3.1.3/config/initializers/secret_token.rb +7 -0
- data/spec/dummy-3.1.3/config/initializers/session_store.rb +8 -0
- data/spec/dummy-3.1.3/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy-3.1.3/config/locales/en.yml +5 -0
- data/spec/dummy-3.1.3/config/routes.rb +58 -0
- data/spec/dummy-3.1.3/db/seeds.rb +7 -0
- data/spec/dummy-3.1.3/doc/README_FOR_APP +2 -0
- data/spec/dummy-3.1.3/lib/assets/.gitkeep +0 -0
- data/spec/dummy-3.1.3/lib/tasks/.gitkeep +0 -0
- data/spec/dummy-3.1.3/log/.gitkeep +0 -0
- data/spec/dummy-3.1.3/public/404.html +26 -0
- data/spec/dummy-3.1.3/public/422.html +26 -0
- data/spec/dummy-3.1.3/public/500.html +26 -0
- data/spec/dummy-3.1.3/public/favicon.ico +0 -0
- data/spec/dummy-3.1.3/public/index.html +241 -0
- data/spec/dummy-3.1.3/public/robots.txt +5 -0
- data/spec/dummy-3.1.3/script/rails +6 -0
- data/spec/dummy-3.1.3/spec/spec_helper.rb +32 -0
- data/spec/dummy-3.1.3/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/dummy-3.1.3/vendor/plugins/.gitkeep +0 -0
- data/spec/lib/dump_rake/dump_reader_spec.rb +638 -0
- data/spec/lib/dump_rake/dump_spec.rb +291 -0
- data/spec/lib/dump_rake/dump_writer_spec.rb +328 -0
- data/spec/lib/dump_rake/env/filter_spec.rb +56 -0
- data/spec/lib/dump_rake/env_spec.rb +139 -0
- data/spec/lib/dump_rake/rails_root_spec.rb +45 -0
- data/spec/lib/dump_rake/table_manipulation_spec.rb +256 -0
- data/spec/lib/dump_rake_spec.rb +326 -0
- data/spec/recipes/dump_spec.rb +553 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/tasks/assets_spec.rb +92 -0
- data/spec/tasks/dump_spec.rb +107 -0
- metadata +272 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
|
2
|
+
|
|
3
|
+
Filter = DumpRake::Env::Filter
|
|
4
|
+
describe Filter do
|
|
5
|
+
it "should pass everything if initialized with nil" do
|
|
6
|
+
filter = Filter.new(nil)
|
|
7
|
+
filter.pass?('a').should be_true
|
|
8
|
+
filter.pass?('b').should be_true
|
|
9
|
+
filter.pass?('c').should be_true
|
|
10
|
+
filter.pass?('d').should be_true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should pass only specified values" do
|
|
14
|
+
filter = Filter.new('a,c')
|
|
15
|
+
filter.pass?('a').should be_true
|
|
16
|
+
filter.pass?('b').should be_false
|
|
17
|
+
filter.pass?('c').should be_true
|
|
18
|
+
filter.pass?('d').should be_false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should not pass anything if initialized empty" do
|
|
22
|
+
filter = Filter.new('')
|
|
23
|
+
filter.pass?('a').should be_false
|
|
24
|
+
filter.pass?('b').should be_false
|
|
25
|
+
filter.pass?('c').should be_false
|
|
26
|
+
filter.pass?('d').should be_false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "when initialized with -" do
|
|
30
|
+
it "should pass everything except specified values" do
|
|
31
|
+
filter = Filter.new('-a,c')
|
|
32
|
+
filter.pass?('a').should be_false
|
|
33
|
+
filter.pass?('b').should be_true
|
|
34
|
+
filter.pass?('c').should be_false
|
|
35
|
+
filter.pass?('d').should be_true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should pass everything if initialized empty" do
|
|
39
|
+
filter = Filter.new('-')
|
|
40
|
+
filter.pass?('a').should be_true
|
|
41
|
+
filter.pass?('b').should be_true
|
|
42
|
+
filter.pass?('c').should be_true
|
|
43
|
+
filter.pass?('d').should be_true
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "custom_pass?" do
|
|
48
|
+
it "should pass only when any call to block returns true" do
|
|
49
|
+
filter = Filter.new('a,c')
|
|
50
|
+
filter.custom_pass?{ |value| value == 'a' }.should be_true
|
|
51
|
+
filter.custom_pass?{ |value| value == 'b' }.should be_false
|
|
52
|
+
filter.custom_pass?{ |value| value == 'c' }.should be_true
|
|
53
|
+
filter.custom_pass?{ |value| value == 'd' }.should be_false
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
Env = DumpRake::Env
|
|
4
|
+
describe Env do
|
|
5
|
+
def silence_warnings
|
|
6
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
|
7
|
+
yield
|
|
8
|
+
ensure
|
|
9
|
+
$VERBOSE = old_verbose
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
before do
|
|
13
|
+
silence_warnings do
|
|
14
|
+
@old_env, ENV = ENV, {}
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
after do
|
|
19
|
+
silence_warnings do
|
|
20
|
+
ENV = @old_env
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "with_env" do
|
|
25
|
+
it "should set env to new_value for duration of block" do
|
|
26
|
+
ENV['LIKE'] = 'old_value'
|
|
27
|
+
|
|
28
|
+
ENV['LIKE'].should == 'old_value'
|
|
29
|
+
Env.with_env('LIKE' => 'new_value') do
|
|
30
|
+
ENV['LIKE'].should == 'new_value'
|
|
31
|
+
end
|
|
32
|
+
ENV['LIKE'].should == 'old_value'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should use dictionary" do
|
|
36
|
+
ENV['LIKE'] = 'old_value'
|
|
37
|
+
|
|
38
|
+
ENV['LIKE'].should == 'old_value'
|
|
39
|
+
Env.with_env(:like => 'new_value') do
|
|
40
|
+
ENV['LIKE'].should == 'new_value'
|
|
41
|
+
end
|
|
42
|
+
ENV['LIKE'].should == 'old_value'
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "[]" do
|
|
47
|
+
it "should mimic ENV" do
|
|
48
|
+
ENV['VERSION'] = 'VERSION_value'
|
|
49
|
+
Env['VERSION'].should == ENV['VERSION']
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should return nil on non existing env variable" do
|
|
53
|
+
Env['DESCRIPTON'].should == nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should get first value that is set" do
|
|
57
|
+
ENV['VERSION'] = 'VERSION_value'
|
|
58
|
+
Env[:like].should == 'VERSION_value'
|
|
59
|
+
ENV['VER'] = 'VER_value'
|
|
60
|
+
Env[:like].should == 'VER_value'
|
|
61
|
+
ENV['LIKE'] = 'LIKE_value'
|
|
62
|
+
Env[:like].should == 'LIKE_value'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should return nil for unset variable" do
|
|
66
|
+
Env[:desc].should == nil
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe "filter" do
|
|
71
|
+
before do
|
|
72
|
+
Env.instance_variable_set(:@filters, nil)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should return Filter" do
|
|
76
|
+
ENV['TABLES'] = 'a,b,c'
|
|
77
|
+
filter = Env.filter('TABLES')
|
|
78
|
+
filter.should be_instance_of(Env::Filter)
|
|
79
|
+
filter.invert.should be_false
|
|
80
|
+
filter.values.should == %w[a b c]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "should cache created filter" do
|
|
84
|
+
ENV['TABLES'] = 'a,b,c'
|
|
85
|
+
ENV['TABLES2'] = 'a,b,c'
|
|
86
|
+
Env::Filter.should_receive(:new).with('a,b,c', nil).once
|
|
87
|
+
Env.filter('TABLES')
|
|
88
|
+
Env.filter('TABLES')
|
|
89
|
+
Env.filter('TABLES2')
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
describe "for_command" do
|
|
94
|
+
describe "when no vars present" do
|
|
95
|
+
it "should return empty hash for every command" do
|
|
96
|
+
Env.for_command(:create).should == {}
|
|
97
|
+
Env.for_command(:restore).should == {}
|
|
98
|
+
Env.for_command(:versions).should == {}
|
|
99
|
+
Env.for_command(:bad).should == {}
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should return empty hash for every command when asking for string keys" do
|
|
103
|
+
Env.for_command(:create, true).should == {}
|
|
104
|
+
Env.for_command(:restore, true).should == {}
|
|
105
|
+
Env.for_command(:versions, true).should == {}
|
|
106
|
+
Env.for_command(:bad, true).should == {}
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
describe "when vars are present" do
|
|
111
|
+
before do
|
|
112
|
+
ENV['LIKE'] = 'Version'
|
|
113
|
+
ENV['DESC'] = 'Description'
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should return hash with symbol keys for every command" do
|
|
117
|
+
Env.for_command(:create).should == {:desc => 'Description'}
|
|
118
|
+
Env.for_command(:restore).should == {:like => 'Version'}
|
|
119
|
+
Env.for_command(:versions).should == {:like => 'Version'}
|
|
120
|
+
Env.for_command(:bad).should == {}
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should return hash with symbol keys for every command when asking for string keys" do
|
|
124
|
+
Env.for_command(:create, true).should == {'DESC' => 'Description'}
|
|
125
|
+
Env.for_command(:restore, true).should == {'LIKE' => 'Version'}
|
|
126
|
+
Env.for_command(:versions, true).should == {'LIKE' => 'Version'}
|
|
127
|
+
Env.for_command(:bad, true).should == {}
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
describe "stringify!" do
|
|
133
|
+
it "should convert keys to strings" do
|
|
134
|
+
@env = {:desc => 'text', :tags => 'a b c', 'LEAVE' => 'none', 'OTHER' => 'data'}
|
|
135
|
+
Env.stringify!(@env)
|
|
136
|
+
@env.should == {'DESC' => 'text', 'TAGS' => 'a b c', 'LEAVE' => 'none', 'OTHER' => 'data'}
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
def temp_remove_const(where, which)
|
|
4
|
+
around do |example|
|
|
5
|
+
if where.const_defined?(which)
|
|
6
|
+
old = where.send(:const_get, which)
|
|
7
|
+
where.send(:remove_const, which)
|
|
8
|
+
example.run
|
|
9
|
+
where.send(:remove_const, which) if where.const_defined?(which)
|
|
10
|
+
where.const_set(which, old)
|
|
11
|
+
else
|
|
12
|
+
example.run
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe 'RailsRoot' do
|
|
18
|
+
before do
|
|
19
|
+
@root = mock('root')
|
|
20
|
+
@root.should_receive(:to_s).and_return(@root)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
temp_remove_const Object, :Rails
|
|
24
|
+
temp_remove_const Object, :RAILS_ROOT
|
|
25
|
+
temp_remove_const DumpRake, :RailsRoot
|
|
26
|
+
|
|
27
|
+
it "should use Rails if it is present" do
|
|
28
|
+
Object.const_set('Rails', mock('rails'))
|
|
29
|
+
Rails.should_receive(:root).and_return(@root)
|
|
30
|
+
load 'dump_rake/rails_root.rb'
|
|
31
|
+
DumpRake::RailsRoot.should === @root
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should use RAILS_ROOT if it is present" do
|
|
35
|
+
Object.const_set('RAILS_ROOT', @root)
|
|
36
|
+
load 'dump_rake/rails_root.rb'
|
|
37
|
+
DumpRake::RailsRoot.should === @root
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should use Dir.pwd else" do
|
|
41
|
+
Dir.should_receive(:pwd).and_return(@root)
|
|
42
|
+
load 'dump_rake/rails_root.rb'
|
|
43
|
+
DumpRake::RailsRoot.should === @root
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
require File.dirname(__FILE__) + '/../../../lib/dump_rake'
|
|
4
|
+
|
|
5
|
+
TableManipulation = DumpRake::TableManipulation
|
|
6
|
+
describe TableManipulation do
|
|
7
|
+
include TableManipulation
|
|
8
|
+
|
|
9
|
+
describe "schema_tables" do
|
|
10
|
+
it "should return schema_tables" do
|
|
11
|
+
schema_tables.should == %w[schema_info schema_migrations]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "verify_connection" do
|
|
16
|
+
it "should return result of ActiveRecord::Base.connection.verify!" do
|
|
17
|
+
ActiveRecord::Base.connection.should_receive(:verify!).and_return(:result)
|
|
18
|
+
verify_connection.should == :result
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "quote_table_name" do
|
|
23
|
+
it "should return result of ActiveRecord::Base.connection.quote_table_name" do
|
|
24
|
+
ActiveRecord::Base.connection.should_receive(:quote_table_name).with('first').and_return('`first`')
|
|
25
|
+
quote_table_name('first').should == '`first`'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "quote_column_name" do
|
|
30
|
+
it "should return result of ActiveRecord::Base.connection.quote_column_name" do
|
|
31
|
+
ActiveRecord::Base.connection.should_receive(:quote_column_name).with('first').and_return('`first`')
|
|
32
|
+
quote_column_name('first').should == '`first`'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "quote_value" do
|
|
37
|
+
it "should return result of ActiveRecord::Base.connection.quote_value" do
|
|
38
|
+
ActiveRecord::Base.connection.should_receive(:quote).with('first').and_return('`first`')
|
|
39
|
+
quote_value('first').should == '`first`'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
describe "clear_table" do
|
|
45
|
+
it "should call ActiveRecord::Base.connection.delete with sql for deleting everything from table" do
|
|
46
|
+
ActiveRecord::Base.connection.should_receive(:delete).with('DELETE FROM `first`', anything)
|
|
47
|
+
clear_table('`first`')
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe "insert_into_table" do
|
|
52
|
+
it "should call ActiveRecord::Base.connection.insert with sql for insert if values is string" do
|
|
53
|
+
ActiveRecord::Base.connection.should_receive(:insert).with("INSERT INTO `table` (`c1`,`c2`) VALUES (`v1`,`v2`)", anything)
|
|
54
|
+
insert_into_table('`table`', '(`c1`,`c2`)', '(`v1`,`v2`)')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should call ActiveRecord::Base.connection.insert with sql for insert if values is array" do
|
|
58
|
+
ActiveRecord::Base.connection.should_receive(:insert).with("INSERT INTO `table` (`c1`,`c2`) VALUES (`v11`,`v12`),(`v21`,`v22`)", anything)
|
|
59
|
+
insert_into_table('`table`', '(`c1`,`c2`)', ['(`v11`,`v12`)', '(`v21`,`v22`)'])
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "join_for_sql" do
|
|
64
|
+
it "should convert array ['`a`', '`b`'] to \"(`a`,`b`)\"" do
|
|
65
|
+
join_for_sql(%w[`a` `b`]).should == '(`a`,`b`)'
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe "columns_insert_sql" do
|
|
70
|
+
it "should return columns sql part for insert" do
|
|
71
|
+
should_receive(:quote_column_name).with('a').and_return('`a`')
|
|
72
|
+
should_receive(:quote_column_name).with('b').and_return('`b`')
|
|
73
|
+
|
|
74
|
+
columns_insert_sql(%w[a b]).should == '(`a`,`b`)'
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "values_insert_sql" do
|
|
79
|
+
it "should return values sql part for insert" do
|
|
80
|
+
should_receive(:quote_value).with('a').and_return('`a`')
|
|
81
|
+
should_receive(:quote_value).with('b').and_return('`b`')
|
|
82
|
+
|
|
83
|
+
values_insert_sql(%w[a b]).should == '(`a`,`b`)'
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
describe "tables_to_dump" do
|
|
89
|
+
it "should call ActiveRecord::Base.connection.tables" do
|
|
90
|
+
ActiveRecord::Base.connection.should_receive(:tables).and_return([])
|
|
91
|
+
tables_to_dump
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should exclude sessions table from result" do
|
|
95
|
+
ActiveRecord::Base.connection.should_receive(:tables).and_return(%w[first second schema_info schema_migrations sessions])
|
|
96
|
+
tables_to_dump.should == %w[first second schema_info schema_migrations]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe "with user defined tables" do
|
|
100
|
+
before do
|
|
101
|
+
ActiveRecord::Base.connection.should_receive(:tables).and_return(%w[first second schema_info schema_migrations sessions])
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "should select certain tables" do
|
|
105
|
+
DumpRake::Env.with_env(:tables => 'first,third,-fifth') do
|
|
106
|
+
tables_to_dump.should == %w[first schema_info schema_migrations]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "should select skip certain tables" do
|
|
111
|
+
DumpRake::Env.with_env(:tables => '-first,third,-fifth') do
|
|
112
|
+
tables_to_dump.should == %w[second schema_info schema_migrations sessions]
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should not exclude sessions table from result if asked to exclude nothing" do
|
|
117
|
+
DumpRake::Env.with_env(:tables => '-') do
|
|
118
|
+
tables_to_dump.should == %w[first second schema_info schema_migrations sessions]
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "should not exclude schema tables" do
|
|
123
|
+
DumpRake::Env.with_env(:tables => '-second,schema_info,schema_migrations') do
|
|
124
|
+
tables_to_dump.should == %w[first schema_info schema_migrations sessions]
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "should not exclude schema tables ever if asked to dump only certain tables" do
|
|
129
|
+
DumpRake::Env.with_env(:tables => 'second') do
|
|
130
|
+
tables_to_dump.should == %w[second schema_info schema_migrations]
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe "table_row_count" do
|
|
137
|
+
it "should ruturn row count for table" do
|
|
138
|
+
ActiveRecord::Base.connection.should_receive(:select_value).with("SELECT COUNT(*) FROM #{quote_table_name('first')}").and_return('666')
|
|
139
|
+
table_row_count('first').should == 666
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
describe "table_chunk_size" do
|
|
144
|
+
it "should return chunk_size based on estimated average for row size" do
|
|
145
|
+
should_receive(:table_columns).with('first').and_return(
|
|
146
|
+
[mock(:column, :type => :integer, :limit => nil)] * 3 +
|
|
147
|
+
[mock(:column, :type => :string, :limit => nil)] * 3 +
|
|
148
|
+
[mock(:column, :type => :text, :limit => nil)]
|
|
149
|
+
)
|
|
150
|
+
table_chunk_size('first').should satisfy { |n|
|
|
151
|
+
(TableManipulation::CHUNK_SIZE_MIN..TableManipulation::CHUNK_SIZE_MAX).include?(n)
|
|
152
|
+
}
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "should not return value less than CHUNK_SIZE_MIN" do
|
|
156
|
+
should_receive(:table_columns).with('first').and_return(
|
|
157
|
+
[mock(:column, :type => :text, :limit => nil)] * 100
|
|
158
|
+
)
|
|
159
|
+
table_chunk_size('first').should == TableManipulation::CHUNK_SIZE_MIN
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it "should not return value more than CHUNK_SIZE_MAX" do
|
|
163
|
+
should_receive(:table_columns).with('first').and_return(
|
|
164
|
+
[mock(:column, :type => :boolean, :limit => 1)] * 10
|
|
165
|
+
)
|
|
166
|
+
table_chunk_size('first').should == TableManipulation::CHUNK_SIZE_MAX
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
describe "table_columns" do
|
|
171
|
+
it "should return table column definitions" do
|
|
172
|
+
columns = [mock(:column), mock(:column), mock(:column)]
|
|
173
|
+
ActiveRecord::Base.connection.should_receive(:columns).with('first').and_return(columns)
|
|
174
|
+
table_columns('first').should == columns
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
describe "table_has_primary_column?" do
|
|
179
|
+
it "should return true only if table has column with name id and type :integer" do
|
|
180
|
+
should_receive(:table_primary_key).at_least(3).times.and_return('id')
|
|
181
|
+
|
|
182
|
+
should_receive(:table_columns).with('first').and_return([mock(:column, :name => 'id', :type => :integer), mock(:column, :name => 'title', :type => :integer)])
|
|
183
|
+
table_has_primary_column?('first').should be_true
|
|
184
|
+
|
|
185
|
+
should_receive(:table_columns).with('second').and_return([mock(:column, :name => 'id', :type => :string), mock(:column, :name => 'title', :type => :integer)])
|
|
186
|
+
table_has_primary_column?('second').should be_false
|
|
187
|
+
|
|
188
|
+
should_receive(:table_columns).with('third').and_return([mock(:column, :name => 'name', :type => :integer), mock(:column, :name => 'title', :type => :integer)])
|
|
189
|
+
table_has_primary_column?('third').should be_false
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
describe "table_primary_key" do
|
|
194
|
+
it "should return id" do
|
|
195
|
+
table_primary_key('first').should == 'id'
|
|
196
|
+
table_primary_key(nil).should == 'id'
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
describe "each_table_row" do
|
|
201
|
+
before do
|
|
202
|
+
@row_count = 550
|
|
203
|
+
@rows = Array.new(@row_count){ |i| {'id' => "#{i + 1}"} }
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def verify_getting_rows
|
|
207
|
+
i = 0
|
|
208
|
+
each_table_row('first', @row_count) do |row|
|
|
209
|
+
row.should == {'id' => "#{i + 1}"}
|
|
210
|
+
i += 1
|
|
211
|
+
end
|
|
212
|
+
i.should == @row_count
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it "should get rows in chunks if table has primary column and chunk size is less than row count" do
|
|
216
|
+
should_receive(:table_has_primary_column?).with('first').and_return(true)
|
|
217
|
+
should_receive(:table_chunk_size).with('first').and_return(100)
|
|
218
|
+
quoted_table_name = quote_table_name('first')
|
|
219
|
+
quoted_primary_key = "#{quoted_table_name}.#{quote_column_name(table_primary_key('first'))}"
|
|
220
|
+
sql = "SELECT * FROM #{quoted_table_name} WHERE #{quoted_primary_key} %s ORDER BY #{quoted_primary_key} ASC LIMIT 100"
|
|
221
|
+
|
|
222
|
+
should_receive(:select_all_by_sql).with(sql % '>= 0').and_return(@rows[0, 100])
|
|
223
|
+
5.times do |i|
|
|
224
|
+
last_primary_key = 100 + i * 100
|
|
225
|
+
should_receive(:select_all_by_sql).with(sql % "> #{last_primary_key}").and_return(@rows[last_primary_key, 100])
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
verify_getting_rows
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def verify_getting_rows_in_one_pass
|
|
232
|
+
should_receive(:select_all_by_sql).with("SELECT * FROM #{quote_table_name('first')}").and_return(@rows)
|
|
233
|
+
verify_getting_rows
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it "should get rows in one pass if table has primary column but chunk size is not less than row count" do
|
|
237
|
+
should_receive(:table_has_primary_column?).with('first').and_return(true)
|
|
238
|
+
should_receive(:table_chunk_size).with('first').and_return(3_000)
|
|
239
|
+
verify_getting_rows_in_one_pass
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
it "should get rows in one pass if table has no primary column" do
|
|
243
|
+
should_receive(:table_has_primary_column?).with('first').and_return(false)
|
|
244
|
+
should_not_receive(:table_chunk_size)
|
|
245
|
+
verify_getting_rows_in_one_pass
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
describe "select_all_by_sql" do
|
|
250
|
+
it "should return all rows returned by database" do
|
|
251
|
+
rows = [mock(:row), mock(:row), mock(:row)]
|
|
252
|
+
ActiveRecord::Base.connection.should_receive(:select_all).with("SELECT * FROM abc WHERE x = y").and_return(rows)
|
|
253
|
+
select_all_by_sql("SELECT * FROM abc WHERE x = y").should == rows
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|