Merge pull request #8300 from chrisroberts/enhancement/deprecation
Command deprecation module
This commit is contained in:
commit
f32c12d426
|
@ -292,6 +292,10 @@ module Vagrant
|
|||
error_key(:clone_machine_not_found)
|
||||
end
|
||||
|
||||
class CommandDeprecated < VagrantError
|
||||
error_key(:command_deprecated)
|
||||
end
|
||||
|
||||
class CommandUnavailable < VagrantError
|
||||
error_key(:command_unavailable)
|
||||
end
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
module Vagrant
|
||||
module Util
|
||||
autoload :Busy, 'vagrant/util/busy'
|
||||
autoload :CommandDeprecation, 'vagrant/util/command_deprecation'
|
||||
autoload :Counter, 'vagrant/util/counter'
|
||||
autoload :CredentialScrubber, 'vagrant/util/credential_scrubber'
|
||||
autoload :Env, 'vagrant/util/env'
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
module Vagrant
|
||||
module Util
|
||||
# Automatically add deprecation notices to commands
|
||||
module CommandDeprecation
|
||||
|
||||
# @return [String] generated name of command
|
||||
def deprecation_command_name
|
||||
name_parts = self.class.name.split("::")
|
||||
[
|
||||
name_parts[1].sub('Command', ''),
|
||||
name_parts[3]
|
||||
].compact.map(&:downcase).join(" ")
|
||||
end
|
||||
|
||||
def self.included(klass)
|
||||
klass.class_eval do
|
||||
class << self
|
||||
if method_defined?(:synopsis)
|
||||
alias_method :non_deprecated_synopsis, :synopsis
|
||||
|
||||
def synopsis
|
||||
if !non_deprecated_synopsis.to_s.empty?
|
||||
"#{non_deprecated_synopsis} [DEPRECATED]"
|
||||
else
|
||||
non_deprecated_synopsis
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
alias_method :non_deprecated_execute, :execute
|
||||
|
||||
def execute
|
||||
@env[:ui].warn(I18n.t("vagrant.commands.deprecated",
|
||||
name: deprecation_command_name
|
||||
) + "\n")
|
||||
non_deprecated_execute
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Mark command deprecation complete and fully disable
|
||||
# the command's functionality
|
||||
module Complete
|
||||
def self.included(klass)
|
||||
klass.include(CommandDeprecation)
|
||||
klass.class_eval do
|
||||
def execute
|
||||
raise Vagrant::Errors::CommandDeprecated,
|
||||
name: deprecation_command_name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -70,6 +70,8 @@ module VagrantPlugins
|
|||
|
||||
return name
|
||||
end
|
||||
|
||||
include Vagrant::Util::CommandDeprecation::Complete
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -664,6 +664,9 @@ en:
|
|||
Additionally, the created environment must be started with a provider
|
||||
matching this provider. For example, if you're using VirtualBox,
|
||||
the clone environment must also be using VirtualBox.
|
||||
command_deprecated: |-
|
||||
The command 'vagrant %{name}' has been deprecated and is no longer functional
|
||||
within Vagrant.
|
||||
command_unavailable: |-
|
||||
The executable '%{file}' Vagrant is trying to run was not
|
||||
found in the PATH variable. This is an error. Please verify
|
||||
|
@ -1568,6 +1571,9 @@ en:
|
|||
# Translations for commands. e.g. `vagrant x`
|
||||
#-------------------------------------------------------------------------------
|
||||
commands:
|
||||
deprecated: |-
|
||||
[DEPRECATION WARNING]: The Vagrant command 'vagrant %{name}' is scheduled be
|
||||
deprecated in an upcoming Vagrant release.
|
||||
common:
|
||||
vm_already_running: |-
|
||||
VirtualBox VM is already running.
|
||||
|
|
|
@ -33,35 +33,37 @@ describe VagrantPlugins::CommandPush::Command do
|
|||
allow(env).to receive(:push)
|
||||
end
|
||||
|
||||
it "validates the pushes" do
|
||||
expect(subject).to receive(:validate_pushes!).once
|
||||
subject.execute
|
||||
end
|
||||
# NOTE: Disabled due to deprecation
|
||||
#
|
||||
# it "validates the pushes" do
|
||||
# expect(subject).to receive(:validate_pushes!).once
|
||||
# subject.execute
|
||||
# end
|
||||
|
||||
it "delegates to Environment#push" do
|
||||
expect(env).to receive(:push).once
|
||||
subject.execute
|
||||
end
|
||||
# it "delegates to Environment#push" do
|
||||
# expect(env).to receive(:push).once
|
||||
# subject.execute
|
||||
# end
|
||||
|
||||
it "validates the configuration" do
|
||||
iso_env.vagrantfile <<-EOH
|
||||
Vagrant.configure("2") do |config|
|
||||
config.vm.box = "hashicorp/precise64"
|
||||
# it "validates the configuration" do
|
||||
# iso_env.vagrantfile <<-EOH
|
||||
# Vagrant.configure("2") do |config|
|
||||
# config.vm.box = "hashicorp/precise64"
|
||||
|
||||
config.push.define "noop" do |push|
|
||||
push.bad = "ham"
|
||||
end
|
||||
end
|
||||
EOH
|
||||
# config.push.define "noop" do |push|
|
||||
# push.bad = "ham"
|
||||
# end
|
||||
# end
|
||||
# EOH
|
||||
|
||||
subject = described_class.new(argv, iso_env.create_vagrant_env)
|
||||
allow(subject).to receive(:validate_pushes!)
|
||||
.and_return(:noop)
|
||||
# subject = described_class.new(argv, iso_env.create_vagrant_env)
|
||||
# allow(subject).to receive(:validate_pushes!)
|
||||
# .and_return(:noop)
|
||||
|
||||
expect { subject.execute }.to raise_error(Vagrant::Errors::ConfigInvalid) { |err|
|
||||
expect(err.message).to include("The following settings shouldn't exist: bad")
|
||||
}
|
||||
end
|
||||
# expect { subject.execute }.to raise_error(Vagrant::Errors::ConfigInvalid) { |err|
|
||||
# expect(err.message).to include("The following settings shouldn't exist: bad")
|
||||
# }
|
||||
# end
|
||||
end
|
||||
|
||||
describe "#validate_pushes!" do
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
require File.expand_path("../../../base", __FILE__)
|
||||
|
||||
require "vagrant/util/command_deprecation"
|
||||
|
||||
describe Vagrant::Util do
|
||||
include_context "unit"
|
||||
|
||||
let(:app){ lambda{|env|} }
|
||||
let(:argv){[]}
|
||||
let(:env){ {ui: Vagrant::UI::Silent.new} }
|
||||
|
||||
let(:command_class) do
|
||||
Class.new(Vagrant.plugin("2", :command)) do
|
||||
def self.synopsis
|
||||
"base synopsis"
|
||||
end
|
||||
def self.name
|
||||
"VagrantPlugins::CommandTest::Command"
|
||||
end
|
||||
def execute
|
||||
@env[:ui].info("COMMAND CONTENT")
|
||||
0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
let(:command){ command_class.new(app, env) }
|
||||
|
||||
describe Vagrant::Util::CommandDeprecation do
|
||||
before{ command_class.include(Vagrant::Util::CommandDeprecation) }
|
||||
|
||||
it "should add deprecation warning to synopsis" do
|
||||
expect(command_class.synopsis).to include('[DEPRECATED]')
|
||||
command.class.synopsis
|
||||
end
|
||||
|
||||
it "should add deprecation warning to #execute" do
|
||||
expect(env[:ui]).to receive(:warn).with(/DEPRECATION WARNING/)
|
||||
command.execute
|
||||
end
|
||||
|
||||
it "should execute original command" do
|
||||
expect(env[:ui]).to receive(:info).with("COMMAND CONTENT")
|
||||
command.execute
|
||||
end
|
||||
|
||||
it "should return with a 0 value" do
|
||||
expect(command.execute).to eq(0)
|
||||
end
|
||||
|
||||
context "with custom name defined" do
|
||||
before do
|
||||
command_class.class_eval do
|
||||
def deprecation_command_name
|
||||
"custom-name"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "should use custom name within warning message" do
|
||||
expect(env[:ui]).to receive(:warn).with(/custom-name/)
|
||||
command.execute
|
||||
end
|
||||
end
|
||||
|
||||
context "with deprecated subcommand" do
|
||||
let(:command_class) do
|
||||
Class.new(Vagrant.plugin("2", :command)) do
|
||||
def self.name
|
||||
"VagrantPlugins::CommandTest::Command::Action"
|
||||
end
|
||||
def execute
|
||||
@env[:ui].info("COMMAND CONTENT")
|
||||
0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "should not modify empty synopsis" do
|
||||
expect(command_class.synopsis.to_s).to be_empty
|
||||
end
|
||||
|
||||
it "should extract command name and subname" do
|
||||
expect(command.deprecation_command_name).to eq("test action")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe Vagrant::Util::CommandDeprecation::Complete do
|
||||
before{ command_class.include(Vagrant::Util::CommandDeprecation::Complete) }
|
||||
|
||||
it "should add deprecation warning to synopsis" do
|
||||
expect(command_class.synopsis).to include('[DEPRECATED]')
|
||||
command.class.synopsis
|
||||
end
|
||||
|
||||
it "should raise a deprecation error when executed" do
|
||||
expect{ command.execute }.to raise_error(Vagrant::Errors::CommandDeprecated)
|
||||
end
|
||||
|
||||
it "should not run original command" do
|
||||
expect(env[:ui]).not_to receive(:info).with("COMMAND CONTENT")
|
||||
expect{ command.execute }.to raise_error(Vagrant::Errors::CommandDeprecated)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue