Updates to address all Ruby deprecations and warnings

This includes updates for resolving all warnings provided by Ruby
for deprecations and/or removed methods. It also enables support
for Ruby 2.7 in the specification constraint as all 2.7 related
warnings are resolved with this changeset.
This commit is contained in:
Chris Roberts 2020-08-10 11:11:30 -07:00
parent 99fdfa1759
commit 5003bb6e15
26 changed files with 289 additions and 162 deletions

View File

@ -17,6 +17,11 @@ module Vagrant
# Vagrant::Action.run(app)
#
class Builder
# Container for Action arguments
MiddlewareArguments = Struct.new(:parameters, :block, :keywords, keyword_init: true)
# Item within the stack
StackItem = Struct.new(:middleware, :arguments, keyword_init: true)
# This is the stack of middlewares added. This should NOT be used
# directly.
#
@ -28,8 +33,8 @@ module Vagrant
# see {#use} instead.
#
# @return [Builder]
def self.build(middleware, *args, &block)
new.use(middleware, *args, &block)
def self.build(middleware, *args, **keywords, &block)
new.use(middleware, *args, **keywords, &block)
end
def initialize
@ -58,12 +63,21 @@ module Vagrant
# of the middleware.
#
# @param [Class] middleware The middleware class
def use(middleware, *args, &block)
def use(middleware, *args, **keywords, &block)
item = StackItem.new(
middleware: middleware,
arguments: MiddlewareArguments.new(
parameters: args,
keywords: keywords,
block: block
)
)
if middleware.kind_of?(Builder)
# Merge in the other builder's stack into our own
self.stack.concat(middleware.stack)
else
self.stack << [middleware, args, block]
self.stack << item
end
self
@ -71,8 +85,22 @@ module Vagrant
# Inserts a middleware at the given index or directly before the
# given middleware object.
def insert(index, middleware, *args, &block)
index = self.index(index) unless index.is_a?(Integer)
def insert(idx_or_item, middleware, *args, **keywords, &block)
item = StackItem.new(
middleware: middleware,
arguments: MiddlewareArguments.new(
parameters: args,
keywords: keywords,
block: block
)
)
if idx_or_item.is_a?(Integer)
index = idx_or_item
else
index = self.index(idx_or_item)
end
raise "no such middleware to insert before: #{index.inspect}" unless index
if middleware.kind_of?(Builder)
@ -80,27 +108,32 @@ module Vagrant
stack.insert(index, stack_item)
end
else
stack.insert(index, [middleware, args, block])
stack.insert(index, item)
end
end
alias_method :insert_before, :insert
# Inserts a middleware after the given index or middleware object.
def insert_after(index, middleware, *args, &block)
index = self.index(index) unless index.is_a?(Integer)
def insert_after(idx_or_item, middleware, *args, **keywords, &block)
if idx_or_item.is_a?(Integer)
index = idx_or_item
else
index = self.index(idx_or_item)
end
raise "no such middleware to insert after: #{index.inspect}" unless index
insert(index + 1, middleware, *args, &block)
end
# Replaces the given middlware object or index with the new
# middleware.
def replace(index, middleware, *args, &block)
def replace(index, middleware, *args, **keywords, &block)
if index.is_a?(Integer)
delete(index)
insert(index, middleware, *args, &block)
insert(index, middleware, *args, **keywords, &block)
else
insert_before(index, middleware, *args, &block)
insert_before(index, middleware, *args, **keywords, &block)
delete(index)
end
end
@ -123,8 +156,9 @@ module Vagrant
def index(object)
stack.each_with_index do |item, i|
return i if item == object
return i if item[0] == object
return i if item[0].respond_to?(:name) && item[0].name == object
return i if item.middleware == object
return i if item.middleware.respond_to?(:name) &&
item.middleware.name == object
end
nil

View File

