facter 1.5.6 → 1.5.7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of facter might be problematic. Click here for more details.

data/spec/spec.opts CHANGED
@@ -1,3 +1,5 @@
1
+ --format
2
+ s
1
3
  --colour
2
4
  --loadby
3
5
  mtime
@@ -0,0 +1,8 @@
1
+ lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
2
+ inet 127.0.0.1 netmask ff000000
3
+ e1000g0: flags=201004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,CoS> mtu 1500 index 2
4
+ inet 192.168.162.130 netmask ffffff00 broadcast 192.168.162.255
5
+ lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
6
+ inet6 ::1/128
7
+ e1000g0: flags=202004841<UP,RUNNING,MULTICAST,DHCP,IPv6,CoS> mtu 1500 index 2
8
+ inet6 fe80::20c:29ff:fe09:627e/10
data/spec/unit/facter.rb CHANGED
@@ -82,6 +82,22 @@ describe Facter do
82
82
  end
83
83
  end
84
84
 
85
+ describe "when asked for a fact as an undefined Facter class method" do
86
+ describe "and the collection is already initialized" do
87
+ it "should return the fact's value" do
88
+ Facter.collection
89
+ Facter.ipaddress.should == Facter['ipaddress'].value
90
+ end
91
+ end
92
+
93
+ describe "and the collection has been just reset" do
94
+ it "should return the fact's value" do
95
+ Facter.reset
96
+ Facter.ipaddress.should == Facter['ipaddress'].value
97
+ end
98
+ end
99
+ end
100
+
85
101
  describe "when passed code as a block" do
86
102
  it "should execute the provided block" do
87
103
  Facter.add("block_testing") { setcode { "foo" } }
@@ -5,7 +5,10 @@ require File.dirname(__FILE__) + '/../spec_helper'
5
5
  require 'facter'
6
6
 
7
7
  describe "Operating System fact" do
8
-
8
+
9
+ before do
10
+ Facter.clear
11
+ end
9
12
 
10
13
  after do
11
14
  Facter.clear
data/spec/unit/util/ip.rb CHANGED
@@ -34,6 +34,13 @@ describe Facter::Util::IP do
34
34
  Facter::Util::IP.get_interfaces().should == ["lo0", "en0"]
35
35
  end
36
36
 
37
+ it "should return a list two interfaces on Solaris with two interfaces multiply reporting" do
38
+ sample_output_file = File.dirname(__FILE__) + '/../data/solaris_ifconfig_all_with_multiple_interfaces'
39
+ solaris_ifconfig = File.new(sample_output_file).read()
40
+ Facter::Util::IP.stubs(:get_all_interface_output).returns(solaris_ifconfig)
41
+ Facter::Util::IP.get_interfaces().should == ["lo0", "e1000g0"]
42
+ end
43
+
37
44
  it "should return a value for a specific interface" do
38
45
  Facter::Util::IP.should respond_to(:get_interface_value)
39
46
  end
@@ -63,6 +70,16 @@ describe Facter::Util::IP do
63
70
  Facter::Util::IP.get_interface_value("e1000g0", "netmask").should == "255.255.255.0"
64
71
  end
65
72
 
73
+ it "should return calculated network information for Solaris" do
74
+ sample_output_file = File.dirname(__FILE__) + "/../data/solaris_ifconfig_single_interface"
75
+ solaris_ifconfig_interface = File.new(sample_output_file).read()
76
+
77
+ Facter::Util::IP.stubs(:get_single_interface_output).with("e1000g0").returns(solaris_ifconfig_interface)
78
+ Facter.stubs(:value).with(:kernel).returns("SunOS")
79
+
80
+ Facter::Util::IP.get_network_value("e1000g0").should == "172.16.15.0"
81
+ end
82
+
66
83
  it "should return interface information for FreeBSD supported via an alias" do
67
84
  sample_output_file = File.dirname(__FILE__) + "/../data/6.0-STABLE_FreeBSD_ifconfig"
68
85
  ifconfig_interface = File.new(sample_output_file).read()
