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
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Dump
|
4
|
+
# Get rails app root (Rails.root or RAILS_ROOT or fail)
|
5
|
+
module RailsRoot
|
6
|
+
def rails_root
|
7
|
+
case
|
8
|
+
when defined?(Rails)
|
9
|
+
Rails.root
|
10
|
+
when defined?(RAILS_ROOT)
|
11
|
+
RAILS_ROOT
|
12
|
+
else
|
13
|
+
fail 'Unknown rails app root'
|
14
|
+
end.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
Dump.extend RailsRoot
|
18
|
+
end
|
19
|
+
end
|
@@ -1,6 +1,14 @@
|
|
1
|
-
|
1
|
+
require 'dump/snapshot'
|
2
|
+
require 'dump/archive_tar_minitar'
|
3
|
+
require 'dump/assets'
|
4
|
+
require 'progress'
|
5
|
+
require 'rake'
|
6
|
+
require 'zlib'
|
7
|
+
require 'tempfile'
|
8
|
+
|
9
|
+
module Dump
|
2
10
|
# Reading dump
|
3
|
-
class
|
11
|
+
class Reader < Snapshot
|
4
12
|
attr_reader :stream, :config
|
5
13
|
|
6
14
|
def self.restore(path)
|
@@ -118,10 +126,10 @@ class DumpRake
|
|
118
126
|
|
119
127
|
def migrate_down
|
120
128
|
case
|
121
|
-
when
|
129
|
+
when Dump::Env.downcase(:migrate_down) == 'reset'
|
122
130
|
Rake::Task['db:drop'].invoke
|
123
131
|
Rake::Task['db:create'].invoke
|
124
|
-
when !
|
132
|
+
when !Dump::Env.no?(:migrate_down)
|
125
133
|
return unless avaliable_tables.include?('schema_migrations')
|
126
134
|
find_entry('schema_migrations.dump') do |entry|
|
127
135
|
migrated = table_rows('schema_migrations').map{ |row| row['version'] }
|
@@ -134,7 +142,7 @@ class DumpRake
|
|
134
142
|
|
135
143
|
unless migrate_down.empty?
|
136
144
|
migrate_down.reverse.with_progress('Migrating down') do |version|
|
137
|
-
|
145
|
+
Dump::Env.with_env('VERSION' => version) do
|
138
146
|
Rake::Task['db:migrate:down'].tap do |task|
|
139
147
|
begin
|
140
148
|
task.invoke
|
@@ -151,13 +159,13 @@ class DumpRake
|
|
151
159
|
end
|
152
160
|
|
153
161
|
def restore_schema?
|
154
|
-
!
|
162
|
+
!Dump::Env.no?(:restore_schema)
|
155
163
|
end
|
156
164
|
|
157
165
|
def read_schema
|
158
166
|
return unless restore_schema?
|
159
167
|
read_entry_to_file('schema.rb') do |f|
|
160
|
-
|
168
|
+
Dump::Env.with_env('SCHEMA' => f.path) do
|
161
169
|
Rake::Task['db:schema:load'].invoke
|
162
170
|
end
|
163
171
|
Rake::Task['db:schema:dump'].invoke
|
@@ -169,10 +177,10 @@ class DumpRake
|
|
169
177
|
end
|
170
178
|
|
171
179
|
def read_tables
|
172
|
-
return if
|
180
|
+
return if Dump::Env[:restore_tables] && Dump::Env[:restore_tables].empty?
|
173
181
|
verify_connection
|
174
182
|
config[:tables].with_progress('Tables') do |table, rows|
|
175
|
-
if (restore_schema? && schema_tables.include?(table)) ||
|
183
|
+
if (restore_schema? && schema_tables.include?(table)) || Dump::Env.filter(:restore_tables).pass?(table)
|
176
184
|
read_table(table, rows)
|
177
185
|
end
|
178
186
|
end
|
@@ -208,7 +216,7 @@ class DumpRake
|
|
208
216
|
end
|
209
217
|
|
210
218
|
def read_assets
|
211
|
-
return if
|
219
|
+
return if Dump::Env[:restore_assets] && Dump::Env[:restore_assets].empty?
|
212
220
|
return if config[:assets].blank?
|
213
221
|
|
214
222
|
assets = config[:assets]
|
@@ -219,10 +227,10 @@ class DumpRake
|
|
219
227
|
assets_count, assets_paths = nil, assets
|
220
228
|
end
|
221
229
|
|
222
|
-
if
|
230
|
+
if Dump::Env[:restore_assets]
|
223
231
|
assets_paths.each do |asset|
|
224
|
-
|
225
|
-
next unless read_asset?(child,
|
232
|
+
Dump::Assets.glob_asset_children(asset, '**/*').reverse.each do |child|
|
233
|
+
next unless read_asset?(child, Dump.rails_root)
|
226
234
|
case
|
227
235
|
when File.file?(child)
|
228
236
|
File.unlink(child)
|
@@ -236,20 +244,20 @@ class DumpRake
|
|
236
244
|
end
|
237
245
|
end
|
238
246
|
else
|
239
|
-
|
247
|
+
Dump::Env.with_env(:assets => assets_paths.join(':')) do
|
240
248
|
Rake::Task['assets:delete'].invoke
|
241
249
|
end
|
242
250
|
end
|
243
251
|
|
244
252
|
read_assets_entries(assets_paths, assets_count) do |stream, root, entry, prefix|
|
245
|
-
if !
|
253
|
+
if !Dump::Env[:restore_assets] || read_asset?(entry.full_name, prefix)
|
246
254
|
stream.extract_entry(root, entry)
|
247
255
|
end
|
248
256
|
end
|
249
257
|
end
|
250
258
|
|
251
259
|
def read_asset?(path, prefix)
|
252
|
-
|
260
|
+
Dump::Env.filter(:restore_assets, Dump::Assets::SPLITTER).custom_pass? do |value|
|
253
261
|
File.fnmatch(File.join(prefix, value), path) ||
|
254
262
|
File.fnmatch(File.join(prefix, value, '**'), path)
|
255
263
|
end
|
@@ -266,7 +274,7 @@ class DumpRake
|
|
266
274
|
end
|
267
275
|
Archive::Tar::Minitar.open(assets_tar) do |inp|
|
268
276
|
inp.each do |entry|
|
269
|
-
yield inp,
|
277
|
+
yield inp, Dump.rails_root, entry, nil
|
270
278
|
Progress.step if assets_count
|
271
279
|
end
|
272
280
|
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
|
3
|
+
require 'dump/rails_root'
|
4
|
+
require 'dump/table_manipulation'
|
5
|
+
require 'pathname'
|
6
|
+
|
7
|
+
module Dump
|
4
8
|
# Base class for dump
|
5
|
-
class
|
9
|
+
class Snapshot
|
6
10
|
include TableManipulation
|
7
11
|
def self.list(options = {})
|
8
|
-
dumps = Dir[File.join(
|
12
|
+
dumps = Dir[File.join(Dump.rails_root, 'dump', options[:all] ? '*.*' : '*.tgz')].sort.select{ |path| File.file?(path) }.map{ |path| new(path) }
|
9
13
|
dumps = dumps.select{ |dump| dump.name[options[:like]] } if options[:like]
|
10
14
|
if options[:tags]
|
11
15
|
tags = get_filter_tags(options[:tags])
|
@@ -128,9 +132,9 @@ class DumpRake
|
|
128
132
|
|
129
133
|
def assets_root_link
|
130
134
|
prefix = 'assets'
|
131
|
-
Dir.mktmpdir('assets', File.join(
|
135
|
+
Dir.mktmpdir('assets', File.join(Dump.rails_root, 'tmp')) do |dir|
|
132
136
|
Dir.chdir(dir) do
|
133
|
-
File.symlink(
|
137
|
+
File.symlink(Dump.rails_root, prefix)
|
134
138
|
begin
|
135
139
|
yield dir, prefix
|
136
140
|
ensure
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
require 'dump/env'
|
2
|
+
|
3
|
+
module Dump
|
2
4
|
# Methods to work with db using ActiveRecord
|
3
5
|
module TableManipulation
|
4
6
|
protected
|
@@ -29,7 +31,8 @@ class DumpRake
|
|
29
31
|
|
30
32
|
def insert_into_table(table_sql, columns_sql, values_sql)
|
31
33
|
values_sql = values_sql.join(',') if values_sql.is_a?(Array)
|
32
|
-
|
34
|
+
sql = "INSERT INTO #{table_sql} #{columns_sql} VALUES #{values_sql}"
|
35
|
+
connection.insert(sql, 'Loading dump')
|
33
36
|
end
|
34
37
|
|
35
38
|
def fix_sequence!(table)
|
@@ -54,9 +57,10 @@ class DumpRake
|
|
54
57
|
end
|
55
58
|
|
56
59
|
def tables_to_dump
|
57
|
-
if
|
60
|
+
if Dump::Env[:tables]
|
58
61
|
avaliable_tables.select do |table|
|
59
|
-
schema_tables.include?(table) ||
|
62
|
+
schema_tables.include?(table) ||
|
63
|
+
Dump::Env.filter(:tables).pass?(table)
|
60
64
|
end
|
61
65
|
else
|
62
66
|
avaliable_tables - %w[sessions]
|
@@ -64,13 +68,14 @@ class DumpRake
|
|
64
68
|
end
|
65
69
|
|
66
70
|
def table_row_count(table)
|
67
|
-
|
71
|
+
sql = "SELECT COUNT(*) FROM #{quote_table_name(table)}"
|
72
|
+
connection.select_value(sql).to_i
|
68
73
|
end
|
69
74
|
|
70
|
-
CHUNK_SIZE_MIN = 100
|
71
|
-
CHUNK_SIZE_MAX = 3_000
|
75
|
+
CHUNK_SIZE_MIN = 100
|
76
|
+
CHUNK_SIZE_MAX = 3_000
|
72
77
|
def table_chunk_size(table)
|
73
|
-
expected_row_size = table_columns(table).
|
78
|
+
expected_row_size = table_columns(table).sum do |column|
|
74
79
|
case column.type
|
75
80
|
when :text
|
76
81
|
Math.sqrt(column.limit || 2_147_483_647)
|
@@ -79,8 +84,12 @@ class DumpRake
|
|
79
84
|
else
|
80
85
|
column.limit || 10
|
81
86
|
end
|
82
|
-
end
|
83
|
-
[
|
87
|
+
end
|
88
|
+
[
|
89
|
+
CHUNK_SIZE_MIN,
|
90
|
+
(10_000_000 / expected_row_size).round,
|
91
|
+
CHUNK_SIZE_MAX,
|
92
|
+
].sort[1]
|
84
93
|
end
|
85
94
|
|
86
95
|
def table_columns(table)
|
@@ -89,7 +98,9 @@ class DumpRake
|
|
89
98
|
|
90
99
|
def table_has_primary_column?(table)
|
91
100
|
# bad test for primary column, but primary even for primary column is nil
|
92
|
-
table_columns(table).any?
|
101
|
+
table_columns(table).any? do |column|
|
102
|
+
column.name == table_primary_key(table) && column.type == :integer
|
103
|
+
end
|
93
104
|
end
|
94
105
|
|
95
106
|
def table_primary_key(_table)
|
@@ -97,10 +108,12 @@ class DumpRake
|
|
97
108
|
end
|
98
109
|
|
99
110
|
def each_table_row(table, row_count, &block)
|
100
|
-
|
111
|
+
chunk_size = table_chunk_size(table)
|
112
|
+
if table_has_primary_column?(table) && row_count > chunk_size
|
101
113
|
# adapted from ActiveRecord::Batches
|
102
114
|
primary_key = table_primary_key(table)
|
103
|
-
quoted_primary_key =
|
115
|
+
quoted_primary_key =
|
116
|
+
"#{quote_table_name(table)}.#{quote_column_name(primary_key)}"
|
104
117
|
select_where_primary_key =
|
105
118
|
"SELECT * FROM #{quote_table_name(table)}" \
|
106
119
|
" WHERE #{quoted_primary_key} %s" \
|
@@ -110,7 +123,8 @@ class DumpRake
|
|
110
123
|
until rows.blank?
|
111
124
|
rows.each(&block)
|
112
125
|
break if rows.count < chunk_size
|
113
|
-
|
126
|
+
sql = select_where_primary_key % "> #{rows.last[primary_key].to_i}"
|
127
|
+
rows = select_all_by_sql(sql)
|
114
128
|
end
|
115
129
|
else
|
116
130
|
table_rows(table).each(&block)
|
@@ -1,6 +1,14 @@
|
|
1
|
-
|
1
|
+
require 'dump/snapshot'
|
2
|
+
require 'dump/archive_tar_minitar'
|
3
|
+
require 'dump/assets'
|
4
|
+
require 'progress'
|
5
|
+
require 'rake'
|
6
|
+
require 'zlib'
|
7
|
+
require 'tempfile'
|
8
|
+
|
9
|
+
module Dump
|
2
10
|
# Creating dump
|
3
|
-
class
|
11
|
+
class Writer < Snapshot
|
4
12
|
attr_reader :stream, :config
|
5
13
|
|
6
14
|
def self.create(path)
|
@@ -42,7 +50,7 @@ class DumpRake
|
|
42
50
|
|
43
51
|
def write_schema
|
44
52
|
create_file('schema.rb') do |f|
|
45
|
-
|
53
|
+
Dump::Env.with_env('SCHEMA' => f.path) do
|
46
54
|
Rake::Task['db:schema:dump'].invoke
|
47
55
|
end
|
48
56
|
end
|
@@ -83,7 +91,7 @@ class DumpRake
|
|
83
91
|
return if assets.blank?
|
84
92
|
|
85
93
|
config[:assets] = {}
|
86
|
-
Dir.chdir(
|
94
|
+
Dir.chdir(Dump.rails_root) do
|
87
95
|
assets = Dir[*assets].uniq
|
88
96
|
assets.with_progress('Assets') do |asset|
|
89
97
|
paths = Dir[File.join(asset, '**/*')]
|
@@ -110,7 +118,7 @@ class DumpRake
|
|
110
118
|
|
111
119
|
def assets_to_dump
|
112
120
|
Rake::Task['assets'].invoke
|
113
|
-
|
121
|
+
Dump::Env[:assets].split(Dump::Assets::SPLITTER)
|
114
122
|
rescue
|
115
123
|
[]
|
116
124
|
end
|
data/lib/tasks/assets.rake
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
require '
|
1
|
+
require 'dump'
|
2
2
|
|
3
3
|
task :assets do
|
4
|
-
ENV['ASSETS'] ||=
|
4
|
+
ENV['ASSETS'] ||= Dump::Assets.assets
|
5
5
|
end
|
6
6
|
|
7
7
|
namespace :assets do
|
8
|
-
desc 'Delete assets' <<
|
8
|
+
desc 'Delete assets' << Dump::Env.explain_variables_for_command(:assets)
|
9
9
|
task :delete => :assets do
|
10
10
|
ENV['ASSETS'].split(':').each do |asset|
|
11
|
-
|
11
|
+
Dump::Assets.glob_asset_children(asset, '*').each do |child|
|
12
12
|
FileUtils.remove_entry(child)
|
13
13
|
end
|
14
14
|
end
|
data/lib/tasks/dump.rake
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
require '
|
1
|
+
require 'dump'
|
2
2
|
|
3
|
-
desc 'Short for dump:create' <<
|
3
|
+
desc 'Short for dump:create' << Dump::Env.explain_variables_for_command(:create)
|
4
4
|
task :dump => 'dump:create'
|
5
5
|
|
6
6
|
namespace :dump do
|
7
|
-
desc 'Show avaliable versions' <<
|
7
|
+
desc 'Show avaliable versions' << Dump::Env.explain_variables_for_command(:versions)
|
8
8
|
task :versions => :environment do
|
9
|
-
|
9
|
+
Dump.versions(Dump::Env.for_command(:versions))
|
10
10
|
end
|
11
11
|
|
12
|
-
desc 'Create dump' <<
|
12
|
+
desc 'Create dump' << Dump::Env.explain_variables_for_command(:create)
|
13
13
|
task :create => :environment do
|
14
|
-
|
14
|
+
Dump.create(Dump::Env.for_command(:create))
|
15
15
|
end
|
16
16
|
|
17
|
-
desc 'Restore dump' <<
|
17
|
+
desc 'Restore dump' << Dump::Env.explain_variables_for_command(:restore)
|
18
18
|
task :restore => :environment do
|
19
|
-
|
19
|
+
Dump.restore(Dump::Env.for_command(:restore))
|
20
20
|
end
|
21
21
|
|
22
|
-
desc 'Cleanup dumps' <<
|
22
|
+
desc 'Cleanup dumps' << Dump::Env.explain_variables_for_command(:cleanup)
|
23
23
|
task :cleanup => :environment do
|
24
|
-
|
24
|
+
Dump.cleanup(Dump::Env.for_command(:cleanup))
|
25
25
|
end
|
26
26
|
end
|
data/script/update_readme
CHANGED
@@ -4,17 +4,17 @@
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
|
6
6
|
require 'pathname'
|
7
|
-
require '
|
7
|
+
require 'dump/env'
|
8
8
|
|
9
9
|
readme = Pathname('README.markdown')
|
10
10
|
lines = readme.readlines.map(&:rstrip)
|
11
11
|
readme.open('w') do |f|
|
12
12
|
lines.each do |line|
|
13
13
|
line.sub!(/^`(.+?)`.*—.*$/) do
|
14
|
-
key, names =
|
14
|
+
key, names = Dump::Env::DICTIONARY.find{ |_key, values| values.include?(Regexp.last_match[1]) }
|
15
15
|
if key
|
16
16
|
names = names.map{ |name| "`#{name}`" }.join(', ')
|
17
|
-
explanation =
|
17
|
+
explanation = Dump::Env::EXPLANATIONS[key]
|
18
18
|
"#{names} — #{explanation}"
|
19
19
|
end
|
20
20
|
end
|
data/spec/cycle_spec.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
2
|
+
require 'dump'
|
3
3
|
require 'tmpdir'
|
4
4
|
|
5
5
|
class Chicken < ActiveRecord::Base
|
6
6
|
end
|
7
7
|
|
8
|
+
ActiveRecord::Base.logger = Logger.new(File.join(Dump.rails_root, 'log/dump.log'))
|
9
|
+
|
8
10
|
def database_configs
|
9
11
|
YAML.load(IO.read(File.expand_path('../db/database.yml', __FILE__)))
|
10
12
|
end
|
@@ -56,17 +58,6 @@ def load_schema
|
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
59
|
-
def in_temp_rails_app
|
60
|
-
old_rails_root = DumpRake::RailsRoot.dup
|
61
|
-
Dir.mktmpdir do |dir|
|
62
|
-
DumpRake::RailsRoot.replace(dir)
|
63
|
-
allow(Progress).to receive(:io).and_return(StringIO.new)
|
64
|
-
yield
|
65
|
-
end
|
66
|
-
ensure
|
67
|
-
DumpRake::RailsRoot.replace(old_rails_root)
|
68
|
-
end
|
69
|
-
|
70
61
|
def create_chickens!(options = {})
|
71
62
|
time = Time.local(2000, 'jan', 1, 20, 15, 1)
|
72
63
|
data = {
|
@@ -131,113 +122,116 @@ end
|
|
131
122
|
|
132
123
|
def call_rake_create(*args)
|
133
124
|
call_rake do
|
134
|
-
|
125
|
+
Dump.create(*args)
|
135
126
|
end
|
136
127
|
end
|
137
128
|
|
138
129
|
def call_rake_restore(*args)
|
139
130
|
call_rake do
|
140
|
-
|
131
|
+
Dump.restore(*args)
|
141
132
|
end
|
142
133
|
end
|
143
134
|
|
144
135
|
describe 'full cycle' do
|
136
|
+
around do |example|
|
137
|
+
Dir.mktmpdir do |dir|
|
138
|
+
@tmp_dir = dir
|
139
|
+
example.run
|
140
|
+
end
|
141
|
+
end
|
142
|
+
before do
|
143
|
+
allow(Dump).to receive(:rails_root).and_return(@tmp_dir)
|
144
|
+
allow(Progress).to receive(:io).and_return(StringIO.new)
|
145
|
+
end
|
146
|
+
|
145
147
|
begin
|
146
148
|
database_configs
|
147
149
|
|
148
150
|
adapters.each do |adapter|
|
149
|
-
it "
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
expect(chicken_data).to eq(saved_chicken_data)
|
171
|
-
end
|
151
|
+
it "dumps and restores using #{adapter}" do
|
152
|
+
use_adapter(adapter) do
|
153
|
+
# add chickens store their attributes and create dump
|
154
|
+
create_chickens!(:random => 100)
|
155
|
+
saved_chicken_data = chicken_data
|
156
|
+
call_rake_create(:description => 'chickens')
|
157
|
+
|
158
|
+
# clear database
|
159
|
+
load_schema
|
160
|
+
expect(Chicken.all).to eq([])
|
161
|
+
|
162
|
+
# restore dump and verify equality
|
163
|
+
call_rake_restore(:version => 'chickens')
|
164
|
+
expect(chicken_data).to eq(saved_chicken_data)
|
165
|
+
|
166
|
+
# go throught create/restore cycle and verify equality
|
167
|
+
call_rake_create
|
168
|
+
load_schema
|
169
|
+
expect(Chicken.all).to be_empty
|
170
|
+
call_rake_restore
|
171
|
+
expect(chicken_data).to eq(saved_chicken_data)
|
172
172
|
end
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
176
|
adapters.each do |adapter|
|
177
|
-
it "
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
create_chickens!
|
185
|
-
end
|
177
|
+
it "does not break id incrementing using #{adapter}" do
|
178
|
+
use_adapter(adapter) do
|
179
|
+
create_chickens!(:random => 100)
|
180
|
+
call_rake_create(:description => 'chickens')
|
181
|
+
load_schema
|
182
|
+
call_rake_restore(:version => 'chickens')
|
183
|
+
create_chickens!
|
186
184
|
end
|
187
185
|
end
|
188
186
|
end
|
189
187
|
|
190
188
|
adapters.combination(2) do |adapter_src, adapter_dst|
|
191
|
-
it "
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
end
|
189
|
+
it "dumps using #{adapter_src} and restores using #{adapter_dst}" do
|
190
|
+
saved_chicken_data = nil
|
191
|
+
use_adapter(adapter_src) do
|
192
|
+
expect(Chicken.all).to be_empty
|
193
|
+
|
194
|
+
create_chickens!(:random => 100)
|
195
|
+
saved_chicken_data = chicken_data
|
196
|
+
call_rake_create
|
197
|
+
end
|
201
198
|
|
202
|
-
|
203
|
-
|
199
|
+
use_adapter(adapter_dst) do
|
200
|
+
expect(Chicken.all).to be_empty
|
204
201
|
|
205
|
-
|
206
|
-
|
207
|
-
end
|
202
|
+
call_rake_restore
|
203
|
+
expect(chicken_data).to eq(saved_chicken_data)
|
208
204
|
end
|
209
205
|
end
|
210
206
|
end
|
211
207
|
|
212
|
-
it '
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
Marshal.load(entry.read)
|
228
|
-
end
|
229
|
-
data << [entry.full_name, entry_data]
|
208
|
+
it 'creates same dump for all adapters' do
|
209
|
+
dumps = []
|
210
|
+
adapters.each do |adapter|
|
211
|
+
use_adapter(adapter) do
|
212
|
+
dump_name = call_rake_create(:desc => adapter)[:stdout].strip
|
213
|
+
dump_path = File.join(Dump.rails_root, 'dump', dump_name)
|
214
|
+
|
215
|
+
data = []
|
216
|
+
Zlib::GzipReader.open(dump_path) do |gzip|
|
217
|
+
Archive::Tar::Minitar.open(gzip, 'r') do |stream|
|
218
|
+
stream.each do |entry|
|
219
|
+
entry_data = if entry.full_name == 'schema.rb'
|
220
|
+
entry.read
|
221
|
+
else
|
222
|
+
Marshal.load(entry.read)
|
230
223
|
end
|
224
|
+
data << [entry.full_name, entry_data]
|
231
225
|
end
|
232
226
|
end
|
233
|
-
dumps << {:path => dump_path, :data => data.sort}
|
234
227
|
end
|
228
|
+
dumps << {:path => dump_path, :data => data.sort}
|
235
229
|
end
|
230
|
+
end
|
236
231
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
end
|
232
|
+
dumps.combination(2) do |dump_a, dump_b|
|
233
|
+
expect(dump_a[:path]).not_to eq(dump_b[:path])
|
234
|
+
expect(dump_a[:data]).to eq(dump_b[:data])
|
241
235
|
end
|
242
236
|
end
|
243
237
|
rescue Errno::ENOENT => e
|