foreman_fog_proxmox 0.9.3 → 0.9.4

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

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e90a84b09846642c70bbaf6332fb71f65952a9d8a34ebe622230b53e39dacbc
4
- data.tar.gz: 58bd39bcc6cf49c526507418e183ab9ba93e60e1d2f43bd4cebd0243fe2cb0a1
3
+ metadata.gz: 4c422b2ba09e7b1cd71a0dec7ec72398c71f4653a0b8386d4949ea15932df346
4
+ data.tar.gz: e870f6684243b1a7f7ee061648d0ad6efd1a1e51a466861f2c1e60f13bc6bc10
5
5
  SHA512:
6
- metadata.gz: f2f6bea23161fbf3de643311ed2d14320acc1cbec8c2b1bf3aa697227d1839ace643fc751e86388f595444fcb35584df69720973e0934066ad1a3ffd33e3fe64
7
- data.tar.gz: 1ccd8f20cba817c008bbae6a5bf8906a891d11fa897573c1cfcb38c9310aa2992aff2bd91dc7726681d14004b5240676ffa9b94ea04b00c5c24f33c7483d0824
6
+ metadata.gz: eede4a7f2e4a098e90737ba71c389d979254720fbd876d5a5c73e792302fc6b59a69e37ec8736fa4fd31da982384b6bde8bd9651131ec71035338460c6bb4c26
7
+ data.tar.gz: 315fc305b50d96704ac6637d9a8689af9cc7d43ec93afe0c2804755b2b14a35183754a212be2f33cec25c1b37c0b124e9c20f0e0ed12a397560749115c88907c
data/README.md CHANGED
@@ -28,6 +28,7 @@ You can support the plugin development via the following methods:
28
28
  |<=0.8 |<6.0|>=0.7|>=1.22|>=2.3|
29
29
  |<0.9 |<6.0|=0.9|>=1.22|>=2.3|
30
30
  |>=0.9 |>=5.4|>=0.9.1|>=1.22|>=2.3|
31
+ |>=0.10 |>=5.4|>=0.9.4|>=1.22|>=2.5|
31
32
 
32
33
  ## Installation
33
34
 
