virtualbox 0.4.2 → 0.4.3
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.
- data/VERSION +1 -1
- data/lib/virtualbox/abstract_model.rb +1 -1
- data/lib/virtualbox/attached_device.rb +2 -2
- data/lib/virtualbox/command.rb +15 -3
- data/lib/virtualbox/dvd.rb +2 -2
- data/lib/virtualbox/extra_data.rb +4 -4
- data/lib/virtualbox/hard_drive.rb +19 -11
- data/lib/virtualbox/nic.rb +1 -1
- data/lib/virtualbox/shared_folder.rb +2 -2
- data/lib/virtualbox/vm.rb +27 -12
- data/test/virtualbox/abstract_model_test.rb +1 -1
- data/test/virtualbox/attached_device_test.rb +3 -11
- data/test/virtualbox/command_test.rb +15 -0
- data/test/virtualbox/dvd_test.rb +2 -2
- data/test/virtualbox/extra_data_test.rb +4 -4
- data/test/virtualbox/hard_drive_test.rb +36 -7
- data/test/virtualbox/nic_test.rb +3 -3
- data/test/virtualbox/shared_folder_test.rb +3 -14
- data/test/virtualbox/vm_test.rb +37 -71
- data/virtualbox.gemspec +2 -2
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.3
|
@@ -166,7 +166,7 @@ module VirtualBox
|
|
166
166
|
# a new one
|
167
167
|
destroy({:port => port_was}, raise_errors) if port_changed? && !port_was.nil?
|
168
168
|
|
169
|
-
Command.vboxmanage("storageattach
|
169
|
+
Command.vboxmanage("storageattach", parent.parent.name, "--storagectl", parent.name, "--port", port, "--device", "0", "--type", image.image_type, "--medium", medium)
|
170
170
|
existing_record!
|
171
171
|
clear_dirty!
|
172
172
|
|
@@ -209,7 +209,7 @@ module VirtualBox
|
|
209
209
|
# parent = storagecontroller
|
210
210
|
# parent.parent = vm
|
211
211
|
destroy_port = options[:port] || port
|
212
|
-
Command.vboxmanage("storageattach
|
212
|
+
Command.vboxmanage("storageattach", parent.parent.name, "--storagectl", parent.name, "--port", destroy_port, "--device", "0", "--medium", "none")
|
213
213
|
image.destroy(raise_errors) if options[:destroy_image] && image
|
214
214
|
rescue Exceptions::CommandFailedException
|
215
215
|
raise if raise_errors
|
data/lib/virtualbox/command.rb
CHANGED
@@ -23,13 +23,25 @@ module VirtualBox
|
|
23
23
|
|
24
24
|
# Sets the path to VBoxManage, which is required for this gem to
|
25
25
|
# work.
|
26
|
+
#
|
27
|
+
# @param [String] Full path to `VBoxManage`.
|
26
28
|
def vboxmanage=(path)
|
27
29
|
@@vboxmanage = path
|
28
30
|
end
|
29
31
|
|
30
|
-
# Runs a VBoxManage command and returns the output.
|
31
|
-
|
32
|
-
|
32
|
+
# Runs a VBoxManage command and returns the output. This method will automatically
|
33
|
+
# shell escape all args passed to it. There is no way to avoid this at the moment
|
34
|
+
# (since it hasn't been necessary to). This will raise an {Exceptions::CommandFailedException}
|
35
|
+
# if the exit status of the command is nonzero. It is up to the caller to figure
|
36
|
+
# out how to handle this; there is no way to suppress it via a parameter to this
|
37
|
+
# call.
|
38
|
+
#
|
39
|
+
# Upon success, {vboxmanage} returns the stdout output from the command.
|
40
|
+
#
|
41
|
+
# @return [String] The data from stdout of the command.
|
42
|
+
def vboxmanage(*args)
|
43
|
+
args.collect! { |arg| shell_escape(arg.to_s) }
|
44
|
+
result = execute("#{@@vboxmanage} -q #{args.join(" ")}")
|
33
45
|
raise Exceptions::CommandFailedException.new(result) if !Command.success?
|
34
46
|
result
|
35
47
|
end
|
data/lib/virtualbox/dvd.rb
CHANGED
@@ -22,7 +22,7 @@ module VirtualBox
|
|
22
22
|
class <<self
|
23
23
|
# Returns an array of all available DVDs as DVD objects
|
24
24
|
def all
|
25
|
-
raw = Command.vboxmanage("list dvds")
|
25
|
+
raw = Command.vboxmanage("list", "dvds")
|
26
26
|
parse_raw(raw)
|
27
27
|
end
|
28
28
|
|
@@ -69,7 +69,7 @@ module VirtualBox
|
|
69
69
|
def destroy(raise_errors=false)
|
70
70
|
return false if empty_drive?
|
71
71
|
|
72
|
-
Command.vboxmanage("closemedium dvd
|
72
|
+
Command.vboxmanage("closemedium", "dvd", uuid, "--delete")
|
73
73
|
true
|
74
74
|
rescue Exceptions::CommandFailedException
|
75
75
|
raise if raise_errors
|
@@ -46,7 +46,7 @@ module VirtualBox
|
|
46
46
|
# @return [Array<ExtraData>]
|
47
47
|
def global(reload=false)
|
48
48
|
if !@@global_data || reload
|
49
|
-
raw = Command.vboxmanage("getextradata global enumerate")
|
49
|
+
raw = Command.vboxmanage("getextradata", "global", "enumerate")
|
50
50
|
@@global_data = parse_kv_pairs(raw)
|
51
51
|
end
|
52
52
|
|
@@ -75,7 +75,7 @@ module VirtualBox
|
|
75
75
|
#
|
76
76
|
# @return [Array<ExtraData>]
|
77
77
|
def populate_relationship(caller, data)
|
78
|
-
raw = Command.vboxmanage("getextradata
|
78
|
+
raw = Command.vboxmanage("getextradata", caller.name, "enumerate")
|
79
79
|
parse_kv_pairs(raw, caller)
|
80
80
|
end
|
81
81
|
|
@@ -124,7 +124,7 @@ module VirtualBox
|
|
124
124
|
# @return [Boolean] True if command was successful, false otherwise.
|
125
125
|
def save(raise_errors=false)
|
126
126
|
changes.each do |key, value|
|
127
|
-
Command.vboxmanage("setextradata
|
127
|
+
Command.vboxmanage("setextradata", parent_name, key, value[1])
|
128
128
|
clear_dirty!(key)
|
129
129
|
end
|
130
130
|
|
@@ -140,7 +140,7 @@ module VirtualBox
|
|
140
140
|
# will be raised if the command failed.
|
141
141
|
# @return [Boolean] True if command was successful, false otherwise.
|
142
142
|
def delete(key, raise_errors=false)
|
143
|
-
Command.vboxmanage("setextradata
|
143
|
+
Command.vboxmanage("setextradata", parent_name, key)
|
144
144
|
super(key)
|
145
145
|
true
|
146
146
|
rescue Exceptions::CommandFailedException
|
@@ -84,21 +84,26 @@ module VirtualBox
|
|
84
84
|
# Returns an array of all available hard drives as HardDrive
|
85
85
|
# objects.
|
86
86
|
#
|
87
|
+
# @param [Boolean] raise_errors If true, {Exceptions::CommandFailedException}
|
88
|
+
# will be raised if the command failed.
|
87
89
|
# @return [Array<HardDrive>]
|
88
|
-
def all
|
89
|
-
raw = Command.vboxmanage("list hdds")
|
90
|
-
parse_blocks(raw).collect { |v| find(v[:uuid]) }
|
90
|
+
def all(raise_errors=false)
|
91
|
+
raw = Command.vboxmanage("list", "hdds")
|
92
|
+
parse_blocks(raw).collect { |v| find(v[:uuid], raise_errors) }
|
93
|
+
rescue Exceptions::CommandFailedException
|
94
|
+
raise if raise_errors
|
95
|
+
false
|
91
96
|
end
|
92
97
|
|
93
98
|
# Finds one specific hard drive by UUID or file name. If the
|
94
99
|
# hard drive can not be found, will return `nil`.
|
95
100
|
#
|
101
|
+
# @param [String] id The UUID or name of the hard drive
|
102
|
+
# @param [Boolean] raise_errors If true, {Exceptions::CommandFailedException}
|
103
|
+
# will be raised if the command failed.
|
96
104
|
# @return [HardDrive]
|
97
|
-
def find(id)
|
98
|
-
raw = Command.vboxmanage("showhdinfo
|
99
|
-
|
100
|
-
# Return nil if the hard drive doesn't exist
|
101
|
-
return nil if raw =~ /VERR_FILE_NOT_FOUND/
|
105
|
+
def find(id, raise_errors=false)
|
106
|
+
raw = Command.vboxmanage("showhdinfo", id)
|
102
107
|
|
103
108
|
data = raw.split(/\n\n/).collect { |v| parse_block(v) }.find { |v| !v.nil? }
|
104
109
|
|
@@ -108,6 +113,9 @@ module VirtualBox
|
|
108
113
|
|
109
114
|
# Return new object
|
110
115
|
new(data)
|
116
|
+
rescue Exceptions::CommandFailedException
|
117
|
+
raise if raise_errors
|
118
|
+
nil
|
111
119
|
end
|
112
120
|
end
|
113
121
|
|
@@ -124,7 +132,7 @@ module VirtualBox
|
|
124
132
|
# will be raised if the command failed.
|
125
133
|
# @return [HardDrive] The new, cloned hard drive, or nil on failure.
|
126
134
|
def clone(outputfile, format="VDI", raise_errors=false)
|
127
|
-
raw = Command.vboxmanage("clonehd
|
135
|
+
raw = Command.vboxmanage("clonehd", uuid, outputfile, "--format", format, "--remember")
|
128
136
|
return nil unless raw =~ /UUID: (.+?)$/
|
129
137
|
|
130
138
|
self.class.find($1.to_s)
|
@@ -159,7 +167,7 @@ module VirtualBox
|
|
159
167
|
return false
|
160
168
|
end
|
161
169
|
|
162
|
-
raw = Command.vboxmanage("createhd --filename
|
170
|
+
raw = Command.vboxmanage("createhd", "--filename", location, "--size", size, "--format", read_attribute(:format), "--remember")
|
163
171
|
return nil unless raw =~ /UUID: (.+?)$/
|
164
172
|
|
165
173
|
# Just replace our attributes with the newly created ones. This also
|
@@ -201,7 +209,7 @@ module VirtualBox
|
|
201
209
|
# will be raised if the command failed.
|
202
210
|
# @return [Boolean] True if command was successful, false otherwise.
|
203
211
|
def destroy(raise_errors=false)
|
204
|
-
Command.vboxmanage("closemedium disk
|
212
|
+
Command.vboxmanage("closemedium", "disk", uuid, "--delete")
|
205
213
|
true
|
206
214
|
rescue Exceptions::CommandFailedException
|
207
215
|
raise if raise_errors
|
data/lib/virtualbox/nic.rb
CHANGED
@@ -143,7 +143,7 @@ module VirtualBox
|
|
143
143
|
#
|
144
144
|
# **This method typically won't be used except internally.**
|
145
145
|
def save_attribute(key, value, vmname)
|
146
|
-
Command.vboxmanage("modifyvm
|
146
|
+
Command.vboxmanage("modifyvm", vmname, "--#{key}#{@index}", value)
|
147
147
|
super
|
148
148
|
end
|
149
149
|
end
|
@@ -204,7 +204,7 @@ module VirtualBox
|
|
204
204
|
# If this isn't a new record, we destroy it first
|
205
205
|
destroy(raise_errors) if !new_record?
|
206
206
|
|
207
|
-
Command.vboxmanage("sharedfolder add
|
207
|
+
Command.vboxmanage("sharedfolder", "add", parent.name, "--name", name, "--hostpath", hostpath)
|
208
208
|
existing_record!
|
209
209
|
clear_dirty!
|
210
210
|
|
@@ -233,7 +233,7 @@ module VirtualBox
|
|
233
233
|
# one.
|
234
234
|
name_value = name_changed? ? name_was : name
|
235
235
|
|
236
|
-
Command.vboxmanage("sharedfolder remove
|
236
|
+
Command.vboxmanage("sharedfolder", "remove", parent.name, "--name", name_value)
|
237
237
|
true
|
238
238
|
rescue Exceptions::CommandFailedException
|
239
239
|
raise if raise_errors
|
data/lib/virtualbox/vm.rb
CHANGED
@@ -120,7 +120,7 @@ module VirtualBox
|
|
120
120
|
#
|
121
121
|
# @return [Array<VM>]
|
122
122
|
def all
|
123
|
-
raw = Command.vboxmanage("list vms")
|
123
|
+
raw = Command.vboxmanage("list", "vms")
|
124
124
|
parse_vm_list(raw)
|
125
125
|
end
|
126
126
|
|
@@ -141,7 +141,7 @@ module VirtualBox
|
|
141
141
|
#
|
142
142
|
# @return [VM] The newly imported virtual machine
|
143
143
|
def import(source_path)
|
144
|
-
raw = Command.vboxmanage("import
|
144
|
+
raw = Command.vboxmanage("import", source_path)
|
145
145
|
return nil unless raw
|
146
146
|
|
147
147
|
find(parse_vm_name(raw))
|
@@ -154,7 +154,7 @@ module VirtualBox
|
|
154
154
|
#
|
155
155
|
# @return [String]
|
156
156
|
def human_info(name)
|
157
|
-
Command.vboxmanage("showvminfo
|
157
|
+
Command.vboxmanage("showvminfo", name)
|
158
158
|
end
|
159
159
|
|
160
160
|
# Gets the VM info (machine readable) for a given VM and returns it
|
@@ -162,7 +162,7 @@ module VirtualBox
|
|
162
162
|
#
|
163
163
|
# @return [Hash] Parsed VM info.
|
164
164
|
def raw_info(name)
|
165
|
-
raw = Command.vboxmanage("showvminfo
|
165
|
+
raw = Command.vboxmanage("showvminfo", name, "--machinereadable")
|
166
166
|
parse_vm_info(raw)
|
167
167
|
end
|
168
168
|
|
@@ -259,7 +259,7 @@ module VirtualBox
|
|
259
259
|
#
|
260
260
|
# **This method typically won't be used except internally.**
|
261
261
|
def save_attribute(key, value)
|
262
|
-
Command.vboxmanage("modifyvm
|
262
|
+
Command.vboxmanage("modifyvm", @original_name, "--#{key}", value)
|
263
263
|
super
|
264
264
|
end
|
265
265
|
|
@@ -287,12 +287,13 @@ module VirtualBox
|
|
287
287
|
# @option options [String] :eulafile (nil) License file
|
288
288
|
def export(filename, options={}, raise_error=false)
|
289
289
|
options = options.inject([]) do |acc, kv|
|
290
|
-
acc.push("--#{kv[0]}
|
290
|
+
acc.push("--#{kv[0]}")
|
291
|
+
acc.push(kv[1])
|
291
292
|
end
|
292
293
|
|
293
|
-
options.unshift("--vsys
|
294
|
+
options.unshift("0").unshift("--vsys") unless options.empty?
|
294
295
|
|
295
|
-
raw = Command.vboxmanage("export
|
296
|
+
raw = Command.vboxmanage("export", @original_name, "-o", filename, *options)
|
296
297
|
true
|
297
298
|
rescue Exceptions::CommandFailedException
|
298
299
|
raise if raise_error
|
@@ -314,7 +315,7 @@ module VirtualBox
|
|
314
315
|
# will be raised if the command failed.
|
315
316
|
# @return [Boolean] True if command was successful, false otherwise.
|
316
317
|
def start(mode=:gui, raise_errors=false)
|
317
|
-
Command.vboxmanage("startvm
|
318
|
+
Command.vboxmanage("startvm", @original_name, "--type", mode)
|
318
319
|
true
|
319
320
|
rescue Exceptions::CommandFailedException
|
320
321
|
raise if raise_errors
|
@@ -364,7 +365,7 @@ module VirtualBox
|
|
364
365
|
end
|
365
366
|
|
366
367
|
# Saves the state of a VM and stops it. The VM can be resumed
|
367
|
-
# again by calling "start" again.
|
368
|
+
# again by calling "{#start}" again.
|
368
369
|
#
|
369
370
|
# @param [Boolean] raise_errors If true, {Exceptions::CommandFailedException}
|
370
371
|
# will be raised if the command failed.
|
@@ -373,6 +374,20 @@ module VirtualBox
|
|
373
374
|
control(:savestate, raise_errors)
|
374
375
|
end
|
375
376
|
|
377
|
+
# Discards any saved state on the current VM. The VM is not destroyed though
|
378
|
+
# and can still be started by calling {#start}.
|
379
|
+
#
|
380
|
+
# @param [Boolean] raise_errors If true, {Exceptions::CommandFailedException}
|
381
|
+
# will be raised if the command failed.
|
382
|
+
# @return [Boolean] True if command was successful, false otherwise.
|
383
|
+
def discard_state(raise_errors=false)
|
384
|
+
Command.vboxmanage("discardstate", @original_name)
|
385
|
+
true
|
386
|
+
rescue Exceptions::CommandFailedException
|
387
|
+
raise if raise_errors
|
388
|
+
false
|
389
|
+
end
|
390
|
+
|
376
391
|
# Controls the virtual machine. This method is used by {#stop},
|
377
392
|
# {#pause}, {#resume}, and {#save_state} to control the virtual machine.
|
378
393
|
# Typically, you won't ever have to call this method and should
|
@@ -383,7 +398,7 @@ module VirtualBox
|
|
383
398
|
# will be raised if the command failed.
|
384
399
|
# @return [Boolean] True if command was successful, false otherwise.
|
385
400
|
def control(command, raise_errors=false)
|
386
|
-
Command.vboxmanage("controlvm
|
401
|
+
Command.vboxmanage("controlvm", @original_name, command)
|
387
402
|
true
|
388
403
|
rescue Exceptions::CommandFailedException
|
389
404
|
raise if raise_errors
|
@@ -405,7 +420,7 @@ module VirtualBox
|
|
405
420
|
# unregistering a VM
|
406
421
|
super
|
407
422
|
|
408
|
-
Command.vboxmanage("unregistervm
|
423
|
+
Command.vboxmanage("unregistervm", @original_name, "--delete")
|
409
424
|
end
|
410
425
|
|
411
426
|
# Returns true if the virtual machine state is running
|
@@ -25,7 +25,7 @@ class AbstractModelTest < Test::Unit::TestCase
|
|
25
25
|
end
|
26
26
|
|
27
27
|
should "generate the proper inspect string" do
|
28
|
-
assert_equal "#<AbstractModelTest::FakeModel :
|
28
|
+
assert_equal "#<AbstractModelTest::FakeModel :bar=nil, :bars=..., :foo=nil, :foos=...>", @model.inspect
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -149,7 +149,7 @@ class AttachedDeviceTest < Test::Unit::TestCase
|
|
149
149
|
end
|
150
150
|
|
151
151
|
should "call the proper vboxcommand" do
|
152
|
-
VirtualBox::Command.expects(:vboxmanage).with("storageattach
|
152
|
+
VirtualBox::Command.expects(:vboxmanage).with("storageattach", @vm.name, "--storagectl", @caller.name, "--port", @ad.port, "--device", "0", "--type", @image.image_type, "--medium", @ad.medium)
|
153
153
|
@ad.save
|
154
154
|
end
|
155
155
|
|
@@ -229,21 +229,13 @@ class AttachedDeviceTest < Test::Unit::TestCase
|
|
229
229
|
VirtualBox::AttachedDevice.destroy_relationship(self, [obj_one, obj_two], "HELLO")
|
230
230
|
end
|
231
231
|
|
232
|
-
should "shell escape VM name and storage controller name" do
|
233
|
-
shell_seq = sequence("shell_seq")
|
234
|
-
VirtualBox::Command.expects(:shell_escape).with(@vm.name).in_sequence(shell_seq)
|
235
|
-
VirtualBox::Command.expects(:shell_escape).with(@caller.name).in_sequence(shell_seq)
|
236
|
-
VirtualBox::Command.expects(:vboxmanage).in_sequence(shell_seq)
|
237
|
-
@value.destroy
|
238
|
-
end
|
239
|
-
|
240
232
|
should "destroy with the specified port if set" do
|
241
|
-
VirtualBox::Command.expects(:vboxmanage).with("storageattach
|
233
|
+
VirtualBox::Command.expects(:vboxmanage).with("storageattach", @vm.name, "--storagectl", @caller.name, "--port", 80, "--device", "0", "--medium", "none")
|
242
234
|
@value.destroy(:port => 80)
|
243
235
|
end
|
244
236
|
|
245
237
|
should "destroy with the default port if not other port is specified" do
|
246
|
-
VirtualBox::Command.expects(:vboxmanage).with("storageattach
|
238
|
+
VirtualBox::Command.expects(:vboxmanage).with("storageattach", @vm.name, "--storagectl", @caller.name, "--port", @value.port, "--device", "0", "--medium", "none")
|
247
239
|
@value.destroy
|
248
240
|
end
|
249
241
|
|
@@ -43,6 +43,21 @@ class CommandTest < Test::Unit::TestCase
|
|
43
43
|
VirtualBox::Command.vboxmanage("foo")
|
44
44
|
}
|
45
45
|
end
|
46
|
+
|
47
|
+
should "call vboxmanage with multiple arguments" do
|
48
|
+
VirtualBox::Command.expects(:execute).with("VBoxManage -q foo bar baz --bak bax")
|
49
|
+
VirtualBox::Command.vboxmanage("foo", "bar", "baz", "--bak", "bax")
|
50
|
+
end
|
51
|
+
|
52
|
+
should "shell escape all arguments" do
|
53
|
+
VirtualBox::Command.expects(:execute).with("VBoxManage -q foo\\ bar baz another\\ string")
|
54
|
+
VirtualBox::Command.vboxmanage("foo bar", "baz", "another string")
|
55
|
+
end
|
56
|
+
|
57
|
+
should "convert arguments to strings" do
|
58
|
+
VirtualBox::Command.expects(:execute).with("VBoxManage -q isastring 8")
|
59
|
+
VirtualBox::Command.vboxmanage(:isastring, 8)
|
60
|
+
end
|
46
61
|
end
|
47
62
|
|
48
63
|
context "testing command results" do
|
data/test/virtualbox/dvd_test.rb
CHANGED
@@ -15,7 +15,7 @@ class DVDTest < Test::Unit::TestCase
|
|
15
15
|
end
|
16
16
|
|
17
17
|
should "call vboxmanage to destroy it" do
|
18
|
-
VirtualBox::Command.expects(:vboxmanage).with("closemedium dvd
|
18
|
+
VirtualBox::Command.expects(:vboxmanage).with("closemedium", "dvd", @dvd.uuid, "--delete")
|
19
19
|
assert @dvd.destroy
|
20
20
|
end
|
21
21
|
|
@@ -69,7 +69,7 @@ Accessible: yes
|
|
69
69
|
Usage: TestJeOS (UUID: 3d0f87b4-50f7-4fc5-ad89-93375b1b32a3)
|
70
70
|
valid
|
71
71
|
|
72
|
-
VirtualBox::Command.expects(:vboxmanage).with("list dvds").returns(@valid)
|
72
|
+
VirtualBox::Command.expects(:vboxmanage).with("list", "dvds").returns(@valid)
|
73
73
|
end
|
74
74
|
|
75
75
|
should "return an array of DVD objects" do
|
@@ -44,7 +44,7 @@ raw
|
|
44
44
|
|
45
45
|
context "populating" do
|
46
46
|
should "call VBoxManage for the caller" do
|
47
|
-
VirtualBox::Command.expects(:vboxmanage).with("getextradata
|
47
|
+
VirtualBox::Command.expects(:vboxmanage).with("getextradata", @caller.name, "enumerate").returns(@raw)
|
48
48
|
VirtualBox::ExtraData.populate_relationship(@caller, {})
|
49
49
|
end
|
50
50
|
|
@@ -75,7 +75,7 @@ raw
|
|
75
75
|
end
|
76
76
|
|
77
77
|
should "call the proper vbox command" do
|
78
|
-
VirtualBox::Command.expects(:vboxmanage).with("setextradata global foo")
|
78
|
+
VirtualBox::Command.expects(:vboxmanage).with("setextradata", "global", "foo")
|
79
79
|
assert @ed.delete(@key)
|
80
80
|
end
|
81
81
|
|
@@ -111,7 +111,7 @@ raw
|
|
111
111
|
end
|
112
112
|
|
113
113
|
should "call the proper vbox command" do
|
114
|
-
VirtualBox::Command.expects(:vboxmanage).with("setextradata global foo BAR")
|
114
|
+
VirtualBox::Command.expects(:vboxmanage).with("setextradata", "global", "foo", "BAR")
|
115
115
|
assert @ed.save
|
116
116
|
end
|
117
117
|
|
@@ -154,7 +154,7 @@ raw
|
|
154
154
|
context "global extra data" do
|
155
155
|
setup do
|
156
156
|
get_seq = sequence("get_seq")
|
157
|
-
VirtualBox::Command.expects(:vboxmanage).with("getextradata global enumerate").once.in_sequence(get_seq)
|
157
|
+
VirtualBox::Command.expects(:vboxmanage).with("getextradata", "global", "enumerate").once.in_sequence(get_seq)
|
158
158
|
VirtualBox::ExtraData.expects(:parse_kv_pairs).returns(@ed).once.in_sequence(get_seq)
|
159
159
|
@global = VirtualBox::ExtraData.global(true)
|
160
160
|
end
|
@@ -16,7 +16,7 @@ In use by VMs: FooVM (UUID: 696249ad-00b6-4087-b47f-9b82629efc31)
|
|
16
16
|
Location: /Users/mitchellh/Library/VirtualBox/HardDisks/foo.vdi
|
17
17
|
raw
|
18
18
|
@name = "foo"
|
19
|
-
VirtualBox::Command.stubs(:vboxmanage).with("showhdinfo
|
19
|
+
VirtualBox::Command.stubs(:vboxmanage).with("showhdinfo", @name).returns(@find_raw)
|
20
20
|
end
|
21
21
|
|
22
22
|
context "validations" do
|
@@ -48,7 +48,7 @@ raw
|
|
48
48
|
end
|
49
49
|
|
50
50
|
should "call vboxmanage to destroy it" do
|
51
|
-
VirtualBox::Command.expects(:vboxmanage).with("closemedium disk
|
51
|
+
VirtualBox::Command.expects(:vboxmanage).with("closemedium", "disk", @hd.uuid, "--delete")
|
52
52
|
assert @hd.destroy
|
53
53
|
end
|
54
54
|
|
@@ -68,7 +68,7 @@ raw
|
|
68
68
|
context "cloning a hard drive" do
|
69
69
|
setup do
|
70
70
|
@hd = VirtualBox::HardDrive.find(@name)
|
71
|
-
VirtualBox::Command.stubs(:vboxmanage).with("clonehd
|
71
|
+
VirtualBox::Command.stubs(:vboxmanage).with("clonehd", @hd.uuid, "bar", "--format", "VDI", "--remember").returns(@find_raw)
|
72
72
|
end
|
73
73
|
|
74
74
|
should "call vboxmanage with the clone command" do
|
@@ -130,7 +130,7 @@ raw
|
|
130
130
|
end
|
131
131
|
|
132
132
|
should "call createhd" do
|
133
|
-
VirtualBox::Command.expects(:vboxmanage).with("createhd --filename
|
133
|
+
VirtualBox::Command.expects(:vboxmanage).with("createhd", "--filename", @location, "--size", @size, "--format", @format, "--remember")
|
134
134
|
@hd.save
|
135
135
|
end
|
136
136
|
|
@@ -172,7 +172,7 @@ raw
|
|
172
172
|
|
173
173
|
context "finding a single hard drive" do
|
174
174
|
should "parse proper fields" do
|
175
|
-
VirtualBox::Command.expects(:vboxmanage).with("showhdinfo
|
175
|
+
VirtualBox::Command.expects(:vboxmanage).with("showhdinfo", @name).returns(@find_raw)
|
176
176
|
|
177
177
|
@expected = {
|
178
178
|
:uuid => "11dedd14-57a1-4bdb-adeb-dd1d67f066e1",
|
@@ -190,12 +190,19 @@ raw
|
|
190
190
|
end
|
191
191
|
|
192
192
|
should "return nil if finding a non-existent hard drive" do
|
193
|
-
VirtualBox::Command.
|
193
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
194
194
|
|
195
195
|
assert_nothing_raised do
|
196
196
|
assert_nil VirtualBox::HardDrive.find(12)
|
197
197
|
end
|
198
198
|
end
|
199
|
+
|
200
|
+
should "raise an exception if flag is set" do
|
201
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
202
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
203
|
+
VirtualBox::HardDrive.find(12, true)
|
204
|
+
}
|
205
|
+
end
|
199
206
|
end
|
200
207
|
|
201
208
|
context "retrieving all hard drives" do
|
@@ -223,7 +230,7 @@ Type: normal
|
|
223
230
|
Usage: foo (UUID: 8710d3db-d96a-46ed-9004-59fa891fda90)
|
224
231
|
valid
|
225
232
|
|
226
|
-
VirtualBox::Command.
|
233
|
+
VirtualBox::Command.stubs(:vboxmanage).with("list", "hdds").returns(@valid)
|
227
234
|
|
228
235
|
@hd = mock("hd")
|
229
236
|
@hd.stubs(:is_a?).with(VirtualBox::HardDrive).returns(true)
|
@@ -236,5 +243,27 @@ valid
|
|
236
243
|
|
237
244
|
result.each { |v| assert v.is_a?(VirtualBox::HardDrive) }
|
238
245
|
end
|
246
|
+
|
247
|
+
should "forward the raise_error flag to find" do
|
248
|
+
VirtualBox::HardDrive.expects(:find).with(anything, true).raises(VirtualBox::Exceptions::CommandFailedException)
|
249
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
250
|
+
VirtualBox::HardDrive.all(true)
|
251
|
+
}
|
252
|
+
end
|
253
|
+
|
254
|
+
should "return false if an error occured" do
|
255
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
256
|
+
|
257
|
+
assert_nothing_raised do
|
258
|
+
assert !VirtualBox::HardDrive.all
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
should "raise an exception if flag is set" do
|
263
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
264
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
265
|
+
VirtualBox::HardDrive.all(true)
|
266
|
+
}
|
267
|
+
end
|
239
268
|
end
|
240
269
|
end
|
data/test/virtualbox/nic_test.rb
CHANGED
@@ -25,7 +25,7 @@ raw
|
|
25
25
|
end
|
26
26
|
|
27
27
|
should "use the vmname strung through the save" do
|
28
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm
|
28
|
+
VirtualBox::Command.expects(:vboxmanage).with("modifyvm", @vmname, "--nic1", "foo")
|
29
29
|
|
30
30
|
nic = @nic[0]
|
31
31
|
nic.nic = "foo"
|
@@ -33,7 +33,7 @@ raw
|
|
33
33
|
end
|
34
34
|
|
35
35
|
should "use the proper index" do
|
36
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm
|
36
|
+
VirtualBox::Command.expects(:vboxmanage).with("modifyvm", @vmname, "--nic2", "far")
|
37
37
|
|
38
38
|
nic = @nic[1]
|
39
39
|
nic.nic = "far"
|
@@ -41,7 +41,7 @@ raw
|
|
41
41
|
end
|
42
42
|
|
43
43
|
should "save the nictype" do
|
44
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm
|
44
|
+
VirtualBox::Command.expects(:vboxmanage).with("modifyvm", @vmname, "--nictype1", "ZOO")
|
45
45
|
|
46
46
|
nic = @nic[0]
|
47
47
|
nic.nictype = "ZOO"
|
@@ -96,7 +96,7 @@ class SharedFolderTest < Test::Unit::TestCase
|
|
96
96
|
end
|
97
97
|
|
98
98
|
should "call the proper vboxcommand" do
|
99
|
-
VirtualBox::Command.expects(:vboxmanage).with("sharedfolder add
|
99
|
+
VirtualBox::Command.expects(:vboxmanage).with("sharedfolder", "add", @caller.name, "--name", @sf.name, "--hostpath", @sf.hostpath)
|
100
100
|
assert @sf.save
|
101
101
|
end
|
102
102
|
|
@@ -175,15 +175,7 @@ class SharedFolderTest < Test::Unit::TestCase
|
|
175
175
|
end
|
176
176
|
|
177
177
|
should "call the proper command" do
|
178
|
-
VirtualBox::Command.expects(:vboxmanage).with("sharedfolder remove
|
179
|
-
assert @value.destroy
|
180
|
-
end
|
181
|
-
|
182
|
-
should "shell escape VM name and storage controller name" do
|
183
|
-
shell_seq = sequence("shell_seq")
|
184
|
-
VirtualBox::Command.expects(:shell_escape).with(@caller.name).in_sequence(shell_seq)
|
185
|
-
VirtualBox::Command.expects(:shell_escape).with(@value.name).in_sequence(shell_seq)
|
186
|
-
VirtualBox::Command.expects(:vboxmanage).in_sequence(shell_seq)
|
178
|
+
VirtualBox::Command.expects(:vboxmanage).with("sharedfolder", "remove", @caller.name, "--name", @value.name).once
|
187
179
|
assert @value.destroy
|
188
180
|
end
|
189
181
|
|
@@ -201,10 +193,7 @@ class SharedFolderTest < Test::Unit::TestCase
|
|
201
193
|
|
202
194
|
should "use the old name if it was changed" do
|
203
195
|
@value.name = "DIFFERENT"
|
204
|
-
|
205
|
-
VirtualBox::Command.expects(:shell_escape).with(@caller.name).in_sequence(shell_seq)
|
206
|
-
VirtualBox::Command.expects(:shell_escape).with(@value.name_was).in_sequence(shell_seq)
|
207
|
-
VirtualBox::Command.expects(:vboxmanage).in_sequence(shell_seq)
|
196
|
+
VirtualBox::Command.expects(:vboxmanage)
|
208
197
|
assert @value.destroy
|
209
198
|
end
|
210
199
|
end
|
data/test/virtualbox/vm_test.rb
CHANGED
@@ -81,11 +81,11 @@ showvminfo
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def create_vm
|
84
|
-
VirtualBox::Command.expects(:vboxmanage).with("showvminfo
|
85
|
-
VirtualBox::Command.expects(:vboxmanage).with("showvminfo
|
86
|
-
VirtualBox::Command.expects(:vboxmanage).with("list hdds").returns("")
|
87
|
-
VirtualBox::Command.expects(:vboxmanage).with("list dvds").returns("")
|
88
|
-
VirtualBox::Command.expects(:vboxmanage).with("getextradata
|
84
|
+
VirtualBox::Command.expects(:vboxmanage).with("showvminfo", @name, "--machinereadable").returns(@raw)
|
85
|
+
VirtualBox::Command.expects(:vboxmanage).with("showvminfo", @name).returns("")
|
86
|
+
VirtualBox::Command.expects(:vboxmanage).with("list", "hdds").returns("")
|
87
|
+
VirtualBox::Command.expects(:vboxmanage).with("list", "dvds").returns("")
|
88
|
+
VirtualBox::Command.expects(:vboxmanage).with("getextradata", @name, "enumerate").returns("")
|
89
89
|
vm = VirtualBox::VM.find(@name)
|
90
90
|
assert vm
|
91
91
|
vm
|
@@ -93,14 +93,9 @@ showvminfo
|
|
93
93
|
|
94
94
|
context "human readable info" do
|
95
95
|
should "not pass --machinereadable into the showvminfo command" do
|
96
|
-
VirtualBox::Command.expects(:vboxmanage).with("showvminfo
|
96
|
+
VirtualBox::Command.expects(:vboxmanage).with("showvminfo", @name).once
|
97
97
|
VirtualBox::VM.human_info(@name)
|
98
98
|
end
|
99
|
-
|
100
|
-
should "shell escape parameter" do
|
101
|
-
VirtualBox::Command.expects(:vboxmanage).with("showvminfo hello\\ world").once
|
102
|
-
VirtualBox::VM.human_info("hello world")
|
103
|
-
end
|
104
99
|
end
|
105
100
|
|
106
101
|
context "reading the VM state" do
|
@@ -147,17 +142,17 @@ showvminfo
|
|
147
142
|
end
|
148
143
|
|
149
144
|
should "export the VM with no options if none are passed" do
|
150
|
-
VirtualBox::Command.expects(:vboxmanage).with("export
|
145
|
+
VirtualBox::Command.expects(:vboxmanage).with("export", @name, "-o", "foo")
|
151
146
|
@vm.export("foo")
|
152
147
|
end
|
153
148
|
|
154
149
|
should "export the VM with specified options" do
|
155
|
-
VirtualBox::Command.expects(:vboxmanage).with("export
|
150
|
+
VirtualBox::Command.expects(:vboxmanage).with("export", @name, "-o", "foo", "--vsys", "0", "--foo", :bar)
|
156
151
|
@vm.export("foo", :foo => :bar)
|
157
152
|
end
|
158
153
|
|
159
154
|
should "shell escape all the options" do
|
160
|
-
VirtualBox::Command.expects(:vboxmanage).with("export
|
155
|
+
VirtualBox::Command.expects(:vboxmanage).with("export", @name, "-o", "foo", "--vsys", "0", "--foo", "a space")
|
161
156
|
@vm.export("foo", :foo => "a space")
|
162
157
|
end
|
163
158
|
|
@@ -185,14 +180,8 @@ showvminfo
|
|
185
180
|
end
|
186
181
|
|
187
182
|
context "control method" do
|
188
|
-
should "shell escape the vm name" do
|
189
|
-
VirtualBox::Command.expects(:vboxmanage).with("controlvm hello\\ world FOO")
|
190
|
-
@vm.instance_variable_set(:@original_name, "hello world")
|
191
|
-
assert @vm.control(:FOO)
|
192
|
-
end
|
193
|
-
|
194
183
|
should "run the given command when 'control' is called" do
|
195
|
-
VirtualBox::Command.expects(:vboxmanage).with("controlvm
|
184
|
+
VirtualBox::Command.expects(:vboxmanage).with("controlvm", @name, :foo)
|
196
185
|
assert @vm.control(:foo)
|
197
186
|
end
|
198
187
|
|
@@ -210,7 +199,7 @@ showvminfo
|
|
210
199
|
end
|
211
200
|
|
212
201
|
should "start a VM with the given type" do
|
213
|
-
VirtualBox::Command.expects(:vboxmanage).with("startvm
|
202
|
+
VirtualBox::Command.expects(:vboxmanage).with("startvm", @name, "--type", :FOO)
|
214
203
|
assert @vm.start(:FOO)
|
215
204
|
end
|
216
205
|
|
@@ -219,12 +208,6 @@ showvminfo
|
|
219
208
|
assert !@vm.start
|
220
209
|
end
|
221
210
|
|
222
|
-
should "shell escape the VM name on start" do
|
223
|
-
VirtualBox::Command.expects(:vboxmanage).with("startvm hello\\ world --type FOO")
|
224
|
-
@vm.instance_variable_set(:@original_name, "hello world")
|
225
|
-
assert @vm.start(:FOO)
|
226
|
-
end
|
227
|
-
|
228
211
|
should "raise an exception if start fails and flag is set" do
|
229
212
|
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
230
213
|
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
@@ -232,7 +215,7 @@ showvminfo
|
|
232
215
|
}
|
233
216
|
end
|
234
217
|
|
235
|
-
should "stop a VM with a '
|
218
|
+
should "stop a VM with a 'acpipowerbutton'" do
|
236
219
|
@vm.expects(:control).with(:acpipowerbutton, false).returns(true)
|
237
220
|
assert @vm.shutdown
|
238
221
|
end
|
@@ -256,6 +239,23 @@ showvminfo
|
|
256
239
|
@vm.expects(:control).with(:savestate, false).returns(true)
|
257
240
|
assert @vm.save_state
|
258
241
|
end
|
242
|
+
|
243
|
+
should "discard a saved state of a VM" do
|
244
|
+
VirtualBox::Command.expects(:vboxmanage).with("discardstate", @name)
|
245
|
+
assert @vm.discard_state
|
246
|
+
end
|
247
|
+
|
248
|
+
should "return false if discarding state failed" do
|
249
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
250
|
+
assert !@vm.discard_state
|
251
|
+
end
|
252
|
+
|
253
|
+
should "raise an exception if discarding state fails and flag is set" do
|
254
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
255
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
256
|
+
@vm.discard_state(true)
|
257
|
+
}
|
258
|
+
end
|
259
259
|
end
|
260
260
|
|
261
261
|
context "destroying" do
|
@@ -263,17 +263,10 @@ showvminfo
|
|
263
263
|
@vm = create_vm
|
264
264
|
end
|
265
265
|
|
266
|
-
should "shell escape the name" do
|
267
|
-
VirtualBox::StorageController.expects(:destroy_relationship)
|
268
|
-
VirtualBox::Command.expects(:vboxmanage).with("unregistervm hello\\ world --delete")
|
269
|
-
@vm.instance_variable_set(:@original_name, "hello world")
|
270
|
-
@vm.destroy
|
271
|
-
end
|
272
|
-
|
273
266
|
should "destroy all storage controllers before destroying VM" do
|
274
267
|
destroy_seq = sequence("destroy_seq")
|
275
268
|
VirtualBox::StorageController.expects(:destroy_relationship).in_sequence(destroy_seq)
|
276
|
-
VirtualBox::Command.expects(:vboxmanage).with("unregistervm
|
269
|
+
VirtualBox::Command.expects(:vboxmanage).with("unregistervm", @name, "--delete").in_sequence(destroy_seq)
|
277
270
|
@vm.destroy
|
278
271
|
end
|
279
272
|
end
|
@@ -288,7 +281,7 @@ raw
|
|
288
281
|
|
289
282
|
should "list VMs then parse them" do
|
290
283
|
all_seq = sequence("all")
|
291
|
-
VirtualBox::Command.expects(:vboxmanage).with("list vms").returns(@raw).in_sequence(all_seq)
|
284
|
+
VirtualBox::Command.expects(:vboxmanage).with("list", "vms").returns(@raw).in_sequence(all_seq)
|
292
285
|
VirtualBox::VM.expects(:parse_vm_list).with(@raw).in_sequence(all_seq)
|
293
286
|
VirtualBox::VM.all
|
294
287
|
end
|
@@ -331,7 +324,7 @@ raw
|
|
331
324
|
end
|
332
325
|
|
333
326
|
should "attempt to find the imported VM" do
|
334
|
-
VirtualBox::Command.expects(:vboxmanage).with("import whatever").returns(@raw)
|
327
|
+
VirtualBox::Command.expects(:vboxmanage).with("import", "whatever").returns(@raw)
|
335
328
|
VirtualBox::VM.expects(:find).with("Base_1").once
|
336
329
|
VirtualBox::VM.import("whatever")
|
337
330
|
end
|
@@ -368,39 +361,17 @@ raw
|
|
368
361
|
end
|
369
362
|
|
370
363
|
should "save only the attributes which saved" do
|
371
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm
|
364
|
+
VirtualBox::Command.expects(:vboxmanage).with("modifyvm", @name, "--ostype", "Zubuntu")
|
372
365
|
|
373
366
|
@vm.ostype = "Zubuntu"
|
374
367
|
assert @vm.save
|
375
368
|
end
|
376
369
|
|
377
|
-
should "shell escape saved values" do
|
378
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm #{@name} --ostype My\\ Value")
|
379
|
-
|
380
|
-
@vm.ostype = "My Value"
|
381
|
-
assert @vm.save
|
382
|
-
end
|
383
|
-
|
384
|
-
should "shell escape the string value of a value" do
|
385
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm #{@name} --memory 400")
|
386
|
-
|
387
|
-
@vm.memory = 400
|
388
|
-
assert_nothing_raised { @vm.save }
|
389
|
-
end
|
390
|
-
|
391
|
-
should "shell escape the VM name when saving an attribute" do
|
392
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm hello\\ world --memory 400")
|
393
|
-
|
394
|
-
@vm.memory = 400
|
395
|
-
@vm.instance_variable_set(:@original_name, "hello world")
|
396
|
-
assert @vm.save
|
397
|
-
end
|
398
|
-
|
399
370
|
should "save name first if changed, then following values should modify new VM" do
|
400
371
|
save_seq = sequence("save_seq")
|
401
372
|
new_name = "foo2"
|
402
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm
|
403
|
-
VirtualBox::Command.expects(:vboxmanage).with("modifyvm
|
373
|
+
VirtualBox::Command.expects(:vboxmanage).with("modifyvm", @name, "--name", new_name).in_sequence(save_seq)
|
374
|
+
VirtualBox::Command.expects(:vboxmanage).with("modifyvm", new_name, "--ostype", "Zubuntu").in_sequence(save_seq)
|
404
375
|
|
405
376
|
@vm.name = new_name
|
406
377
|
@vm.ostype = "Zubuntu"
|
@@ -427,17 +398,12 @@ raw
|
|
427
398
|
}
|
428
399
|
|
429
400
|
command_seq = sequence("command_seq)")
|
430
|
-
VirtualBox::Command.expects(:vboxmanage).with("showvminfo
|
431
|
-
VirtualBox::Command.expects(:vboxmanage).
|
401
|
+
VirtualBox::Command.expects(:vboxmanage).with("showvminfo", @name, "--machinereadable").returns(@raw).in_sequence(command_seq)
|
402
|
+
VirtualBox::Command.expects(:vboxmanage).returns("").at_least(0).in_sequence(command_seq)
|
432
403
|
@vm = VirtualBox::VM.find(@name)
|
433
404
|
assert @vm
|
434
405
|
end
|
435
406
|
|
436
|
-
should "shell escape the VM name" do
|
437
|
-
VirtualBox::Command.expects(:vboxmanage).with("showvminfo hello\\ world --machinereadable").returns(@raw)
|
438
|
-
assert VirtualBox::VM.find("hello world")
|
439
|
-
end
|
440
|
-
|
441
407
|
should "return a VM object with proper attributes" do
|
442
408
|
@expected.each do |k,v|
|
443
409
|
assert_equal v, @vm.read_attribute(k)
|
data/virtualbox.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{virtualbox}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Mitchell Hashimoto"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-02-02}
|
13
13
|
s.description = %q{Create and modify virtual machines in VirtualBox using pure ruby.}
|
14
14
|
s.email = %q{mitchell.hashimoto@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virtualbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mitchell Hashimoto
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-02 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|