@@ -113,6 +130,12 @@ describe Facter::Util::IP do
113
130
 
114
131
  Facter::Util::IP.get_interface_value("en1", "netmask").should == "255.255.255.0"
115
132
  end
133
+
134
+ it "should not get bonding master on interface aliases" do
135
+ Facter.stubs(:value).with(:kernel).returns("Linux")
136
+
137
+ Facter::Util::IP.get_bonding_master("eth0:1").should be_nil
138
+ end
116
139
 
117
140
  [:freebsd, :netbsd, :openbsd, :sunos, :darwin].each do |platform|
118
141
  it "should require conversion from hex on #{platform}" do
@@ -201,6 +201,16 @@ describe Facter::Util::Loader do
201
201
  @loader.load_all
202
202
  end
203
203
 
204
+ it "should not raise an exception when a file is unloadable" do
205
+ @loader.expects(:search_path).returns %w{/one/dir}
206
+ Dir.expects(:entries).with("/one/dir").returns %w{a.rb}
207
+
208
+ Kernel.expects(:load).with("/one/dir/a.rb").raises(LoadError)
209
+ @loader.expects(:warn)
210
+
211
+ lambda { @loader.load_all }.should_not raise_error
212
+ end
213
+
204
214
  it "should load all facts from the environment" do
205
215
  Facter.expects(:add).with('one')
206
216
  Facter.expects(:add).with('two')
@@ -44,4 +44,38 @@ describe Facter::Util::Macosx do
44
44
  Facter::Util::Macosx.expects(:profiler_data).with("SPSoftwareDataType").returns "eh"
45
45
  Facter::Util::Macosx.os_overview.should == "eh"
46
46
  end
47
+
48
+ describe "when working out software version" do
49
+
50
+ before do
51
+ Facter::Util::Resolution.expects(:exec).with("/usr/bin/sw_vers -productName").returns "Mac OS X"
52
+ Facter::Util::Resolution.expects(:exec).with("/usr/bin/sw_vers -buildVersion").returns "9J62"
53
+ end
54
+
55
+ it "should have called sw_vers three times when determining software version" do
56
+ Facter::Util::Resolution.expects(:exec).with("/usr/bin/sw_vers -productVersion").returns "10.5.7"
57
+ Facter::Util::Macosx.sw_vers
58
+ end
59
+
60
+ it "should return a hash with the correct keys when determining software version" do
61
+ Facter::Util::Resolution.expects(:exec).with("/usr/bin/sw_vers -productVersion").returns "10.5.7"
62
+ Facter::Util::Macosx.sw_vers.keys.sort.should == ["macosx_productName",
63
+ "macosx_buildVersion",
64
+ "macosx_productversion_minor",
65
+ "macosx_productversion_major",
66
+ "macosx_productVersion"].sort
67
+ end
68
+
69
+ it "should split a product version of 'x.y.z' into separate hash entries correctly" do
70
+ Facter::Util::Resolution.expects(:exec).with("/usr/bin/sw_vers -productVersion").returns "1.2.3"
71
+ sw_vers = Facter::Util::Macosx.sw_vers
72
+ sw_vers["macosx_productversion_major"].should == "1.2"
73
+ sw_vers["macosx_productversion_minor"].should == "3"
74
+ end
75
+
76
+ it "should treat a product version of 'x.y' as 'x.y.0" do
77
+ Facter::Util::Resolution.expects(:exec).with("/usr/bin/sw_vers -productVersion").returns "2.3"
78
+ Facter::Util::Macosx.sw_vers["macosx_productversion_minor"].should == "0"
79
+ end
80
+ end
47
81
  end
@@ -25,6 +25,14 @@ describe Facter::Util::Resolution do
25
25
  Facter::Util::Resolution.new("yay").limit.should == 0
26
26
  end
27
27
 
28
+ it "should default to nil for code" do
29
+ Facter::Util::Resolution.new("yay").code.should be_nil
30
+ end
31
+
32
+ it "should default to nil for interpreter" do
33
+ Facter::Util::Resolution.new("yay").interpreter.should be_nil
34
+ end
35
+
28
36
  it "should provide a 'limit' method that returns the timeout" do
29
37
  res = Facter::Util::Resolution.new("yay")
30
38
  res.timeout = "testing"
@@ -71,6 +79,13 @@ describe Facter::Util::Resolution do
71
79
  @resolve = Facter::Util::Resolution.new("yay")
72
80
  end
73
81
 
82
+ describe "and setcode has not been called" do
83
+ it "should return nil" do
84
+ Facter::Util::Resolution.expects(:exec).with(nil, nil).never
85
+ @resolve.value.should be_nil
86
+ end
87
+ end
88
+
74
89
  describe "and the code is a string" do
75
90
  it "should return the result of executing the code with the interpreter" do
76
91
  @resolve.setcode "/bin/foo"
@@ -103,11 +118,17 @@ describe Facter::Util::Resolution do
103
118
  @resolve.value.should be_nil
104
119
  end
105
120
 
121
+ it "should return nil if the value is an empty block" do
122
+ @resolve.setcode { "" }
123
+ @resolve.value.should be_nil
124
+ end
125
+
106
126
  it "should use its limit method to determine the timeout, to avoid conflict when a 'timeout' method exists for some other reason" do
107
127
  @resolve.expects(:timeout).never
108
128
  @resolve.expects(:limit).returns "foo"
109
129
  Timeout.expects(:timeout).with("foo")
110
130
 
131
+ @resolve.setcode { sleep 2; "raise This is a test"}
111
132
  @resolve.value
112
133
  end
113
134
 
@@ -0,0 +1,96 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ require 'facter/util/virtual'
4
+
5
+ describe Facter::Util::Virtual do
6
+
7
+ after do
8
+ Facter.clear
9
+ end
10
+ it "should detect openvz" do
11
+ FileTest.stubs(:exists?).with("/proc/vz/veinfo").returns(true)
12
+ Facter::Util::Virtual.should be_openvz
13
+ end
14
+
15
+ it "should identify openvzhn when version file exists" do
16
+ Facter::Util::Virtual.stubs(:openvz?).returns(true)
17
+ FileTest.stubs(:exists?).with("/proc/vz/version").returns(true)
18
+ Facter::Util::Virtual.openvz_type().should == "openvzhn"
19
+ end
20
+
21
+ it "should identify openvzve when no version file exists" do
22
+ Facter::Util::Virtual.stubs(:openvz?).returns(true)
23
+ FileTest.stubs(:exists?).with("/proc/vz/version").returns(false)
24
+ Facter::Util::Virtual.openvz_type().should == "openvzve"
25
+ end
26
+
27
+ it "should identify Solaris zones when non-global zone" do
28
+ Facter::Util::Resolution.stubs(:exec).with("/sbin/zonename").returns("somezone")
29
+ Facter::Util::Virtual.should be_zone
30
+ end
31
+
32
+ it "should not identify Solaris zones when global zone" do
33
+ Facter::Util::Resolution.stubs(:exec).with("/sbin/zonename").returns("global")
34
+ Facter::Util::Virtual.should_not be_zone
35
+ end
36
+
37
+ it "should not detect vserver if no self status" do
38
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(false)
39
+ Facter::Util::Virtual.should_not be_vserver
40
+ end
41
+
42
+ it "should detect vserver when vxid present in process status" do
43
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(true)
44
+ File.stubs(:read).with("/proc/self/status").returns("VxID: 42\n")
45
+ Facter::Util::Virtual.should be_vserver
46
+ end
47
+
48
+ it "should detect vserver when s_context present in process status" do
49
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(true)
50
+ File.stubs(:read).with("/proc/self/status").returns("s_context: 42\n")
51
+ Facter::Util::Virtual.should be_vserver
52
+ end
53
+
54
+ it "should not detect vserver when vserver flags not present in process status" do
55
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(true)
56
+ File.stubs(:read).with("/proc/self/status").returns("wibble: 42\n")
57
+ Facter::Util::Virtual.should_not be_vserver
58
+ end
59
+
60
+ it "should identify vserver_host when /proc/virtual exists" do
61
+ Facter::Util::Virtual.expects(:vserver?).returns(true)
62
+ FileTest.stubs(:exists?).with("/proc/virtual").returns(true)
63
+ Facter::Util::Virtual.vserver_type().should == "vserver_host"
64
+ end
65
+
66
+ it "should identify vserver_type as vserver when /proc/virtual does not exist" do
67
+ Facter::Util::Virtual.expects(:vserver?).returns(true)
68
+ FileTest.stubs(:exists?).with("/proc/virtual").returns(false)
69
+ Facter::Util::Virtual.vserver_type().should == "vserver"
70
+ end
71
+
72
+ it "should detect xen when /proc/sys/xen exists" do
73
+ FileTest.expects(:exists?).with("/proc/sys/xen").returns(true)
74
+ Facter::Util::Virtual.should be_xen
75
+ end
76
+
77
+ it "should detect xen when /sys/bus/xen exists" do
78
+ FileTest.expects(:exists?).with("/proc/sys/xen").returns(false)
79
+ FileTest.expects(:exists?).with("/sys/bus/xen").returns(true)
80
+ Facter::Util::Virtual.should be_xen
81
+ end
82
+
83
+ it "should detect xen when /proc/xen exists" do
84
+ FileTest.expects(:exists?).with("/proc/sys/xen").returns(false)
85
+ FileTest.expects(:exists?).with("/sys/bus/xen").returns(false)
86
+ FileTest.expects(:exists?).with("/proc/xen").returns(true)
87
+ Facter::Util::Virtual.should be_xen
88
+ end
89
+
90
+ it "should not detect xen when no sysfs/proc xen directories exist" do
91
+ FileTest.expects(:exists?).with("/proc/sys/xen").returns(false)
92
+ FileTest.expects(:exists?).with("/sys/bus/xen").returns(false)
93
+ FileTest.expects(:exists?).with("/proc/xen").returns(false)
94
+ Facter::Util::Virtual.should_not be_xen
95
+ end
96
+ end
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ require 'facter'
4
+ require 'facter/util/virtual'
5
+
6
+ describe "Virtual fact" do
7
+
8
+ after do
9
+ Facter.clear
10
+ end
11
+
12
+ it "should be zone on Solaris when a zone" do
13
+ Facter.fact(:kernel).stubs(:value).returns("SunOS")
14
+ Facter::Util::Virtual.stubs(:zone?).returns(true)
15
+ Facter::Util::Virtual.stubs(:vserver?).returns(false)
16
+ Facter::Util::Virtual.stubs(:xen?).returns(false)
17
+ Facter.fact(:virtual).value.should == "zone"
18
+ end
19
+
20
+ end
21
+
22
+ describe "is_virtual fact" do
23
+
24
+ after do
25
+ Facter.clear
26
+ end
27
+
28
+ it "should be virtual when running on xen" do
29
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
30
+ Facter.fact(:virtual).stubs(:value).returns("xenu")
31
+ Facter.fact(:is_virtual).value.should == true
32
+ end
33
+
34
+ it "should be false when running on xen0" do
35
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
36
+ Facter.fact(:virtual).stubs(:value).returns("xen0")
37
+ Facter.fact(:is_virtual).value.should == false
38
+ end
39
+
40
+ it "should be true when running on vmware" do
41
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
42
+ Facter.fact(:virtual).stubs(:value).returns("vmware")
43
+ Facter.fact(:is_virtual).value.should == true
44
+ end
45
+
46
+ it "should be true when running on openvz" do
47
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
48
+ Facter.fact(:virtual).stubs(:value).returns("openvzve")
49
+ Facter.fact(:is_virtual).value.should == true
50
+ end
51
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.6
4
+ version: 1.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reductive Labs
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-04 00:00:00 +00:00
12
+ date: 2009-09-25 00:00:00 +10:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -22,74 +22,77 @@ extensions: []
22
22
  extra_rdoc_files: []
