vaguerent/lib/vagrant/plugin.rb

58 lines
1.9 KiB
Ruby

require "rubygems"
module Vagrant
# Represents a single plugin and also manages loading plugins from
# RubyGems. If a plugin has a `vagrant_init.rb` file somewhere on its
# load path, then this class will find it and load it. For logging purposes
# (for debugging), the list of loaded plugins is stored in the {plugins}
# array.
class Plugin
# The array of loaded plugins.
@@plugins = []
# The gemspec of this plugin. This is an actual gemspec object.
attr_reader :gemspec
# The path to the `vagrant_init.rb` file which was loaded for this plugin.
attr_reader :file
# Loads all the plugins for Vagrant. Plugins are currently
# gems which have a "vagrant_init.rb" somewhere on their
# load path. This file is loaded to kick off the load sequence
# for that plugin.
def self.load!
# Stupid hack since Rails 2.3.x overrides Gem.source_index with their
# own incomplete replacement which causes issues.
index = Gem.source_index
index = [index.installed_source_index, index.vendor_source_index] if defined?(Rails::VendorGemSourceIndex) && index.is_a?(Rails::VendorGemSourceIndex)
# Look for a vagrant_init.rb in all the gems, but only the
# latest version of the gems.
[index].flatten.each do |source|
source.latest_specs.each do |spec|
file = Gem.searcher.matching_files(spec, "vagrant_init.rb").first
next if !file
@@plugins << new(spec, file)
end
end
end
# Returns the array of plugins which are currently loaded by
# Vagrant.
#
# @return [Array]
def self.plugins; @@plugins; end
# Initializes a new plugin, given a Gemspec and the path to the
# gem's `vagrant_init.rb` file. This should never be called manually.
# Instead {load!} creates all the instances.
def initialize(spec, file)
@gemspec = spec
@file = file
load file
end
end
end