derelict_m 0.6.2a

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.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +2 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +18 -0
  5. data/.travis.yml +16 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +99 -0
  9. data/Rakefile +22 -0
  10. data/derelict.gemspec +63 -0
  11. data/lib/derelict.rb +74 -0
  12. data/lib/derelict/box.rb +29 -0
  13. data/lib/derelict/box/manager.rb +111 -0
  14. data/lib/derelict/box/not_found.rb +16 -0
  15. data/lib/derelict/connection.rb +84 -0
  16. data/lib/derelict/connection/invalid.rb +14 -0
  17. data/lib/derelict/connection/not_found.rb +13 -0
  18. data/lib/derelict/exception.rb +6 -0
  19. data/lib/derelict/exception/optional_reason.rb +32 -0
  20. data/lib/derelict/executer.rb +237 -0
  21. data/lib/derelict/instance.rb +147 -0
  22. data/lib/derelict/instance/command_failed.rb +30 -0
  23. data/lib/derelict/instance/invalid.rb +14 -0
  24. data/lib/derelict/instance/missing_binary.rb +13 -0
  25. data/lib/derelict/instance/non_directory.rb +13 -0
  26. data/lib/derelict/instance/not_found.rb +13 -0
  27. data/lib/derelict/parser.rb +27 -0
  28. data/lib/derelict/parser/box_list.rb +53 -0
  29. data/lib/derelict/parser/box_list/invalid_format.rb +16 -0
  30. data/lib/derelict/parser/plugin_list.rb +63 -0
  31. data/lib/derelict/parser/plugin_list/invalid_format.rb +16 -0
  32. data/lib/derelict/parser/plugin_list/needs_reinstall.rb +22 -0
  33. data/lib/derelict/parser/status.rb +90 -0
  34. data/lib/derelict/parser/status/invalid_format.rb +16 -0
  35. data/lib/derelict/parser/version.rb +28 -0
  36. data/lib/derelict/parser/version/invalid_format.rb +16 -0
  37. data/lib/derelict/plugin.rb +29 -0
  38. data/lib/derelict/plugin/manager.rb +107 -0
  39. data/lib/derelict/plugin/not_found.rb +14 -0
  40. data/lib/derelict/utils.rb +11 -0
  41. data/lib/derelict/utils/logger.rb +59 -0
  42. data/lib/derelict/utils/logger/array_outputter.rb +43 -0
  43. data/lib/derelict/utils/logger/invalid_type.rb +15 -0
  44. data/lib/derelict/utils/logger/raw_formatter.rb +12 -0
  45. data/lib/derelict/version.rb +3 -0
  46. data/lib/derelict/virtual_machine.rb +190 -0
  47. data/lib/derelict/virtual_machine/invalid.rb +14 -0
  48. data/lib/derelict/virtual_machine/not_found.rb +18 -0
  49. data/spec/coverage_helper.rb +19 -0
  50. data/spec/derelict/box/manager_spec.rb +171 -0
  51. data/spec/derelict/box/not_found_spec.rb +13 -0
  52. data/spec/derelict/box_spec.rb +37 -0
  53. data/spec/derelict/connection/invalid_spec.rb +16 -0
  54. data/spec/derelict/connection/not_found_spec.rb +13 -0
  55. data/spec/derelict/connection_spec.rb +107 -0
  56. data/spec/derelict/exception/optional_reason_spec.rb +41 -0
  57. data/spec/derelict/exception_spec.rb +11 -0
  58. data/spec/derelict/executer_spec.rb +129 -0
  59. data/spec/derelict/instance/command_failed_spec.rb +40 -0
  60. data/spec/derelict/instance/invalid_spec.rb +16 -0
  61. data/spec/derelict/instance/missing_binary_spec.rb +13 -0
  62. data/spec/derelict/instance/non_directory_spec.rb +13 -0
  63. data/spec/derelict/instance/not_found_spec.rb +13 -0
  64. data/spec/derelict/instance_spec.rb +258 -0
  65. data/spec/derelict/parser/box_list/invalid_format_spec.rb +16 -0
  66. data/spec/derelict/parser/box_list_spec.rb +64 -0
  67. data/spec/derelict/parser/plugin_list/invalid_format_spec.rb +16 -0
  68. data/spec/derelict/parser/plugin_list/needs_reinstall_spec.rb +13 -0
  69. data/spec/derelict/parser/plugin_list_spec.rb +82 -0
  70. data/spec/derelict/parser/status/invalid_format_spec.rb +16 -0
  71. data/spec/derelict/parser/status_spec.rb +214 -0
  72. data/spec/derelict/parser/version/invalid_format_spec.rb +16 -0
  73. data/spec/derelict/parser/version_spec.rb +42 -0
  74. data/spec/derelict/parser_spec.rb +24 -0
  75. data/spec/derelict/plugin/manager_spec.rb +208 -0
  76. data/spec/derelict/plugin/not_found_spec.rb +13 -0
  77. data/spec/derelict/plugin_spec.rb +37 -0
  78. data/spec/derelict/utils/logger/array_outputter_spec.rb +40 -0
  79. data/spec/derelict/utils/logger/invalid_type_spec.rb +13 -0
  80. data/spec/derelict/utils/logger/raw_formatter_spec.rb +17 -0
  81. data/spec/derelict/utils/logger_spec.rb +35 -0
  82. data/spec/derelict/virtual_machine/invalid_spec.rb +16 -0
  83. data/spec/derelict/virtual_machine/not_found_spec.rb +34 -0
  84. data/spec/derelict/virtual_machine_spec.rb +356 -0
  85. data/spec/derelict_spec.rb +50 -0
  86. data/spec/spec_helper.rb +32 -0
  87. data/spec/support/log_context.rb +36 -0
  88. metadata +332 -0
