dump 1.0.5 → 1.0.6
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.
- 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
|