mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
partial implementation of the command recorder
This commit is contained in:
parent
24174d1b3a
commit
843e319f78
3 changed files with 122 additions and 0 deletions
|
@ -284,6 +284,8 @@ module ActiveRecord
|
||||||
# In application.rb.
|
# In application.rb.
|
||||||
#
|
#
|
||||||
class Migration
|
class Migration
|
||||||
|
autoload :CommandRecorder, 'active_record/migration/command_recorder'
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
attr_accessor :delegate # :nodoc:
|
attr_accessor :delegate # :nodoc:
|
||||||
end
|
end
|
||||||
|
|
48
activerecord/lib/active_record/migration/command_recorder.rb
Normal file
48
activerecord/lib/active_record/migration/command_recorder.rb
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
module ActiveRecord
|
||||||
|
class Migration
|
||||||
|
# ActiveRecord::Migration::CommandRecorder records commands done during
|
||||||
|
# a migration and knows how to reverse those commands.
|
||||||
|
class CommandRecorder
|
||||||
|
attr_reader :commands
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@commands = []
|
||||||
|
end
|
||||||
|
|
||||||
|
# record +command+. +command+ should be a method name and arguments.
|
||||||
|
# For example:
|
||||||
|
#
|
||||||
|
# recorder.record(:method_name, [:arg1, arg2])
|
||||||
|
def record(*command)
|
||||||
|
@commands << command
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns a list that represents commands that are the inverse of the
|
||||||
|
# commands stored in +commands+.
|
||||||
|
def inverse
|
||||||
|
@commands.map { |name, args| send(:"invert_#{name}", args) }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def invert_create_table(args)
|
||||||
|
[:drop_table, args]
|
||||||
|
end
|
||||||
|
|
||||||
|
def invert_rename_table(args)
|
||||||
|
[:rename_table, args.reverse]
|
||||||
|
end
|
||||||
|
|
||||||
|
def invert_add_column(args)
|
||||||
|
[:remove_column, args.first(2)]
|
||||||
|
end
|
||||||
|
|
||||||
|
def invert_rename_index(args)
|
||||||
|
[:rename_index, args.reverse]
|
||||||
|
end
|
||||||
|
|
||||||
|
def invert_rename_column(args)
|
||||||
|
[:rename_column, [args.first] + args.last(2).reverse]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
72
activerecord/test/cases/migration/command_recorder_test.rb
Normal file
72
activerecord/test/cases/migration/command_recorder_test.rb
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
require "cases/helper"
|
||||||
|
|
||||||
|
module ActiveRecord
|
||||||
|
class Migration
|
||||||
|
class CommandRecorderTest < ActiveRecord::TestCase
|
||||||
|
def setup
|
||||||
|
@recorder = CommandRecorder.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_record
|
||||||
|
@recorder.record :create_table, [:system_settings]
|
||||||
|
assert_equal 1, @recorder.commands.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_inverse
|
||||||
|
@recorder.record :create_table, [:system_settings]
|
||||||
|
assert_equal 1, @recorder.inverse.length
|
||||||
|
|
||||||
|
@recorder.record :rename_table, [:old, :new]
|
||||||
|
assert_equal 2, @recorder.inverse.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_create_table
|
||||||
|
@recorder.record :create_table, [:system_settings]
|
||||||
|
drop_table = @recorder.inverse.first
|
||||||
|
assert_equal [:drop_table, [:system_settings]], drop_table
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_rename_table
|
||||||
|
@recorder.record :rename_table, [:old, :new]
|
||||||
|
rename = @recorder.inverse.first
|
||||||
|
assert_equal [:rename_table, [:new, :old]], rename
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_add_column
|
||||||
|
@recorder.record :add_column, [:table, :column, :type, {}]
|
||||||
|
remove = @recorder.inverse.first
|
||||||
|
assert_equal [:remove_column, [:table, :column]], remove
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_rename_column
|
||||||
|
@recorder.record :rename_column, [:table, :old, :new]
|
||||||
|
rename = @recorder.inverse.first
|
||||||
|
assert_equal [:rename_column, [:table, :new, :old]], rename
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_add_index
|
||||||
|
@recorder.record :add_index, [:table, [:one, :two], {:options => true}]
|
||||||
|
remove = @recorder.inverse.first
|
||||||
|
assert_equal [:remove_index, [:table, {:column => [:one, :two]}]], remove
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_rename_index
|
||||||
|
@recorder.record :rename_index, [:old, :new]
|
||||||
|
rename = @recorder.inverse.first
|
||||||
|
assert_equal [:rename_index, [:new, :old]], rename
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_add_timestamps
|
||||||
|
@recorder.record :add_timestamps, [:table]
|
||||||
|
remove = @recorder.inverse.first
|
||||||
|
assert_equal [:remove_timestamps, [:table]], remove
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invert_remove_timestamps
|
||||||
|
@recorder.record :remove_timestamps, [:table]
|
||||||
|
add = @recorder.inverse.first
|
||||||
|
assert_equal [:add_timestamps, [:table]], add
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue