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
         |