derelict 0.0.1 → 0.1.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.
Files changed (63) hide show
  1. checksums.yaml +5 -13
  2. data/.cane +2 -0
  3. data/.coveralls.yml +1 -0
  4. data/.travis.yml +13 -0
  5. data/README.md +55 -9
  6. data/Rakefile +21 -0
  7. data/derelict.gemspec +25 -1
  8. data/lib/derelict/connection/invalid.rb +14 -0
  9. data/lib/derelict/connection/not_found.rb +13 -0
  10. data/lib/derelict/connection.rb +84 -0
  11. data/lib/derelict/exception/optional_reason.rb +32 -0
  12. data/lib/derelict/exception.rb +3 -2
  13. data/lib/derelict/instance/command_failed.rb +28 -0
  14. data/lib/derelict/instance/invalid.rb +11 -11
  15. data/lib/derelict/instance/missing_binary.rb +13 -0
  16. data/lib/derelict/instance/non_directory.rb +10 -8
  17. data/lib/derelict/instance/not_found.rb +10 -8
  18. data/lib/derelict/instance.rb +105 -33
  19. data/lib/derelict/parser/status/invalid_format.rb +16 -0
  20. data/lib/derelict/parser/status.rb +89 -0
  21. data/lib/derelict/parser/version/invalid_format.rb +16 -0
  22. data/lib/derelict/parser/version.rb +28 -0
  23. data/lib/derelict/parser.rb +25 -0
  24. data/lib/derelict/utils/logger/array_outputter.rb +43 -0
  25. data/lib/derelict/utils/logger/invalid_type.rb +15 -0
  26. data/lib/derelict/utils/logger/raw_formatter.rb +12 -0
  27. data/lib/derelict/utils/logger.rb +51 -0
  28. data/lib/derelict/utils.rb +11 -0
  29. data/lib/derelict/version.rb +2 -2
  30. data/lib/derelict/virtual_machine/invalid.rb +14 -0
  31. data/lib/derelict/virtual_machine/not_found.rb +18 -0
  32. data/lib/derelict/virtual_machine.rb +154 -0
  33. data/lib/derelict.rb +61 -14
  34. data/spec/coverage_helper.rb +16 -0
  35. data/spec/derelict/connection/invalid_spec.rb +16 -0
  36. data/spec/derelict/connection/not_found_spec.rb +13 -0
  37. data/spec/derelict/connection_spec.rb +107 -0
  38. data/spec/derelict/exception/optional_reason_spec.rb +41 -0
  39. data/spec/derelict/exception_spec.rb +11 -0
  40. data/spec/derelict/instance/command_failed_spec.rb +40 -0
  41. data/spec/derelict/instance/invalid_spec.rb +16 -0
  42. data/spec/derelict/instance/missing_binary_spec.rb +13 -0
  43. data/spec/derelict/instance/non_directory_spec.rb +13 -0
  44. data/spec/derelict/instance/not_found_spec.rb +13 -0
  45. data/spec/derelict/instance_spec.rb +226 -0
  46. data/spec/derelict/parser/status/invalid_format_spec.rb +16 -0
  47. data/spec/derelict/parser/status_spec.rb +214 -0
  48. data/spec/derelict/parser/version/invalid_format_spec.rb +16 -0
  49. data/spec/derelict/parser/version_spec.rb +31 -0
  50. data/spec/derelict/parser_spec.rb +24 -0
  51. data/spec/derelict/utils/logger/array_outputter_spec.rb +40 -0
  52. data/spec/derelict/utils/logger/invalid_type_spec.rb +13 -0
  53. data/spec/derelict/utils/logger/raw_formatter_spec.rb +17 -0
  54. data/spec/derelict/utils/logger_spec.rb +35 -0
  55. data/spec/derelict/virtual_machine/invalid_spec.rb +16 -0
  56. data/spec/derelict/virtual_machine/not_found_spec.rb +34 -0
  57. data/spec/derelict/virtual_machine_spec.rb +295 -0
  58. data/spec/derelict_spec.rb +50 -0
  59. data/spec/spec_helper.rb +28 -3
  60. data/spec/support/log_context.rb +36 -0
  61. metadata +175 -22
  62. data/lib/derelict/instance/already_active.rb +0 -9
  63. data/spec/system_spec.spec +0 -10
