dump 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.rubocop.yml +53 -0
- data/.rubocop_todo.yml +33 -0
- data/.travis.yml +12 -3
- data/README.markdown +8 -0
- data/dump.gemspec +4 -1
- data/lib/dump.rb +1 -0
- data/lib/dump/capistrano.rb +7 -1
- data/lib/dump/capistrano/v2.rb +331 -0
- data/lib/dump/railtie.rb +1 -0
- data/lib/dump_rake.rb +17 -8
- data/lib/dump_rake/archive_tar_minitar_fix.rb +3 -1
- data/lib/dump_rake/assets.rb +1 -0
- data/lib/dump_rake/continious_timeout.rb +17 -17
- data/lib/dump_rake/dump.rb +27 -22
- data/lib/dump_rake/dump_reader.rb +62 -63
- data/lib/dump_rake/dump_writer.rb +20 -21
- data/lib/dump_rake/env.rb +12 -10
- data/lib/dump_rake/env/filter.rb +3 -0
- data/lib/dump_rake/rails_root.rb +1 -0
- data/lib/dump_rake/table_manipulation.rb +23 -20
- data/lib/generators/assets_config/assets_config_generator.rb +2 -0
- data/lib/tasks/assets.rake +1 -2
- data/lib/tasks/dump.rake +5 -6
- data/recipes/dump.rb +1 -343
- data/script/update_readme +5 -3
- data/spec/cycle_spec.rb +33 -30
- data/spec/dummy_rails_app.rb +42 -0
- data/spec/lib/dump_rake/dump_reader_spec.rb +80 -92
- data/spec/lib/dump_rake/dump_spec.rb +56 -58
- data/spec/lib/dump_rake/dump_writer_spec.rb +42 -43
- data/spec/lib/dump_rake/env/filter_spec.rb +9 -9
- data/spec/lib/dump_rake/env_spec.rb +21 -21
- data/spec/lib/dump_rake/rails_root_spec.rb +7 -7
- data/spec/lib/dump_rake/table_manipulation_spec.rb +57 -63
- data/spec/lib/dump_rake_spec.rb +76 -76
- data/spec/recipes/dump_spec.rb +241 -217
- data/spec/spec_helper.rb +1 -42
- data/spec/tasks/assets_spec.rb +18 -18
- data/spec/tasks/dump_spec.rb +18 -18
- metadata +21 -2
data/script/update_readme
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
2
5
|
|
3
|
-
$: << File.join(File.dirname(__FILE__), '../lib')
|
4
6
|
require 'pathname'
|
5
7
|
require 'dump_rake/env'
|
6
8
|
|
@@ -9,7 +11,7 @@ lines = readme.readlines.map(&:rstrip)
|
|
9
11
|
readme.open('w') do |f|
|
10
12
|
lines.each do |line|
|
11
13
|
line.sub!(/^`(.+?)`.*—.*$/) do
|
12
|
-
key, names = DumpRake::Env::DICTIONARY.find{ |
|
14
|
+
key, names = DumpRake::Env::DICTIONARY.find{ |_key, values| values.include?(Regexp.last_match[1]) }
|
13
15
|
if key
|
14
16
|
names = names.map{ |name| "`#{name}`" }.join(', ')
|
15
17
|
explanation = DumpRake::Env::EXPLANATIONS[key]
|
data/spec/cycle_spec.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require File.dirname(__FILE__) + '/../lib/dump_rake'
|
4
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dump_rake'
|
5
3
|
require 'tmpdir'
|
6
4
|
|
5
|
+
class Chicken < ActiveRecord::Base
|
6
|
+
end
|
7
|
+
|
7
8
|
def database_configs
|
8
|
-
YAML
|
9
|
+
YAML.load(IO.read(File.expand_path('../db/database.yml', __FILE__)))
|
9
10
|
end
|
10
11
|
|
11
12
|
def adapters
|
@@ -18,12 +19,12 @@ def use_adapter(adapter)
|
|
18
19
|
case config['adapter']
|
19
20
|
when /^mysql/
|
20
21
|
ActiveRecord::Base.establish_connection(config.merge('database' => nil))
|
21
|
-
ActiveRecord::Base.connection.drop_database config['database']
|
22
|
+
ActiveRecord::Base.connection.drop_database config['database']
|
22
23
|
ActiveRecord::Base.connection.create_database(config['database'])
|
23
24
|
ActiveRecord::Base.establish_connection(config)
|
24
25
|
when /^postgresql/
|
25
26
|
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
26
|
-
ActiveRecord::Base.connection.drop_database config['database']
|
27
|
+
ActiveRecord::Base.connection.drop_database config['database']
|
27
28
|
ActiveRecord::Base.connection.create_database(config['database'])
|
28
29
|
ActiveRecord::Base.establish_connection(config)
|
29
30
|
else
|
@@ -45,10 +46,14 @@ ensure
|
|
45
46
|
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
46
47
|
end
|
47
48
|
|
49
|
+
def schema_path
|
50
|
+
File.expand_path('../db/schema.rb', __FILE__)
|
51
|
+
end
|
52
|
+
|
48
53
|
def load_schema
|
49
|
-
grab_output
|
50
|
-
load(
|
51
|
-
|
54
|
+
grab_output do
|
55
|
+
load(schema_path)
|
56
|
+
end
|
52
57
|
end
|
53
58
|
|
54
59
|
def in_temp_rails_app
|
@@ -63,7 +68,7 @@ ensure
|
|
63
68
|
end
|
64
69
|
|
65
70
|
def create_chickens!(options = {})
|
66
|
-
time = Time.local(2000,
|
71
|
+
time = Time.local(2000, 'jan', 1, 20, 15, 1)
|
67
72
|
data = {
|
68
73
|
:string => ['', 'lala'],
|
69
74
|
:text => ['', 'lala', 'lala' * 100],
|
@@ -84,12 +89,10 @@ def create_chickens!(options = {})
|
|
84
89
|
end
|
85
90
|
end
|
86
91
|
end
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
chicken["#{type}_col"] = values[rand(values.length)] if rand > 0.5
|
92
|
-
end
|
92
|
+
options[:random].to_i.times do
|
93
|
+
Chicken.create! do |chicken|
|
94
|
+
data.each do |type, values|
|
95
|
+
chicken["#{type}_col"] = values[rand(values.length)] if rand > 0.5
|
93
96
|
end
|
94
97
|
end
|
95
98
|
end
|
@@ -102,11 +105,11 @@ end
|
|
102
105
|
def reset_rake!
|
103
106
|
@rake = Rake::Application.new
|
104
107
|
Rake.application = @rake
|
105
|
-
load
|
106
|
-
load
|
108
|
+
load 'tasks/assets.rake'
|
109
|
+
load 'tasks/dump.rake'
|
107
110
|
Rake::Task.define_task('environment')
|
108
111
|
Rake::Task.define_task('db:schema:dump') do
|
109
|
-
File.open(
|
112
|
+
File.open(schema_path, 'r') do |r|
|
110
113
|
if ENV['SCHEMA']
|
111
114
|
File.open(ENV['SCHEMA'], 'w') do |w|
|
112
115
|
w.write(r.read)
|
@@ -121,21 +124,21 @@ end
|
|
121
124
|
|
122
125
|
def call_rake
|
123
126
|
reset_rake!
|
124
|
-
grab_output
|
127
|
+
grab_output do
|
125
128
|
yield
|
126
|
-
|
129
|
+
end
|
127
130
|
end
|
128
131
|
|
129
132
|
def call_rake_create(*args)
|
130
|
-
call_rake
|
133
|
+
call_rake do
|
131
134
|
DumpRake.create(*args)
|
132
|
-
|
135
|
+
end
|
133
136
|
end
|
134
137
|
|
135
138
|
def call_rake_restore(*args)
|
136
|
-
call_rake
|
139
|
+
call_rake do
|
137
140
|
DumpRake.restore(*args)
|
138
|
-
|
141
|
+
end
|
139
142
|
end
|
140
143
|
|
141
144
|
describe 'full cycle' do
|
@@ -146,16 +149,16 @@ describe 'full cycle' do
|
|
146
149
|
it "should dump and restore using #{adapter}" do
|
147
150
|
in_temp_rails_app do
|
148
151
|
use_adapter(adapter) do
|
149
|
-
#add chickens store their attributes and create dump
|
152
|
+
# add chickens store their attributes and create dump
|
150
153
|
create_chickens!(:random => 100)
|
151
154
|
saved_chicken_data = chicken_data
|
152
155
|
call_rake_create(:description => 'chickens')
|
153
156
|
|
154
|
-
#clear database
|
157
|
+
# clear database
|
155
158
|
load_schema
|
156
159
|
expect(Chicken.all).to eq([])
|
157
160
|
|
158
|
-
#restore dump and verify equality
|
161
|
+
# restore dump and verify equality
|
159
162
|
call_rake_restore(:version => 'chickens')
|
160
163
|
expect(chicken_data).to eq(saved_chicken_data)
|
161
164
|
|
@@ -206,7 +209,7 @@ describe 'full cycle' do
|
|
206
209
|
end
|
207
210
|
end
|
208
211
|
|
209
|
-
it
|
212
|
+
it 'should create same dump for all adapters' do
|
210
213
|
in_temp_rails_app do
|
211
214
|
dumps = []
|
212
215
|
adapters.each do |adapter|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rails/version'
|
2
|
+
|
3
|
+
version = Rails::VERSION::STRING
|
4
|
+
|
5
|
+
if version < '3' && !Gem.respond_to?(:source_index)
|
6
|
+
# Add Gem.source_index for rails < 3
|
7
|
+
module Gem
|
8
|
+
def self.source_index
|
9
|
+
sources
|
10
|
+
end
|
11
|
+
SourceIndex = Specification
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Construct possible paths for config/environment.rb in dummy-X.X.X,
|
16
|
+
# dummy-X.X, dummy-X
|
17
|
+
version_parts = version.split('.')
|
18
|
+
environment_paths = version_parts.length.downto(1).map do |count|
|
19
|
+
version_part = version_parts.take(count).join('.')
|
20
|
+
File.expand_path("../dummy-#{version_part}/config/environment.rb", __FILE__)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Require environment if any dummy app exists, otherwise abort with instructions
|
24
|
+
if (environment_path = environment_paths.find(&File.method(:exist?)))
|
25
|
+
require environment_path
|
26
|
+
else
|
27
|
+
app_path = "spec/dummy-#{version_parts.take(2).join('.')}"
|
28
|
+
|
29
|
+
rails_command = if version < '3'
|
30
|
+
"rails #{app_path}"
|
31
|
+
else
|
32
|
+
"rails new #{app_path} -TSJ --skip-bundle"
|
33
|
+
end
|
34
|
+
|
35
|
+
command = "RAILS_VERSION=#{version} bundle exec #{rails_command}"
|
36
|
+
|
37
|
+
abort [
|
38
|
+
"No dummy app for rails #{version}",
|
39
|
+
"Create using `#{command}`",
|
40
|
+
'Tried:', *environment_paths
|
41
|
+
].join("\n")
|
42
|
+
end
|
@@ -1,34 +1,18 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require File.dirname(__FILE__) + '/../../../lib/dump_rake'
|
4
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dump_rake'
|
5
3
|
require 'active_record/migration'
|
6
4
|
|
7
|
-
def object_of_length(required_length)
|
8
|
-
LengthConstraint.new(required_length)
|
9
|
-
end
|
10
|
-
|
11
|
-
class LengthConstraint
|
12
|
-
def initialize(required_length)
|
13
|
-
@required_length = required_length
|
14
|
-
end
|
15
|
-
|
16
|
-
def ==(value)
|
17
|
-
@required_length == value.length
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
5
|
DumpReader = DumpRake::DumpReader
|
22
6
|
describe DumpReader do
|
23
|
-
describe
|
24
|
-
it
|
7
|
+
describe 'restore' do
|
8
|
+
it 'should create selves instance and open' do
|
25
9
|
@dump = double('dump')
|
26
10
|
expect(@dump).to receive(:open)
|
27
11
|
expect(DumpReader).to receive(:new).with('/abc/123.tmp').and_return(@dump)
|
28
12
|
DumpReader.restore('/abc/123.tmp')
|
29
13
|
end
|
30
14
|
|
31
|
-
it
|
15
|
+
it 'should call dump subroutines' do
|
32
16
|
@dump = double('dump')
|
33
17
|
allow(@dump).to receive(:open).and_yield(@dump)
|
34
18
|
allow(@dump).to receive(:silence).and_yield
|
@@ -44,10 +28,10 @@ describe DumpReader do
|
|
44
28
|
end
|
45
29
|
end
|
46
30
|
|
47
|
-
describe
|
31
|
+
describe 'summary' do
|
48
32
|
Summary = DumpReader::Summary
|
49
33
|
describe Summary do
|
50
|
-
it
|
34
|
+
it 'should format text' do
|
51
35
|
@summary = Summary.new
|
52
36
|
@summary.header 'One'
|
53
37
|
@summary.data(%w[fff ggg jjj ppp qqq www])
|
@@ -73,14 +57,14 @@ describe DumpReader do
|
|
73
57
|
expect("#{@summary}").to eq(output.gsub(/#{output[/^\s+/]}/, ' '))
|
74
58
|
end
|
75
59
|
|
76
|
-
it
|
60
|
+
it 'should pluralize' do
|
77
61
|
expect(Summary.pluralize(0, 'file')).to eq('0 files')
|
78
62
|
expect(Summary.pluralize(1, 'file')).to eq('1 file')
|
79
63
|
expect(Summary.pluralize(10, 'file')).to eq('10 files')
|
80
64
|
end
|
81
65
|
end
|
82
66
|
|
83
|
-
it
|
67
|
+
it 'should create selves instance and open' do
|
84
68
|
@dump = double('dump')
|
85
69
|
expect(@dump).to receive(:open)
|
86
70
|
expect(DumpReader).to receive(:new).with('/abc/123.tmp').and_return(@dump)
|
@@ -92,7 +76,7 @@ describe DumpReader do
|
|
92
76
|
{'path/a' => 10, 'path/b' => 20} => ['path/a: 10 entries', 'path/b: 20 entries'],
|
93
77
|
%w[path/a path/b] => %w[path/a path/b],
|
94
78
|
}.each do |assets, formatted_assets|
|
95
|
-
it
|
79
|
+
it 'should call dump subroutines and create summary' do
|
96
80
|
tables = {'a' => 10, 'b' => 20, 'c' => 666}
|
97
81
|
formatted_tables = ['a: 10 rows', 'b: 20 rows', 'c: 666 rows']
|
98
82
|
|
@@ -113,7 +97,7 @@ describe DumpReader do
|
|
113
97
|
end
|
114
98
|
end
|
115
99
|
|
116
|
-
it
|
100
|
+
it 'should call dump subroutines and create summary with schema' do
|
117
101
|
tables = {'a' => 10, 'b' => 20, 'c' => 666}
|
118
102
|
formatted_tables = ['a: 10 rows', 'b: 20 rows', 'c: 666 rows']
|
119
103
|
assets = formatted_assets = %w[path/a path/b]
|
@@ -142,11 +126,11 @@ describe DumpReader do
|
|
142
126
|
end
|
143
127
|
end
|
144
128
|
|
145
|
-
describe
|
146
|
-
it
|
129
|
+
describe 'open' do
|
130
|
+
it 'should set stream to gzipped tar reader' do
|
147
131
|
@gzip = double('gzip')
|
148
132
|
@stream = double('stream')
|
149
|
-
expect(Zlib::GzipReader).to receive(:open).with(Pathname(
|
133
|
+
expect(Zlib::GzipReader).to receive(:open).with(Pathname('123.tgz')).and_yield(@gzip)
|
150
134
|
expect(Archive::Tar::Minitar::Input).to receive(:open).with(@gzip).and_yield(@stream)
|
151
135
|
|
152
136
|
@dump = DumpReader.new('123.tgz')
|
@@ -157,7 +141,7 @@ describe DumpReader do
|
|
157
141
|
end
|
158
142
|
end
|
159
143
|
|
160
|
-
describe
|
144
|
+
describe 'low level' do
|
161
145
|
before do
|
162
146
|
@e1 = double('e1', :full_name => 'config', :read => 'config_data')
|
163
147
|
@e2 = double('e2', :full_name => 'first.dump', :read => 'first.dump_data')
|
@@ -167,44 +151,44 @@ describe DumpReader do
|
|
167
151
|
allow(@dump).to receive(:stream).and_return(@stream)
|
168
152
|
end
|
169
153
|
|
170
|
-
describe
|
171
|
-
it
|
154
|
+
describe 'find_entry' do
|
155
|
+
it 'should find first entry in stream equal string' do
|
172
156
|
@dump.find_entry('config') do |entry|
|
173
157
|
expect(entry).to eq(@e1)
|
174
158
|
end
|
175
159
|
end
|
176
160
|
|
177
|
-
it
|
161
|
+
it 'should find first entry in stream matching regexp' do
|
178
162
|
@dump.find_entry(/\.dump$/) do |entry|
|
179
163
|
expect(entry).to eq(@e2)
|
180
164
|
end
|
181
165
|
end
|
182
166
|
|
183
|
-
it
|
184
|
-
expect(@dump.find_entry(/\.dump$/) do |
|
167
|
+
it 'should return result of block' do
|
168
|
+
expect(@dump.find_entry(/\.dump$/) do |_entry|
|
185
169
|
'hello'
|
186
170
|
end).to eq('hello')
|
187
171
|
end
|
188
172
|
end
|
189
173
|
|
190
|
-
describe
|
191
|
-
it
|
174
|
+
describe 'read_entry' do
|
175
|
+
it 'should call find_entry' do
|
192
176
|
expect(@dump).to receive(:find_entry).with('config').and_yield(@e1)
|
193
177
|
@dump.read_entry('config')
|
194
178
|
end
|
195
179
|
|
196
|
-
it
|
180
|
+
it 'should read entries data' do
|
197
181
|
expect(@dump.read_entry('config')).to eq('config_data')
|
198
182
|
end
|
199
183
|
end
|
200
184
|
|
201
|
-
describe
|
202
|
-
it
|
185
|
+
describe 'read_entry_to_file' do
|
186
|
+
it 'should call find_entry' do
|
203
187
|
expect(@dump).to receive(:find_entry).with('config')
|
204
188
|
@dump.read_entry_to_file('config')
|
205
189
|
end
|
206
190
|
|
207
|
-
it
|
191
|
+
it 'should open temp file, write data there, rewind and yield that file' do
|
208
192
|
@entry = double('entry')
|
209
193
|
allow(@dump).to receive(:find_entry).and_yield(@entry)
|
210
194
|
@temp = double('temp')
|
@@ -223,7 +207,7 @@ describe DumpReader do
|
|
223
207
|
end
|
224
208
|
end
|
225
209
|
|
226
|
-
describe
|
210
|
+
describe 'subroutines' do
|
227
211
|
before do
|
228
212
|
@stream = double('stream')
|
229
213
|
@dump = DumpReader.new('123.tgz')
|
@@ -231,8 +215,8 @@ describe DumpReader do
|
|
231
215
|
allow(Progress).to receive(:io).and_return(StringIO.new)
|
232
216
|
end
|
233
217
|
|
234
|
-
describe
|
235
|
-
it
|
218
|
+
describe 'read_config' do
|
219
|
+
it 'should read config' do
|
236
220
|
@data = {:tables => {:first => 1}, :assets => %w[images videos]}
|
237
221
|
expect(@dump).to receive(:read_entry).with('config').and_return(Marshal.dump(@data))
|
238
222
|
|
@@ -241,8 +225,8 @@ describe DumpReader do
|
|
241
225
|
end
|
242
226
|
end
|
243
227
|
|
244
|
-
describe
|
245
|
-
it
|
228
|
+
describe 'migrate_down' do
|
229
|
+
it 'should not invoke rake tasks or find_entry if migrate_down is 0, no or false' do
|
246
230
|
expect(Rake::Task).not_to receive(:[])
|
247
231
|
expect(@dump).not_to receive(:find_entry)
|
248
232
|
|
@@ -257,7 +241,7 @@ describe DumpReader do
|
|
257
241
|
end
|
258
242
|
end
|
259
243
|
|
260
|
-
it
|
244
|
+
it 'should invoke db:drop and db:create if migrate_down is reset' do
|
261
245
|
@load_task = double('drop_task')
|
262
246
|
@dump_task = double('create_task')
|
263
247
|
expect(Rake::Task).to receive(:[]).with('db:drop').and_return(@load_task)
|
@@ -272,7 +256,7 @@ describe DumpReader do
|
|
272
256
|
|
273
257
|
[nil, '1'].each do |migrate_down_value|
|
274
258
|
describe "when migrate_down is #{migrate_down_value.inspect}" do
|
275
|
-
it
|
259
|
+
it 'should not find_entry if table schema_migrations is not present' do
|
276
260
|
allow(@dump).to receive(:avaliable_tables).and_return(%w[first])
|
277
261
|
expect(@dump).not_to receive(:find_entry)
|
278
262
|
|
@@ -281,7 +265,7 @@ describe DumpReader do
|
|
281
265
|
end
|
282
266
|
end
|
283
267
|
|
284
|
-
it
|
268
|
+
it 'should find schema_migrations.dump if table schema_migrations is present' do
|
285
269
|
allow(@dump).to receive(:avaliable_tables).and_return(%w[schema_migrations first])
|
286
270
|
expect(@dump).to receive(:find_entry).with('schema_migrations.dump')
|
287
271
|
|
@@ -290,7 +274,7 @@ describe DumpReader do
|
|
290
274
|
end
|
291
275
|
end
|
292
276
|
|
293
|
-
it
|
277
|
+
it 'should call migrate down for each version not present in schema_migrations table' do
|
294
278
|
@entry = StringIO.new
|
295
279
|
Marshal.dump(['version'], @entry)
|
296
280
|
%w[1 2 3 4].each do |i|
|
@@ -308,12 +292,12 @@ describe DumpReader do
|
|
308
292
|
version = DumpRake::Env['VERSION']
|
309
293
|
@versions << version
|
310
294
|
if version == '6'
|
311
|
-
|
295
|
+
fail ActiveRecord::IrreversibleMigration
|
312
296
|
end
|
313
297
|
end
|
314
298
|
expect(@migrate_down_task).to receive('reenable').exactly(3).times
|
315
299
|
|
316
|
-
expect($stderr).to receive('puts').with(
|
300
|
+
expect($stderr).to receive('puts').with('Irreversible migration: 6')
|
317
301
|
|
318
302
|
expect(Rake::Task).to receive(:[]).with('db:migrate:down').exactly(3).times.and_return(@migrate_down_task)
|
319
303
|
|
@@ -326,19 +310,19 @@ describe DumpReader do
|
|
326
310
|
end
|
327
311
|
end
|
328
312
|
|
329
|
-
describe
|
313
|
+
describe 'read_schema' do
|
330
314
|
before do
|
331
315
|
@task = double('task')
|
332
316
|
allow(Rake::Task).to receive(:[]).and_return(@task)
|
333
317
|
allow(@task).to receive(:invoke)
|
334
318
|
end
|
335
319
|
|
336
|
-
it
|
320
|
+
it 'should read schema.rb to temp file' do
|
337
321
|
expect(@dump).to receive(:read_entry_to_file).with('schema.rb')
|
338
322
|
@dump.read_schema
|
339
323
|
end
|
340
324
|
|
341
|
-
it
|
325
|
+
it 'should set ENV SCHEMA to temp files path' do
|
342
326
|
@file = double('tempfile', :path => '/temp/123-arst')
|
343
327
|
allow(@dump).to receive(:read_entry_to_file).and_yield(@file)
|
344
328
|
|
@@ -346,7 +330,7 @@ describe DumpReader do
|
|
346
330
|
@dump.read_schema
|
347
331
|
end
|
348
332
|
|
349
|
-
it
|
333
|
+
it 'should call task db:schema:load and db:schema:dump' do
|
350
334
|
@file = double('tempfile', :path => '/temp/123-arst')
|
351
335
|
allow(@dump).to receive(:read_entry_to_file).and_yield(@file)
|
352
336
|
|
@@ -361,22 +345,22 @@ describe DumpReader do
|
|
361
345
|
end
|
362
346
|
end
|
363
347
|
|
364
|
-
describe
|
365
|
-
it
|
366
|
-
@data =
|
348
|
+
describe 'schema' do
|
349
|
+
it 'should read schema' do
|
350
|
+
@data = 'create table, rows, etc...'
|
367
351
|
expect(@dump).to receive(:read_entry).with('schema.rb').and_return(@data)
|
368
352
|
expect(@dump.schema).to eq(@data)
|
369
353
|
end
|
370
354
|
end
|
371
355
|
|
372
|
-
describe
|
373
|
-
it
|
356
|
+
describe 'read_tables' do
|
357
|
+
it 'should verify connection' do
|
374
358
|
allow(@dump).to receive(:config).and_return({:tables => []})
|
375
359
|
expect(@dump).to receive(:verify_connection)
|
376
360
|
@dump.read_tables
|
377
361
|
end
|
378
362
|
|
379
|
-
it
|
363
|
+
it 'should call read_table for each table in config' do
|
380
364
|
allow(@dump).to receive(:verify_connection)
|
381
365
|
allow(@dump).to receive(:config).and_return({:tables => {'first' => 1, 'second' => 3}})
|
382
366
|
|
@@ -386,8 +370,8 @@ describe DumpReader do
|
|
386
370
|
@dump.read_tables
|
387
371
|
end
|
388
372
|
|
389
|
-
describe
|
390
|
-
it
|
373
|
+
describe 'when called with restore_tables' do
|
374
|
+
it 'should verify connection and call read_table for each table in restore_tables' do
|
391
375
|
allow(@dump).to receive(:config).and_return({:tables => {'first' => 1, 'second' => 3}})
|
392
376
|
|
393
377
|
expect(@dump).to receive(:verify_connection)
|
@@ -399,7 +383,7 @@ describe DumpReader do
|
|
399
383
|
end
|
400
384
|
end
|
401
385
|
|
402
|
-
it
|
386
|
+
it 'should not verfiy connection or call read_table for empty restore_tables' do
|
403
387
|
allow(@dump).to receive(:config).and_return({:tables => {'first' => 1, 'second' => 3}})
|
404
388
|
|
405
389
|
expect(@dump).not_to receive(:verify_connection)
|
@@ -412,14 +396,14 @@ describe DumpReader do
|
|
412
396
|
end
|
413
397
|
end
|
414
398
|
|
415
|
-
describe
|
416
|
-
it
|
399
|
+
describe 'read_table' do
|
400
|
+
it 'should not read table if no entry found for table' do
|
417
401
|
expect(@dump).to receive(:find_entry).with('first.dump').and_return(nil)
|
418
402
|
expect(@dump).not_to receive(:quote_table_name)
|
419
403
|
@dump.read_table('first', 10)
|
420
404
|
end
|
421
405
|
|
422
|
-
it
|
406
|
+
it 'should clear table and read table if entry found for table' do
|
423
407
|
@entry = double('entry', :to_str => Marshal.dump('data'), :eof? => true)
|
424
408
|
expect(@dump).to receive(:columns_insert_sql).with('data')
|
425
409
|
expect(@dump).to receive(:find_entry).with('first.dump').and_yield(@entry)
|
@@ -428,7 +412,7 @@ describe DumpReader do
|
|
428
412
|
@dump.read_table('first', 10)
|
429
413
|
end
|
430
414
|
|
431
|
-
it
|
415
|
+
it 'should clear schema table before writing' do
|
432
416
|
@entry = double('entry', :to_str => Marshal.dump('data'), :eof? => true)
|
433
417
|
expect(@dump).to receive(:columns_insert_sql).with('data')
|
434
418
|
expect(@dump).to receive(:find_entry).with('schema_migrations.dump').and_yield(@entry)
|
@@ -437,7 +421,7 @@ describe DumpReader do
|
|
437
421
|
@dump.read_table('schema_migrations', 10)
|
438
422
|
end
|
439
423
|
|
440
|
-
describe
|
424
|
+
describe 'reading/writing data' do
|
441
425
|
def create_entry(rows_count)
|
442
426
|
@entry = StringIO.new
|
443
427
|
|
@@ -453,7 +437,7 @@ describe DumpReader do
|
|
453
437
|
|
454
438
|
allow(@dump).to receive(:find_entry).and_yield(@entry)
|
455
439
|
end
|
456
|
-
it
|
440
|
+
it 'should read to eof' do
|
457
441
|
create_entry(2500)
|
458
442
|
allow(@dump).to receive(:clear_table)
|
459
443
|
allow(@dump).to receive(:insert_into_table)
|
@@ -461,7 +445,11 @@ describe DumpReader do
|
|
461
445
|
expect(@entry.eof?).to be_truthy
|
462
446
|
end
|
463
447
|
|
464
|
-
|
448
|
+
define :object_of_length do |n|
|
449
|
+
match{ |actual| actual.length == n }
|
450
|
+
end
|
451
|
+
|
452
|
+
it 'should try to insert rows in slices of 1000 rows' do
|
465
453
|
create_entry(2500)
|
466
454
|
allow(@dump).to receive(:clear_table)
|
467
455
|
expect(@dump).to receive(:insert_into_table).with(anything, anything, object_of_length(1000)).twice
|
@@ -470,7 +458,7 @@ describe DumpReader do
|
|
470
458
|
@dump.read_table('first', 2500)
|
471
459
|
end
|
472
460
|
|
473
|
-
it
|
461
|
+
it 'should try to insert row by row if slice method fails' do
|
474
462
|
create_entry(2500)
|
475
463
|
allow(@dump).to receive(:clear_table)
|
476
464
|
expect(@dump).to receive(:insert_into_table).with(anything, anything, kind_of(Array)).exactly(3).times.and_raise('sql error')
|
@@ -478,7 +466,7 @@ describe DumpReader do
|
|
478
466
|
@dump.read_table('first', 2500)
|
479
467
|
end
|
480
468
|
|
481
|
-
it
|
469
|
+
it 'should quote table, columns and values and send them to insert_into_table' do
|
482
470
|
create_entry(100)
|
483
471
|
allow(@dump).to receive(:clear_table)
|
484
472
|
expect(@dump).to receive(:quote_table_name).with('first').and_return('`first`')
|
@@ -493,7 +481,7 @@ describe DumpReader do
|
|
493
481
|
end
|
494
482
|
end
|
495
483
|
|
496
|
-
describe
|
484
|
+
describe 'read_assets' do
|
497
485
|
before do
|
498
486
|
@task = double('task')
|
499
487
|
allow(Rake::Task).to receive(:[]).with('assets:delete').and_return(@task)
|
@@ -501,24 +489,24 @@ describe DumpReader do
|
|
501
489
|
allow(@dump).to receive(:assets_root_link).and_yield('/tmp', 'assets')
|
502
490
|
end
|
503
491
|
|
504
|
-
it
|
492
|
+
it 'should not read assets if config[:assets] is nil' do
|
505
493
|
allow(@dump).to receive(:config).and_return({})
|
506
494
|
expect(@dump).not_to receive(:find_entry)
|
507
495
|
@dump.read_assets
|
508
496
|
end
|
509
497
|
|
510
|
-
it
|
498
|
+
it 'should not read assets if config[:assets] is blank' do
|
511
499
|
allow(@dump).to receive(:config).and_return({:assets => []})
|
512
500
|
expect(@dump).not_to receive(:find_entry)
|
513
501
|
@dump.read_assets
|
514
502
|
end
|
515
503
|
|
516
|
-
describe
|
504
|
+
describe 'deleting existing assets' do
|
517
505
|
before do
|
518
506
|
allow(@stream).to receive(:each)
|
519
507
|
end
|
520
508
|
|
521
|
-
it
|
509
|
+
it 'should call assets:delete' do
|
522
510
|
@assets = %w[images videos]
|
523
511
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
524
512
|
allow(@dump).to receive(:find_entry)
|
@@ -528,7 +516,7 @@ describe DumpReader do
|
|
528
516
|
@dump.read_assets
|
529
517
|
end
|
530
518
|
|
531
|
-
it
|
519
|
+
it 'should call assets:delete with ASSETS set to config[:assets] joined with :' do
|
532
520
|
@assets = %w[images videos]
|
533
521
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
534
522
|
allow(@dump).to receive(:find_entry)
|
@@ -540,8 +528,8 @@ describe DumpReader do
|
|
540
528
|
@dump.read_assets
|
541
529
|
end
|
542
530
|
|
543
|
-
describe
|
544
|
-
it
|
531
|
+
describe 'when called with restore_assets' do
|
532
|
+
it 'should delete files and dirs only in requested paths' do
|
545
533
|
@assets = %w[images videos]
|
546
534
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
547
535
|
|
@@ -566,7 +554,7 @@ describe DumpReader do
|
|
566
554
|
end
|
567
555
|
end
|
568
556
|
|
569
|
-
it
|
557
|
+
it 'should not delete any files and dirs for empty list' do
|
570
558
|
@assets = %w[images videos]
|
571
559
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
572
560
|
|
@@ -585,8 +573,8 @@ describe DumpReader do
|
|
585
573
|
end
|
586
574
|
end
|
587
575
|
|
588
|
-
describe
|
589
|
-
it
|
576
|
+
describe 'old style' do
|
577
|
+
it 'should find assets.tar' do
|
590
578
|
@assets = %w[images videos]
|
591
579
|
allow(@dump).to receive(:config).and_return({:assets => @assets})
|
592
580
|
allow(Dir).to receive(:glob).and_return([])
|
@@ -602,7 +590,7 @@ describe DumpReader do
|
|
602
590
|
{'images' => 0, 'videos' => 0},
|
603
591
|
{'images' => {:files => 0, :total => 0}, 'videos' => {:files => 0, :total => 0}},
|
604
592
|
].each do |assets|
|
605
|
-
it
|
593
|
+
it 'should rewrite rewind method to empty method - to not raise exception, open tar and extract each entry' do
|
606
594
|
allow(@dump).to receive(:config).and_return({:assets => assets})
|
607
595
|
allow(Dir).to receive(:glob).and_return([])
|
608
596
|
allow(FileUtils).to receive(:remove_entry)
|
@@ -626,7 +614,7 @@ describe DumpReader do
|
|
626
614
|
end
|
627
615
|
end
|
628
616
|
|
629
|
-
describe
|
617
|
+
describe 'new style' do
|
630
618
|
before do
|
631
619
|
expect(@dump).to receive(:find_entry).with('assets.tar')
|
632
620
|
end
|
@@ -636,7 +624,7 @@ describe DumpReader do
|
|
636
624
|
{'images' => 0, 'videos' => 0},
|
637
625
|
{'images' => {:files => 0, :total => 0}, 'videos' => {:files => 0, :total => 0}},
|
638
626
|
].each do |assets|
|
639
|
-
it
|
627
|
+
it 'should extract each entry' do
|
640
628
|
allow(@dump).to receive(:config).and_return({:assets => assets})
|
641
629
|
allow(Dir).to receive(:glob).and_return([])
|
642
630
|
allow(FileUtils).to receive(:remove_entry)
|
@@ -659,8 +647,8 @@ describe DumpReader do
|
|
659
647
|
end
|
660
648
|
end
|
661
649
|
|
662
|
-
describe
|
663
|
-
it
|
650
|
+
describe 'read_asset?' do
|
651
|
+
it 'should create filter and call custom_pass? on it' do
|
664
652
|
@filter = double('filter')
|
665
653
|
allow(@filter).to receive('custom_pass?')
|
666
654
|
|
@@ -669,7 +657,7 @@ describe DumpReader do
|
|
669
657
|
@dump.read_asset?('a', 'b')
|
670
658
|
end
|
671
659
|
|
672
|
-
it
|
660
|
+
it 'should test path usint fnmatch' do
|
673
661
|
DumpRake::Env.with_env(:restore_assets => '[a-b]') do
|
674
662
|
expect(@dump.read_asset?('x/a', 'x')).to be_truthy
|
675
663
|
expect(@dump.read_asset?('x/b/file', 'x')).to be_truthy
|