dump 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -15
- data/.rubocop_todo.yml +1 -1
- data/Gemfile +6 -1
- data/LICENSE.txt +1 -1
- data/README.markdown +2 -2
- data/dump.gemspec +2 -2
- data/lib/dump.rb +86 -2
- data/lib/{dump_rake/archive_tar_minitar_fix.rb → dump/archive_tar_minitar.rb} +0 -0
- data/lib/{dump_rake → dump}/assets.rb +6 -4
- data/lib/dump/capistrano/v2.rb +34 -34
- data/lib/{dump_rake → dump}/continious_timeout.rb +1 -1
- data/lib/{dump_rake → dump}/env.rb +4 -4
- data/lib/{dump_rake → dump}/env/filter.rb +1 -1
- data/lib/dump/rails_root.rb +19 -0
- data/lib/{dump_rake/dump_reader.rb → dump/reader.rb} +25 -17
- data/lib/{dump_rake/dump.rb → dump/snapshot.rb} +9 -5
- data/lib/{dump_rake → dump}/table_manipulation.rb +28 -14
- data/lib/{dump_rake/dump_writer.rb → dump/writer.rb} +13 -5
- data/lib/tasks/assets.rake +4 -4
- data/lib/tasks/dump.rake +10 -10
- data/script/update_readme +3 -3
- data/spec/cycle_spec.rb +78 -84
- data/spec/{lib/dump_rake → dump}/env/filter_spec.rb +14 -14
- data/spec/dump/env_spec.rb +139 -0
- data/spec/{lib/dump_rake → dump}/rails_root_spec.rb +11 -13
- data/spec/{lib/dump_rake/dump_reader_spec.rb → dump/reader_spec.rb} +89 -89
- data/spec/dump/snapshot_spec.rb +290 -0
- data/spec/{lib/dump_rake → dump}/table_manipulation_spec.rb +54 -55
- data/spec/{lib/dump_rake/dump_writer_spec.rb → dump/writer_spec.rb} +41 -42
- data/spec/dump_spec.rb +327 -0
- data/spec/recipes/dump_spec.rb +92 -93
- data/spec/spec_helper.rb +0 -3
- data/spec/tasks/assets_spec.rb +16 -15
- data/spec/tasks/dump_spec.rb +30 -29
- metadata +75 -98
- data/.autotest +0 -13
- data/lib/dump_rake.rb +0 -94
- data/lib/dump_rake/rails_root.rb +0 -13
- data/spec/lib/dump_rake/dump_spec.rb +0 -289
- data/spec/lib/dump_rake/env_spec.rb +0 -139
- data/spec/lib/dump_rake_spec.rb +0 -326
- data/spec/spec.opts +0 -4
@@ -1,25 +1,25 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'dump/env/filter'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
filter = Filter.new(nil)
|
4
|
+
describe Dump::Env::Filter do
|
5
|
+
it 'passes everything if initialized with nil' do
|
6
|
+
filter = described_class.new(nil)
|
7
7
|
expect(filter.pass?('a')).to be_truthy
|
8
8
|
expect(filter.pass?('b')).to be_truthy
|
9
9
|
expect(filter.pass?('c')).to be_truthy
|
10
10
|
expect(filter.pass?('d')).to be_truthy
|
11
11
|
end
|
12
12
|
|
13
|
-
it '
|
14
|
-
filter =
|
13
|
+
it 'passes only specified values' do
|
14
|
+
filter = described_class.new('a,c')
|
15
15
|
expect(filter.pass?('a')).to be_truthy
|
16
16
|
expect(filter.pass?('b')).to be_falsey
|
17
17
|
expect(filter.pass?('c')).to be_truthy
|
18
18
|
expect(filter.pass?('d')).to be_falsey
|
19
19
|
end
|
20
20
|
|
21
|
-
it '
|
22
|
-
filter =
|
21
|
+
it 'does not pass anything if initialized empty' do
|
22
|
+
filter = described_class.new('')
|
23
23
|
expect(filter.pass?('a')).to be_falsey
|
24
24
|
expect(filter.pass?('b')).to be_falsey
|
25
25
|
expect(filter.pass?('c')).to be_falsey
|
@@ -27,16 +27,16 @@ describe Filter do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe 'when initialized with -' do
|
30
|
-
it '
|
31
|
-
filter =
|
30
|
+
it 'passes everything except specified values' do
|
31
|
+
filter = described_class.new('-a,c')
|
32
32
|
expect(filter.pass?('a')).to be_falsey
|
33
33
|
expect(filter.pass?('b')).to be_truthy
|
34
34
|
expect(filter.pass?('c')).to be_falsey
|
35
35
|
expect(filter.pass?('d')).to be_truthy
|
36
36
|
end
|
37
37
|
|
38
|
-
it '
|
39
|
-
filter =
|
38
|
+
it 'passes everything if initialized empty' do
|
39
|
+
filter = described_class.new('-')
|
40
40
|
expect(filter.pass?('a')).to be_truthy
|
41
41
|
expect(filter.pass?('b')).to be_truthy
|
42
42
|
expect(filter.pass?('c')).to be_truthy
|
@@ -45,8 +45,8 @@ describe Filter do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
describe 'custom_pass?' do
|
48
|
-
it '
|
49
|
-
filter =
|
48
|
+
it 'passes only when any call to block returns true' do
|
49
|
+
filter = described_class.new('a,c')
|
50
50
|
expect(filter.custom_pass?{ |value| value == 'a' }).to be_truthy
|
51
51
|
expect(filter.custom_pass?{ |value| value == 'b' }).to be_falsey
|
52
52
|
expect(filter.custom_pass?{ |value| value == 'c' }).to be_truthy
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dump/env'
|
3
|
+
|
4
|
+
describe Dump::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 'sets env to new_value for duration of block' do
|
26
|
+
ENV['LIKE'] = 'old_value'
|
27
|
+
|
28
|
+
expect(ENV['LIKE']).to eq('old_value')
|
29
|
+
described_class.with_env('LIKE' => 'new_value') do
|
30
|
+
expect(ENV['LIKE']).to eq('new_value')
|
31
|
+
end
|
32
|
+
expect(ENV['LIKE']).to eq('old_value')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'uses dictionary' do
|
36
|
+
ENV['LIKE'] = 'old_value'
|
37
|
+
|
38
|
+
expect(ENV['LIKE']).to eq('old_value')
|
39
|
+
described_class.with_env(:like => 'new_value') do
|
40
|
+
expect(ENV['LIKE']).to eq('new_value')
|
41
|
+
end
|
42
|
+
expect(ENV['LIKE']).to eq('old_value')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '[]' do
|
47
|
+
it 'mimics ENV' do
|
48
|
+
ENV['VERSION'] = 'VERSION_value'
|
49
|
+
expect(described_class['VERSION']).to eq(ENV['VERSION'])
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns nil on non existing env variable' do
|
53
|
+
expect(described_class['DESCRIPTON']).to eq(nil)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'gets first value that is set' do
|
57
|
+
ENV['VERSION'] = 'VERSION_value'
|
58
|
+
expect(described_class[:like]).to eq('VERSION_value')
|
59
|
+
ENV['VER'] = 'VER_value'
|
60
|
+
expect(described_class[:like]).to eq('VER_value')
|
61
|
+
ENV['LIKE'] = 'LIKE_value'
|
62
|
+
expect(described_class[:like]).to eq('LIKE_value')
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns nil for unset variable' do
|
66
|
+
expect(described_class[:desc]).to eq(nil)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe 'filter' do
|
71
|
+
before do
|
72
|
+
described_class.instance_variable_set(:@filters, nil)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns Filter' do
|
76
|
+
ENV['TABLES'] = 'a,b,c'
|
77
|
+
filter = described_class.filter('TABLES')
|
78
|
+
expect(filter).to be_instance_of(described_class::Filter)
|
79
|
+
expect(filter.invert).to be_falsey
|
80
|
+
expect(filter.values).to eq(%w[a b c])
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'caches created filter' do
|
84
|
+
ENV['TABLES'] = 'a,b,c'
|
85
|
+
ENV['TABLES2'] = 'a,b,c'
|
86
|
+
expect(described_class::Filter).to receive(:new).with('a,b,c', nil).once
|
87
|
+
described_class.filter('TABLES')
|
88
|
+
described_class.filter('TABLES')
|
89
|
+
described_class.filter('TABLES2')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe 'for_command' do
|
94
|
+
describe 'when no vars present' do
|
95
|
+
it 'returns empty hash for every command' do
|
96
|
+
expect(described_class.for_command(:create)).to eq({})
|
97
|
+
expect(described_class.for_command(:restore)).to eq({})
|
98
|
+
expect(described_class.for_command(:versions)).to eq({})
|
99
|
+
expect(described_class.for_command(:bad)).to eq({})
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns empty hash for every command when asking for string keys' do
|
103
|
+
expect(described_class.for_command(:create, true)).to eq({})
|
104
|
+
expect(described_class.for_command(:restore, true)).to eq({})
|
105
|
+
expect(described_class.for_command(:versions, true)).to eq({})
|
106
|
+
expect(described_class.for_command(:bad, true)).to eq({})
|
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 'returns hash with symbol keys for every command' do
|
117
|
+
expect(described_class.for_command(:create)).to eq({:desc => 'Description'})
|
118
|
+
expect(described_class.for_command(:restore)).to eq({:like => 'Version'})
|
119
|
+
expect(described_class.for_command(:versions)).to eq({:like => 'Version'})
|
120
|
+
expect(described_class.for_command(:bad)).to eq({})
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'returns hash with symbol keys for every command when asking for string keys' do
|
124
|
+
expect(described_class.for_command(:create, true)).to eq({'DESC' => 'Description'})
|
125
|
+
expect(described_class.for_command(:restore, true)).to eq({'LIKE' => 'Version'})
|
126
|
+
expect(described_class.for_command(:versions, true)).to eq({'LIKE' => 'Version'})
|
127
|
+
expect(described_class.for_command(:bad, true)).to eq({})
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe 'stringify!' do
|
133
|
+
it 'converts keys to strings' do
|
134
|
+
@env = {:desc => 'text', :tags => 'a b c', 'LEAVE' => 'none', 'OTHER' => 'data'}
|
135
|
+
described_class.stringify!(@env)
|
136
|
+
expect(@env).to eq({'DESC' => 'text', 'TAGS' => 'a b c', 'LEAVE' => 'none', 'OTHER' => 'data'})
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'dump/rails_root'
|
2
3
|
|
3
4
|
def temp_remove_const(where, which)
|
4
5
|
around do |example|
|
@@ -14,32 +15,29 @@ def temp_remove_const(where, which)
|
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
|
-
describe
|
18
|
+
describe Dump::RailsRoot do
|
19
|
+
include described_class
|
20
|
+
|
18
21
|
before do
|
19
22
|
@root = double('root')
|
20
|
-
|
23
|
+
allow(@root).to receive(:to_s).and_return(@root)
|
21
24
|
end
|
22
25
|
|
23
26
|
temp_remove_const Object, :Rails
|
24
27
|
temp_remove_const Object, :RAILS_ROOT
|
25
|
-
temp_remove_const DumpRake, :RailsRoot
|
26
28
|
|
27
|
-
it '
|
29
|
+
it 'uses Rails if it is present' do
|
28
30
|
Object.const_set('Rails', double('rails'))
|
29
31
|
expect(Rails).to receive(:root).and_return(@root)
|
30
|
-
|
31
|
-
expect(DumpRake::RailsRoot).to equal(@root)
|
32
|
+
expect(rails_root).to equal(@root)
|
32
33
|
end
|
33
34
|
|
34
|
-
it '
|
35
|
+
it 'uses RAILS_ROOT if it is present' do
|
35
36
|
Object.const_set('RAILS_ROOT', @root)
|
36
|
-
|
37
|
-
expect(DumpRake::RailsRoot).to equal(@root)
|
37
|
+
expect(rails_root).to equal(@root)
|
38
38
|
end
|
39
39
|
|
40
|
-
it '
|
41
|
-
expect
|
42
|
-
load 'dump_rake/rails_root.rb'
|
43
|
-
expect(DumpRake::RailsRoot).to equal(@root)
|
40
|
+
it 'fails otherwaise' do
|
41
|
+
expect{ rails_root }.to raise_error
|
44
42
|
end
|
45
43
|
end
|
@@ -1,22 +1,22 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'dump/reader'
|
3
3
|
require 'active_record/migration'
|
4
4
|
|
5
|
-
|
6
|
-
describe
|
5
|
+
Reader = Dump::Reader
|
6
|
+
describe Reader do
|
7
7
|
describe 'restore' do
|
8
|
-
it '
|
8
|
+
it 'creates instance and opens' do
|
9
9
|
@dump = double('dump')
|
10
10
|
expect(@dump).to receive(:open)
|
11
|
-
expect(
|
12
|
-
|
11
|
+
expect(described_class).to receive(:new).with('/abc/123.tmp').and_return(@dump)
|
12
|
+
described_class.restore('/abc/123.tmp')
|
13
13
|
end
|
14
14
|
|
15
|
-
it '
|
15
|
+
it 'calls dump subroutines' do
|
16
16
|
@dump = double('dump')
|
17
17
|
allow(@dump).to receive(:open).and_yield(@dump)
|
18
18
|
allow(@dump).to receive(:silence).and_yield
|
19
|
-
allow(
|
19
|
+
allow(described_class).to receive(:new).and_return(@dump)
|
20
20
|
|
21
21
|
expect(@dump).to receive(:read_config).ordered
|
22
22
|
expect(@dump).to receive(:migrate_down).ordered
|
@@ -24,14 +24,14 @@ describe DumpReader do
|
|
24
24
|
expect(@dump).to receive(:read_tables).ordered
|
25
25
|
expect(@dump).to receive(:read_assets).ordered
|
26
26
|
|
27
|
-
|
27
|
+
described_class.restore('/abc/123.tmp')
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
describe 'summary' do
|
32
|
-
Summary =
|
32
|
+
Summary = Reader::Summary
|
33
33
|
describe Summary do
|
34
|
-
it '
|
34
|
+
it 'formats text' do
|
35
35
|
@summary = Summary.new
|
36
36
|
@summary.header 'One'
|
37
37
|
@summary.data(%w[fff ggg jjj ppp qqq www])
|
@@ -57,18 +57,18 @@ describe DumpReader do
|
|
57
57
|
expect("#{@summary}").to eq(output.gsub(/#{output[/^\s+/]}/, ' '))
|
58
58
|
end
|
59
59
|
|
60
|
-
it '
|
60
|
+
it 'pluralizes' do
|
61
61
|
expect(Summary.pluralize(0, 'file')).to eq('0 files')
|
62
62
|
expect(Summary.pluralize(1, 'file')).to eq('1 file')
|
63
63
|
expect(Summary.pluralize(10, 'file')).to eq('10 files')
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
it '
|
67
|
+
it 'creates instance and opens' do
|
68
68
|
@dump = double('dump')
|
69
69
|
expect(@dump).to receive(:open)
|
70
|
-
expect(
|
71
|
-
|
70
|
+
expect(described_class).to receive(:new).with('/abc/123.tmp').and_return(@dump)
|
71
|
+
described_class.summary('/abc/123.tmp')
|
72
72
|
end
|
73
73
|
|
74
74
|
{
|
@@ -76,14 +76,14 @@ describe DumpReader do
|
|
76
76
|
{'path/a' => 10, 'path/b' => 20} => ['path/a: 10 entries', 'path/b: 20 entries'],
|
77
77
|
%w[path/a path/b] => %w[path/a path/b],
|
78
78
|
}.each do |assets, formatted_assets|
|
79
|
-
it '
|
79
|
+
it 'calls dump subroutines and creates summary' do
|
80
80
|
tables = {'a' => 10, 'b' => 20, 'c' => 666}
|
81
81
|
formatted_tables = ['a: 10 rows', 'b: 20 rows', 'c: 666 rows']
|
82
82
|
|
83
83
|
@dump = double('dump')
|
84
84
|
allow(@dump).to receive(:config).and_return(:tables => tables, :assets => assets)
|
85
85
|
allow(@dump).to receive(:open).and_yield(@dump)
|
86
|
-
allow(
|
86
|
+
allow(described_class).to receive(:new).and_return(@dump)
|
87
87
|
expect(@dump).to receive(:read_config)
|
88
88
|
|
89
89
|
@summary = double('summary')
|
@@ -93,11 +93,11 @@ describe DumpReader do
|
|
93
93
|
expect(@summary).to receive(:data).with(formatted_assets)
|
94
94
|
allow(Summary).to receive(:new).and_return(@summary)
|
95
95
|
|
96
|
-
expect(
|
96
|
+
expect(described_class.summary('/abc/123.tmp')).to eq(@summary)
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
it '
|
100
|
+
it 'calls dump subroutines and creates summary with schema' do
|
101
101
|
tables = {'a' => 10, 'b' => 20, 'c' => 666}
|
102
102
|
formatted_tables = ['a: 10 rows', 'b: 20 rows', 'c: 666 rows']
|
103
103
|
assets = formatted_assets = %w[path/a path/b]
|
@@ -110,7 +110,7 @@ describe DumpReader do
|
|
110
110
|
allow(@dump).to receive(:config).and_return(:tables => tables, :assets => assets)
|
111
111
|
allow(@dump).to receive(:open).and_yield(@dump)
|
112
112
|
allow(@dump).to receive(:schema).and_return(schema)
|
113
|
-
allow(
|
113
|
+
allow(described_class).to receive(:new).and_return(@dump)
|
114
114
|
expect(@dump).to receive(:read_config)
|
115
115
|
|
116
116
|
@summary = double('summary')
|
@@ -122,18 +122,18 @@ describe DumpReader do
|
|
122
122
|
expect(@summary).to receive(:data).with(schema_lines)
|
123
123
|
allow(Summary).to receive(:new).and_return(@summary)
|
124
124
|
|
125
|
-
expect(
|
125
|
+
expect(described_class.summary('/abc/123.tmp', :schema => true)).to eq(@summary)
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
129
|
describe 'open' do
|
130
|
-
it '
|
130
|
+
it 'sets stream to gzipped tar reader' do
|
131
131
|
@gzip = double('gzip')
|
132
132
|
@stream = double('stream')
|
133
133
|
expect(Zlib::GzipReader).to receive(:open).with(Pathname('123.tgz')).and_yield(@gzip)
|
134
134
|
expect(Archive::Tar::Minitar::Input).to receive(:open).with(@gzip).and_yield(@stream)
|
135
135
|
|
136
|
-
@dump =
|
136
|
+
@dump = described_class.new('123.tgz')
|
137
137
|
@dump.open do |dump|
|
138
138
|
expect(dump).to eq(@dump)
|
139
139
|
expect(dump.stream).to eq(@stream)
|
@@ -147,24 +147,24 @@ describe DumpReader do
|
|
147
147
|
@e2 = double('e2', :full_name => 'first.dump', :read => 'first.dump_data')
|
148
148
|
@e3 = double('e3', :full_name => 'second.dump', :read => 'second.dump_data')
|
149
149
|
@stream = [@e1, @e2, @e3]
|
150
|
-
@dump =
|
150
|
+
@dump = described_class.new('123.tgz')
|
151
151
|
allow(@dump).to receive(:stream).and_return(@stream)
|
152
152
|
end
|
153
153
|
|
154
154
|
describe 'find_entry' do
|
155
|
-
it '
|
155
|
+
it 'finds first entry in stream equal string' do
|
156
156
|
@dump.find_entry('config') do |entry|
|
157
157
|
expect(entry).to eq(@e1)
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
it '
|
161
|
+
it 'finds first entry in stream matching regexp' do
|
162
162
|
@dump.find_entry(/\.dump$/) do |entry|
|
163
163
|
expect(entry).to eq(@e2)
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
167
|
-
it '
|
167
|
+
it 'returns result of block' do
|
168
168
|
expect(@dump.find_entry(/\.dump$/) do |_entry|
|
169
169
|
'hello'
|
170
170
|
end).to eq('hello')
|
@@ -172,23 +172,23 @@ describe DumpReader do
|
|
172
172
|
end
|
173
173
|
|
174
174
|
describe 'read_entry' do
|
175
|
-
it '
|
175
|
+
it 'calls find_entry' do
|
176
176
|
expect(@dump).to receive(:find_entry).with('config').and_yield(@e1)
|
177
177
|
@dump.read_entry('config')
|
178
178
|
end
|
179
179
|
|
180
|
-
it '
|
180
|
+
it 'reads entries data' do
|
181
181
|
expect(@dump.read_entry('config')).to eq('config_data')
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
185
185
|
describe 'read_entry_to_file' do
|
186
|
-
it '
|
186
|
+
it 'calls find_entry' do
|
187
187
|
expect(@dump).to receive(:find_entry).with('config')
|
188
188
|
@dump.read_entry_to_file('config')
|
189
189
|
end
|
190
190
|
|
191
|
-
it '
|
191
|
+
it 'opens temp file, writes data there, rewinds and yields that file' do
|
192
192
|
@entry = double('entry')
|
193
193
|
allow(@dump).to receive(:find_entry).and_yield(@entry)
|
194
194
|
@temp = double('temp')
|
@@ -210,13 +210,13 @@ describe DumpReader do
|
|
210
210
|
describe 'subroutines' do
|
211
211
|
before do
|
212
212
|
@stream = double('stream')
|
213
|
-
@dump =
|
213
|
+
@dump = described_class.new('123.tgz')
|
214
214
|
allow(@dump).to receive(:stream).and_return(@stream)
|
215
215
|
allow(Progress).to receive(:io).and_return(StringIO.new)
|
216
216
|
end
|
217
217
|
|
218
218
|
describe 'read_config' do
|
219
|
-
it '
|
219
|
+
it 'reads config' do
|
220
220
|
@data = {:tables => {:first => 1}, :assets => %w[images videos]}
|
221
221
|
expect(@dump).to receive(:read_entry).with('config').and_return(Marshal.dump(@data))
|
222
222
|
|
@@ -226,22 +226,22 @@ describe DumpReader do
|
|
226
226
|
end
|
227
227
|
|
228
228
|
describe 'migrate_down' do
|
229
|
-
it '
|
229
|
+
it 'does not invoke rake tasks or find_entry if migrate_down is 0, no or false' do
|
230
230
|
expect(Rake::Task).not_to receive(:[])
|
231
231
|
expect(@dump).not_to receive(:find_entry)
|
232
232
|
|
233
|
-
|
233
|
+
Dump::Env.with_env(:migrate_down => '0') do
|
234
234
|
@dump.migrate_down
|
235
235
|
end
|
236
|
-
|
236
|
+
Dump::Env.with_env(:migrate_down => 'no') do
|
237
237
|
@dump.migrate_down
|
238
238
|
end
|
239
|
-
|
239
|
+
Dump::Env.with_env(:migrate_down => 'false') do
|
240
240
|
@dump.migrate_down
|
241
241
|
end
|
242
242
|
end
|
243
243
|
|
244
|
-
it '
|
244
|
+
it 'invokes db:drop and db:create if migrate_down is reset' do
|
245
245
|
@load_task = double('drop_task')
|
246
246
|
@dump_task = double('create_task')
|
247
247
|
expect(Rake::Task).to receive(:[]).with('db:drop').and_return(@load_task)
|
@@ -249,32 +249,32 @@ describe DumpReader do
|
|
249
249
|
expect(@load_task).to receive(:invoke)
|
250
250
|
expect(@dump_task).to receive(:invoke)
|
251
251
|
|
252
|
-
|
252
|
+
Dump::Env.with_env(:migrate_down => 'reset') do
|
253
253
|
@dump.migrate_down
|
254
254
|
end
|
255
255
|
end
|
256
256
|
|
257
257
|
[nil, '1'].each do |migrate_down_value|
|
258
258
|
describe "when migrate_down is #{migrate_down_value.inspect}" do
|
259
|
-
it '
|
259
|
+
it 'does not find_entry if table schema_migrations is not present' do
|
260
260
|
allow(@dump).to receive(:avaliable_tables).and_return(%w[first])
|
261
261
|
expect(@dump).not_to receive(:find_entry)
|
262
262
|
|
263
|
-
|
263
|
+
Dump::Env.with_env(:migrate_down => migrate_down_value) do
|
264
264
|
@dump.migrate_down
|
265
265
|
end
|
266
266
|
end
|
267
267
|
|
268
|
-
it '
|
268
|
+
it 'finds schema_migrations.dump if table schema_migrations is present' do
|
269
269
|
allow(@dump).to receive(:avaliable_tables).and_return(%w[schema_migrations first])
|
270
270
|
expect(@dump).to receive(:find_entry).with('schema_migrations.dump')
|
271
271
|
|
272
|
-
|
272
|
+
Dump::Env.with_env(:migrate_down => migrate_down_value) do
|
273
273
|
@dump.migrate_down
|
274
274
|
end
|
275
275
|
end
|
276
276
|
|
277
|
-
it '
|
277
|
+
it 'calls migrate down for each version not present in schema_migrations table' do
|
278
278
|
@entry = StringIO.new
|
279
279
|
Marshal.dump(['version'], @entry)
|
280
280
|
%w[1 2 3 4].each do |i|
|
@@ -289,7 +289,7 @@ describe DumpReader do
|
|
289
289
|
@versions = []
|
290
290
|
@migrate_down_task = double('migrate_down_task')
|
291
291
|
expect(@migrate_down_task).to receive('invoke').exactly(3).times do
|
292
|
-
version =
|
292
|
+
version = Dump::Env['VERSION']
|
293
293
|
@versions << version
|
294
294
|
if version == '6'
|
295
295
|
fail ActiveRecord::IrreversibleMigration
|
@@ -301,7 +301,7 @@ describe DumpReader do
|
|
301
301
|
|
302
302
|
expect(Rake::Task).to receive(:[]).with('db:migrate:down').exactly(3).times.and_return(@migrate_down_task)
|
303
303
|
|
304
|
-
|
304
|
+
Dump::Env.with_env(:migrate_down => migrate_down_value) do
|
305
305
|
@dump.migrate_down
|
306
306
|
end
|
307
307
|
expect(@versions).to eq(%w[5 6 7].reverse)
|
@@ -317,20 +317,20 @@ describe DumpReader do
|
|
317
317
|
allow(@task).to receive(:invoke)
|
318
318
|
end
|
319
319
|
|
320
|
-
it '
|
320
|
+
it 'reads schema.rb to temp file' do
|
321
321
|
expect(@dump).to receive(:read_entry_to_file).with('schema.rb')
|
322
322
|
@dump.read_schema
|
323
323
|
end
|
324
324
|
|
325
|
-
it '
|
325
|
+
it 'sets ENV SCHEMA to temp files path' do
|
326
326
|
@file = double('tempfile', :path => '/temp/123-arst')
|
327
327
|
allow(@dump).to receive(:read_entry_to_file).and_yield(@file)
|
328
328
|
|
329
|
-
expect(
|
329
|
+
expect(Dump::Env).to receive(:with_env).with('SCHEMA' => '/temp/123-arst')
|
330
330
|
@dump.read_schema
|
331
331
|
end
|
332
332
|
|
333
|
-
it '
|
333
|
+
it 'calls task db:schema:load and db:schema:dump' do
|
334
334
|
@file = double('tempfile', :path => '/temp/123-arst')
|
335
335
|
allow(@dump).to receive(:read_entry_to_file).and_yield(@file)
|
336
336
|
|
@@ -346,7 +346,7 @@ describe DumpReader do
|
|
346
346
|
end
|
347
347
|
|
348
348
|
describe 'schema' do
|
349
|
-
it '
|
349
|
+
it 'reads schema' do
|
350
350
|
@data = 'create table, rows, etc...'
|
351
351
|
expect(@dump).to receive(:read_entry).with('schema.rb').and_return(@data)
|
352
352
|
expect(@dump.schema).to eq(@data)
|
@@ -354,13 +354,13 @@ describe DumpReader do
|
|
354
354
|
end
|
355
355
|
|
356
356
|
describe 'read_tables' do
|
357
|
-
it '
|
357
|
+
it 'verifies connection' do
|
358
358
|
allow(@dump).to receive(:config).and_return({:tables => []})
|
359
359
|
expect(@dump).to receive(:verify_connection)
|
360
360
|
@dump.read_tables
|
361
361
|
end
|
362
362
|
|
363
|
-
it '
|
363
|
+
it 'calls read_table for each table in config' do
|
364
364
|
allow(@dump).to receive(:verify_connection)
|
365
365
|
allow(@dump).to receive(:config).and_return({:tables => {'first' => 1, 'second' => 3}})
|
366
366
|
|
@@ -371,25 +371,25 @@ describe DumpReader do
|
|
371
371
|
end
|
372
372
|
|
373
373
|
describe 'when called with restore_tables' do
|
374
|
-
it '
|
374
|
+
it 'verifies connection and calls read_table for each table in restore_tables' do
|
375
375
|
allow(@dump).to receive(:config).and_return({:tables => {'first' => 1, 'second' => 3}})
|
376
376
|
|
377
377
|
expect(@dump).to receive(:verify_connection)
|
378
378
|
expect(@dump).to receive(:read_table).with('first', 1)
|
379
379
|
expect(@dump).not_to receive(:read_table).with('second', 3)
|
380
380
|
|
381
|
-
|
381
|
+
Dump::Env.with_env(:restore_tables => 'first') do
|
382
382
|
@dump.read_tables
|
383
383
|
end
|
384
384
|
end
|
385
385
|
|
386
|
-
it '
|
386
|
+
it 'does not verfiy connection or call read_table for empty restore_tables' do
|
387
387
|
allow(@dump).to receive(:config).and_return({:tables => {'first' => 1, 'second' => 3}})
|
388
388
|
|
389
389
|
expect(@dump).not_to receive(:verify_connection)
|
390
390
|
expect(@dump).not_to receive(:read_table)
|
391
391
|
|
392
|
-
|
392
|
+
Dump::Env.with_env(:restore_tables => '') do
|
393
393
|
@dump.read_tables
|
394
394
|
end
|
395
395
|
end
|
@@ -397,13 +397,13 @@ describe DumpReader do
|
|
397
397
|
end
|
398
398
|
|
399
399
|
describe 'read_table' do
|
400
|
-
it '
|
400
|
+
it 'does not read table if no entry found for table' do
|
401
401
|
expect(@dump).to receive(:find_entry).with('first.dump').and_return(nil)
|
402
402
|
expect(@dump).not_to receive(:quote_table_name)
|
403
403
|
@dump.read_table('first', 10)
|
404
404
|
end
|
405
405
|
|
406
|
-
it '
|
406
|
+
it 'clears table and reads table if entry found for table' do
|
407
407
|
@entry = double('entry', :to_str => Marshal.dump('data'), :eof? => true)
|
408
408
|
expect(@dump).to receive(:columns_insert_sql).with('data')
|
409
409
|
expect(@dump).to receive(:find_entry).with('first.dump').and_yield(@entry)
|
@@ -412,7 +412,7 @@ describe DumpReader do
|
|
412
412
|
@dump.read_table('first', 10)
|
413
413
|
end
|
414
414
|
|
415
|
-
it '
|
415
|
+
it 'clears schema table before writing' do
|
416
416
|
@entry = double('entry', :to_str => Marshal.dump('data'), :eof? => true)
|
417
417
|
expect(@dump).to receive(:columns_insert_sql).with('data')
|
418
418
|
expect(@dump).to receive(:find_entry).with('schema_migrations.dump').and_yield(@entry)
|
@@ -437,7 +437,7 @@ describe DumpReader do
|
|
437
437
|
|
438
438
|
allow(@dump).to receive(:find_entry).and_yield(@entry)
|
439
439
|
end
|
440
|
-
it '
|
440
|
+
it 'reads to eof' do
|
441
441
|
create_entry(2500)
|
442
442
|
allow(@dump).to receive(:clear_table)
|
443
443
|
allow(@dump).to receive(:insert_into_table)
|
@@ -449,7 +449,7 @@ describe DumpReader do
|
|
449
449
|
match{ |actual| actual.length == n }
|
450
450
|
end
|
451
451
|
|
452
|
-
it '
|
452
|
+
it 'tries to insert rows in slices of 1000 rows' do
|
453
453
|
create_entry(2500)
|
454
454
|
allow(@dump).to receive(:clear_table)
|
455
455
|
expect(@dump).to receive(:insert_into_table).with(anything, anything, object_of_length(1000)).twice
|
@@ -458,7 +458,7 @@ describe DumpReader do
|
|
458
458
|
@dump.read_table('first', 2500)
|
459
459
|
end
|
460
460
|
|
461
|
-
it '
|
461
|
+
it 'tries to insert row by row if slice method fails' do
|
462
462
|
create_entry(2500)
|
463
463
|
allow(@dump).to receive(:clear_table)
|
464
464
|
expect(@dump).to receive(:insert_into_table).with(anything, anything, kind_of(Array)).exactly(3).times.and_raise('sql error')
|
@@ -466,7 +466,7 @@ describe DumpReader do
|
|
466
466
|
@dump.read_table('first', 2500)
|
467
467
|
end
|
468
468
|
|
469
|
-
it '
|
469
|
+
it 'quotes table, columns and values and sends them to insert_into_table' do
|
470
470
|
create_entry(100)
|
471
471
|
allow(@dump).to receive(:clear_table)
|
472
472
|
expect(@dump).to receive(:quote_table_name).with('first').and_return('`first`')
|
@@ -489,13 +489,13 @@ describe DumpReader do
|
|
489
489
|
allow(@dump).to receive(:assets_root_link).and_yield('/tmp', 'assets')
|
490
490
|
end
|
491
491
|
|
492
|
-
it '
|
492
|
+
it 'does not read assets if config[:assets] is nil' do
|
493
493
|
allow(@dump).to receive(:config).and_return({})
|
494
494
|
expect(@dump).not_to receive(:find_entry)
|
495
495
|
@dump.read_assets
|
496
496
|
end
|
497
497
|
|
498
|
-
it '
|
498
|
+
it 'does not read assets if config[:assets] is blank' do
|
499
499
|
allow(@dump).to receive(:config).and_return({:assets => []})
|
500
500
|
expect(@dump).not_to receive(:find_entry)
|
501
501
|
@dump.read_assets
|
@@ -506,7 +506,7 @@ describe DumpReader do
|
|
506
506
|
allow(@stream).to receive(:each)
|
507
507
|
end
|
508
508
|
|
509
|
-
it '
|
509
|
+
it 'calls assets:delete' do
|
510
510
|
@assets = %w[images videos]
|
511
511
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
512
512
|
allow(@dump).to receive(:find_entry)
|
@@ -516,31 +516,31 @@ describe DumpReader do
|
|
516
516
|
@dump.read_assets
|
517
517
|
end
|
518
518
|
|
519
|
-
it '
|
519
|
+
it 'calls assets:delete with ASSETS set to config[:assets] joined with :' do
|
520
520
|
@assets = %w[images videos]
|
521
521
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
522
522
|
allow(@dump).to receive(:find_entry)
|
523
523
|
|
524
524
|
expect(@task).to receive(:invoke) do
|
525
|
-
expect(
|
525
|
+
expect(Dump::Env[:assets]).to eq('images:videos')
|
526
526
|
end
|
527
527
|
|
528
528
|
@dump.read_assets
|
529
529
|
end
|
530
530
|
|
531
531
|
describe 'when called with restore_assets' do
|
532
|
-
it '
|
532
|
+
it 'deletes files and dirs only in requested paths' do
|
533
533
|
@assets = %w[images videos]
|
534
534
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
535
535
|
|
536
|
-
expect(
|
537
|
-
expect(
|
536
|
+
expect(Dump::Assets).to receive('glob_asset_children').with('images', '**/*').and_return(%w[images images/a.jpg images/b.jpg])
|
537
|
+
expect(Dump::Assets).to receive('glob_asset_children').with('videos', '**/*').and_return(%w[videos videos/a.mov])
|
538
538
|
|
539
|
-
expect(@dump).to receive('read_asset?').with('images/b.jpg',
|
540
|
-
expect(@dump).to receive('read_asset?').with('images/a.jpg',
|
541
|
-
expect(@dump).to receive('read_asset?').with('images',
|
542
|
-
expect(@dump).to receive('read_asset?').with('videos/a.mov',
|
543
|
-
expect(@dump).to receive('read_asset?').with('videos',
|
539
|
+
expect(@dump).to receive('read_asset?').with('images/b.jpg', Dump.rails_root).ordered.and_return(false)
|
540
|
+
expect(@dump).to receive('read_asset?').with('images/a.jpg', Dump.rails_root).ordered.and_return(true)
|
541
|
+
expect(@dump).to receive('read_asset?').with('images', Dump.rails_root).ordered.and_return(true)
|
542
|
+
expect(@dump).to receive('read_asset?').with('videos/a.mov', Dump.rails_root).ordered.and_return(false)
|
543
|
+
expect(@dump).to receive('read_asset?').with('videos', Dump.rails_root).ordered.and_return(false)
|
544
544
|
|
545
545
|
expect(File).to receive('file?').with('images/a.jpg').and_return(true)
|
546
546
|
expect(File).to receive('unlink').with('images/a.jpg')
|
@@ -549,16 +549,16 @@ describe DumpReader do
|
|
549
549
|
expect(File).to receive('directory?').with('images').and_return(true)
|
550
550
|
expect(Dir).to receive('unlink').with('images').and_raise(Errno::ENOTEMPTY)
|
551
551
|
|
552
|
-
|
552
|
+
Dump::Env.with_env(:restore_assets => 'images/a.*:stylesheets') do
|
553
553
|
@dump.read_assets
|
554
554
|
end
|
555
555
|
end
|
556
556
|
|
557
|
-
it '
|
557
|
+
it 'does not delete any files and dirs for empty list' do
|
558
558
|
@assets = %w[images videos]
|
559
559
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
560
560
|
|
561
|
-
expect(
|
561
|
+
expect(Dump::Assets).not_to receive('glob_asset_children')
|
562
562
|
|
563
563
|
expect(@dump).not_to receive('read_asset?')
|
564
564
|
|
@@ -566,7 +566,7 @@ describe DumpReader do
|
|
566
566
|
expect(File).not_to receive('file?')
|
567
567
|
expect(File).not_to receive('unlink')
|
568
568
|
|
569
|
-
|
569
|
+
Dump::Env.with_env(:restore_assets => '') do
|
570
570
|
@dump.read_assets
|
571
571
|
end
|
572
572
|
end
|
@@ -574,7 +574,7 @@ describe DumpReader do
|
|
574
574
|
end
|
575
575
|
|
576
576
|
describe 'old style' do
|
577
|
-
it '
|
577
|
+
it 'finds assets.tar' do
|
578
578
|
@assets = %w[images videos]
|
579
579
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
580
580
|
allow(Dir).to receive(:glob).and_return([])
|
@@ -590,7 +590,7 @@ describe DumpReader do
|
|
590
590
|
{'images' => 0, 'videos' => 0},
|
591
591
|
{'images' => {:files => 0, :total => 0}, 'videos' => {:files => 0, :total => 0}},
|
592
592
|
].each do |assets|
|
593
|
-
it '
|
593
|
+
it 'rewrites rewind method to empty method - to not raise exception, opens tar and extracts each entry' do
|
594
594
|
allow(@dump).to receive(:config).and_return({:assets => assets})
|
595
595
|
allow(Dir).to receive(:glob).and_return([])
|
596
596
|
allow(FileUtils).to receive(:remove_entry)
|
@@ -604,7 +604,7 @@ describe DumpReader do
|
|
604
604
|
@entries = %w[a b c d].map do |s|
|
605
605
|
file = double("file_#{s}")
|
606
606
|
each_excpectation.and_yield(file)
|
607
|
-
expect(@inp).to receive(:extract_entry).with(
|
607
|
+
expect(@inp).to receive(:extract_entry).with(Dump.rails_root, file)
|
608
608
|
file
|
609
609
|
end
|
610
610
|
expect(Archive::Tar::Minitar).to receive(:open).with(@assets_tar).and_yield(@inp)
|
@@ -624,7 +624,7 @@ describe DumpReader do
|
|
624
624
|
{'images' => 0, 'videos' => 0},
|
625
625
|
{'images' => {:files => 0, :total => 0}, 'videos' => {:files => 0, :total => 0}},
|
626
626
|
].each do |assets|
|
627
|
-
it '
|
627
|
+
it 'extracts each entry' do
|
628
628
|
allow(@dump).to receive(:config).and_return({:assets => assets})
|
629
629
|
allow(Dir).to receive(:glob).and_return([])
|
630
630
|
allow(FileUtils).to receive(:remove_entry)
|
@@ -648,17 +648,17 @@ describe DumpReader do
|
|
648
648
|
end
|
649
649
|
|
650
650
|
describe 'read_asset?' do
|
651
|
-
it '
|
651
|
+
it 'creates filter and call custom_pass? on it' do
|
652
652
|
@filter = double('filter')
|
653
653
|
allow(@filter).to receive('custom_pass?')
|
654
654
|
|
655
|
-
expect(
|
655
|
+
expect(Dump::Env).to receive('filter').with(:restore_assets, Dump::Assets::SPLITTER).and_return(@filter)
|
656
656
|
|
657
657
|
@dump.read_asset?('a', 'b')
|
658
658
|
end
|
659
659
|
|
660
|
-
it '
|
661
|
-
|
660
|
+
it 'tests path usint fnmatch' do
|
661
|
+
Dump::Env.with_env(:restore_assets => '[a-b]') do
|
662
662
|
expect(@dump.read_asset?('x/a', 'x')).to be_truthy
|
663
663
|
expect(@dump.read_asset?('x/b/file', 'x')).to be_truthy
|
664
664
|
expect(@dump.read_asset?('x/c', 'x')).to be_falsey
|