mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
command recorder will record commands sent to a delegate object
This commit is contained in:
parent
6dbbfae563
commit
6519df4157
2 changed files with 35 additions and 3 deletions
|
@ -3,10 +3,11 @@ module ActiveRecord
|
||||||
# ActiveRecord::Migration::CommandRecorder records commands done during
|
# ActiveRecord::Migration::CommandRecorder records commands done during
|
||||||
# a migration and knows how to reverse those commands.
|
# a migration and knows how to reverse those commands.
|
||||||
class CommandRecorder
|
class CommandRecorder
|
||||||
attr_reader :commands
|
attr_reader :commands, :delegate
|
||||||
|
|
||||||
def initialize
|
def initialize(delegate = nil)
|
||||||
@commands = []
|
@commands = []
|
||||||
|
@delegate = delegate
|
||||||
end
|
end
|
||||||
|
|
||||||
# record +command+. +command+ should be a method name and arguments.
|
# record +command+. +command+ should be a method name and arguments.
|
||||||
|
@ -29,10 +30,19 @@ module ActiveRecord
|
||||||
@commands.reverse.map { |name, args|
|
@commands.reverse.map { |name, args|
|
||||||
method = :"invert_#{name}"
|
method = :"invert_#{name}"
|
||||||
raise IrreversibleMigration unless respond_to?(method, true)
|
raise IrreversibleMigration unless respond_to?(method, true)
|
||||||
send(method, args)
|
__send__(method, args)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def respond_to?(*args) # :nodoc:
|
||||||
|
super || delegate.respond_to?(*args)
|
||||||
|
end
|
||||||
|
|
||||||
|
def send(method, *args) # :nodoc:
|
||||||
|
return super unless respond_to?(method)
|
||||||
|
record(method, args)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def invert_create_table(args)
|
def invert_create_table(args)
|
||||||
[:drop_table, args]
|
[:drop_table, args]
|
||||||
|
|
|
@ -7,6 +7,28 @@ module ActiveRecord
|
||||||
@recorder = CommandRecorder.new
|
@recorder = CommandRecorder.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_respond_to_delegates
|
||||||
|
recorder = CommandRecorder.new(Class.new {
|
||||||
|
def america; end
|
||||||
|
}.new)
|
||||||
|
assert recorder.respond_to?(:america)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_send_calls_super
|
||||||
|
assert_raises(NoMethodError) do
|
||||||
|
@recorder.send(:create_table, :horses)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_send_delegates_to_record
|
||||||
|
recorder = CommandRecorder.new(Class.new {
|
||||||
|
def create_table(name); end
|
||||||
|
}.new)
|
||||||
|
assert recorder.respond_to?(:create_table), 'respond_to? create_table'
|
||||||
|
recorder.send(:create_table, :horses)
|
||||||
|
assert_equal [[:create_table, [:horses]]], recorder.commands
|
||||||
|
end
|
||||||
|
|
||||||
def test_unknown_commands_raise_exception
|
def test_unknown_commands_raise_exception
|
||||||
@recorder.record :execute, ['some sql']
|
@recorder.record :execute, ['some sql']
|
||||||
assert_raises(ActiveRecord::IrreversibleMigration) do
|
assert_raises(ActiveRecord::IrreversibleMigration) do
|
||||||
|
|
Loading…
Reference in a new issue