@@ -0,0 +1,214 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Parser::Status do
4
+ subject { Derelict::Parser::Status.new output }
5
+ let(:output) { nil }
6
+
7
+ it "is autoloaded" do
8
+ should be_a Derelict::Parser::Status
9
+ end
10
+
11
+ context "with valid output" do
12
+ let(:output) {
13
+ <<-END.gsub /^ +/, ""
14
+ Current machine states:
15
+
16
+ foo not created (virtualbox)
17
+
18
+ The environment has not yet been created. Run `vagrant up` to
19
+ create the environment. If a machine is not created, only the
20
+ default provider will be shown. So if a provider is not listed,
21
+ then the machine is not created for that environment.
22
+ END
23
+ }
24
+
25
+ describe "#vm_names" do
26
+ subject { Derelict::Parser::Status.new(output).vm_names }
27
+ it { should eq Set[:foo] }
28
+
29
+ include_context "logged messages"
30
+ let(:expected_logs) {[
31
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
32
+ "DEBUG status: Parsing states from VM list using Derelict::Parser::Status instance\n",
33
+ "DEBUG status: Parsing VM list from output using Derelict::Parser::Status instance\n",
34
+ ]}
35
+ end
36
+
37
+ describe "#exists?" do
38
+ it "should return true for 'foo' VM" do
39
+ expect(subject.exists?(:foo)).to be true
40
+ end
41
+
42
+ it "should return false for unknown VM" do
43
+ expect(subject.exists?(:bar)).to be false
44
+ end
45
+
46
+ include_context "logged messages"
47
+ let(:expected_logs) {[
48
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
49
+ ]}
50
+ end
51
+
52
+ describe "#state" do
53
+ it "should return :not_created for 'foo' VM" do
54
+ expect(subject.state(:foo)).to be :not_created
55
+ end
56
+
57
+ it "should return :not_created for unknown VM" do
58
+ type = Derelict::VirtualMachine::NotFound
59
+ expect { subject.state(:bar) }.to raise_error type
60
+ end
61
+
62
+ include_context "logged messages"
63
+ let(:expected_logs) {[
64
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
65
+ ]}
66
+ end
67
+ end
68
+
69
+ context "with multi-machine output" do
70
+ let(:output) {
71
+ <<-END.gsub /^ +/, ""
72
+ Current machine states:
73
+
74
+ foo not created (virtualbox)
75
+ bar not created (virtualbox)
76
+
77
+ This environment represents multiple VMs. The VMs are all listed
78
+ above with their current state. For more information about a specific
79
+ VM, run `vagrant status NAME`.
80
+ END
81
+ }
82
+
83
+ describe "#vm_names" do
84
+ subject { Derelict::Parser::Status.new(output).vm_names }
85
+ it { should eq Set[:foo, :bar] }
86
+
87
+ include_context "logged messages"
88
+ let(:expected_logs) {[
89
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
90
+ "DEBUG status: Parsing states from VM list using Derelict::Parser::Status instance\n",
91
+ "DEBUG status: Parsing VM list from output using Derelict::Parser::Status instance\n",
92
+ ]}
93
+ end
94
+
95
+ describe "#exists?" do
96
+ it "should return true for 'foo' VM" do
97
+ expect(subject.exists?(:foo)).to be true
98
+ end
99
+
100
+ it "should return true for 'bar' VM" do
101
+ expect(subject.exists?(:bar)).to be true
102
+ end
103
+
104
+ it "should return false for unknown VM" do
105
+ expect(subject.exists?(:baz)).to be false
106
+ end
107
+
108
+ include_context "logged messages"
109
+ let(:expected_logs) {[
110
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
111
+ ]}
112
+ end
113
+
114
+ describe "#state" do
115
+ it "should return :not_created for 'foo' VM" do
116
+ expect(subject.state(:foo)).to be :not_created
117
+ end
118
+
119
+ it "should return :not_created for 'bar' VM" do
120
+ expect(subject.state(:bar)).to be :not_created
121
+ end
122
+
123
+ it "should return :not_created for unknown VM" do
124
+ type = Derelict::VirtualMachine::NotFound
125
+ expect { subject.state(:baz) }.to raise_error type
126
+ end
127
+
128
+ include_context "logged messages"
129
+ let(:expected_logs) {[
130
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
131
+ ]}
132
+ end
133
+ end
134
+
135
+
136
+ context "with invalid list format" do
137
+ let(:output) {
138
+ <<-END.gsub /^ +/, ""
139
+ This output is missing the list of virtual machines.
140
+ END
141
+ }
142
+
143
+ describe "#vm_names" do
144
+ subject { Derelict::Parser::Status.new(output).vm_names }
145
+ it "should raise InvalidFormat" do
146
+ type = Derelict::Parser::Status::InvalidFormat
147
+ message = [
148
+ "Output from 'vagrant status' was in an unexpected format: ",
149
+ "Couldn't find VM list",
150
+ ].join
151
+ expect { subject }.to raise_error type, message
152
+ end
153
+
154
+ include_context "logged messages"
155
+ let(:expected_logs) {[
156
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
157
+ "DEBUG status: Parsing states from VM list using Derelict::Parser::Status instance\n",
158
+ "DEBUG status: Parsing VM list from output using Derelict::Parser::Status instance\n",
159
+ ]}
160
+ end
161
+
162
+ describe "#state" do
163
+ subject { Derelict::Parser::Status.new(output).state(:foo) }
164
+ it "should raise InvalidFormat" do
165
+ type = Derelict::Parser::Status::InvalidFormat
166
+ message = [
167
+ "Output from 'vagrant status' was in an unexpected format: ",
168
+ "Couldn't find VM list",
169
+ ].join
170
+ expect { subject }.to raise_error type, message
171
+ end
172
+
173
+ include_context "logged messages"
174
+ let(:expected_logs) {[
175
+ "DEBUG status: Successfully initialized Derelict::Parser::Status instance\n",
176
+ "DEBUG status: Parsing states from VM list using Derelict::Parser::Status instance\n",
177
+ "DEBUG status: Parsing VM list from output using Derelict::Parser::Status instance\n",
178
+ ]}
179
+ end
180
+ end
181
+
182
+ context "with invalid VM format" do
183
+ let(:output) {
184
+ <<-END.gsub /^ +/, ""
185
+ Current machine states:
186
+
187
+ foo this line is missing brackets!
188
+ bar not created (virtualbox)
189
+
190
+ This environment represents multiple VMs. The VMs are all listed
191
+ above with their current state. For more information about a specific
192
+ VM, run `vagrant status NAME`.
193
+ END
194
+ }
195
+
196
+ describe "#vm_names" do
197
+ subject { Derelict::Parser::Status.new(output).vm_names }
198
+ it "should raise InvalidFormat" do
199
+ type = Derelict::Parser::Status::InvalidFormat
200
+ message = "Output from 'vagrant status' was in an unexpected format: Couldn't parse VM list"
201
+ expect { subject.parse! }.to raise_error type, message
202
+ end
203
+ end
204
+
205
+ describe "#state" do
206
+ subject { Derelict::Parser::Status.new(output).state(:foo) }
207
+ it "should raise InvalidFormat" do
208
+ type = Derelict::Parser::Status::InvalidFormat
209
+ message = "Output from 'vagrant status' was in an unexpected format: Couldn't parse VM list"
210
+ expect { subject }.to raise_error type, message
211
+ end
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Parser::Version::InvalidFormat do
4
+ it "is autoloaded" do
5
+ should be_a Derelict::Parser::Version::InvalidFormat
6
+ end
7
+
8
+ context "when using default reason" do
9
+ its(:message) { should eq "Output from 'vagrant --version' was in an unexpected format" }
10
+ end
11
+
12
+ context "when using custom reason" do
13
+ subject { Derelict::Parser::Version::InvalidFormat.new "reason" }
14
+ its(:message) { should eq "Output from 'vagrant --version' was in an unexpected format: reason" }
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Parser::Version do
4
+ let(:parser) { Derelict::Parser::Version.new stdout }
5
+
6
+ describe "#version" do
7
+ subject { parser.version }
8
+
9
+ context "on Vagrant 1.0.7" do
10
+ let(:stdout) { "Vagrant version 1.0.7\n" }
11
+ it { should eq "1.0.7" }
12
+
13
+ include_context "logged messages"
14
+ let(:expected_logs) {[
15
+ "DEBUG version: Successfully initialized Derelict::Parser::Version instance\n",
16
+ "DEBUG version: Parsing version from output using Derelict::Parser::Version instance\n",
17
+ ]}
18
+ end
19
+
20
+ context "on Vagrant 1.3.4" do
21
+ let(:stdout) { "Vagrant v1.3.4\n" }
22
+ it { should eq "1.3.4" }
23
+
24
+ include_context "logged messages"
25
+ let(:expected_logs) {[
26
+ "DEBUG version: Successfully initialized Derelict::Parser::Version instance\n",
27
+ "DEBUG version: Parsing version from output using Derelict::Parser::Version instance\n",
28
+ ]}
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Parser do
4
+ let(:output) { nil }
5
+ subject { Derelict::Parser.new output }
6
+
7
+ it "is autoloaded" do
8
+ should be_a Derelict::Parser
9
+ end
10
+
11
+ describe "#initialize" do
12
+ let(:output) { "the output" }
13
+ let(:description) { "test parser" }
14
+
15
+ it "should store output" do
16
+ expect(subject.output).to eq "the output"
17
+ end
18
+
19
+ include_context "logged messages"
20
+ let(:expected_logs) {[
21
+ "DEBUG parser: Successfully initialized Derelict::Parser (unknown type)\n",
22
+ ]}
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Utils::Logger::ArrayOutputter do
4
+ let(:logger) { Log4r::Logger.new "test::array_outputter_spec" }
5
+ let(:outputter) { Derelict::Utils::Logger::ArrayOutputter.new "test" }
6
+ before { logger.outputters = [outputter] }
7
+ subject { outputter }
8
+
9
+ describe "#level" do
10
+ subject { outputter.level }
11
+ it { should be Log4r::ALL }
12
+ end
13
+
14
+ context "with no data" do
15
+ describe "#messages" do
16
+ subject { outputter.messages }
17
+ it { should eq [] }
18
+ end
19
+
20
+ describe "#flush" do
21
+ subject { outputter.flush }
22
+ it { should eq [] }
23
+ end
24
+ end
25
+
26
+ context "after INFO level log" do
27
+ before { logger.info "test info message" }
28
+ let(:message) { " INFO array_outputter_spec: test info message\n" }
29
+
30
+ describe "#messages" do
31
+ subject { outputter.messages }
32
+ it { should eq [message] }
33
+ end
34
+
35
+ context "then #flush" do
36
+ subject { outputter.flush }
37
+ it { should eq [message] }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Utils::Logger::InvalidType do
4
+ subject { Derelict::Utils::Logger::InvalidType.new "test type" }
5
+
6
+ it "is autoloaded" do
7
+ should be_a Derelict::Utils::Logger::InvalidType
8
+ end
9
+
10
+ its(:message) {
11
+ should eq "Invalid logger type 'test type'"
12
+ }
13
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Utils::Logger::RawFormatter do
4
+ let(:formatter) { Derelict::Utils::Logger::RawFormatter.new }
5
+ subject { formatter }
6
+
7
+ it "is autoloaded" do
8
+ should be_a Derelict::Utils::Logger::RawFormatter
9
+ end
10
+
11
+ describe "#format" do
12
+ let(:data) { double("data") }
13
+ let(:event) { double("event", :data => data) }
14
+ subject { formatter.format event }
15
+ it { should be data }
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Utils::Logger do
4
+ let(:logger) do
5
+ Module.new do
6
+ extend Derelict::Utils::Logger
7
+ private
8
+ def self.logger_name
9
+ "test"
10
+ end
11
+ end
12
+ end
13
+
14
+ describe "#logger" do
15
+ subject { logger.logger options }
16
+ let(:options) { {:type => type} }
17
+ let(:type) { :nil }
18
+
19
+ context "internal type" do
20
+ let(:type) { :internal }
21
+ it { should be_a Log4r::Logger }
22
+ end
23
+
24
+ context "external type" do
25
+ let(:type) { :external }
26
+ it { should be_a Log4r::Logger }
27
+ end
28
+
29
+ context "invalid type" do
30
+ it "should raise InvalidType" do
31
+ expect { subject }.to raise_error Derelict::Utils::Logger::InvalidType
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::VirtualMachine::Invalid do
4
+ it "is autoloaded" do
5
+ should be_a Derelict::VirtualMachine::Invalid
6
+ end
7
+
8
+ context "when using default reason" do
9
+ its(:message) { should eq "Invalid Derelict virtual machine" }
10
+ end
11
+
12
+ context "when using custom reason" do
13
+ subject { Derelict::VirtualMachine::Invalid.new "reason" }
14
+ its(:message) { should eq "Invalid Derelict virtual machine: reason" }
15
+ end
16
+ end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::VirtualMachine::NotFound do
4
+ let(:connection) { double("connection") }
5
+ let(:name) { "foo" }
6
+ let(:exception) { Derelict::VirtualMachine::NotFound.new name, connection }
7
+ subject { exception }
8
+
9
+ it "is autoloaded" do
10
+ should be_a Derelict::VirtualMachine::NotFound
11
+ end
12
+
13
+ describe "#message" do
14
+ subject { exception.message }
15
+
16
+ context "with invalid connection" do
17
+ let(:expected) {
18
+ "Invalid Derelict virtual machine: Virtual machine foo not found"
19
+ }
20
+ it { should eq expected }
21
+ end
22
+
23
+ context "with invalid connection" do
24
+ let(:connection) { double("connection", :path => "/foo") }
25
+ let(:expected) {
26
+ [
27
+ "Invalid Derelict virtual machine: Virtual machine ",
28
+ "foo not found in /foo",
29
+ ].join
30
+ }
31
+ it { should eq expected }
32
+ end
33
+ end
34
+ end