@ -25,6 +25,7 @@ module Vagrant
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::action::builtin::box_add")
@parser = URI::RFC2396_Parser.new
end
def call(env)
@ -44,7 +45,7 @@ module Vagrant
u = u.gsub("\\", "/")
if Util::Platform.windows? && u =~ /^[a-z]:/i
# On Windows, we need to be careful about drive letters
u = "file:///#{URI.escape(u)}"
u = "file:///#{@parser.escape(u)}"
end
if u =~ /^[a-z0-9]+:.*$/i && !u.start_with?("file://")
@ -53,9 +54,9 @@ module Vagrant
end
# Expand the path and try to use that, if possible
p = File.expand_path(URI.unescape(u.gsub(/^file:\/\//, "")))
p = File.expand_path(@parser.unescape(u.gsub(/^file:\/\//, "")))
p = Util::Platform.cygwin_windows_path(p)
next "file://#{URI.escape(p.gsub("\\", "/"))}" if File.file?(p)
next "file://#{@parser.escape(p.gsub("\\", "/"))}" if File.file?(p)
u
end
@ -434,7 +435,7 @@ module Vagrant
downloader_options[:ui] = env[:ui] if opts[:ui]
downloader_options[:location_trusted] = env[:box_download_location_trusted]
downloader_options[:box_extra_download_options] = env[:box_extra_download_options]
Util::Downloader.new(url, temp_path, downloader_options)
end
@ -495,7 +496,7 @@ module Vagrant
url ||= uri.opaque
#7570 Strip leading slash left in front of drive letter by uri.path
Util::Platform.windows? && url.gsub!(/^\/([a-zA-Z]:)/, '\1')
url = URI.unescape(url)
url = @parser.unescape(url)
begin
File.open(url, "r") do |f|

View File

@ -72,7 +72,7 @@ module Vagrant
#
# @param [Machine] machine The machine that the folders belong to
# @param [Hash] folders The result from a {#synced_folders} call.
def save_synced_folders(machine, folders, **opts)
def save_synced_folders(machine, folders, opts={})
if opts[:merge]
existing = cached_synced_folders(machine)
if existing

View File

@ -7,23 +7,23 @@ module Vagrant
# This is a hash of the middleware to prepend to a certain
# other middleware.
#
# @return [Hash<Class, Array<Class>>]
# @return [Hash<Class, Array<Builder::StackItem>>]
attr_reader :before_hooks
# This is a hash of the middleware to append to a certain other
# middleware.
#
# @return [Hash<Class, Array<Class>>]
# @return [Hash<Class, Array<Builder::StackItem>>]
attr_reader :after_hooks
# This is a list of the hooks to just prepend to the beginning
#
# @return [Array<Class>]
# @return [Array<Builder::StackItem>]
attr_reader :prepend_hooks
# This is a list of the hooks to just append to the end
#
# @return [Array<Class>]
# @return [Array<Builder::StackItem>]
attr_reader :append_hooks
def initialize
@ -37,16 +37,32 @@ module Vagrant
#
# @param [Class] existing The existing middleware.
# @param [Class] new The new middleware.
def before(existing, new, *args, &block)
@before_hooks[existing] << [new, args, block]
def before(existing, new, *args, **keywords, &block)
item = Builder::StackItem.new(
middleware: new,
arguments: Builder::MiddlewareArguments.new(
parameters: args,
keywords: keywords,
block: block
)
)
@before_hooks[existing] << item
end
# Add a middleware after an existing middleware.
#
# @param [Class] existing The existing middleware.
# @param [Class] new The new middleware.
def after(existing, new, *args, &block)
@after_hooks[existing] << [new, args, block]
def after(existing, new, *args, **keywords, &block)
item = Builder::StackItem.new(
middleware: new,
arguments: Builder::MiddlewareArguments.new(
parameters: args,
keywords: keywords,
block: block
)
)
@after_hooks[existing] << item
end
# Append a middleware to the end of the stack. Note that if the
@ -54,15 +70,31 @@ module Vagrant
# be run.
#
# @param [Class] new The middleware to append.
def append(new, *args, &block)
@append_hooks << [new, args, block]
def append(new, *args, **keywords, &block)
item = Builder::StackItem.new(
middleware: new,
arguments: Builder::MiddlewareArguments.new(
parameters: args,
keywords: keywords,
block: block
)
)
@append_hooks << item
end
# Prepend a middleware to the beginning of the stack.
#
# @param [Class] new The new middleware to prepend.
def prepend(new, *args, &block)
@prepend_hooks << [new, args, block]
def prepend(new, *args, **keywords, &block)
item = Builder::StackItem.new(
middleware: new,
arguments: Builder::MiddlewareArguments.new(
parameters: args,
keywords: keywords,
block: block
)
)
@prepend_hooks << item
end
# @return [Boolean]
@ -77,27 +109,28 @@ module Vagrant
# called directly.
#
# @param [Builder] builder
def apply(builder, options=nil)
options ||= {}
def apply(builder, options={})
if !options[:no_prepend_or_append]
# Prepends first
@prepend_hooks.each do |klass, args, block|
@prepend_hooks.each do |item|
if options[:root]
idx = builder.index(options[:root])
else
idx = 0
end
builder.insert(idx, klass, *args, &block)
builder.insert(idx, item.middleware, *item.arguments.parameters,
**item.arguments.keywords, &item.arguments.block)
end
# Appends
@append_hooks.each do |klass, args, block|
@append_hooks.each do |item|
if options[:root]
idx = builder.index(options[:root])
builder.insert(idx + 1, klass, *args, &block)
builder.insert(idx + 1, item.middleware, *item.arguments.parameters,
**item.arguments.keywords, &item.arguments.block)
else
builder.use(klass, *args, &block)
builder.use(item.middleware, *item.arguments.parameters,
**item.arguments.keywords, &item.arguments.block)
end
end
end
@ -106,8 +139,9 @@ module Vagrant
@before_hooks.each do |key, list|
next if !builder.index(key)
list.each do |klass, args, block|
builder.insert_before(key, klass, *args, &block)
list.each do |item|
builder.insert_before(key, item.middleware, *item.arguments.parameters,
**item.arguments.keywords, &item.arguments.block)
end
end
@ -115,8 +149,9 @@ module Vagrant
@after_hooks.each do |key, list|
next if !builder.index(key)
list.each do |klass, args, block|
builder.insert_after(key, klass, *args, &block)
list.each do |item|
builder.insert_after(key, item.middleware, *item.arguments.parameters,
**item.arguments.keywords, &item.arguments.block)
end
end
end

View File

@ -92,14 +92,34 @@ module Vagrant
# A somewhat confusing function which simply initializes each
# middleware properly to call the next middleware in the sequence.
def finalize_action(action, env)
klass, args, block = action
if action.is_a?(Builder::StackItem)
klass = action.middleware
args = action.arguments.parameters
keywords = action.arguments.keywords
block = action.arguments.block
else
klass = action
args = []
keywords = {}
end
# Default the arguments to an empty array. Otherwise in Ruby 1.8
# a `nil` args will actually pass `nil` into the class.
args ||= []
args = nil if args.empty?
keywords = nil if keywords.empty?
if klass.is_a?(Class)
klass.new(self, env, *args, &block)
# NOTE: We need to detect if we are passing args and/or
# keywords and do it explicitly. Earlier versions
# are not as lax about splatting keywords when the
# target method is not expecting them.
if args && keywords
klass.new(self, env, *args, **keywords, &block)
elsif args
klass.new(self, env, *args, &block)
elsif keywords
klass.new(self, env, **keywords, &block)
else
klass.new(self, env, &block)
end
elsif klass.respond_to?(:call)
# Make it a lambda which calls the item then forwards
# up the chain

View File

@ -57,12 +57,13 @@ module Vagrant
# @param [Symbol] provider The provider that this box implements.
# @param [Pathname] directory The directory where this box exists on
# disk.
def initialize(name, provider, version, directory, **opts)
# @param [String] metadata_url Metadata URL for box
def initialize(name, provider, version, directory, metadata_url: nil)
@name = name
@version = version
@provider = provider
@directory = directory
@metadata_url = opts[:metadata_url]
@metadata_url = metadata_url
metadata_file = directory.join("metadata.json")
raise Errors::BoxMetadataFileNotFound, name: @name if !metadata_file.file?
@ -120,7 +121,7 @@ module Vagrant
#
# @param [Hash] download_options Options to pass to the downloader.
# @return [BoxMetadata]
def load_metadata(**download_options)
def load_metadata(download_options={})
tf = Tempfile.new("vagrant-load-metadata")
tf.close
@ -132,7 +133,7 @@ module Vagrant
end
opts = { headers: ["Accept: application/json"] }.merge(download_options)
Util::Downloader.new(url, tf.path, **opts).download!
Util::Downloader.new(url, tf.path, opts).download!
BoxMetadata.new(File.open(tf.path, "r"))
rescue Errors::DownloaderError => e
raise Errors::BoxMetadataDownloadError,

View File

@ -632,7 +632,12 @@ module Vagrant
self_spec.runtime_dependencies.each { |d| gem d.name, *d.requirement.as_list }
# discover all the gems we have available
list = {}
directories = [Gem::Specification.default_specifications_dir]
if Gem.respond_to?(:default_specifications_dir)
spec_dir = Gem.default_specifications_dir
else
spec_dir = Gem::Specification.default_specifications_dir
end
directories = [spec_dir]
Gem::Specification.find_all{true}.each do |spec|
list[spec.full_name] = spec
end

View File

@ -100,7 +100,7 @@ module Vagrant
def translate_error(opts)
return nil if !opts[:_key]
I18n.t("#{opts[:_namespace]}.#{opts[:_key]}", opts)
I18n.t("#{opts[:_namespace]}.#{opts[:_key]}", **opts)
end
end

View File

@ -244,7 +244,7 @@ module Vagrant
unlocked_reload
# Don't recover if entry already exists in the global
return entry if find_by_prefix(entry.id)
lock_file = lock_machine(entry.id)
if !lock_file
raise Errors::MachineLocked,
@ -478,7 +478,7 @@ module Vagrant
# Creates a {Vagrant::Environment} for this entry.
#
# @return [Vagrant::Environment]
def vagrant_env(home_path, **opts)
def vagrant_env(home_path, opts={})
Vagrant::Util::SilenceWarnings.silence! do
Environment.new({
cwd: @vagrantfile_path,

View File

@ -227,7 +227,7 @@ module Vagrant
# This method handles actually outputting a message of a given type
# to the console.
def say(type, message, **opts)
def say(type, message, opts={})
defaults = { new_line: true, prefix: true }
opts = defaults.merge(@opts).merge(opts)

View File

@ -1,3 +1,4 @@
require "cgi"
require "uri"
require "log4r"
@ -41,8 +42,8 @@ module Vagrant
begin
url = URI.parse(@source)
if url.scheme && url.scheme.start_with?("http") && url.user
auth = "#{URI.unescape(url.user)}"
auth += ":#{URI.unescape(url.password)}" if url.password
auth = "#{CGI.unescape(url.user)}"
auth += ":#{CGI.unescape(url.password)}" if url.password
url.user = nil
url.password = nil
options[:auth] ||= auth

View File

@ -217,7 +217,7 @@ module VagrantPlugins
# The WinSSH communicator connection provides isolated modification
# to the generated connection instances. This modification forces
# all provided commands to run within powershell
def connect(*args)
def connect(**opts)
connection = nil
super { |c| connection = c }

View File

@ -412,7 +412,7 @@ module VagrantPlugins
prov.run = options.delete(:run) if options.key?(:run)
prov.communicator_required = options.delete(:communicator_required) if options.key?(:communicator_required)
prov.add_config(options, &block)
prov.add_config(**options, &block)
nil
end
@ -467,7 +467,7 @@ module VagrantPlugins
disk_config.set_options(options)
# Add provider config
disk_config.add_provider_config(provider_options, &block)
disk_config.add_provider_config(**provider_options, &block)
if !Vagrant::Util::Experimental.feature_enabled?("disks")
@logger.warn("Disk config defined, but experimental feature is not enabled. To use this feature, enable it with the experimental flag `disks`. Disk will not be added to internal config, and will be ignored.")
@ -1019,7 +1019,7 @@ module VagrantPlugins
option: "allow_fstab_modification", given: @allow_fstab_modification.class, required: "Boolean"
)
end
if ![TrueClass, FalseClass].include?(@allow_hosts_modification.class)
errors["vm"] << I18n.t("vagrant.config.vm.config_type",
option: "allow_hosts_modification", given: @allow_hosts_modification.class, required: "Boolean"

View File

@ -32,7 +32,7 @@ describe VagrantPlugins::CommandBox::Command::Add do
let(:argv) { ["foo"] }
it "executes the runner with the proper actions" do
expect(action_runner).to receive(:run).with(any_args) { |action, **opts|
expect(action_runner).to receive(:run).with(any_args) { |action, opts|
expect(opts[:box_name]).to be_nil
expect(opts[:box_url]).to eq("foo")
true
@ -46,7 +46,7 @@ describe VagrantPlugins::CommandBox::Command::Add do
let(:argv) { ["foo", "bar"] }
it "executes the runner with the proper actions" do
expect(action_runner).to receive(:run).with(any_args) { |action, **opts|
expect(action_runner).to receive(:run).with(any_args) { |action, opts|
expect(opts[:box_name]).to eq("foo")
expect(opts[:box_url]).to eq("bar")
true

View File

@ -24,7 +24,7 @@ describe VagrantPlugins::CommandBox::Command::Outdated do
let(:argv) { ["--force"] }
it "passes along the force update option" do
expect(action_runner).to receive(:run).with(any_args) { |action, **opts|
expect(action_runner).to receive(:run).with(any_args) { |action, opts|
expect(opts[:box_outdated_force]).to be_truthy
true
}

View File

@ -120,7 +120,7 @@ describe VagrantPlugins::CommunicatorSSH::Communicator do
context "when printing message to the user" do
before do
allow(machine).to receive(:ssh_info).
and_return(host: '10.1.2.3', port: 22).ordered
and_return(host: '10.1.2.3', port: 22)
allow(communicator).to receive(:connect)
allow(communicator).to receive(:ready?).and_return(true)
end

View File

@ -6,7 +6,8 @@ describe "VagrantPlugins::GuestWindows::Cap::ChangeHostName" do
let(:described_class) do
VagrantPlugins::GuestWindows::Plugin.components.guest_capabilities[:windows].get(:change_host_name)
end
let(:machine) { double("machine") }
let(:machine) { double("machine", guest: guest) }
let(:guest) { double("guest") }
let(:communicator) { VagrantTests::DummyCommunicator::Communicator.new(machine) }
before do
@ -34,7 +35,6 @@ describe "VagrantPlugins::GuestWindows::Cap::ChangeHostName" do
'if (!([System.Net.Dns]::GetHostName() -eq \'newhostname\')) { exit 0 } exit 1',
exit_code: 0)
communicator.stub_command(rename_script, exit_code: 0)
allow(machine).to receive(:guest)
allow(machine.guest).to receive(:capability)
allow(machine.guest).to receive(:capability?)
described_class.change_host_name_and_wait(machine, 'newhostname', 0)

View File

@ -32,7 +32,7 @@ describe VagrantPlugins::DockerProvider::Driver::Compose do
end
let(:data_directory){ double("data-directory", join: composition_path) }
let(:local_data_path){ double("local-data-path") }
let(:compose_execute_up){ ["docker-compose", "-f", "docker-compose.yml", "-p", "cwd", "up", "--remove-orphans", "-d", {}] }
let(:compose_execute_up){ ["docker-compose", "-f", "docker-compose.yml", "-p", "cwd", "up", "--remove-orphans", "-d", any_args] }
subject{ described_class.new(machine) }
@ -277,7 +277,7 @@ describe VagrantPlugins::DockerProvider::Driver::Compose do
before { allow(subject).to receive(:created?).and_return(true) }
it 'removes the container' do
expect(subject).to receive(:execute).with("docker-compose", "-f", "docker-compose.yml", "-p", "cwd", "rm", "-f", "docker_1", {})
expect(subject).to receive(:execute).with("docker-compose", "-f", "docker-compose.yml", "-p", "cwd", "rm", "-f", "docker_1", any_args)
subject.rm(cid)
end
end

View File

@ -44,7 +44,7 @@ describe VagrantPlugins::ProviderVirtualBox::Action::Network do
it "creates a host-only interface with an IPv6 address <prefix>:1" do
guest = double("guest")
machine.config.vm.network 'private_network', { type: :static, ip: 'dead:beef::100' }
machine.config.vm.network 'private_network', type: :static, ip: 'dead:beef::100'
#allow(driver).to receive(:read_bridged_interfaces) { [] }
allow(driver).to receive(:read_host_only_interfaces) { [] }
#allow(driver).to receive(:read_dhcp_servers) { [] }
@ -71,19 +71,11 @@ describe VagrantPlugins::ProviderVirtualBox::Action::Network do
end
it "raises the appropriate error when provided with an invalid IP address" do
guest = double("guest")
machine.config.vm.network 'private_network', { ip: '192.168.33.06' }
machine.config.vm.network 'private_network', ip: '192.168.33.06'
expect{ subject.call(env) }.to raise_error(Vagrant::Errors::NetworkAddressInvalid)
end
it "raises no invalid network error when provided with a valid IP address" do
guest = double("guest")
machine.config.vm.network 'private_network', { ip: '192.168.33.6' }
expect{ subject.call(env) }.not_to raise_error(Vagrant::Errors::NetworkAddressInvalid)
end
context "with a dhcp private network" do
let(:bridgedifs) { [] }
let(:hostonlyifs) { [] }
@ -92,7 +84,7 @@ describe VagrantPlugins::ProviderVirtualBox::Action::Network do
let(:network_args) {{ type: :dhcp }}
before do
machine.config.vm.network 'private_network', network_args
machine.config.vm.network 'private_network', **network_args
allow(driver).to receive(:read_bridged_interfaces) { bridgedifs }
allow(driver).to receive(:read_host_only_interfaces) { hostonlyifs }
allow(driver).to receive(:read_dhcp_servers) { dhcpservers }

View File

@ -10,7 +10,7 @@ describe VagrantPlugins::Chef::Config::ChefApply do
let(:machine) { double("machine") }
def chef_error(key, options = {})
I18n.t("vagrant.provisioners.chef.#{key}", options)
I18n.t("vagrant.provisioners.chef.#{key}", **options)
end
describe "#recipe" do

View File

@ -549,12 +549,12 @@ describe Vagrant::Action::Builder do
it "should add trigger action to start of stack" do
subject.apply_dynamic_updates(env)
expect(subject.stack[0].first).to eq(Vagrant::Action::Builtin::Trigger)
expect(subject.stack[0].middleware).to eq(Vagrant::Action::Builtin::Trigger)
end
it "should have timing and type arguments" do
subject.apply_dynamic_updates(env)
args = subject.stack[0][1]
args = subject.stack[0].arguments.parameters
expect(args).to include(type)
expect(args).to include(timing)
expect(args).to include(action.to_s)
@ -566,12 +566,12 @@ describe Vagrant::Action::Builder do
it "should add trigger action to middle of stack" do
subject.apply_dynamic_updates(env)
expect(subject.stack[1].first).to eq(Vagrant::Action::Builtin::Trigger)
expect(subject.stack[1].middleware).to eq(Vagrant::Action::Builtin::Trigger)
end
it "should have timing and type arguments" do
subject.apply_dynamic_updates(env)
args = subject.stack[1][1]
args = subject.stack[1].arguments.parameters
expect(args).to include(type)
expect(args).to include(timing)
expect(args).to include(action.to_s)
@ -587,12 +587,12 @@ describe Vagrant::Action::Builder do
it "should add trigger action to start of stack" do
subject.apply_dynamic_updates(env)
expect(subject.stack[0].first).to eq(Vagrant::Action::Builtin::Trigger)
expect(subject.stack[0].middleware).to eq(Vagrant::Action::Builtin::Trigger)
end
it "should have timing and type arguments" do
subject.apply_dynamic_updates(env)
args = subject.stack[0][1]
args = subject.stack[0].arguments.parameters
expect(args).to include(type)
expect(args).to include(timing)
expect(args).to include(action.to_s)
@ -609,7 +609,7 @@ describe Vagrant::Action::Builder do
it "should have timing and type arguments" do
subject.apply_dynamic_updates(env)
args = subject.stack[1][1]
args = subject.stack[1].arguments.parameters
expect(args).to include(type)
expect(args).to include(timing)
expect(args).to include(action.to_s)
@ -688,7 +688,7 @@ describe Vagrant::Action::Builder do
it "should include arguments to the trigger action" do
subject.apply_action_name(env)
args = subject.stack[0][1]
args = subject.stack[0].arguments.parameters
expect(args).to include(raw_action_name)
expect(args).to include(timing)
expect(args).to include(:action)
@ -705,9 +705,9 @@ describe Vagrant::Action::Builder do
it "should include arguments to the trigger action" do
subject.apply_action_name(env)
builder = subject.stack.first[1]&.first
builder = subject.stack.first.arguments.parameters.first
expect(builder).not_to be_nil
args = builder.stack.first[1]
args = builder.stack.first.arguments.parameters
expect(args).to include(raw_action_name)
expect(args).to include(timing)
expect(args).to include(:action)
@ -728,12 +728,12 @@ describe Vagrant::Action::Builder do
it "should add a trigger action to the start of the stack" do
subject.apply_action_name(env)
expect(subject.stack[0].first).to eq(Vagrant::Action::Builtin::Trigger)
expect(subject.stack[0].middleware).to eq(Vagrant::Action::Builtin::Trigger)
end
it "should include arguments to the trigger action" do
subject.apply_action_name(env)
args = subject.stack[0][1]
args = subject.stack[0].arguments.parameters
expect(args).to include(action_name)
expect(args).to include(timing)
expect(args).to include(:hook)
@ -750,7 +750,7 @@ describe Vagrant::Action::Builder do
it "should include arguments to the trigger action" do
subject.apply_action_name(env)
args = subject.stack.last[1]
args = subject.stack.last.arguments.parameters
expect(args).to include(action_name)
expect(args).to include(timing)
expect(args).to include(:hook)

View File

@ -91,7 +91,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_name] = "foo"
env[:box_url] = box_path.to_s
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo")
expect(version).to eq("0")
@ -113,7 +113,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
box_path.to_s,
]
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo")
expect(version).to eq("0")
@ -132,7 +132,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_name] = "foo"
env[:box_url] = "http://127.0.0.1:#{port}/#{box_path.basename}"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo")
expect(version).to eq("0")
@ -152,7 +152,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_name] = "foo"
env[:box_url] = "ftp://127.0.0.1:#{port}/#{box_path.basename}"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo")
expect(version).to eq("0")
@ -218,7 +218,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_checksum_type] = ""
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo")
expect(version).to eq("0")
@ -291,7 +291,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_provider] = "virtualbox"
allow(box_collection).to receive(:find).and_return(box)
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo")
expect(version).to eq("0")
@ -311,7 +311,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
box_url_name = "http://127.0.0.1:#{port}/#{box_path.basename}"
env[:box_name] = box_url_name
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq(box_url_name)
expect(version).to eq("0")
expect(opts[:metadata_url]).to be_nil
@ -333,7 +333,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
box_url_name = "box name with spaces"
env[:box_name] = box_url_name
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq(box_url_name)
expect(version).to eq("0")
expect(opts[:metadata_url]).to be_nil
@ -356,7 +356,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_name] = "foo"
env[:box_url] = "http://#{username}:#{password}@127.0.0.1:#{port}/#{box_path.basename}"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo")
expect(version).to eq("0")
@ -404,7 +404,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
with_web_server(md_path) do |port|
env[:box_url] = "http://127.0.0.1:#{port}/#{md_path.basename}"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
expect(checksum(path)).to eq(checksum(box_path))
@ -449,7 +449,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
with_web_server(md_path, **opts) do |port|
env[:box_url] = "http://127.0.0.1:#{port}/#{md_path.basename}"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
expect(checksum(path)).to eq(checksum(box_path))
@ -494,7 +494,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
url = "http://127.0.0.1:#{port}"
env[:box_url] = "mitchellh/precise64.json"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq("mitchellh/precise64")
expect(version).to eq("0.7")
expect(checksum(path)).to eq(checksum(box_path))
@ -545,7 +545,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_url] = "mitchellh/precise64.json"
env[:box_server_url] = url
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq("mitchellh/precise64")
expect(version).to eq("0.7")
expect(checksum(path)).to eq(checksum(box_path))
@ -606,7 +606,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
end
end
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
expect(checksum(path)).to eq(checksum(box_path))
@ -651,7 +651,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
with_web_server(md_path) do |port|
env[:box_url] = "http://127.0.0.1:#{port}/#{md_path.basename}"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
expect(checksum(path)).to eq(checksum(box_path))
@ -795,7 +795,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
end
env[:box_url] = tf.path
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
@ -839,7 +839,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_url] = tf.path
env[:box_provider] = "vmware"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
@ -888,7 +888,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_url] = tf.path
env[:box_provider] = "vmware"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
@ -928,7 +928,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_url] = tf.path
env[:box_version] = "~> 0.1"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.5")
@ -973,7 +973,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_url] = tf.path
env[:box_provider] = "vmware"
env[:box_version] = "~> 0.1"
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.5")
@ -1021,7 +1021,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_url] = tf.path
env[:box_provider] = ["virtualbox", "vmware"]
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
@ -1069,7 +1069,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
expect(env[:ui]).to receive(:ask).and_return("1")
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")
@ -1245,7 +1245,7 @@ describe Vagrant::Action::Builtin::BoxAdd, :skip_windows, :bsdtar do
env[:box_force] = true
env[:box_url] = tf.path
allow(box_collection).to receive(:find).and_return(box)
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, **opts|
expect(box_collection).to receive(:add).with(any_args) { |path, name, version, opts|
expect(checksum(path)).to eq(checksum(box_path))
expect(name).to eq("foo/bar")
expect(version).to eq("0.7")

View File

@ -36,11 +36,20 @@ describe Vagrant::Action::Hook do
subject.before(existing, 2)
subject.before(existing, 3, :arg, &block)
expect(subject.before_hooks[existing]).to eq([
[1, [], nil],
[2, [], nil],
[3, [:arg], block]
])
hooks = subject.before_hooks[existing]
expect(hooks.size).to eq(3)
expect(hooks[0].middleware).to eq(1)
expect(hooks[0].arguments.parameters).to eq([])
expect(hooks[0].arguments.keywords).to eq({})
expect(hooks[0].arguments.block).to be_nil
expect(hooks[1].middleware).to eq(2)
expect(hooks[1].arguments.parameters).to eq([])
expect(hooks[1].arguments.keywords).to eq({})
expect(hooks[1].arguments.block).to be_nil
expect(hooks[2].middleware).to eq(3)
expect(hooks[2].arguments.parameters).to eq([:arg])
expect(hooks[2].arguments.keywords).to eq({})
expect(hooks[2].arguments.block).to eq(block)
end
end
@ -54,11 +63,20 @@ describe Vagrant::Action::Hook do
subject.after(existing, 2)
subject.after(existing, 3, :arg, &block)
expect(subject.after_hooks[existing]).to eq([
[1, [], nil],
[2, [], nil],
[3, [:arg], block]
])
hooks = subject.after_hooks[existing]
expect(hooks.size).to eq(3)
expect(hooks[0].middleware).to eq(1)
expect(hooks[0].arguments.parameters).to eq([])
expect(hooks[0].arguments.keywords).to eq({})
expect(hooks[0].arguments.block).to be_nil
expect(hooks[1].middleware).to eq(2)
expect(hooks[1].arguments.parameters).to eq([])
expect(hooks[1].arguments.keywords).to eq({})
expect(hooks[1].arguments.block).to be_nil
expect(hooks[2].middleware).to eq(3)
expect(hooks[2].arguments.parameters).to eq([:arg])
expect(hooks[2].arguments.keywords).to eq({})
expect(hooks[2].arguments.block).to eq(block)
end
end
@ -70,11 +88,20 @@ describe Vagrant::Action::Hook do
subject.append(2)
subject.append(3, :arg, &block)
expect(subject.append_hooks).to eq([
[1, [], nil],
[2, [], nil],
[3, [:arg], block]
])
hooks = subject.append_hooks
expect(hooks.size).to eq(3)
expect(hooks[0].middleware).to eq(1)
expect(hooks[0].arguments.parameters).to eq([])
expect(hooks[0].arguments.keywords).to eq({})
expect(hooks[0].arguments.block).to be_nil
expect(hooks[1].middleware).to eq(2)
expect(hooks[1].arguments.parameters).to eq([])
expect(hooks[1].arguments.keywords).to eq({})
expect(hooks[1].arguments.block).to be_nil
expect(hooks[2].middleware).to eq(3)
expect(hooks[2].arguments.parameters).to eq([:arg])
expect(hooks[2].arguments.keywords).to eq({})
expect(hooks[2].arguments.block).to eq(block)
end
end
@ -86,11 +113,20 @@ describe Vagrant::Action::Hook do
subject.prepend(2)
subject.prepend(3, :arg, &block)
expect(subject.prepend_hooks).to eq([
[1, [], nil],
[2, [], nil],
[3, [:arg], block]
])
hooks = subject.prepend_hooks
expect(hooks.size).to eq(3)
expect(hooks[0].middleware).to eq(1)
expect(hooks[0].arguments.parameters).to eq([])
expect(hooks[0].arguments.keywords).to eq({})
expect(hooks[0].arguments.block).to be_nil
expect(hooks[1].middleware).to eq(2)
expect(hooks[1].arguments.parameters).to eq([])
expect(hooks[1].arguments.keywords).to eq({})
expect(hooks[1].arguments.block).to be_nil
expect(hooks[2].middleware).to eq(3)
expect(hooks[2].arguments.parameters).to eq([:arg])
expect(hooks[2].arguments.keywords).to eq({})
expect(hooks[2].arguments.block).to eq(block)
end
end
@ -105,12 +141,15 @@ describe Vagrant::Action::Hook do
subject.apply(builder)
expect(builder.stack).to eq([
["1", [2], nil],
["2", [], nil],
["8", [], nil],
["9", [], nil]
])
stack = builder.stack
expect(stack[0].middleware).to eq("1")
expect(stack[0].arguments.parameters).to eq([2])
expect(stack[1].middleware).to eq("2")
expect(stack[1].arguments.parameters).to eq([])
expect(stack[2].middleware).to eq("8")
expect(stack[2].arguments.parameters).to eq([])
expect(stack[3].middleware).to eq("9")
expect(stack[3].arguments.parameters).to eq([])
end
it "should not prepend or append if disabled" do
@ -124,12 +163,11 @@ describe Vagrant::Action::Hook do
subject.apply(builder, no_prepend_or_append: true)
expect(builder.stack).to eq([
["3", [], nil],
["4", [], nil],
["7", [], nil],
["8", [], nil]
])
stack = builder.stack
expect(stack[0].middleware).to eq("3")
expect(stack[1].middleware).to eq("4")
expect(stack[2].middleware).to eq("7")
expect(stack[3].middleware).to eq("8")
end
end
end

View File

@ -53,7 +53,7 @@ describe Vagrant::Plugin::Manager do
before do
allow(Vagrant::Plugin::StateFile).to receive(:new).and_return(state_file)
allow(bundler).to receive(:environment_path=)
allow(local_data_path).to receive(:join).and_return(local_data_path)
allow(local_data_path).to receive(:join).and_return(local_data_path) if local_data_path
allow(subject).to receive(:bundler_init)
end
@ -118,7 +118,7 @@ describe Vagrant::Plugin::Manager do
end
it "should init the bundler instance with plugins" do
expect(bundler).to receive(:init!).with(plugins, anything)
expect(bundler).to receive(:init!).with(plugins, any_args)
subject.bundler_init(plugins)
end

View File

@ -14,7 +14,7 @@ describe Vagrant::UI::Basic do
end
it "outputs using `puts` by default" do
expect(subject).to receive(:safe_puts).with(any_args) { |message, **opts|
expect(subject).to receive(:safe_puts).with(any_args) { |message, opts|
expect(opts[:printer]).to eq(:puts)
true
}
@ -23,7 +23,7 @@ describe Vagrant::UI::Basic do
end
it "outputs using `print` if new_line is false" do
expect(subject).to receive(:safe_puts).with(any_args) { |message, **opts|
expect(subject).to receive(:safe_puts).with(any_args) { |message, opts|
expect(opts[:printer]).to eq(:print)
true
}
@ -32,7 +32,7 @@ describe Vagrant::UI::Basic do
end
it "outputs using `print` if new_line is false" do
expect(subject).to receive(:safe_puts).with(any_args) { |message, **opts|
expect(subject).to receive(:safe_puts).with(any_args) { |message, opts|
expect(opts[:printer]).to eq(:print)
true
}
@ -44,7 +44,7 @@ describe Vagrant::UI::Basic do
stdout = StringIO.new
subject.stdout = stdout
expect(subject).to receive(:safe_puts).with(any_args) { |message, **opts|
expect(subject).to receive(:safe_puts).with(any_args) { |message, opts|
expect(opts[:io]).to be(stdout)
true
}
@ -60,7 +60,7 @@ describe Vagrant::UI::Basic do
stderr = StringIO.new
subject.stderr = stderr
expect(subject).to receive(:safe_puts).with(any_args) { |message, **opts|
expect(subject).to receive(:safe_puts).with(any_args) { |message, opts|
expect(opts[:io]).to be(stderr)
true
}
@ -81,7 +81,7 @@ describe Vagrant::UI::Basic do
context "#detail" do
it "outputs details" do
expect(subject).to receive(:safe_puts).with(any_args) { |message, **opts|
expect(subject).to receive(:safe_puts).with(any_args) { |message, opts|
expect(message).to eq("foo")
true
}
@ -104,7 +104,7 @@ describe Vagrant::UI::Basic do
before{ Vagrant::Util::CredentialScrubber.sensitive(password) }
it "should remove sensitive information from the output" do
expect(subject).to receive(:safe_puts).with(any_args) do |message, **opts|
expect(subject).to receive(:safe_puts).with(any_args) do |message, opts|
expect(message).not_to include(password)
end
subject.detail(output)

View File

@ -12,7 +12,7 @@ Gem::Specification.new do |s|
s.summary = "Build and distribute virtualized development environments."
s.description = "Vagrant is a tool for building and distributing virtualized development environments."
s.required_ruby_version = "~> 2.4", "< 2.7"
s.required_ruby_version = "~> 2.4", "< 2.8"
s.required_rubygems_version = ">= 1.3.6"
s.add_dependency "bcrypt_pbkdf", "~> 1.0.0"