23
23
 
24
24
  files:
25
- - README.rst
26
25
  - COPYING
26
+ - Rakefile
27
+ - ChangeLog
27
28
  - CHANGELOG
28
29
  - README
29
30
  - LICENSE
31
+ - README.rst
30
32
  - INSTALL
31
- - Rakefile
32
33
  - TODO
33
34
  - install.rb
34
35
  - bin/facter
36
+ - lib/facter.rb
35
37
  - lib/facter
36
- - lib/facter/processor.rb
37
- - lib/facter/macaddress.rb
38
- - lib/facter/hostname.rb
39
- - lib/facter/selinux.rb
40
- - lib/facter/facterversion.rb
41
- - lib/facter/macosx.rb
42
38
  - lib/facter/hardwaremodel.rb
43
- - lib/facter/kernelrelease.rb
44
39
  - lib/facter/uptime.rb
45
- - lib/facter/ec2.rb
46
- - lib/facter/fqdn.rb
47
- - lib/facter/iphostnumber.rb
48
- - lib/facter/uniqueid.rb
49
- - lib/facter/puppetversion.rb
50
- - lib/facter/timezone.rb
51
- - lib/facter/manufacturer.rb
40
+ - lib/facter/lsbmajdistrelease.rb
41
+ - lib/facter/macaddress.rb
42
+ - lib/facter/processor.rb
52
43
  - lib/facter/operatingsystem.rb
53
- - lib/facter/network.rb
54
- - lib/facter/rubysitedir.rb
55
- - lib/facter/ssh.rb
56
- - lib/facter/rubyversion.rb
57
- - lib/facter/netmask.rb
58
- - lib/facter/kernelmajversion.rb
59
- - lib/facter/memory.rb
60
- - lib/facter/hardwareisa.rb
61
- - lib/facter/architecture.rb
62
- - lib/facter/ps.rb
63
- - lib/facter/lsb.rb
64
- - lib/facter/id.rb
65
- - lib/facter/ipaddress.rb
66
- - lib/facter/virtual.rb
67
- - lib/facter/kernelversion.rb
68
44
  - lib/facter/operatingsystemrelease.rb
69
- - lib/facter/interfaces.rb
45
+ - lib/facter/uniqueid.rb
46
+ - lib/facter/kernel.rb
47
+ - lib/facter/rubyversion.rb
48
+ - lib/facter/network.rb
49
+ - lib/facter/path.rb
70
50
  - lib/facter/util
51
+ - lib/facter/util/loader.rb
52
+ - lib/facter/util/uptime.rb
71
53
  - lib/facter/util/confine.rb
54
+ - lib/facter/util/fact.rb
55
+ - lib/facter/util/ip.rb
56
+ - lib/facter/util/values.rb
72
57
  - lib/facter/util/macosx.rb
73
- - lib/facter/util/uptime.rb
58
+ - lib/facter/util/netmask.rb
59
+ - lib/facter/util/resolution.rb
60
+ - lib/facter/util/plist.rb
61
+ - lib/facter/util/memory.rb
74
62
  - lib/facter/util/plist
75
- - lib/facter/util/plist/parser.rb
76
63
  - lib/facter/util/plist/generator.rb
77
- - lib/facter/util/fact.rb
64
+ - lib/facter/util/plist/parser.rb
78
65
  - lib/facter/util/manufacturer.rb
79
- - lib/facter/util/loader.rb
66
+ - lib/facter/util/virtual.rb
80
67
  - lib/facter/util/collection.rb
81
- - lib/facter/util/netmask.rb
82
- - lib/facter/util/memory.rb
83
- - lib/facter/util/plist.rb
84
- - lib/facter/util/ip.rb
85
- - lib/facter/util/resolution.rb
86
- - lib/facter/util/values.rb
68
+ - lib/facter/interfaces.rb
69
+ - lib/facter/macosx.rb
70
+ - lib/facter/hostname.rb
71
+ - lib/facter/ssh.rb
72
+ - lib/facter/netmask.rb
73
+ - lib/facter/timezone.rb
87
74
  - lib/facter/physicalprocessorcount.rb
