Support specifying a component for Vagrant.plugin
The future of subclassing things like configuration bases and so on will be to use `Vagrant.plugin(version, component)`. For example: `Vagrant.plugin("1", :provisioner)`.
This commit is contained in:
parent
194cd2145d
commit
7258daf535
|
@ -56,6 +56,10 @@ require 'vagrant/version'
|
||||||
global_logger = Log4r::Logger.new("vagrant::global")
|
global_logger = Log4r::Logger.new("vagrant::global")
|
||||||
global_logger.info("Vagrant version: #{Vagrant::VERSION}")
|
global_logger.info("Vagrant version: #{Vagrant::VERSION}")
|
||||||
|
|
||||||
|
# We need these components always so instead of an autoload we
|
||||||
|
# just require them explicitly here.
|
||||||
|
require "vagrant/registry"
|
||||||
|
|
||||||
module Vagrant
|
module Vagrant
|
||||||
autoload :Action, 'vagrant/action'
|
autoload :Action, 'vagrant/action'
|
||||||
autoload :Box, 'vagrant/box'
|
autoload :Box, 'vagrant/box'
|
||||||
|
@ -73,13 +77,19 @@ module Vagrant
|
||||||
autoload :Guest, 'vagrant/guest'
|
autoload :Guest, 'vagrant/guest'
|
||||||
autoload :Hosts, 'vagrant/hosts'
|
autoload :Hosts, 'vagrant/hosts'
|
||||||
autoload :Plugin, 'vagrant/plugin'
|
autoload :Plugin, 'vagrant/plugin'
|
||||||
autoload :Registry, 'vagrant/registry'
|
|
||||||
autoload :SSH, 'vagrant/ssh'
|
autoload :SSH, 'vagrant/ssh'
|
||||||
autoload :TestHelpers, 'vagrant/test_helpers'
|
autoload :TestHelpers, 'vagrant/test_helpers'
|
||||||
autoload :UI, 'vagrant/ui'
|
autoload :UI, 'vagrant/ui'
|
||||||
autoload :Util, 'vagrant/util'
|
autoload :Util, 'vagrant/util'
|
||||||
autoload :VM, 'vagrant/vm'
|
autoload :VM, 'vagrant/vm'
|
||||||
|
|
||||||
|
# These are the various plugin versions and their components in
|
||||||
|
# a lazy loaded Hash-like structure.
|
||||||
|
c = PLUGIN_COMPONENTS = Registry.new
|
||||||
|
c.register(:"1") { Plugin::V1::Plugin }
|
||||||
|
c.register([:"1", :config]) { Plugin::V1::Config }
|
||||||
|
c.register([:"1", :provisioner]) { Plugin::V1::Provisioner }
|
||||||
|
|
||||||
# Returns a `Vagrant::Registry` object that contains all the built-in
|
# Returns a `Vagrant::Registry` object that contains all the built-in
|
||||||
# middleware stacks.
|
# middleware stacks.
|
||||||
def self.actions
|
def self.actions
|
||||||
|
@ -108,16 +118,30 @@ module Vagrant
|
||||||
# Given a specific version, this returns a proper superclass to use
|
# Given a specific version, this returns a proper superclass to use
|
||||||
# to register plugins for that version.
|
# to register plugins for that version.
|
||||||
#
|
#
|
||||||
# Plugins should subclass the class returned by this method, and will
|
# Optionally, if you give a specific component, then it will return
|
||||||
# be registered as soon as they have a name associated with them.
|
# the proper superclass for that component as well.
|
||||||
|
#
|
||||||
|
# Plugins and plugin components should subclass the classes returned by
|
||||||
|
# this method. This method lets Vagrant core control these superclasses
|
||||||
|
# and change them over time without affecting plugins. For example, if
|
||||||
|
# the V1 superclass happens to be "Vagrant::V1," future versions of
|
||||||
|
# Vagrant may move it to "Vagrant::Plugins::V1" and plugins will not be
|
||||||
|
# affected.
|
||||||
#
|
#
|
||||||
# @return [Class]
|
# @return [Class]
|
||||||
def self.plugin(version)
|
def self.plugin(version, component=nil)
|
||||||
# We only support version 1 right now.
|
# Build up the key and return a result
|
||||||
return Plugin::V1::Plugin if version == "1"
|
key = version.to_sym
|
||||||
|
key = [key, component.to_sym] if component
|
||||||
|
result = PLUGIN_COMPONENTS.get(key)
|
||||||
|
|
||||||
# Raise an error that the plugin version is invalid
|
# If we found our component then we return that
|
||||||
raise ArgumentError, "Invalid plugin version API: #{version}"
|
return result if result
|
||||||
|
|
||||||
|
# If we didn't find a result, then raise an exception, depending
|
||||||
|
# on if we got a component or not.
|
||||||
|
raise ArgumentError, "Plugin superclass not found for version/component: " +
|
||||||
|
"#{version} #{component}"
|
||||||
end
|
end
|
||||||
|
|
||||||
# This should be used instead of Ruby's built-in `require` in order to
|
# This should be used instead of Ruby's built-in `require` in order to
|
||||||
|
|
|
@ -7,6 +7,7 @@ module Vagrant
|
||||||
module V1
|
module V1
|
||||||
autoload :Config, "vagrant/plugin/v1/config"
|
autoload :Config, "vagrant/plugin/v1/config"
|
||||||
autoload :Plugin, "vagrant/plugin/v1/plugin"
|
autoload :Plugin, "vagrant/plugin/v1/plugin"
|
||||||
|
autoload :Provisioner, "vagrant/plugin/v1/provisioner"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,8 +6,15 @@ describe Vagrant do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "plugin superclass" do
|
describe "plugin superclass" do
|
||||||
it "returns the proper class for version 1" do
|
describe "v1" do
|
||||||
described_class.plugin("1").should == Vagrant::Plugin::V1::Plugin
|
it "returns the proper class for version 1" do
|
||||||
|
described_class.plugin("1").should == Vagrant::Plugin::V1::Plugin
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns the proper components for version 1" do
|
||||||
|
described_class.plugin("1", :config).should == Vagrant::Plugin::V1::Config
|
||||||
|
described_class.plugin("1", :provisioner).should == Vagrant::Plugin::V1::Provisioner
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "raises an exception if an unsupported version is given" do
|
it "raises an exception if an unsupported version is given" do
|
||||||
|
|
Loading…
Reference in New Issue