vagrant-triggers 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -2
- data/CHANGELOG.md +20 -2
- data/Gemfile +6 -1
- data/README.md +28 -14
- data/lib/vagrant-triggers.rb +2 -1
- data/lib/vagrant-triggers/action/trigger.rb +16 -42
- data/lib/vagrant-triggers/config.rb +12 -9
- data/lib/vagrant-triggers/dsl.rb +65 -0
- data/lib/vagrant-triggers/plugin.rb +1 -1
- data/lib/vagrant-triggers/version.rb +1 -1
- data/locales/en.yml +21 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/vagrant-triggers/action/trigger_spec.rb +42 -152
- data/spec/vagrant-triggers/config_spec.rb +14 -7
- data/spec/vagrant-triggers/dsl_spec.rb +133 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92d93f338ac34daa73bb81b1c67e82a098ed6a3b
|
4
|
+
data.tar.gz: 19f64c4f8f7d5379719a126d8e5fdf0fa2db76b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cb4fa497e40a8697e7f86d7276c63a7e38df7c5c82aaa3c804566fa3bc783138547f8d60640f7cde21b7d051bc1abe891fd0f4cd80f24ced622eb7e19c54bb5
|
7
|
+
data.tar.gz: ad5b94780e81efe97b693e0460ce1163983a95c171d980d2021ffe99c69b92746ee68125e3ab75c2a398a7de0530965c5d30e126f7028c2cdfd88f7d9d30b00d
|
data/.travis.yml
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
-
|
3
|
+
- 2.0.0
|
4
4
|
env:
|
5
|
-
- VAGRANT_VERSION=v1.
|
5
|
+
- VAGRANT_VERSION=v1.5.2
|
6
6
|
matrix:
|
7
7
|
include:
|
8
|
+
- env: VAGRANT_VERSION=master
|
9
|
+
- env: VAGRANT_VERSION=v1.4.3
|
8
10
|
- env: VAGRANT_VERSION=v1.3.5
|
9
11
|
rvm: 1.9.3
|
10
12
|
- env: VAGRANT_VERSION=v1.2.7
|
11
13
|
rvm: 1.9.3
|
14
|
+
allow_failures:
|
15
|
+
- env: VAGRANT_VERSION=master
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,22 @@
|
|
1
|
-
## 0.
|
1
|
+
## 0.3.0 (April 4, 2014)
|
2
|
+
|
3
|
+
CHANGES:
|
4
|
+
|
5
|
+
- Implement a new DSL for running scripts.
|
6
|
+
|
7
|
+
DEPRECATIONS:
|
8
|
+
|
9
|
+
- The ```:info``` and ```:execute``` options has been replaced by the new DSL.
|
10
|
+
|
11
|
+
IMPROVEMENTS:
|
12
|
+
|
13
|
+
- Plugin messages are now localized.
|
14
|
+
|
15
|
+
BUG FIXES:
|
16
|
+
|
17
|
+
- Avoid loops by adding VAGRANT_NO_TRIGGERS to the subprocess shell.
|
18
|
+
|
19
|
+
## 0.2.2 (March 1, 2014)
|
2
20
|
|
3
21
|
NEW FEATURES:
|
4
22
|
|
@@ -6,7 +24,7 @@ NEW FEATURES:
|
|
6
24
|
|
7
25
|
BUG FIXES:
|
8
26
|
|
9
|
-
- Remove Vagrant specific environment variables when executing commands [(#5)](https://github.com/emyl/vagrant-triggers/issues/
|
27
|
+
- Remove Vagrant specific environment variables when executing commands [(#5)](https://github.com/emyl/vagrant-triggers/issues/5)
|
10
28
|
|
11
29
|
## 0.2.1 (November 19, 2013)
|
12
30
|
|
data/Gemfile
CHANGED
@@ -2,8 +2,13 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
+
# Warning: Hack below.
|
6
|
+
#
|
7
|
+
# Add the current project gem to the "plugins" group
|
8
|
+
dependencies.find { |dep| dep.name == "vagrant-triggers" }.instance_variable_set(:@groups, [:default, :plugins])
|
9
|
+
|
5
10
|
group :development do
|
6
|
-
gem "vagrant", :github => "mitchellh/vagrant", :ref => ENV.fetch("VAGRANT_VERSION", "
|
11
|
+
gem "vagrant", :github => "mitchellh/vagrant", :ref => ENV.fetch("VAGRANT_VERSION", "master")
|
7
12
|
end
|
8
13
|
|
9
14
|
group :test do
|
data/README.md
CHANGED
@@ -17,32 +17,42 @@ Installation is performed in the prescribed manner for Vagrant plugins:
|
|
17
17
|
|
18
18
|
### Basic usage
|
19
19
|
|
20
|
-
|
20
|
+
```ruby
|
21
|
+
Vagrant.configure("2") do |config|
|
22
|
+
# Your existing Vagrant configuration
|
23
|
+
...
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
config.trigger.before :command, :option => "value" do
|
26
|
+
run "script"
|
27
|
+
...
|
28
|
+
end
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
config.trigger.after :command, :option => "value" do
|
31
|
+
run "script"
|
32
|
+
...
|
33
|
+
end
|
34
|
+
end
|
28
35
|
```
|
29
36
|
|
30
37
|
The first argument is the command in which the trigger will be tied. It could be an array (e.g. ```[:up, :resume]```) in case of multiple commands.
|
31
38
|
|
32
39
|
### Options
|
33
40
|
|
34
|
-
* ```:
|
35
|
-
* ```:
|
36
|
-
|
37
|
-
* ```:append_to_path => ["dir", "dir"]```: additional places where looking for the script. See [this wiki page](https://github.com/emyl/vagrant-triggers/wiki/The-:append_to_path-option) for details.
|
38
|
-
* ```:force => true```: continue even if the script fails (exits with non-zero code)
|
41
|
+
* ```:append_to_path => ["dir", "dir"]```: additional places where looking for scripts. See [this wiki page](https://github.com/emyl/vagrant-triggers/wiki/The-:append_to_path-option) for details.
|
42
|
+
* ```:force => true```: continue even one of the scripts fails (exits with non-zero code)
|
39
43
|
* ```:stdout => true```: display script output
|
40
44
|
|
45
|
+
### Trigger block DSL
|
46
|
+
|
47
|
+
The given block will be evaluated by an instance of the [VagrantPlugins::Triggers::DSL](https://github.com/emyl/vagrant-triggers/blob/master/lib/vagrant-triggers/dsl.rb) class. This class defines a very simple DSL for running scripts on the host machine. Basically only one method (`run`) is directly defined, all the other calls will be forwarded to Vagrant's [ui](https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/ui.rb) instance. This allows the definition of custom messages along with scripts.
|
48
|
+
|
49
|
+
For additional details you can take a look to the [VagrantPlugins::Triggers::DSL](https://github.com/emyl/vagrant-triggers/blob/master/lib/vagrant-triggers/dsl.rb) definition.
|
50
|
+
|
41
51
|
### Skipping execution
|
42
52
|
|
43
53
|
Triggers won't run if ```VAGRANT_NO_TRIGGERS``` environment variable is set.
|
44
54
|
|
45
|
-
##
|
55
|
+
## A more detailed example
|
46
56
|
|
47
57
|
In the following example a VirtualBox VM (not managed by Vagrant) will be tied to the machine defined in ```Vagrantfile```, to make so that it follows its lifecycle:
|
48
58
|
|
@@ -55,12 +65,17 @@ Vagrant.configure("2") do |config|
|
|
55
65
|
:suspend => "controlvm 22aed8b3-d246-40d5-8ad4-176c17552c43 savestate",
|
56
66
|
:halt => "controlvm 22aed8b3-d246-40d5-8ad4-176c17552c43 acpipowerbutton",
|
57
67
|
}.each do |command, trigger|
|
58
|
-
config.trigger.before command, :
|
68
|
+
config.trigger.before command, :stdout => true do
|
69
|
+
info "Executing #{command} action on the VirtualBox tied VM..."
|
70
|
+
run "vboxmanage #{trigger}"
|
71
|
+
end
|
59
72
|
end
|
60
73
|
|
61
74
|
end
|
62
75
|
```
|
63
76
|
|
77
|
+
For additional examples, see the [trigger recipes](https://github.com/emyl/vagrant-triggers/wiki/Trigger-recipes) wiki page.
|
78
|
+
|
64
79
|
## Contributing
|
65
80
|
|
66
81
|
To contribute, clone the repository, and use [Bundler](http://bundler.io/)
|
@@ -76,4 +91,3 @@ You can now fork this repository, make your changes and send a pull request.
|
|
76
91
|
|
77
92
|
|
78
93
|
[](https://bitdeli.com/free "Bitdeli Badge")
|
79
|
-
|
data/lib/vagrant-triggers.rb
CHANGED
@@ -5,9 +5,10 @@ module VagrantPlugins
|
|
5
5
|
module Triggers
|
6
6
|
lib_path = Pathname.new(File.expand_path("../vagrant-triggers", __FILE__))
|
7
7
|
autoload :Action, lib_path.join("action")
|
8
|
+
autoload :DSL, lib_path.join("dsl")
|
8
9
|
autoload :Config, lib_path.join("config")
|
9
10
|
autoload :Errors, lib_path.join("errors")
|
10
|
-
|
11
|
+
|
11
12
|
# This returns the path to the source of this plugin.
|
12
13
|
#
|
13
14
|
# @return [Pathname]
|
@@ -1,6 +1,4 @@
|
|
1
1
|
require "log4r"
|
2
|
-
require "shellwords"
|
3
|
-
require "vagrant/util/subprocess"
|
4
2
|
|
5
3
|
module VagrantPlugins
|
6
4
|
module Triggers
|
@@ -22,41 +20,6 @@ module VagrantPlugins
|
|
22
20
|
|
23
21
|
private
|
24
22
|
|
25
|
-
def build_environment
|
26
|
-
@logger.debug("Original environment: #{ENV.inspect}")
|
27
|
-
|
28
|
-
# Remove GEM_ environment variables
|
29
|
-
["GEM_HOME", "GEM_PATH", "GEMRC"].each { |gem_var| ENV.delete(gem_var) }
|
30
|
-
|
31
|
-
# Create the new PATH removing Vagrant bin directory
|
32
|
-
# and appending directories specified through the
|
33
|
-
# :append_to_path option
|
34
|
-
new_path = ENV["VAGRANT_INSTALLER_ENV"] ? ENV["PATH"].gsub(/#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}.*?#{File::PATH_SEPARATOR}/, "") : ENV["PATH"]
|
35
|
-
new_path += Array(@options[:append_to_path]).map { |dir| "#{File::PATH_SEPARATOR}#{dir}" }.join
|
36
|
-
ENV["PATH"] = new_path
|
37
|
-
@logger.debug("PATH modifed: #{ENV["PATH"]}")
|
38
|
-
end
|
39
|
-
|
40
|
-
def execute(raw_command)
|
41
|
-
@env[:ui].info 'Executing command "' + raw_command + '"...'
|
42
|
-
command = Shellwords.shellsplit(raw_command)
|
43
|
-
env_backup = ENV.to_hash
|
44
|
-
begin
|
45
|
-
build_environment
|
46
|
-
result = Vagrant::Util::Subprocess.execute(command[0], *command[1..-1])
|
47
|
-
rescue Vagrant::Errors::CommandUnavailable, Vagrant::Errors::CommandUnavailableWindows
|
48
|
-
raise Errors::CommandUnavailable, :command => command[0]
|
49
|
-
ensure
|
50
|
-
ENV.replace(env_backup)
|
51
|
-
end
|
52
|
-
if result.exit_code != 0 && !@options[:force]
|
53
|
-
raise Errors::CommandFailed, :command => raw_command, :stderr => result.stderr
|
54
|
-
end
|
55
|
-
if @options[:stdout]
|
56
|
-
@env[:ui].info "Command output:\n\n#{result.stdout}\n"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
23
|
def fire_triggers
|
61
24
|
# Triggers don't fire on environment load and unload.
|
62
25
|
return if [:environment_load, :environment_unload].include?(@env[:action_name])
|
@@ -66,13 +29,24 @@ module VagrantPlugins
|
|
66
29
|
@logger.debug("Looking for triggers #{@condition} action #{current_action}.")
|
67
30
|
triggers_to_fire = @env[:machine].config.trigger.triggers.find_all { |t| t[:action] == current_action && t[:condition] == @condition }
|
68
31
|
unless triggers_to_fire.empty?
|
69
|
-
|
32
|
+
# Emit a warning message if the old syntax is found
|
33
|
+
if @env[:machine].config.trigger.deprecation_warning
|
34
|
+
@env[:ui].warn I18n.t("vagrant_triggers.action.trigger.deprecated_syntax")
|
35
|
+
end
|
36
|
+
@env[:ui].info I18n.t("vagrant_triggers.action.trigger.running_triggers", :condition => @condition)
|
70
37
|
triggers_to_fire.each do |trigger|
|
38
|
+
# Ugly block, will change in v0.4
|
71
39
|
@options = trigger[:options]
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
40
|
+
case
|
41
|
+
when trigger[:proc]
|
42
|
+
dsl = DSL.new(@env[:ui], @options)
|
43
|
+
dsl.instance_eval &trigger[:proc]
|
44
|
+
when @options[:execute]
|
45
|
+
dsl = DSL.new(@env[:ui], @options)
|
46
|
+
dsl.execute @options[:execute]
|
47
|
+
when @options[:info]
|
48
|
+
dsl = DSL.new(@env[:ui], @options)
|
49
|
+
dsl.info @options[:info]
|
76
50
|
else
|
77
51
|
@logger.debug("Trigger command not found.")
|
78
52
|
end
|
@@ -1,19 +1,21 @@
|
|
1
1
|
module VagrantPlugins
|
2
2
|
module Triggers
|
3
3
|
class Config < Vagrant.plugin("2", :config)
|
4
|
+
attr_reader :deprecation_warning
|
4
5
|
attr_reader :triggers
|
5
|
-
|
6
|
+
|
6
7
|
def initialize
|
7
|
-
@
|
8
|
+
@deprecation_warning = false
|
9
|
+
@triggers = []
|
8
10
|
end
|
9
11
|
|
10
|
-
def after(actions, options = {})
|
11
|
-
add_trigger(actions, :after, options)
|
12
|
+
def after(actions, options = {}, &block)
|
13
|
+
add_trigger(actions, :after, options, block)
|
12
14
|
end
|
13
15
|
|
14
|
-
def before(actions, options = {})
|
15
|
-
add_trigger(actions, :before, options)
|
16
|
-
end
|
16
|
+
def before(actions, options = {}, &block)
|
17
|
+
add_trigger(actions, :before, options, block)
|
18
|
+
end
|
17
19
|
|
18
20
|
def validate(machine)
|
19
21
|
errors = []
|
@@ -27,9 +29,10 @@ module VagrantPlugins
|
|
27
29
|
|
28
30
|
private
|
29
31
|
|
30
|
-
def add_trigger(actions, condition, options)
|
32
|
+
def add_trigger(actions, condition, options, proc)
|
31
33
|
Array(actions).each do |action|
|
32
|
-
@triggers << { :action => action, :condition => condition, :options => options }
|
34
|
+
@triggers << { :action => action, :condition => condition, :options => options, :proc => proc }
|
35
|
+
@deprecation_warning = true if options[:execute] || options[:info]
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "shellwords"
|
3
|
+
require "vagrant/util/subprocess"
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module Triggers
|
7
|
+
class DSL
|
8
|
+
def initialize(ui, options = {})
|
9
|
+
@logger = Log4r::Logger.new("vagrant::plugins::triggers::dsl")
|
10
|
+
@options = options
|
11
|
+
@ui = ui
|
12
|
+
end
|
13
|
+
|
14
|
+
def run(raw_command, options = {})
|
15
|
+
@ui.info I18n.t("vagrant_triggers.action.trigger.executing_command", :command => raw_command)
|
16
|
+
command = Shellwords.shellsplit(raw_command)
|
17
|
+
env_backup = ENV.to_hash
|
18
|
+
begin
|
19
|
+
build_environment
|
20
|
+
result = Vagrant::Util::Subprocess.execute(command[0], *command[1..-1])
|
21
|
+
rescue Vagrant::Errors::CommandUnavailable, Vagrant::Errors::CommandUnavailableWindows
|
22
|
+
raise Errors::CommandUnavailable, :command => command[0]
|
23
|
+
ensure
|
24
|
+
ENV.replace(env_backup)
|
25
|
+
end
|
26
|
+
if result.exit_code != 0 && !@options[:force]
|
27
|
+
raise Errors::CommandFailed, :command => raw_command, :stderr => result.stderr
|
28
|
+
end
|
29
|
+
if @options[:stdout]
|
30
|
+
@ui.info I18n.t("vagrant_triggers.action.trigger.command_output", :output => result.stdout)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
alias_method :execute, :run
|
34
|
+
|
35
|
+
def method_missing(method, *args, &block)
|
36
|
+
# If the @ui object responds to the given method, call it
|
37
|
+
if @ui.respond_to?(method)
|
38
|
+
@ui.send(method, *args, *block)
|
39
|
+
else
|
40
|
+
super(method, *args, &block)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def build_environment
|
47
|
+
@logger.debug("Original environment: #{ENV.inspect}")
|
48
|
+
|
49
|
+
# Remove GEM_ environment variables
|
50
|
+
["GEM_HOME", "GEM_PATH", "GEMRC"].each { |gem_var| ENV.delete(gem_var) }
|
51
|
+
|
52
|
+
# Create the new PATH removing Vagrant bin directory
|
53
|
+
# and appending directories specified through the
|
54
|
+
# :append_to_path option
|
55
|
+
new_path = ENV["VAGRANT_INSTALLER_ENV"] ? ENV["PATH"].gsub(/#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}.*?#{File::PATH_SEPARATOR}/, "") : ENV["PATH"]
|
56
|
+
new_path += Array(@options[:append_to_path]).map { |dir| "#{File::PATH_SEPARATOR}#{dir}" }.join
|
57
|
+
ENV["PATH"] = new_path
|
58
|
+
@logger.debug("PATH modifed: #{ENV["PATH"]}")
|
59
|
+
|
60
|
+
# Add the VAGRANT_NO_TRIGGERS variable to avoid loops
|
61
|
+
ENV["VAGRANT_NO_TRIGGERS"] = "1"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# This is a sanity check to make sure no one is attempting to install
|
2
2
|
# this into an early Vagrant version.
|
3
3
|
if Vagrant::VERSION < "1.2.0"
|
4
|
-
raise "The Vagrant Triggers plugin is only compatible with Vagrant 1.
|
4
|
+
raise "The Vagrant Triggers plugin is only compatible with Vagrant 1.2+"
|
5
5
|
end
|
6
6
|
|
7
7
|
module VagrantPlugins
|
data/locales/en.yml
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
en:
|
2
2
|
vagrant_triggers:
|
3
|
+
action:
|
4
|
+
trigger:
|
5
|
+
command_output: |-
|
6
|
+
Command output:
|
7
|
+
---------------
|
8
|
+
%{output}
|
9
|
+
---------------
|
10
|
+
deprecated_syntax: |-
|
11
|
+
--------------------
|
12
|
+
DEPRECATION WARNING:
|
13
|
+
--------------------
|
14
|
+
The `:execute` and `:info` trigger options are deprecated
|
15
|
+
and will be removed in vagrant-triggers 0.4. Please upgrade
|
16
|
+
your Vagrantfile according to the new trigger DSL.
|
17
|
+
|
18
|
+
More information on the project home page:
|
19
|
+
https://github.com/emyl/vagrant-triggers
|
20
|
+
executing_command: |-
|
21
|
+
Executing command "%{command}"...
|
22
|
+
running_triggers: |-
|
23
|
+
Running triggers %{condition} action...
|
3
24
|
errors:
|
4
25
|
command_failed: |-
|
5
26
|
The command "%{command}" returned a failed exit code. The
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "fileutils"
|
2
1
|
require "spec_helper"
|
3
2
|
|
4
3
|
describe VagrantPlugins::Triggers::Action::Trigger do
|
@@ -12,171 +11,62 @@ describe VagrantPlugins::Triggers::Action::Trigger do
|
|
12
11
|
let(:ui) { double("ui", :info => info) }
|
13
12
|
let(:info) { double("info") }
|
14
13
|
|
15
|
-
let(:result) { double("result", :exit_code => 0, :stderr => stderr) }
|
16
|
-
let(:stderr) { double("stderr") }
|
17
|
-
|
18
14
|
before do
|
19
|
-
|
15
|
+
trigger_block = Proc.new { nil }
|
16
|
+
@triggers = [ { :action => machine_action, :condition => condition, :options => { }, :proc => trigger_block } ]
|
17
|
+
machine.stub_chain(:config, :trigger, :deprecation_warning)
|
20
18
|
machine.stub_chain(:config, :trigger, :triggers).and_return(@triggers)
|
21
19
|
end
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
it "should skip :environment_load and :environment_unload actions" do
|
29
|
-
[:environment_load, :environment_unload].each do |action|
|
30
|
-
env.stub(:[]).with(:action_name).and_return(action)
|
31
|
-
env.should_not_receive(:[]).with(:machine_action)
|
32
|
-
described_class.new(app, env, condition).call(env)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
it "shouldn't fire if machine action is not defined" do
|
37
|
-
env.stub(:[]).with(:action_name)
|
38
|
-
env.stub(:[]).with(:machine_action).and_return(nil)
|
39
|
-
env.should_not_receive(:[]).with(:machine)
|
40
|
-
described_class.new(app, env, condition).call(env)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should fire trigger when all conditions are satisfied" do
|
44
|
-
Vagrant::Util::Subprocess.should_receive(:execute).with("foo")
|
45
|
-
described_class.new(app, env, condition).call(env)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should fire all defined triggers" do
|
49
|
-
@triggers << { :action => machine_action, :condition => condition, :options => { :execute => "bar" } }
|
50
|
-
Vagrant::Util::Subprocess.should_receive(:execute).twice
|
51
|
-
described_class.new(app, env, condition).call(env)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "shouldn't execute trigger with no command" do
|
55
|
-
@triggers[0][:options] = {}
|
56
|
-
Vagrant::Util::Subprocess.should_not_receive(:execute)
|
57
|
-
described_class.new(app, env, condition).call(env)
|
58
|
-
end
|
59
|
-
|
60
|
-
it "shouldn't fire trigger when condition doesn't match" do
|
61
|
-
@triggers[0][:condition] = "blah"
|
62
|
-
Vagrant::Util::Subprocess.should_not_receive(:execute)
|
63
|
-
described_class.new(app, env, condition).call(env)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "shouldn't fire trigger when action doesn't match" do
|
67
|
-
@triggers[0][:action] = "blah"
|
68
|
-
Vagrant::Util::Subprocess.should_not_receive(:execute)
|
69
|
-
described_class.new(app, env, condition).call(env)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should raise an error if executed command exits with non-zero code" do
|
73
|
-
result.stub(:exit_code => 1)
|
74
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandFailed)
|
75
|
-
end
|
76
|
-
|
77
|
-
it "shouldn't raise an error if executed command exits with non-zero code but :force option was specified" do
|
78
|
-
@triggers[0][:options][:force] = true
|
79
|
-
result.stub(:exit_code => 1)
|
80
|
-
expect { described_class.new(app, env, condition).call(env) }.not_to raise_error()
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should display output if :stdout option was specified" do
|
84
|
-
@triggers[0][:options][:stdout] = true
|
85
|
-
result.stub(:stdout => "Some output")
|
86
|
-
ui.should_receive(:info).with("Command output:\n\nSome output\n")
|
21
|
+
it "should skip :environment_load and :environment_unload actions" do
|
22
|
+
[:environment_load, :environment_unload].each do |action|
|
23
|
+
env.stub(:[]).with(:action_name).and_return(action)
|
24
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
87
25
|
described_class.new(app, env, condition).call(env)
|
88
26
|
end
|
89
27
|
end
|
90
28
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
File.stub(:executable?).with("#{@tmp_dir}/foo").and_return(true)
|
97
|
-
end
|
98
|
-
|
99
|
-
after do
|
100
|
-
File.delete("#{@tmp_dir}/foo")
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should raise a CommandUnavailable error by default" do
|
104
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
105
|
-
end
|
106
|
-
|
107
|
-
it "should raise a CommandUnavailable error on Windows" do
|
108
|
-
Vagrant::Util::Platform.stub(:windows? => true)
|
109
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should honor the :append_to_path option and restore original path after execution" do
|
113
|
-
@triggers[0][:options][:append_to_path] = @tmp_dir
|
114
|
-
original_path = ENV["PATH"]
|
115
|
-
described_class.new(app, env, condition).call(env)
|
116
|
-
expect(ENV["PATH"]).to eq(original_path)
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should accept an array for the :append_to_path option" do
|
120
|
-
@triggers[0][:options][:append_to_path] = [@tmp_dir, @tmp_dir]
|
121
|
-
expect { described_class.new(app, env, condition).call(env) }.not_to raise_error()
|
122
|
-
end
|
29
|
+
it "shouldn't fire if machine action is not defined" do
|
30
|
+
env.stub(:[]).with(:action_name)
|
31
|
+
env.stub(:[]).with(:machine_action).and_return(nil)
|
32
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
33
|
+
described_class.new(app, env, condition).call(env)
|
123
34
|
end
|
124
35
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
ENV["GEMRC"] = "#{ENV["EMBEDDED_DIR"]}/etc/gemrc"
|
132
|
-
ENV["PATH"] = "#{ENV["EMBEDDED_DIR"]}/bin:#{ENV["PATH"]}"
|
133
|
-
end
|
134
|
-
|
135
|
-
context "with a command which is present into the Vagrant embedded dir" do
|
136
|
-
before do
|
137
|
-
Dir.mkdir("#{ENV["EMBEDDED_DIR"]}/bin")
|
138
|
-
File.open("#{ENV["EMBEDDED_DIR"]}/bin/foo", "w+", 0700) { |file| }
|
139
|
-
end
|
140
|
-
|
141
|
-
it "should raise a CommandUnavailable error" do
|
142
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
143
|
-
end
|
36
|
+
it "should fire trigger when all conditions are satisfied" do
|
37
|
+
dsl = double("dsl")
|
38
|
+
VagrantPlugins::Triggers::DSL.stub(:new).with(ui, @triggers.first[:options]).and_return(dsl)
|
39
|
+
dsl.should_receive(:instance_eval).and_yield
|
40
|
+
described_class.new(app, env, condition).call(env)
|
41
|
+
end
|
144
42
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
43
|
+
it "should fire all defined triggers" do
|
44
|
+
@triggers << @triggers.first
|
45
|
+
VagrantPlugins::Triggers::DSL.should_receive(:new).twice
|
46
|
+
described_class.new(app, env, condition).call(env)
|
47
|
+
end
|
149
48
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
described_class.new(app, env, condition).call(env)
|
156
|
-
end
|
49
|
+
it "shouldn't execute trigger with no command or block" do
|
50
|
+
@triggers[0][:proc] = nil
|
51
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
52
|
+
described_class.new(app, env, condition).call(env)
|
53
|
+
end
|
157
54
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
described_class.new(app, env, condition).call(env)
|
164
|
-
end
|
55
|
+
it "shouldn't fire trigger when condition doesn't match" do
|
56
|
+
@triggers[0][:condition] = "blah"
|
57
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
58
|
+
described_class.new(app, env, condition).call(env)
|
59
|
+
end
|
165
60
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
described_class.new(app, env, condition).call(env)
|
172
|
-
end
|
61
|
+
it "shouldn't fire trigger when action doesn't match" do
|
62
|
+
@triggers[0][:action] = "blah"
|
63
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
64
|
+
described_class.new(app, env, condition).call(env)
|
65
|
+
end
|
173
66
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
ENV["GEMRC"] = nil
|
179
|
-
ENV["PATH"] = @original_path
|
180
|
-
end
|
67
|
+
it "should emit a warning message if the deprecation warning flag is set" do
|
68
|
+
machine.stub_chain(:config, :trigger, :deprecation_warning).and_return(true)
|
69
|
+
ui.should_receive(:warn).with(/DEPRECATION WARNING/)
|
70
|
+
described_class.new(app, env, condition).call(env)
|
181
71
|
end
|
182
72
|
end
|
@@ -16,25 +16,32 @@ describe VagrantPlugins::Triggers::Config do
|
|
16
16
|
|
17
17
|
describe "add triggers" do
|
18
18
|
it "should add before triggers" do
|
19
|
-
config.before
|
20
|
-
expect(config.triggers
|
19
|
+
config.before(:up) { run "ls" }
|
20
|
+
expect(config.triggers).to have(1).item
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should add after triggers" do
|
24
|
-
config.after
|
25
|
-
expect(config.triggers
|
24
|
+
config.after(:up) { run "ls" }
|
25
|
+
expect(config.triggers).to have(1).item
|
26
|
+
end
|
27
|
+
|
28
|
+
[:execute, :info].each do |option|
|
29
|
+
it "should set the deprecation warning flag if the old #{option.to_s} option is passed" do
|
30
|
+
config.before(:up, option => true)
|
31
|
+
expect(config.deprecation_warning).to be_true
|
32
|
+
end
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
29
36
|
describe "accept multiple entries" do
|
30
37
|
it "should record multiple entries" do
|
31
|
-
config.before
|
32
|
-
config.after
|
38
|
+
config.before(:up) { run "ls" }
|
39
|
+
config.after(:up) { run "ls" }
|
33
40
|
expect(config.triggers).to have(2).items
|
34
41
|
end
|
35
42
|
|
36
43
|
it "should record multiple entries if the action is an array" do
|
37
|
-
config.before
|
44
|
+
config.before([:up, :halt]) { run "ls" }
|
38
45
|
expect(config.triggers).to have(2).items
|
39
46
|
end
|
40
47
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe VagrantPlugins::Triggers::DSL do
|
5
|
+
let(:result) { double("result", :exit_code => 0, :stderr => stderr) }
|
6
|
+
let(:stderr) { double("stderr") }
|
7
|
+
|
8
|
+
let(:ui) { double("ui", :info => info) }
|
9
|
+
let(:info) { double("info") }
|
10
|
+
|
11
|
+
before do
|
12
|
+
@command = "foo"
|
13
|
+
@dsl = described_class.new(ui, {})
|
14
|
+
end
|
15
|
+
|
16
|
+
context "method missing" do
|
17
|
+
it "acts as proxy if the ui object respond to the called method" do
|
18
|
+
ui.stub(:foo).and_return("bar")
|
19
|
+
expect(@dsl.foo).to eq("bar")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "run a regular command" do
|
24
|
+
before do
|
25
|
+
Vagrant::Util::Subprocess.stub(:execute => result)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should raise an error if executed command exits with non-zero code" do
|
29
|
+
result.stub(:exit_code => 1)
|
30
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandFailed)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "shouldn't raise an error if executed command exits with non-zero code but :force option was specified" do
|
34
|
+
dsl = described_class.new(ui, :force => true)
|
35
|
+
result.stub(:exit_code => 1)
|
36
|
+
expect { dsl.run(@command) }.not_to raise_error()
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should display output if :stdout option was specified" do
|
40
|
+
dsl = described_class.new(ui, :stdout => true)
|
41
|
+
result.stub(:stdout => "Some output")
|
42
|
+
ui.should_receive(:info).with(/Some output/)
|
43
|
+
dsl.run(@command)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should pass VAGRANT_NO_TRIGGERS environment variable to the command" do
|
47
|
+
Vagrant::Util::Subprocess.should_receive(:execute) do |command|
|
48
|
+
expect(ENV).to have_key("VAGRANT_NO_TRIGGERS")
|
49
|
+
result
|
50
|
+
end
|
51
|
+
@dsl.run(@command)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "run a command not in the PATH" do
|
56
|
+
before do
|
57
|
+
@tmp_dir = Vagrant::Util::Platform.windows? ? ENV["USERPROFILE"] : ENV["HOME"]
|
58
|
+
File.open("#{@tmp_dir}/#{@command}", "w+", 0700) { |file| }
|
59
|
+
File.stub(:executable? => false)
|
60
|
+
File.stub(:executable?).with("#{@tmp_dir}/#{@command}").and_return(true)
|
61
|
+
end
|
62
|
+
|
63
|
+
after do
|
64
|
+
File.delete("#{@tmp_dir}/#{@command}")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should raise a CommandUnavailable error by default" do
|
68
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should raise a CommandUnavailable error on Windows" do
|
72
|
+
Vagrant::Util::Platform.stub(:windows? => true)
|
73
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should honor the :append_to_path option and restore original path after execution" do
|
77
|
+
dsl = described_class.new(ui, :append_to_path => @tmp_dir)
|
78
|
+
original_path = ENV["PATH"]
|
79
|
+
dsl.run(@command)
|
80
|
+
expect(ENV["PATH"]).to eq(original_path)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should accept an array for the :append_to_path option" do
|
84
|
+
dsl = described_class.new(ui, :append_to_path => [@tmp_dir, @tmp_dir])
|
85
|
+
expect { dsl.run(@command) }.not_to raise_error()
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "run a command simulating the Vagrant environment" do
|
90
|
+
before do
|
91
|
+
@original_path = ENV["PATH"]
|
92
|
+
ENV["VAGRANT_INSTALLER_ENV"] = "1"
|
93
|
+
ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"] = Vagrant::Util::Platform.windows? ? ENV["USERPROFILE"] : ENV["HOME"]
|
94
|
+
ENV["GEM_HOME"] = "#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/gems"
|
95
|
+
ENV["GEM_PATH"] = ENV["GEM_HOME"]
|
96
|
+
ENV["GEMRC"] = "#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/etc/gemrc"
|
97
|
+
ENV["PATH"] = "#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin:#{ENV["PATH"]}"
|
98
|
+
end
|
99
|
+
|
100
|
+
context "with a command which is present into the Vagrant embedded dir" do
|
101
|
+
before do
|
102
|
+
Dir.mkdir("#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin")
|
103
|
+
File.open("#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin/#{@command}", "w+", 0700) { |file| }
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should raise a CommandUnavailable error" do
|
107
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
108
|
+
end
|
109
|
+
|
110
|
+
after do
|
111
|
+
FileUtils.rm_rf("#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
["GEM_HOME", "GEM_PATH", "GEMRC"].each do |env_var|
|
116
|
+
it "should not pass #{env_var} to the executed command" do
|
117
|
+
Vagrant::Util::Subprocess.should_receive(:execute) do |command|
|
118
|
+
expect(ENV).not_to have_key(env_var)
|
119
|
+
result
|
120
|
+
end
|
121
|
+
@dsl.run(@command)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
after do
|
126
|
+
ENV["EMBEDDED_DIR"] = nil
|
127
|
+
ENV["GEM_HOME"] = nil
|
128
|
+
ENV["GEM_PATH"] = nil
|
129
|
+
ENV["GEMRC"] = nil
|
130
|
+
ENV["PATH"] = @original_path
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-triggers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emiliano Ticci
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- lib/vagrant-triggers/action/trigger.rb
|
65
65
|
- lib/vagrant-triggers/action.rb
|
66
66
|
- lib/vagrant-triggers/config.rb
|
67
|
+
- lib/vagrant-triggers/dsl.rb
|
67
68
|
- lib/vagrant-triggers/errors.rb
|
68
69
|
- lib/vagrant-triggers/plugin.rb
|
69
70
|
- lib/vagrant-triggers/version.rb
|
@@ -75,6 +76,7 @@ files:
|
|
75
76
|
- spec/spec_helper.rb
|
76
77
|
- spec/vagrant-triggers/action/trigger_spec.rb
|
77
78
|
- spec/vagrant-triggers/config_spec.rb
|
79
|
+
- spec/vagrant-triggers/dsl_spec.rb
|
78
80
|
- spec/vagrant-triggers/vagrant_spec.rb
|
79
81
|
- vagrant-triggers.gemspec
|
80
82
|
- .gitignore
|
@@ -106,4 +108,5 @@ test_files:
|
|
106
108
|
- spec/spec_helper.rb
|
107
109
|
- spec/vagrant-triggers/action/trigger_spec.rb
|
108
110
|
- spec/vagrant-triggers/config_spec.rb
|
111
|
+
- spec/vagrant-triggers/dsl_spec.rb
|
109
112
|
- spec/vagrant-triggers/vagrant_spec.rb
|