Added insert, swap, and delete helpers to Vagrant::Action::Builder

This commit is contained in:
Mitchell Hashimoto 2010-07-05 20:09:39 +02:00
parent da27f248e7
commit 29458061df
2 changed files with 126 additions and 0 deletions

View File

@ -45,6 +45,52 @@ module Vagrant
end end
end end
# Inserts a middleware at the given index or directly before the
# given middleware object.
def insert(index, middleware, *args, &block)
index = self.index(index) unless index.is_a?(Integer)
stack.insert(index, [middleware, args, block])
end
alias_method :insert_before, :insert
# Inserts a middleware after the given index or middleware object.
def insert_after(index, middleware, *args, &block)
index = self.index(index) unless index.is_a?(Integer)
raise "no such middleware to insert after: #{index.inspect}" unless index
insert(index + 1, middleware, *args, &block)
end
# Swaps out the given middlware object or index with the new
# middleware.
def swap(index, middleware, *args, &block)
if index.is_a?(Integer)
delete(index)
insert(index, middleware, *args, &block)
else
insert_before(index, middleware, *args, &block)
delete(index)
end
end
# Deletes the given middleware object or index
def delete(index)
index = self.index(index) unless index.is_a?(Integer)
stack.delete_at(index)
end
# Returns the numeric index for the given middleware object.
#
# @param [Object] object The item to find the index for
# @return [Integer]
def index(object)
stack.each_with_index do |item, i|
return i if item[0] == object
end
nil
end
# Converts the builder stack to a runnable action sequence. # Converts the builder stack to a runnable action sequence.
# #
# @param [Vagrant::Action::Environment] env The action environment # @param [Vagrant::Action::Environment] env The action environment

View File

@ -46,6 +46,86 @@ class ActionBuilderTest < Test::Unit::TestCase
end end
end end
context "inserting" do
setup do
@instance.use "1"
@instance.use "2"
end
should "insert at the proper numeric index" do
@instance.insert(1, "3")
assert_equal "3", @instance.stack[1].first
end
should "insert next to the proper object if given" do
@instance.insert("2", "3")
assert_equal "3", @instance.stack[1].first
end
should "be able to call insert_before as well" do
@instance.insert_before("1", "0")
assert_equal "0", @instance.stack.first.first
end
should "be able to insert_after" do
@instance.insert_after("1", "0")
assert_equal "0", @instance.stack[1].first
end
should "be able to insert_after using numeric index" do
@instance.insert_after(1, "0")
assert_equal "0", @instance.stack[2].first
end
should "raise an exception if invalid index" do
assert_raises(RuntimeError) {
@instance.insert_after("15", "0")
}
end
end
context "swapping" do
setup do
@instance.use "1"
@instance.use "2"
end
should "be able to swap using the object" do
@instance.swap "1", "3"
assert_equal "3", @instance.stack.first.first
end
should "be able to swap using the index" do
@instance.swap 0, "3"
assert_equal "3", @instance.stack.first.first
end
end
context "deleting" do
setup do
@instance.use "1"
end
should "delete the proper object" do
@instance.delete("1")
assert @instance.stack.empty?
end
should "delete by index if given" do
@instance.delete(0)
assert @instance.stack.empty?
end
end
context "getting an index of an object" do
should "return the proper index if it exists" do
@instance.use 1
@instance.use 2
@instance.use 3
assert_equal 1, @instance.index(2)
end
end
context "converting to an app" do context "converting to an app" do
should "preprend error halt to the chain" do should "preprend error halt to the chain" do
result = mock("result") result = mock("result")