@@ -110,7 +111,7 @@ Redhat, CentOS or Fedora users should also [setup Selinux](https://projects.thef
110
111
  ### Prerequisites
111
112
 
112
113
  * You need a Proxmox VE 5.4+ server running.
113
- * You need ruby >= 2.3. You can install it with [rbenv](https://github.com/rbenv/rbenv).
114
+ * You need ruby >= 2.5. You can install it with [rbenv](https://github.com/rbenv/rbenv).
114
115
  * You also need nodejs in your dev machine to run webpack-dev-server. You can install it with [nvm](https://github.com/creationix/nvm).
115
116
 
116
117
  ### Platform
@@ -182,6 +183,12 @@ export DISABLE_SPRING=true
182
183
  bundle exec bin/rake test TEST=test/functional/compute_resources_controller_test.rb
183
184
  ```
184
185
 
186
+ * Check code syntax with rubocop and foreman rules:
187
+
188
+ ```shell
189
+ bundle exec bin/rake foreman_fog_proxmox:rubocop
190
+ ```
191
+
185
192
  * See deface overrides result:
186
193
 
187
194
  ```shell
@@ -150,6 +150,8 @@ module ProxmoxContainerHelper
150
150
  nic.store(:bridge, interface_attributes['bridge'].to_s) if interface_attributes['bridge']
151
151
  nic.store(:ip, interface_attributes['ip'].to_s) if interface_attributes['ip']
152
152
  nic.store(:ip6, interface_attributes['ip6'].to_s) if interface_attributes['ip6']
153
+ nic.store(:gw, interface_attributes['gw'].to_s) if interface_attributes['gw']
154
+ nic.store(:gw6, interface_attributes['gw6'].to_s) if interface_attributes['gw6']
153
155
  nic.store(:rate, interface_attributes['rate'].to_i) if interface_attributes['rate']
154
156
  nic.store(:tag, interface_attributes['tag'].to_i) if interface_attributes['tag']
155
157
  logger.debug("parse_container_interface(): add nic=#{nic}")
@@ -17,13 +17,24 @@
17
17
  # You should have received a copy of the GNU General Public License
18
18
  # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
+ require 'fog/proxmox/helpers/ip_helper'
21
+
20
22
  module FogExtensions
21
23
  module Proxmox
22
24
  module Interface
23
25
  extend ActiveSupport::Concern
26
+ attr_accessor :dhcpv4, :dhcpv6, :gwv4, :gwv6
24
27
  def mac
25
28
  macaddr
26
29
  end
30
+
31
+ def cidrv4_prefix
32
+ Fog::Proxmox::IpHelper.prefix(ip) if ip
33
+ end
34
+
35
+ def cidrv6_prefix
36
+ Fog::Proxmox::IpHelper.prefix6(ip) if ip
37
+ end
27
38
  end
28
39
  end
29
40
  end
@@ -17,6 +17,8 @@
17
17
  # You should have received a copy of the GNU General Public License
18
18
  # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
+ require 'fog/proxmox/helpers/ip_helper'
21
+
20
22
  module HostExt
21
23
  module Proxmox
22
24
  module Interfaces
@@ -33,11 +35,16 @@ module HostExt
33
35
  end
34
36
  end
35
37
 
38
+ def cidr_ip(interface_attributes)
39
+ Fog::Proxmox::IpHelper.to_cidr(interface_attributes['ip'], interface_attributes['compute_attributes']['cidr_suffix'])
40
+ end
41
+
36
42
  def add_interface_to_compute_attributes(index, interface_attributes, compute_attributes)
37
43
  compute_attributes[index] = {}
38
44
  compute_attributes[index].store('id', interface_attributes['identifier'])
39
45
  compute_attributes[index].store('_delete', interface_attributes['_destroy'])
40
46
  compute_attributes[index].store('macaddr', interface_attributes['mac'])
47
+ compute_attributes[index].store('ip', cidr_ip(interface_attributes))
41
48
  compute_attributes[index].merge!(interface_attributes['compute_attributes'].reject { |k, _v| k == 'id' })
42
49
  end
43
50
  end
@@ -17,6 +17,8 @@
17
17
  # You should have received a copy of the GNU General Public License
18
18
  # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
+ require 'fog/proxmox/helpers/ip_helper'
21
+
20
22
  module ForemanFogProxmox
21
23
  module ProxmoxInterfaces
22
24
  def editable_network_interfaces?
@@ -41,6 +43,45 @@ module ForemanFogProxmox
41
43
  raise ::Foreman::Exception, _(format('Invalid name interface[%<index>s]. Must be eth[n] with n integer >= 0', index: index)) unless container_nic_name_valid?(nic)
42
44
  end
43
45
 
46
+ def cidr_prefix(nic_compute_attributes, v6 = false)
47
+ attr_name = 'cidrv'
48
+ attr_name += v6 ? '6' : '4'
49
+ attr_name += '_prefix'
50
+ nic_compute_attributes[attr_name] if nic_compute_attributes[attr_name].presence
51
+ end
52
+
53
+ def set_ip(host, nic, nic_compute_attributes, v6 = false)
54
+ return 'dhcp' if dhcp?(nic_compute_attributes, v6)
55
+
56
+ ip = v6 ? nic.ip6 : nic.ip
57
+ return ip unless container?(host) || cidr_prefix(nic_compute_attributes, v6)
58
+
59
+ valid = v6 ? Fog::Proxmox::IpHelper.cidr6_prefix?(cidr_prefix(nic_compute_attributes, v6)) : Fog::Proxmox::IpHelper.cidr_prefix?(cidr_prefix(nic_compute_attributes, v6))
60
+ ipv = v6 ? 'IPv6' : 'IPv4'
61
+ max = v6 ? 128 : 32
62
+ unless valid
63
+ raise ::Foreman::Exception, _(format('Invalid Interface Proxmox CIDR %<ip>s. If %<ip>s is not empty, Proxmox CIDR prefix must be an integer between 0 and %<max>i.', ip: ipv, max: max))
64
+ end
65
+
66
+ v6 ? Fog::Proxmox::IpHelper.to_cidr6(nic.ip6, cidr_prefix(nic_compute_attributes, v6)) : Fog::Proxmox::IpHelper.to_cidr(nic.ip, cidr_prefix(nic_compute_attributes, v6))
67
+ end
68
+
69
+ def set_gw(nic_compute_attributes, v6 = false)
70
+ attr_name = 'gwv'
71
+ attr_name += v6 ? '6' : '4'
72
+ nic_compute_attributes[attr_name] if nic_compute_attributes[attr_name].presence
73
+ end
74
+
75
+ def to_boolean(value)
76
+ [1, true, '1', 'true'].include?(value)
77
+ end
78
+
79
+ def dhcp?(nic_compute_attributes, v6 = false)
80
+ attr_name = 'dhcpv'
81
+ attr_name += v6 ? '6' : '4'
82
+ to_boolean(nic_compute_attributes[attr_name]) if nic_compute_attributes[attr_name].present?
83
+ end
84
+
44
85
  def host_interfaces_attrs(host)
45
86
  host.interfaces.select(&:physical?).each.with_index.reduce({}) do |hash, (nic, index)|
46
87
  set_nic_identifier(nic, index)
@@ -51,8 +92,10 @@ module ForemanFogProxmox
51
92
  nic_compute_attributes.store(:macaddr, mac) if mac.present?
52
93
  interface_compute_attributes = host.compute_attributes['interfaces_attributes'] ? host.compute_attributes['interfaces_attributes'].select { |_k, v| v['id'] == nic.identifier } : {}
53
94
  nic_compute_attributes.store(:_delete, interface_compute_attributes[interface_compute_attributes.keys[0]]['_delete']) unless interface_compute_attributes.empty?
54
- nic_compute_attributes.store(:ip, nic.ip) if nic.ip.present?
55
- nic_compute_attributes.store(:ip6, nic.ip6) if nic.ip6.present?
95
+ nic_compute_attributes.store(:ip, set_ip(host, nic, nic_compute_attributes))
96
+ nic_compute_attributes.store(:gw, set_gw(nic_compute_attributes))
97
+ nic_compute_attributes.store(:ip6, set_ip(host, nic, nic_compute_attributes, true))
98
+ nic_compute_attributes.store(:gw6, set_gw(nic_compute_attributes, true))
56
99
  hash.merge(index.to_s => nic_compute_attributes)
57
100
  end
58
101
  end
@@ -15,7 +15,7 @@ GNU General Public License for more details.
15
15
  You should have received a copy of the GNU General Public License
16
16
  along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
17
17
  <% if @host.compute_resource.class == ForemanFogProxmox::Proxmox %>
18
- <% compute_attributes = f.options[:parent_builder].object.compute_attributes %>
18
+ <% compute_attributes = f.object.compute_attributes %>
19
19
  <% vm_type = compute_attributes ? compute_attributes['type'] : f.object.type %>
20
20
 
21
21
  <%= f.fields_for 'compute_attributes', OpenStruct.new(f.object.compute_attributes) do |f| %>
@@ -20,6 +20,12 @@ along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>. %>
20
20
  <%= field_set_tag _("Nic"), :id => "container_network_#{f.index}", :style => ('display: none;' unless container), :disabled => !container do %>
21
21
  <%= f.hidden_field :id if !new_vm %>
22
22
  <%= text_f f, :name, :label => _('Name'), :label_size => "col-md-2" %>
23
+ <%= checkbox_f f, :dhcpv4, :label => _('DHCP IPv4') %>
24
+ <%= text_f f, :cidrv4_prefix, :label => _('CIDR IPv4 prefix'), :label_size => "col-md-2" %>
25
+ <%= text_f f, :gwv4, :label => _('Gateway IPv4'), :label_size => "col-md-2" %>
26
+ <%= checkbox_f f, :dhcpv6, :label => _('DHCP IPv6') %>
27
+ <%= text_f f, :cidrv6_prefix, :label => _('CIDR IPv6 prefix'), :label_size => "col-md-2" %>
28
+ <%= text_f f, :gwv6, :label => _('Gateway IPv6'), :label_size => "col-md-2" %>
23
29
  <%= counter_f f, :tag, :class => "input-mini", :label => _('VLAN tag'), :label_size => "col-md-2" %>
24
30
  <%= counter_f f, :rate, :class => "input-mini", :label => _('Rate limit'), :label_size => "col-md-2" %>
25
31
  <%= select_f f, :bridge, compute_resource.bridges, :iface, :iface, { }, :label => _('Bridge'), :label_size => "col-md-2" %>
@@ -18,5 +18,5 @@
18
18
  # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
20
  module ForemanFogProxmox
21
- VERSION = '0.9.3'
21
+ VERSION = '0.9.4'
22
22
  end
@@ -56,8 +56,8 @@ module ForemanFogProxmox
56
56
  '1' => { 'id' => 'mp0', 'storage' => 'local-lvm', 'size' => '1073741824', 'mp' => '/opt/path' }
57
57
  },
58
58
  'interfaces_attributes' => {
59
- '0' => { 'id' => 'net0', 'name' => 'eth0', 'bridge' => 'vmbr0', 'ip' => 'dhcp', 'ip6' => 'dhcp', 'rate' => '' },
60
- '1' => { 'id' => 'net1', 'name' => 'eth1', 'bridge' => 'vmbr0', 'ip' => 'dhcp', 'ip6' => 'dhcp' }
59
+ '0' => { 'id' => 'net0', 'name' => 'eth0', 'bridge' => 'vmbr0', 'ip' => 'dhcp', 'ip6' => 'dhcp', 'rate' => '', 'gw' => '192.168.56.100', 'gw6' => '2001:0:1234::c1c0:abcd:876' },
60
+ '1' => { 'id' => 'net1', 'name' => 'eth1', 'bridge' => 'vmbr0', 'ip' => 'dhcp', 'ip6' => 'dhcp', 'gw' => '192.168.56.100', 'gw6' => '2001:0:1234::c1c0:abcd:876' }
61
61
  } }
62
62
  end
63
63
 
@@ -82,8 +82,8 @@ module ForemanFogProxmox
82
82
  'password' => 'proxmox01',
83
83
  :rootfs => 'local-lvm:1073741824',
84
84
  :mp0 => 'local-lvm:1073741824,mp=/opt/path',
85
- 'net0' => 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp',
86
- 'net1' => 'model=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp' }
85
+ 'net0' => 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876',
86
+ 'net1' => 'model=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876' }
87
87
  end
