51 lines
1.6 KiB
Ruby
51 lines
1.6 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!
|
|
# Look for a vagrant_init.rb in all the gems, but only the
|
|
# latest version of the gems.
|
|
Gem.source_index.latest_specs.each do |spec|
|
|
file = Gem.searcher.matching_files(spec, "vagrant_init.rb").first
|
|
next if !file
|
|
|
|
@@plugins << new(spec, file)
|
|
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
|