@@ -0,0 +1,11 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Exception do
4
+ it "is autoloaded" do
5
+ should be_a Derelict::Exception
6
+ end
7
+
8
+ it "inherits from ::Exception" do
9
+ should be_a ::Exception
10
+ end
11
+ end
@@ -0,0 +1,129 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Executer do
4
+ let(:executer) { described_class.new }
5
+ let(:command) { double("command") }
6
+ let(:options) { Hash.new }
7
+ let(:block) { Proc.new do end }
8
+ let(:result) { double("result") }
9
+
10
+ describe ".execute" do
11
+ before do
12
+ expect(described_class).to receive(:new).with(options).and_return(executer)
13
+ expect(executer).to receive(:execute).with(command, &block).and_return(result)
14
+ end
15
+
16
+ subject { described_class.execute command, options, &block }
17
+ it { should be result }
18
+ end
19
+
20
+ describe "#initialize" do
21
+ subject { described_class.new options }
22
+ it { should be_a described_class }
23
+ its(:stdout) { should eq "" }
24
+ its(:stderr) { should eq "" }
25
+ its(:success?) { should be_nil }
26
+ its(:status) { should be_nil }
27
+
28
+ context "with :chars mode specified" do
29
+ let(:options) { {:mode => :chars} }
30
+ it { should be_a described_class }
31
+ end
32
+ end
33
+
34
+ # The way #execute is tested is much slower than a unit test
35
+ # (obviously), but I ran into some difficulty implementing a proper
36
+ # unit test for this method.
37
+ #
38
+ # TODO: rewrite as a unit test
39
+ describe "#execute" do
40
+ subject { executer.execute command, &block }
41
+
42
+ context "without a block" do
43
+ let(:command) { "echo 'test 1'" }
44
+ its(:stdout) { should eq "test 1\n" }
45
+ its(:stderr) { should eq "" }
46
+ its(:success?) { should be_true }
47
+ its(:status) { should be 0 }
48
+
49
+ context "with non-existent command" do
50
+ let(:command) { "not_actually_a_command" }
51
+ it "should raise ENOENT" do
52
+ expect { subject }.to raise_error(Errno::ENOENT)
53
+ end
54
+ end
55
+
56
+ context "with unsuccessful command" do
57
+ let(:command) { "false" }
58
+ its(:success?) { should be_false }
59
+ its(:status) { should be 1 }
60
+ end
61
+
62
+ # Unfortunately this part is even worse. It seems to work though!
63
+ # The basic idea is for a thread to kill *this* process once the
64
+ # sub-process has started. It's still relatively fast, and is at
65
+ # least an accurate way to model the real-world use.
66
+ context "when main process is receives a signal" do
67
+ subject {
68
+ Thread.new do
69
+ # Wait for the sub-process to start
70
+ sleep 0.01 while executer.pid.nil?
71
+
72
+ # Send SIGINT to this process, it should get forwarded on
73
+ # to the sub-process
74
+ Process.kill "INT", Process.pid
75
+ end
76
+
77
+ # Start the sub-process
78
+ executer.execute "sleep 10"
79
+ }
80
+
81
+ specify "the sub-process should get killed" do
82
+ expect(subject.success?).to be_false
83
+ expect(subject.status).to be nil
84
+ end
85
+ end
86
+ end
87
+
88
+ context "with a block" do
89
+ context "with one argument" do
90
+ let(:command) { "echo 'test 2'" }
91
+ let(:block) do
92
+ @buffer = ""
93
+ Proc.new do |stdout|
94
+ @buffer << stdout
95
+ end
96
+ end
97
+
98
+ its(:stdout) { should eq "test 2\n" }
99
+ its(:stderr) { should eq "" }
100
+ its(:success?) { should be_true }
101
+ its(:status) { should be 0 }
102
+ specify "the block should get called" do
103
+ subject; expect(@buffer).to eq executer.stdout
104
+ end
105
+ end
106
+
107
+ context "with two arguments" do
108
+ let(:command) { "echo 'test 3'; echo 'test 4' 1>&2" }
109
+ let(:block) do
110
+ @stdout = ""; @stderr = ""
111
+ Proc.new do |stdout, stderr|
112
+ @stdout << stdout unless stdout.nil?
113
+ @stderr << stderr unless stderr.nil?
114
+ end
115
+ end
116
+
117
+ its(:stdout) { should eq "test 3\n" }
118
+ its(:stderr) { should eq "test 4\n" }
119
+ its(:success?) { should be_true }
120
+ its(:status) { should be 0 }
121
+ specify "the block should get called" do
122
+ subject
123
+ expect(@stdout).to eq executer.stdout
124
+ expect(@stderr).to eq executer.stderr
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Instance::CommandFailed do
4
+ it "is autoloaded" do
5
+ should be_a Derelict::Instance::CommandFailed
6
+ end
7
+
8
+ describe "#initialize" do
9
+ let(:command) { nil }
10
+ let(:result) { nil }
11
+ subject { Derelict::Instance::CommandFailed.new command, result }
12
+
13
+ context "with no arguments" do
14
+ its(:message) { should eq "Error executing Vagrant command" }
15
+ end
16
+
17
+ context "with custom command" do
18
+ let(:command) { "my_command" }
19
+ its(:message) { should eq "Error executing Vagrant command 'my_command'" }
20
+ end
21
+
22
+ context "with custom result" do
23
+ let(:result) { double("result", :stderr => "my_stderr") }
24
+ its(:message) {
25
+ should eq "Error executing Vagrant command, STDERR output:\nmy_stderr"
26
+ }
27
+ end
28
+
29
+ context "with custom command and result" do
30
+ let(:command) { "my_command" }
31
+ let(:result) { double("result", :stderr => "my_stderr") }
32
+ its(:message) {
33
+ should eq [
34
+ "Error executing Vagrant command 'my_command', ",
35
+ "STDERR output:\nmy_stderr"
36
+ ].join
37
+ }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Instance::Invalid do
4
+ it "is autoloaded" do
5
+ should be_a Derelict::Instance::Invalid
6
+ end
7
+
8
+ context "when using default reason" do
9
+ its(:message) { should eq "Invalid Derelict instance" }
10
+ end
11
+
12
+ context "when using custom reason" do
13
+ subject { Derelict::Instance::Invalid.new "reason" }
14
+ its(:message) { should eq "Invalid Derelict instance: reason" }
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Instance::MissingBinary do
4
+ subject { Derelict::Instance::MissingBinary.new "/foo/bar" }
5
+
6
+ it "is autoloaded" do
7
+ should be_a Derelict::Instance::MissingBinary
8
+ end
9
+
10
+ its(:message) {
11
+ should eq "Invalid Derelict instance: 'vagrant' binary not found at /foo/bar"
12
+ }
13
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Instance::NonDirectory do
4
+ subject { Derelict::Instance::NonDirectory.new "/foo/bar" }
5
+
6
+ it "is autoloaded" do
7
+ should be_a Derelict::Instance::NonDirectory
8
+ end
9
+
10
+ its(:message) {
11
+ should eq "Invalid Derelict instance: expected directory, found file: /foo/bar"
12
+ }
13
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Instance::NotFound do
4
+ subject { Derelict::Instance::NotFound.new "/foo/bar" }
5
+
6
+ it "is autoloaded" do
7
+ should be_a Derelict::Instance::NotFound
8
+ end
9
+
10
+ its(:message) {
11
+ should eq "Invalid Derelict instance: directory doesn't exist: /foo/bar"
12
+ }
13
+ end
@@ -0,0 +1,258 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Instance do
4
+ let(:instance) { Derelict::Instance.new path }
5
+ let(:path) { nil }
6
+
7
+ subject { instance }
8
+
9
+ it "is autoloaded" do
10
+ should be_a Derelict::Instance
11
+ end
12
+
13
+ describe "#version" do
14
+ let(:result) { double("result", :stdout => stdout) }
15
+ let(:stdout) { double("stdout") }
16
+ let(:parser) { double("parser", :version => "the version") }
17
+ subject { instance.version }
18
+ before {
19
+ expect(instance).to receive(:execute!).with("--version").and_return(result)
20
+ expect(Derelict::Parser::Version).to receive(:new).with(stdout).and_return(parser)
21
+ }
22
+
23
+ it "should execute --version and parse the result" do
24
+ expect(subject).to eq "the version"
25
+ end
26
+ end
27
+
28
+ describe "#plugins" do
29
+ subject { instance.plugins }
30
+ it { should be_a Derelict::Plugin::Manager }
31
+ its(:instance) { should be instance }
32
+ end
33
+
34
+ describe "#boxes" do
35
+ subject { instance.boxes }
36
+ it { should be_a Derelict::Box::Manager }
37
+ its(:instance) { should be instance }
38
+ end
39
+
40
+ context "with path parameter" do
41
+ let(:path) { "/foo/bar" }
42
+
43
+ describe "#initialize" do
44
+ its(:path) { should eq "/foo/bar" }
45
+ end
46
+
47
+ describe "#validate!" do
48
+ subject { instance.validate! }
49
+
50
+ context "with valid path" do
51
+ before {
52
+ expect(File).to receive(:exists?).with("/foo/bar").and_return(true)
53
+ expect(File).to receive(:directory?).with("/foo/bar").and_return(true)
54
+ expect(File).to receive(:exists?).with("/foo/bar/bin/vagrant").and_return(true)
55
+ expect(File).to receive(:executable?).with("/foo/bar/bin/vagrant").and_return(true)
56
+ }
57
+
58
+ it "shouldn't raise any exceptions" do
59
+ expect { subject }.to_not raise_error
60
+ end
61
+
62
+ it "should be chainable" do
63
+ expect(subject).to be_a Derelict::Instance
64
+ end
65
+
66
+ include_context "logged messages"
67
+ let(:expected_logs) {[
68
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
69
+ "DEBUG instance: Starting validation for Derelict::Instance at '/foo/bar'\n",
70
+ "DEBUG instance: Vagrant binary for Derelict::Instance at '/foo/bar' is '/foo/bar/bin/vagrant'\n",
71
+ " INFO instance: Successfully validated Derelict::Instance at '/foo/bar'\n",
72
+ ]}
73
+ end
74
+
75
+ context "with non-existent path" do
76
+ before {
77
+ expect(File).to receive(:exists?).with("/foo/bar").and_return(false)
78
+ }
79
+
80
+ it "should raise NotFound" do
81
+ expect { subject }.to raise_error Derelict::Instance::NotFound
82
+ end
83
+
84
+ include_context "logged messages"
85
+ let(:expected_logs) {[
86
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
87
+ "DEBUG instance: Starting validation for Derelict::Instance at '/foo/bar'\n",
88
+ ]}
89
+ end
90
+
91
+ context "with path pointing to a file" do
92
+ before {
93
+ expect(File).to receive(:exists?).with("/foo/bar").and_return(true)
94
+ expect(File).to receive(:directory?).with("/foo/bar").and_return(false)
95
+ }
96
+
97
+ it "should raise NonDirectory" do
98
+ expect { subject }.to raise_error Derelict::Instance::NonDirectory
99
+ end
100
+
101
+ include_context "logged messages"
102
+ let(:expected_logs) {[
103
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
104
+ "DEBUG instance: Starting validation for Derelict::Instance at '/foo/bar'\n",
105
+ ]}
106
+ end
107
+
108
+ context "with vagrant binary missing" do
109
+ before {
110
+ expect(File).to receive(:exists?).with("/foo/bar").and_return(true)
111
+ expect(File).to receive(:directory?).with("/foo/bar").and_return(true)
112
+ expect(File).to receive(:exists?).with("/foo/bar/bin/vagrant").and_return(false)
113
+ }
114
+
115
+ it "should raise MissingBinary" do
116
+ expect { subject }.to raise_error Derelict::Instance::MissingBinary
117
+ end
118
+
119
+ include_context "logged messages"
120
+ let(:expected_logs) {[
121
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
122
+ "DEBUG instance: Starting validation for Derelict::Instance at '/foo/bar'\n",
123
+ "DEBUG instance: Vagrant binary for Derelict::Instance at '/foo/bar' is '/foo/bar/bin/vagrant'\n",
124
+ ]}
125
+ end
126
+
127
+ context "with vagrant binary non-executable" do
128
+ before {
129
+ expect(File).to receive(:exists?).with("/foo/bar").and_return(true)
130
+ expect(File).to receive(:directory?).with("/foo/bar").and_return(true)
131
+ expect(File).to receive(:exists?).with("/foo/bar/bin/vagrant").and_return(true)
132
+ expect(File).to receive(:executable?).with("/foo/bar/bin/vagrant").and_return(false)
133
+ }
134
+
135
+ it "should raise MissingBinary" do
136
+ expect { subject }.to raise_error Derelict::Instance::MissingBinary
137
+ end
138
+
139
+ include_context "logged messages"
140
+ let(:expected_logs) {[
141
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
142
+ "DEBUG instance: Starting validation for Derelict::Instance at '/foo/bar'\n",
143
+ "DEBUG instance: Vagrant binary for Derelict::Instance at '/foo/bar' is '/foo/bar/bin/vagrant'\n",
144
+ ]}
145
+ end
146
+ end
147
+
148
+ describe "#connect" do
149
+ let(:connection) { double("connection") }
150
+ let(:connection_path) { double("connection_path", :inspect => "connection_path") }
151
+ subject { instance.connect connection_path }
152
+ before do
153
+ con = Derelict::Connection
154
+ args = [instance, connection_path]
155
+ expect(con).to receive(:new).with(*args).and_return(connection)
156
+ expect(connection).to receive(:validate!).and_return(connection)
157
+ end
158
+
159
+ it { should be connection }
160
+
161
+ include_context "logged messages"
162
+ let(:expected_logs) {[
163
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
164
+ " INFO instance: Creating connection for 'connection_path' by Derelict::Instance at '/foo/bar'\n",
165
+ ]}
166
+ end
167
+
168
+ context "with mock Executer" do
169
+ let(:expected_command) { "/foo/bar/bin/vagrant test arg\\ 1" }
170
+ before do
171
+ expect(Derelict::Executer).to receive(:execute).with(expected_command, options).and_return(result)
172
+ end
173
+
174
+ let(:options) { Hash.new }
175
+
176
+ let(:result) do
177
+ double("result", {
178
+ :stdout => "stdout\n",
179
+ :stderr => "stderr\n",
180
+ :success? => success,
181
+ })
182
+ end
183
+
184
+ let(:success) { double("success") }
185
+
186
+ describe "#execute" do
187
+ subject { instance.execute :test, "arg 1" }
188
+ its(:stdout) { should eq "stdout\n" }
189
+ its(:stderr) { should eq "stderr\n" }
190
+ its(:success?) { should be success }
191
+
192
+ include_context "logged messages"
193
+ let(:expected_logs) {[
194
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
195
+ "DEBUG instance: Vagrant binary for Derelict::Instance at '/foo/bar' is '/foo/bar/bin/vagrant'\n",
196
+ "DEBUG instance: Generated command '/foo/bar/bin/vagrant test arg\\ 1' from subcommand 'test' with arguments [\"arg 1\"]\n",
197
+ "DEBUG instance: Executing /foo/bar/bin/vagrant test arg\\ 1 using Derelict::Instance at '/foo/bar'\n",
198
+ ]}
199
+
200
+ context "with options hash" do
201
+ let(:options) { {:foo => :bar} }
202
+ subject { instance.execute :test, "arg 1", options }
203
+ its(:stdout) { should eq "stdout\n" }
204
+ its(:stderr) { should eq "stderr\n" }
205
+ its(:success?) { should be success }
206
+ end
207
+
208
+ context "with :sudo option enabled" do
209
+ let(:options_argument) { {:sudo => true} }
210
+ let(:options) { Hash.new } # Don't pass sudo opt to Executer.execute
211
+ let(:expected_command) { "sudo -- /foo/bar/bin/vagrant test arg\\ 1" }
212
+ subject { instance.execute :test, "arg 1", options_argument }
213
+ its(:stdout) { should eq "stdout\n" }
214
+ its(:stderr) { should eq "stderr\n" }
215
+ its(:success?) { should be success }
216
+ end
217
+ end
218
+
219
+ describe "#execute!" do
220
+ subject { instance.execute! :test, "arg 1" }
221
+
222
+ context "on success" do
223
+ let(:success) { true }
224
+
225
+ its(:stdout) { should eq "stdout\n" }
226
+ its(:stderr) { should eq "stderr\n" }
227
+ its(:success?) { should be true }
228
+
229
+ include_context "logged messages"
230
+ let(:expected_logs) {[
231
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
232
+ "DEBUG instance: Vagrant binary for Derelict::Instance at '/foo/bar' is '/foo/bar/bin/vagrant'\n",
233
+ "DEBUG instance: Generated command '/foo/bar/bin/vagrant test arg\\ 1' from subcommand 'test' with arguments [\"arg 1\"]\n",
234
+ "DEBUG instance: Executing /foo/bar/bin/vagrant test arg\\ 1 using Derelict::Instance at '/foo/bar'\n",
235
+ ]}
236
+ end
237
+
238
+ context "on failure" do
239
+ let(:success) { false }
240
+
241
+ it "should raise CommandFailed" do
242
+ expect { subject }.to raise_error Derelict::Instance::CommandFailed
243
+ end
244
+
245
+ include_context "logged messages"
246
+ let(:expected_logs) {[
247
+ "DEBUG instance: Successfully initialized Derelict::Instance at '/foo/bar'\n",
248
+ "DEBUG instance: Vagrant binary for Derelict::Instance at '/foo/bar' is '/foo/bar/bin/vagrant'\n",
249
+ "DEBUG instance: Generated command '/foo/bar/bin/vagrant test arg\\ 1' from subcommand 'test' with arguments [\"arg 1\"]\n",
250
+ "DEBUG instance: Executing /foo/bar/bin/vagrant test arg\\ 1 using Derelict::Instance at '/foo/bar'\n",
251
+ "DEBUG instance: Generated command '/foo/bar/bin/vagrant test arg\\ 1' from subcommand 'test' with arguments [\"arg 1\"]\n",
252
+ " WARN instance: Command /foo/bar/bin/vagrant test arg\\ 1 failed: Error executing Vagrant command '/foo/bar/bin/vagrant test arg\\ 1', STDERR output:\nstderr\n\n",
253
+ ]}
254
+ end
255
+ end
256
+ end
257
+ end
258
+ end