88
88
 
89
89
  let(:host_delete) do
@@ -125,7 +125,7 @@ module ForemanFogProxmox
125
125
  vm = parse_container_vm(host)
126
126
  assert_equal 536_870_912, vm[:memory]
127
127
  assert_equal 'local-lvm:1073741824', vm[:rootfs]
128
- assert_equal 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp', vm[:net0]
128
+ assert_equal 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876', vm[:net0]
129
129
  assert_not vm.key?(:config)
130
130
  assert_not vm.key?(:node)
131
131
  assert_not vm.key?(:type)
@@ -145,8 +145,8 @@ module ForemanFogProxmox
145
145
  :ostemplate => 'local:vztmpl/alpine-3.7-default_20171211_amd64.tar.xz',
146
146
  :ostemplate_file => 'local:vztmpl/alpine-3.7-default_20171211_amd64.tar.xz',
147
147
  :ostemplate_storage => 'local',
148
- :net0 => 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp',
149
- :net1 => 'name=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp',
148
+ :net0 => 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876',
149
+ :net1 => 'name=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876',
150
150
  :rootfs => 'local-lvm:1073741824',
151
151
  :mp0 => 'local-lvm:1073741824,mp=/opt/path'
152
152
  )
@@ -171,7 +171,7 @@ module ForemanFogProxmox
171
171
  add_container_interface(host['interfaces_attributes']['0'], deletes, nics)
172
172
  assert 1, nics.length
173
173
  assert nics[0].key?(:net0)
174
- assert_equal 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp', nics[0][:net0]
174
+ assert_equal 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876', nics[0][:net0]
175
175
  end
176
176
 
177
177
  test '#interface with name eth1 and bridge' do
@@ -180,7 +180,7 @@ module ForemanFogProxmox
180
180
  add_container_interface(host['interfaces_attributes']['1'], deletes, nics)
181
181
  assert 1, nics.length
182
182
  assert nics[0].key?(:net1)
183
- assert_equal 'name=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp', nics[0][:net1]
183
+ assert_equal 'name=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876', nics[0][:net1]
184
184
  end
185
185
 
186
186
  test '#interface delete net0' do
@@ -196,8 +196,8 @@ module ForemanFogProxmox
196
196
  interfaces_to_add, interfaces_to_delete = parse_container_interfaces(host['interfaces_attributes'])
197
197
  assert interfaces_to_delete.empty?
198
198
  assert_equal 2, interfaces_to_add.length
199
- assert interfaces_to_add.include?(net0: 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp')
200
- assert interfaces_to_add.include?(net1: 'name=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp')
199
+ assert interfaces_to_add.include?(net0: 'name=eth0,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876')
200
+ assert interfaces_to_add.include?(net1: 'name=eth1,bridge=vmbr0,ip=dhcp,ip6=dhcp,gw=192.168.56.100,gw6=2001:0:1234::c1c0:abcd:876')
201
201
  end
202
202
  end
203
203
  end
@@ -61,7 +61,7 @@ module ForemanFogProxmox
61
61
  end
62
62
 
63
63
  it 'sets container hostname with host name' do
64
- physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :primary => true)
64
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :primary => true, :compute_attributes => { 'dhcpv4' => '1', 'dhcpv6' => '1' })
65
65
  host = FactoryBot.build(
66
66
  :host_empty,
67
67
  :interfaces => [physical_nic],
@@ -46,8 +46,8 @@ module ForemanFogProxmox
46
46
  assert err.message.end_with?('Invalid identifier interface[0]. Must be net[n] with n integer >= 0')
47
47
  end
48
48
 
49
- it 'sets compute id with identifier, ip and ip6' do
50
- ip = IPAddr.new(1, Socket::AF_INET).to_s
49
+ it 'sets server compute id with identifier, ip and ip6' do
50
+ ip = '192.168.56.100'
51
51
  ip6 = Array.new(4) { format('%<x>s', x: rand(16**4)) }.join(':') + '::1'
52
52
  physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6)
53
53
  host = FactoryBot.build(
@@ -66,6 +66,52 @@ module ForemanFogProxmox
66
66
  assert_equal ip, nic_attr[:ip]
67
67
  assert_equal ip6, nic_attr[:ip6]
68
68
  end
69
+
70
+ it 'sets container compute id with identifier, ip/CIDR, gw and ip6' do
71
+ ip = '192.168.56.100'
72
+ cidr_suffix = '31'
73
+ ip6 = Array.new(4) { format('%<x>s', x: rand(16**4)) }.join(':') + '::1'
74
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => { 'cidrv4_prefix' => cidr_suffix, 'gwv4' => ip, 'dhcpv6' => '1' })
75
+ host = FactoryBot.build(
76
+ :host_empty,
77
+ :interfaces => [physical_nic],
78
+ :compute_attributes => {
79
+ 'type' => 'lxc',
80
+ 'interfaces_attributes' => {
81
+ '0' => physical_nic
82
+ }
83
+ }
84
+ )
85
+ nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?)
86
+ nic_attr = nic_attributes.first
87
+ assert_equal 'net0', nic_attr[:id]
88
+ assert_equal Fog::Proxmox::IpHelper.to_cidr(ip, cidr_suffix), nic_attr[:ip]
89
+ assert_equal ip, nic_attr[:gw]
90
+ assert_equal 'dhcp', nic_attr[:ip6]
91
+ end
92
+
93
+ it 'sets container compute id with identifier, ip DHCP, gw6 and ip6' do
94
+ ip = '192.168.56.100'
95
+ cidr6_suffix = '100'
96
+ ip6 = '2001:0:1234::c1c0:abcd:876'
97
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => { 'cidrv6_prefix' => cidr6_suffix, 'dhcpv4' => '1', 'gwv6' => ip6 })
98
+ host = FactoryBot.build(
99
+ :host_empty,
100
+ :interfaces => [physical_nic],
101
+ :compute_attributes => {
102
+ 'type' => 'lxc',
103
+ 'interfaces_attributes' => {
104
+ '0' => physical_nic
105
+ }
106
+ }
107
+ )
108
+ nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?)
109
+ nic_attr = nic_attributes.first
110
+ assert_equal 'net0', nic_attr[:id]
111
+ assert_equal 'dhcp', nic_attr[:ip]
112
+ assert_equal Fog::Proxmox::IpHelper.to_cidr6(ip6, cidr6_suffix), nic_attr[:ip6]
113
+ assert_equal ip6, nic_attr[:gw6]
114
+ end
69
115
  end
70
116
  end
71
117
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_fog_proxmox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tristan Robert
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-12-12 00:00:00.000000000 Z
12
+ date: 2020-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: deface
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '0.8'
34
+ version: '0.10'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '0.8'
41
+ version: '0.10'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rdoc
44
44
  requirement: !ruby/object:Gem::Requirement