88
- - lib/facter/lsbmajdistrelease.rb
75
+ - lib/facter/facterversion.rb
76
+ - lib/facter/architecture.rb
77
+ - lib/facter/kernelmajversion.rb
78
+ - lib/facter/kernelversion.rb
89
79
  - lib/facter/domain.rb
90
- - lib/facter/kernel.rb
80
+ - lib/facter/fqdn.rb
81
+ - lib/facter/ipaddress.rb
82
+ - lib/facter/rubysitedir.rb
83
+ - lib/facter/memory.rb
84
+ - lib/facter/puppetversion.rb
85
+ - lib/facter/id.rb
86
+ - lib/facter/hardwareisa.rb
87
+ - lib/facter/iphostnumber.rb
88
+ - lib/facter/ec2.rb
89
+ - lib/facter/selinux.rb
90
+ - lib/facter/lsb.rb
91
+ - lib/facter/manufacturer.rb
91
92
  - lib/facter/Cfkey.rb
92
- - lib/facter.rb
93
+ - lib/facter/virtual.rb
94
+ - lib/facter/ps.rb
95
+ - lib/facter/kernelrelease.rb
93
96
  - conf/redhat
94
97
  - conf/redhat/facter.spec
95
98
  - conf/solaris
@@ -99,31 +102,34 @@ files:
99
102
  - conf/osx/PackageInfo.plist
100
103
  - conf/osx/preflight
101
104
  - etc/facter.conf
105
+ - spec/Rakefile
106
+ - spec/integration
107
+ - spec/integration/facter.rb
108
+ - spec/spec.opts
109
+ - spec/spec_helper.rb
102
110
  - spec/unit
103
- - spec/unit/selinux.rb
104
111
  - spec/unit/facter.rb
105
112
  - spec/unit/operatingsystem.rb
106
- - spec/unit/data
107
- - spec/unit/data/darwin_ifconfig_all_with_multiple_interfaces
108
- - spec/unit/data/linux_ifconfig_all_with_single_interface
109
- - spec/unit/data/darwin_ifconfig_single_interface
110
- - spec/unit/data/Mac_OS_X_10.5.5_ifconfig
111
- - spec/unit/data/6.0-STABLE_FreeBSD_ifconfig
112
- - spec/unit/data/solaris_ifconfig_single_interface
113
- - spec/unit/interfaces.rb
114
113
  - spec/unit/util
114
+ - spec/unit/util/loader.rb
115
115
  - spec/unit/util/confine.rb
116
- - spec/unit/util/macosx.rb
117
116
  - spec/unit/util/fact.rb
118
- - spec/unit/util/loader.rb
119
- - spec/unit/util/collection.rb
120
117
  - spec/unit/util/ip.rb
118
+ - spec/unit/util/macosx.rb
121
119
  - spec/unit/util/resolution.rb
122
- - spec/spec_helper.rb
123
- - spec/integration
124
- - spec/integration/facter.rb
125
- - spec/spec.opts
126
- - spec/Rakefile
120
+ - spec/unit/util/virtual.rb
121
+ - spec/unit/util/collection.rb
122
+ - spec/unit/interfaces.rb
123
+ - spec/unit/data
124
+ - spec/unit/data/6.0-STABLE_FreeBSD_ifconfig
125
+ - spec/unit/data/linux_ifconfig_all_with_single_interface
126
+ - spec/unit/data/darwin_ifconfig_all_with_multiple_interfaces
127
+ - spec/unit/data/solaris_ifconfig_single_interface
128
+ - spec/unit/data/solaris_ifconfig_all_with_multiple_interfaces
129
+ - spec/unit/data/darwin_ifconfig_single_interface
130
+ - spec/unit/data/Mac_OS_X_10.5.5_ifconfig
131
+ - spec/unit/selinux.rb
132
+ - spec/unit/virtual.rb
127
133
  has_rdoc: true
128
134
  homepage: http://reductivelabs.com
129
135
  post_install_message: