Skip to content

Commit

Permalink
use migration struct
Browse files Browse the repository at this point in the history
  • Loading branch information
jesseduffield committed Aug 5, 2020
1 parent 5a5be0a commit 7798186
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 58 deletions.
6 changes: 6 additions & 0 deletions lib/lazy_migrate/migration.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# typed: false
# frozen_string_literal: true

module LazyMigrate
Migration = Struct.new(:status, :version, :name, :has_file, :current)
end
26 changes: 13 additions & 13 deletions lib/lazy_migrate/migrator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,15 @@ def select_migration_prompt(on_done:, migrator_adapter:)
end

def select_action_prompt(on_done:, migrator_adapter:, migration:)
if !migration[:has_file]
prompt.error("\nMigration file not found for migration #{migration[:version]}")
if !migration.has_file
prompt.error("\nMigration file not found for migration #{migration.version}")
on_done.()
end

option_map = obtain_option_map(migrator_adapter: migrator_adapter)

prompt.select("\nWhat would you like to do for #{migration[:version]} #{name}?") do |inner_menu|
options_for_migration(status: migration[:status]).each do |option|
prompt.select("\nWhat would you like to do for #{migration.version} #{name}?") do |inner_menu|
options_for_migration(status: migration.status).each do |option|
inner_menu.choice(option, -> {
with_unsafe_error_capture do
option_map[option].(migration)
Expand All @@ -92,11 +92,11 @@ def options_for_migration(status:)

def obtain_option_map(migrator_adapter:)
{
UP => ->(migration) { migrator_adapter.up(migration[:version]) },
DOWN => ->(migration) { migrator_adapter.down(migration[:version]) },
REDO => ->(migration) { migrator_adapter.redo(migration[:version]) },
MIGRATE => ->(migration) { migrator_adapter.migrate(migration[:version]) },
ROLLBACK => ->(migration) { migrator_adapter.rollback(migration[:version]) },
UP => ->(migration) { migrator_adapter.up(migration.version) },
DOWN => ->(migration) { migrator_adapter.down(migration.version) },
REDO => ->(migration) { migrator_adapter.redo(migration.version) },
MIGRATE => ->(migration) { migrator_adapter.migrate(migration.version) },
ROLLBACK => ->(migration) { migrator_adapter.rollback(migration.version) },
BRING_TO_TOP => ->(migration) { migrator_adapter.bring_to_top(migration: migration, ask_for_rerun: -> { ask_for_rerun }) },
}
end
Expand All @@ -107,13 +107,13 @@ def ask_for_rerun

def render_migration_option(migration)
"#{
migration[:status].ljust(6)
migration.status.ljust(6)
}#{
migration[:version].to_s.ljust(16)
migration.version.to_s.ljust(16)
}#{
(migration[:current] ? 'current' : '').ljust(9)
(migration.current ? 'current' : '').ljust(9)
}#{
migration[:name].ljust(50)
migration.name.ljust(50)
}"
end

Expand Down
22 changes: 13 additions & 9 deletions lib/lazy_migrate/migrator_adapter.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# typed: false
# frozen_string_literal: true

require 'lazy_migrate/migration'

module LazyMigrate
class MigratorAdapter
def initialize
Expand All @@ -13,8 +15,8 @@ def initialize
# removed from the schema_migrations table. The user chooses whether
# they want to down the migration before moving it.
def bring_to_top(migration:, ask_for_rerun:)
initial_version = migration[:version]
initial_status = migration[:status]
initial_version = migration.version
initial_status = migration.status
initial_filename = self.find_filename_for_migration(migration)

if initial_filename.nil?
Expand Down Expand Up @@ -70,13 +72,15 @@ def find_migrations
version = str_version.to_i
current = version == current_version

{
status: status,
version: version,
name: name,
has_file: has_file,
current: current,
}
LazyMigrate::Migration.new(
*{
status: status,
version: version,
name: name,
has_file: has_file,
current: current,
}.values
)
}
end

Expand Down
2 changes: 1 addition & 1 deletion lib/lazy_migrate/new_migrator_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def find_previous_version(version)
end

def find_filename_for_migration(migration)
context.migrations.find { |m| m.version == migration[:version] }&.filename
context.migrations.find { |m| m.version == migration.version }&.filename
end

def last_version
Expand Down
2 changes: 1 addition & 1 deletion lib/lazy_migrate/old_migrator_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def find_previous_version(version)
end

def find_filename_for_migration(migration)
migrations.find { |m| m.version == migration[:version] }&.filename
migrations.find { |m| m.version == migration.version }&.filename
end

def last_version
Expand Down
69 changes: 35 additions & 34 deletions spec/lazy_migrate/migrator_adapter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,26 @@
# frozen_string_literal: true

require 'rails_helper'
require 'lazy_migrate/migration'

RSpec.describe LazyMigrate::MigratorAdapter do
let(:rails_root) { Rails.root }

let(:create_books_migration_status) {
{ status: "up", version: 20200804231712, name: "Create books", has_file: true, current: false }
LazyMigrate::Migration.new(*{ status: "up", version: 20200804231712, name: "Create books", has_file: true, current: false }.values)
}

let(:add_author_migration_status_status) { 'up' }
let(:add_author_migration_status) {
{ status: add_author_migration_status_status, version: 20200804234040, name: "Add book author", has_file: true, current: false }
LazyMigrate::Migration.new(*{ status: add_author_migration_status_status, version: 20200804234040, name: "Add book author", has_file: true, current: false }.values)
}

let(:add_page_count_migration_status) {
{ status: "down", version: 20200804234057, name: "Add book page count", has_file: true, current: false }
LazyMigrate::Migration.new(*{ status: "down", version: 20200804234057, name: "Add book page count", has_file: true, current: false }.values)
}

let(:add_rating_migration_status) {
{ status: "up", version: 20200804234111, name: "Add book rating", has_file: true, current: true }
LazyMigrate::Migration.new(*{ status: "up", version: 20200804234111, name: "Add book rating", has_file: true, current: true }.values)
}

let(:migrations) {
Expand Down Expand Up @@ -61,9 +62,9 @@ def find_support_folder

ActiveRecord::SchemaMigration.delete_all

migrations.sort { |m| m[:version] }.each do |migration|
if migration[:status] == 'up'
ActiveRecord::SchemaMigration.create(version: migration[:version])
migrations.sort { |m| m.version }.each do |migration|
if migration.status == 'up'
ActiveRecord::SchemaMigration.create(version: migration.version)
end
end
end
Expand All @@ -89,7 +90,7 @@ def find_support_folder
subject { migrator_adapter.bring_to_top(migration: migration, ask_for_rerun: -> { rerun }) }

before do
expect(ActiveRecord::Migration).to receive(:next_migration_number).with(add_rating_migration_status[:version] + 1).and_return(new_version.to_s)
expect(ActiveRecord::Migration).to receive(:next_migration_number).with(add_rating_migration_status.version + 1).and_return(new_version.to_s)
end

shared_examples 'renames file' do
Expand Down Expand Up @@ -126,8 +127,8 @@ def find_support_folder

it 'does not change schema migration table' do
expect { subject }.not_to(change { ActiveRecord::SchemaMigration.all.map(&:version) }.from([
create_books_migration_status[:version],
add_rating_migration_status[:version],
create_books_migration_status.version,
add_rating_migration_status.version,
]))
end
end
Expand All @@ -140,13 +141,13 @@ def find_support_folder
expect { subject }
.to change { ActiveRecord::SchemaMigration.all.map(&:version) }
.from([
create_books_migration_status[:version],
add_author_migration_status[:version],
add_rating_migration_status[:version],
create_books_migration_status.version,
add_author_migration_status.version,
add_rating_migration_status.version,
])
.to([
create_books_migration_status[:version],
add_rating_migration_status[:version],
create_books_migration_status.version,
add_rating_migration_status.version,
new_version,
])
end
Expand Down Expand Up @@ -202,24 +203,24 @@ def find_support_folder

describe '.up' do
it 'ups a migration' do
migrator_adapter.up(add_page_count_migration_status[:version])
migrator_adapter.up(add_page_count_migration_status.version)

expect(ActiveRecord::SchemaMigration.find_by(version: add_author_migration_status[:version])).to be_present
expect(ActiveRecord::SchemaMigration.find_by(version: add_author_migration_status.version)).to be_present
end
end

describe '.down' do
it 'downs a migration' do
migrator_adapter.down(add_author_migration_status[:version])
migrator_adapter.down(add_author_migration_status.version)

expect(ActiveRecord::SchemaMigration.find_by(version: add_author_migration_status[:version])).to be nil
expect(ActiveRecord::SchemaMigration.find_by(version: add_author_migration_status.version)).to be nil
end
end

describe '.migrate' do
let(:add_author_migration_status_status) { 'down' }

subject { migrator_adapter.migrate(add_page_count_migration_status[:version]) }
subject { migrator_adapter.migrate(add_page_count_migration_status.version) }

context 'when rails version is 5.1' do
next unless Rails.version.start_with?('5.1')
Expand All @@ -228,13 +229,13 @@ def find_support_folder
expect { subject }
.to change { ActiveRecord::SchemaMigration.all.map(&:version) }
.from([
create_books_migration_status[:version],
add_rating_migration_status[:version],
create_books_migration_status.version,
add_rating_migration_status.version,
])
.to([
# interestingly in 5.2+ we actually migrate 'downwards' if referring to
# an old migration, equivalent to rolling back
create_books_migration_status[:version],
create_books_migration_status.version,
])
end
end
Expand All @@ -246,14 +247,14 @@ def find_support_folder
expect { subject }
.to change { ActiveRecord::SchemaMigration.all.map(&:version) }
.from([
create_books_migration_status[:version],
add_rating_migration_status[:version],
create_books_migration_status.version,
add_rating_migration_status.version,
])
.to([
create_books_migration_status[:version],
add_rating_migration_status[:version],
add_author_migration_status[:version],
add_page_count_migration_status[:version],
create_books_migration_status.version,
add_rating_migration_status.version,
add_author_migration_status.version,
add_page_count_migration_status.version,
])
end
end
Expand All @@ -262,18 +263,18 @@ def find_support_folder
describe '.rollback' do
let(:add_author_migration_status_status) { 'up' }

subject { migrator_adapter.rollback(add_author_migration_status[:version]) }
subject { migrator_adapter.rollback(add_author_migration_status.version) }

it 'rolls back to before migration' do
expect { subject }
.to change { ActiveRecord::SchemaMigration.all.map(&:version) }
.from([
create_books_migration_status[:version],
add_author_migration_status[:version],
add_rating_migration_status[:version],
create_books_migration_status.version,
add_author_migration_status.version,
add_rating_migration_status.version,
])
.to([
create_books_migration_status[:version],
create_books_migration_status.version,
])
end
end
Expand Down

0 comments on commit 7798186

Please sign in to comment.