Merge pull request #10165 from chrisroberts/f-has-plugin
Update Vagrant.has_plugin? helper to function prior to plugin loading
This commit is contained in:
commit
f50bf62cd1
|
@ -151,16 +151,9 @@ module Vagrant
|
||||||
return true if plugin("2").manager.registered.any? { |p| p.name == name }
|
return true if plugin("2").manager.registered.any? { |p| p.name == name }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Make the requirement object
|
|
||||||
version = Gem::Requirement.new([version]) if version
|
|
||||||
|
|
||||||
# Now check the plugin gem names
|
# Now check the plugin gem names
|
||||||
require "vagrant/plugin/manager"
|
require "vagrant/plugin/manager"
|
||||||
Plugin::Manager.instance.installed_specs.any? do |s|
|
Plugin::Manager.instance.plugin_installed?(name, version)
|
||||||
match = s.name == name
|
|
||||||
next match if !version
|
|
||||||
next match && version.satisfied_by?(s.version)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a superclass to use when creating a plugin for Vagrant.
|
# Returns a superclass to use when creating a plugin for Vagrant.
|
||||||
|
|
|
@ -41,12 +41,14 @@ module Vagrant
|
||||||
@system_file = StateFile.new(system_path) if system_path && system_path.file?
|
@system_file = StateFile.new(system_path) if system_path && system_path.file?
|
||||||
|
|
||||||
@local_file = nil
|
@local_file = nil
|
||||||
|
@globalized = @localized = false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Enable global plugins
|
# Enable global plugins
|
||||||
#
|
#
|
||||||
# @return [Hash] list of plugins
|
# @return [Hash] list of plugins
|
||||||
def globalize!
|
def globalize!
|
||||||
|
@globalized = true
|
||||||
@logger.debug("Enabling globalized plugins")
|
@logger.debug("Enabling globalized plugins")
|
||||||
plugins = installed_plugins
|
plugins = installed_plugins
|
||||||
bundler_init(plugins)
|
bundler_init(plugins)
|
||||||
|
@ -56,8 +58,9 @@ module Vagrant
|
||||||
# Enable environment local plugins
|
# Enable environment local plugins
|
||||||
#
|
#
|
||||||
# @param [Environment] env Vagrant environment
|
# @param [Environment] env Vagrant environment
|
||||||
# @return [Hash] list of plugins
|
# @return [Hash, nil] list of plugins
|
||||||
def localize!(env)
|
def localize!(env)
|
||||||
|
@localized = true
|
||||||
if env.local_data_path
|
if env.local_data_path
|
||||||
@logger.debug("Enabling localized plugins")
|
@logger.debug("Enabling localized plugins")
|
||||||
@local_file = StateFile.new(env.local_data_path.join("plugins.json"))
|
@local_file = StateFile.new(env.local_data_path.join("plugins.json"))
|
||||||
|
@ -68,6 +71,11 @@ module Vagrant
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [Boolean] local and global plugins are loaded
|
||||||
|
def ready?
|
||||||
|
@globalized && @localized
|
||||||
|
end
|
||||||
|
|
||||||
# Initialize bundler with given plugins
|
# Initialize bundler with given plugins
|
||||||
#
|
#
|
||||||
# @param [Hash] plugins List of plugins
|
# @param [Hash] plugins List of plugins
|
||||||
|
@ -335,6 +343,32 @@ module Vagrant
|
||||||
end
|
end
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Check if the requested plugin is installed
|
||||||
|
#
|
||||||
|
# @param [String] name Name of plugin
|
||||||
|
# @param [String] version Specific version of the plugin
|
||||||
|
# @return [Boolean]
|
||||||
|
def plugin_installed?(name, version=nil)
|
||||||
|
# Make the requirement object
|
||||||
|
version = Gem::Requirement.new([version.to_s]) if version
|
||||||
|
|
||||||
|
# If plugins are loaded, check for match in loaded specs
|
||||||
|
if ready?
|
||||||
|
return installed_specs.any? do |s|
|
||||||
|
match = s.name == name
|
||||||
|
next match if !version
|
||||||
|
next match && version.satisfied_by?(s.version)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Plugins are not loaded yet so check installed plugin data
|
||||||
|
plugin_info = installed_plugins[name]
|
||||||
|
return false if !plugin_info
|
||||||
|
return !!plugin_info if version.nil? || plugin_info["installed_gem_version"].nil?
|
||||||
|
installed_version = Gem::Version.new(plugin_info["installed_gem_version"])
|
||||||
|
version.satisfied_by?(installed_version)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -80,6 +80,35 @@ describe Vagrant::Plugin::Manager do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#ready?" do
|
||||||
|
let(:plugins) { double("plugins") }
|
||||||
|
let(:env) { double("env", local_data_path: nil) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(subject).to receive(:bundler_init)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should be false by default" do
|
||||||
|
expect(subject.ready?).to be_falsey
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should be false when only globalize! has been called" do
|
||||||
|
subject.globalize!
|
||||||
|
expect(subject.ready?).to be_falsey
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should be false when only localize! has been called" do
|
||||||
|
subject.localize!(env)
|
||||||
|
expect(subject.ready?).to be_falsey
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should be true when both localize! and globalize! have been called" do
|
||||||
|
subject.globalize!
|
||||||
|
subject.localize!(env)
|
||||||
|
expect(subject.ready?).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "#bundler_init" do
|
describe "#bundler_init" do
|
||||||
let(:plugins) { {"plugin_name" => {}} }
|
let(:plugins) { {"plugin_name" => {}} }
|
||||||
|
|
||||||
|
@ -111,6 +140,77 @@ describe Vagrant::Plugin::Manager do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#plugin_installed?" do
|
||||||
|
let(:ready) { true }
|
||||||
|
let(:specs) { [] }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(subject).to receive(:ready?).and_return(ready)
|
||||||
|
allow(subject).to receive(:installed_specs).and_return(specs)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when manager is ready" do
|
||||||
|
it "should return false when plugin is not found" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin")).to be_falsey
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when plugin is installed" do
|
||||||
|
let(:specs) { [Gem::Specification.new("vagrant-plugin", "1.2.3")] }
|
||||||
|
|
||||||
|
it "should return true" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin")).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return true when version matches installed version" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin", "1.2.3")).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return true when version requirement is satisified by version" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin", "> 1.0")).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return false when version requirement is not satisified by version" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin", "2.0")).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when manager is not ready" do
|
||||||
|
let(:ready) { false }
|
||||||
|
let(:plugins) { {} }
|
||||||
|
before { allow(subject).to receive(:installed_plugins).and_return(plugins) }
|
||||||
|
|
||||||
|
it "should check installed plugin data" do
|
||||||
|
expect(subject).to receive(:installed_plugins).and_return(plugins)
|
||||||
|
subject.plugin_installed?("vagrant-plugin")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return false when plugin is not found" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin")).to be_falsey
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when plugin is installed" do
|
||||||
|
let(:plugins) { {"vagrant-plugin" => {"installed_gem_version" => "1.2.3"}} }
|
||||||
|
|
||||||
|
it "should return true" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin")).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return true when version matches installed version" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin", "1.2.3")).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return true when version requirement is satisified by version" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin", "> 1.0")).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return false when version requirement is not satisified by version" do
|
||||||
|
expect(subject.plugin_installed?("vagrant-plugin", "2.0")).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "#install_plugin" do
|
describe "#install_plugin" do
|
||||||
it "installs the plugin and adds it to the state file" do
|
it "installs the plugin and adds it to the state file" do
|
||||||
specs = Array.new(5) { Gem::Specification.new }
|
specs = Array.new(5) { Gem::Specification.new }
|
||||||
|
|
|
@ -70,6 +70,7 @@ describe Vagrant do
|
||||||
specs = [Gem::Specification.new]
|
specs = [Gem::Specification.new]
|
||||||
specs[0].name = "foo"
|
specs[0].name = "foo"
|
||||||
allow(Vagrant::Plugin::Manager.instance).to receive(:installed_specs).and_return(specs)
|
allow(Vagrant::Plugin::Manager.instance).to receive(:installed_specs).and_return(specs)
|
||||||
|
allow(Vagrant::Plugin::Manager.instance).to receive(:ready?).and_return(true)
|
||||||
|
|
||||||
expect(described_class.has_plugin?("foo")).to be(true)
|
expect(described_class.has_plugin?("foo")).to be(true)
|
||||||
expect(described_class.has_plugin?("bar")).to be(false)
|
expect(described_class.has_plugin?("bar")).to be(false)
|
||||||
|
@ -79,6 +80,7 @@ describe Vagrant do
|
||||||
specs = [Gem::Specification.new]
|
specs = [Gem::Specification.new]
|
||||||
specs[0].name = "foo"
|
specs[0].name = "foo"
|
||||||
specs[0].version = "1.2.3"
|
specs[0].version = "1.2.3"
|
||||||
|
allow(Vagrant::Plugin::Manager.instance).to receive(:ready?).and_return(true)
|
||||||
allow(Vagrant::Plugin::Manager.instance).to receive(:installed_specs).and_return(specs)
|
allow(Vagrant::Plugin::Manager.instance).to receive(:installed_specs).and_return(specs)
|
||||||
|
|
||||||
expect(described_class.has_plugin?("foo", "~> 1.2.0")).to be(true)
|
expect(described_class.has_plugin?("foo", "~> 1.2.0")).to be(true)
|
||||||
|
|
Loading…
Reference in New Issue