Initial foundation building of new action style

This commit is contained in:
Mitchell Hashimoto 2010-07-03 17:34:15 +02:00
parent febfd81b68
commit 6eefc8e874
4 changed files with 117 additions and 0 deletions

26
lib/vagrant/action.rb Normal file
View File

@ -0,0 +1,26 @@
module Vagrant
class Action
class << self
# Returns the list of registered actions.
def actions
@actions ||= {}
end
# Registers an action and associates it with a symbol. This
# symbol can then be referenced in other action builds and
# callbacks can be registered on that symbol.
#
# @param [Symbol] key
def register(key, callable)
@actions[key] = callable
end
# Runs a registered action with the given key.
#
# @param [Symbol] key
def run(key)
@actions[key].call
end
end
end
end

View File

@ -0,0 +1,27 @@
module Vagrant
class Action
class Builder
def initialize(&block)
instance_eval(&block) if block_given?
end
def stack
@stack ||= []
end
def use(middleware, *args, &block)
stack << [middleware, args, block]
end
def to_app
inner = @ins.last
@ins[0...-1].reverse.inject(inner) { |a,e| e.call(a) }
end
def call(env)
to_app.call(env)
end
end
end
end

View File

@ -0,0 +1,22 @@
module Vagrant
module Actions
# Represents a middleware stack for Vagrant actions. Vagrant
# actions are created and can be extended with middlewares.
#
# The exact nature of how this will work is not set in stone.
class MiddlewareStack
# Initializes the middleware stack with the given name.
def initialize(key)
@stack = []
end
def use(klass)
@stack << klass
end
def run(endpoint)
@stack << endpoint
end
end
end
end

View File

@ -0,0 +1,42 @@
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
class ActionBuilderTest < Test::Unit::TestCase
setup do
@klass = Vagrant::Action::Builder
end
context "initializing" do
should "setup empty middleware stack" do
builder = @klass.new
assert builder.stack.empty?
end
should "take block to setup stack" do
builder = @klass.new do
use Hash
use lambda { |i| i }
end
assert !builder.stack.empty?
assert_equal 2, builder.stack.length
end
end
context "with an instance" do
setup do
@instance = @klass.new
end
context "adding to the stack" do
should "add to the end" do
@instance.use 1
@instance.use 2
assert_equal [2, [], nil], @instance.stack.last
end
end
context "converting to an app" do
end
end
end