spiceweasel 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -4,17 +4,20 @@ Spiceweasel is a command-line tool for batch loading Chef infrastructure. It pro
4
4
 
5
5
  The `examples` directory provides examples based on the Quick Starts provided at [http://help.opscode.com/kb/otherhelp](http://help.opscode.com/kb/otherhelp).
6
6
 
7
- CHANGELOG.md covers current, previous and future development milestones and contains the features backlog.
7
+ The [https://github.com/mattray/ravel-repo](https://github.com/mattray/ravel-repo) provides a working example for bootstrapping a Chef repository with Spiceweasel.
8
+
9
+ The [CHANGELOG.md](https://github.com/mattray/spiceweasel/blob/master/CHANGELOG.md) covers current, previous and future development milestones and contains the features backlog.
10
+
8
11
 
9
12
  Requirements
10
13
  ============
11
14
  Spiceweasel currently depends on `knife` to run commands for it. Infrastructure files must either end in .json or .yml to be processed.
12
15
 
13
- Written with Chef 0.9.12 and 0.10.0 and supports cookbooks, environments, roles, data bags and nodes.
16
+ Written initially with Chef 0.9.12 (should still work) and continuing to develop with support for 0.10.
14
17
 
15
18
  Testing
16
19
  -------
17
- Tested with Ubuntu 10.04 and Chef 0.9.16 and 0.10.2.
20
+ Tested with Ubuntu 10.04 and Chef 0.9.16 and 0.10.4.
18
21
 
19
22
  File Syntax
20
23
  ===========
@@ -164,7 +167,7 @@ produces the knife commands
164
167
 
165
168
  ```
166
169
  knife cookbook upload apache2
167
- knife cookbook site download apt 1.1.0 --file cookbooks/apt.tgz
170
+ knife cookbook site download apt 1.1.0 --file cookbooks/apt.tgz
168
171
  tar -C cookbooks/ -xf cookbooks/apt.tgz
169
172
  knife cookbook upload apt
170
173
  knife cookbook upload mysql
@@ -172,7 +175,7 @@ knife cookbook upload mysql
172
175
 
173
176
  Environments
174
177
  ------------
175
- The `environments` section of the JSON or YAML file currently supports `knife environment from file FOO` where `FOO` is the name of the environment file ending in `.rb` in the `environments` directory. The YAML snippet
178
+ The `environments` section of the JSON or YAML file currently supports `knife environment from file FOO` where `FOO` is the name of the environment file ending in `.rb` in the `environments` directory. The YAML snippet
176
179
 
177
180
  ``` yaml
178
181
  environments:
@@ -181,7 +184,7 @@ environments:
181
184
  - production:
182
185
  ```
183
186
 
184
- produces the knife commands
187
+ produces the knife commands
185
188
 
186
189
  ```
187
190
  knife environment from file development.rb
@@ -191,7 +194,7 @@ knife environment from file production.rb
191
194
 
192
195
  Roles
193
196
  -----
194
- The `roles` section of the JSON or YAML file currently supports `knife role from file FOO` where `FOO` is the name of the role file ending in `.rb` in the `roles` directory. The YAML snippet
197
+ The `roles` section of the JSON or YAML file currently supports `knife role from file FOO` where `FOO` is the name of the role file ending in `.rb` in the `roles` directory. The YAML snippet
195
198
 
196
199
  ``` yaml
197
200
  roles:
@@ -200,7 +203,7 @@ roles:
200
203
  - webserver:
201
204
  ```
202
205
 
203
- produces the knife commands
206
+ produces the knife commands
204
207
 
205
208
  ```
206
209
  knife role from file base.rb
@@ -210,7 +213,7 @@ knife role from file webserver.rb
210
213
 
211
214
  Data Bags
212
215
  ---------
213
- The `data bags` section of the JSON or YAML file currently creates the data bags listed with `knife data bag create FOO` where `FOO` is the name of the data bag. Individual items may be added to the data bag as part of a JSON or YAML sequence, the assumption is made that they `.json` files and in the `data_bags/FOO` directory. You may also pass a wildcard as an entry to load all matching data bags (ie. `*`). Encrypted data bags are supported by listing `secret filename` as the first item (where `filename` is the secret key to be used). Assuming the presence of `dataA.json` and `dataB.json` in the `data_bags/data` directory, the YAML snippet
216
+ The `data bags` section of the JSON or YAML file currently creates the data bags listed with `knife data bag create FOO` where `FOO` is the name of the data bag. Individual items may be added to the data bag as part of a JSON or YAML sequence, the assumption is made that they `.json` files and in the `data_bags/FOO` directory. You may also pass a wildcard as an entry to load all matching data bags (ie. `*`). Encrypted data bags are supported by listing `secret filename` as the first item (where `filename` is the secret key to be used). Assuming the presence of `dataA.json` and `dataB.json` in the `data_bags/data` directory, the YAML snippet
214
217
 
215
218
  ``` yaml
216
219
  data bags:
@@ -226,7 +229,7 @@ data bags:
226
229
  - rabbitmq
227
230
  ```
228
231
 
229
- produces the knife commands
232
+ produces the knife commands
230
233
 
231
234
  ```
232
235
  knife data bag create users
@@ -243,7 +246,7 @@ knife data bag from file passwords data_bags/passwords/rabbitmq.json --secret-fi
243
246
 
244
247
  Nodes
245
248
  -----
246
- The `nodes` section of the JSON or YAML file bootstraps a node for each entry where the entry is a hostname or provider and count. Each node requires 2 items after it in a sequence. The first item is the run_list and the second the CLI options used. The run_list may be space or comma-delimited. Validation is performed on the run_list components to ensure that only recipes and roles listed in the file are used. A shortcut syntax for bulk-creating nodes with various providers where the line starts with the provider and ends with the number of nodes to be provisioned. The YAML snippet
249
+ The `nodes` section of the JSON or YAML file bootstraps a node for each entry where the entry is a hostname or provider and count. Each node requires 2 items after it in a sequence. The first item is the run_list and the second the CLI options used. The run_list may be space or comma-delimited. Validation is performed on the run_list components to ensure that only recipes and roles listed in the file are used. A shortcut syntax for bulk-creating nodes with various providers where the line starts with the provider and ends with the number of nodes to be provisioned. The YAML snippet
247
250
 
248
251
  ``` yaml
249
252
  nodes:
@@ -261,7 +264,7 @@ nodes:
261
264
  - --image 49 --flavor 2
262
265
  ```
263
266
 
264
- produces the knife commands
267
+ produces the knife commands
265
268
 
266
269
  ```
267
270
  knife bootstrap serverA 'role[base]' -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
@@ -5,6 +5,8 @@ require 'yaml'
5
5
 
6
6
  require 'spiceweasel'
7
7
 
8
+ options={'knife_options' => ''}
9
+
8
10
  #process command line options
9
11
  begin
10
12
  ARGV << "-h" if ARGV.empty?
@@ -17,6 +19,10 @@ rescue OptionParser::InvalidOption => e
17
19
  exit(-1)
18
20
  end
19
21
 
22
+ if cli.config[:knifeconfig]
23
+ options['knife_options']=" -c "+cli.config[:knifeconfig]
24
+ end
25
+
20
26
  begin
21
27
  file = ARGV.last
22
28
  STDOUT.puts "DEBUG: file: #{file}" if cli.config[:debug]
@@ -41,12 +47,12 @@ end
41
47
  create = String.new()
42
48
  delete = String.new()
43
49
 
44
- cookbook_list = Spiceweasel::CookbookList.new(input['cookbooks'])
45
- environment_list = Spiceweasel::EnvironmentList.new(input['environments'])
46
- role_list = Spiceweasel::RoleList.new(input['roles'])
47
- data_bag_list = Spiceweasel::DataBagList.new(input['data bags'])
50
+ cookbook_list = Spiceweasel::CookbookList.new(input['cookbooks'], options)
51
+ environment_list = Spiceweasel::EnvironmentList.new(input['environments'], options)
52
+ role_list = Spiceweasel::RoleList.new(input['roles'], options)
53
+ data_bag_list = Spiceweasel::DataBagList.new(input['data bags'], options)
48
54
 
49
- node_list = Spiceweasel::NodeList.new(input['nodes'], cookbook_list, environment_list, role_list)
55
+ node_list = Spiceweasel::NodeList.new(input['nodes'], cookbook_list, environment_list, role_list, options)
50
56
 
51
57
  create += cookbook_list.create
52
58
  create += environment_list.create
@@ -44,4 +44,10 @@ class Spiceweasel::CLI
44
44
  :boolean => true,
45
45
  :proc => lambda {|v| puts "Spiceweasel: #{Spiceweasel::VERSION}" },
46
46
  :exit => 0
47
+
48
+ option :knifeconfig,
49
+ :short => "-c CONFIG",
50
+ :long => "--knifeconfig CONFIG",
51
+ :description => "The knife.rb configuration file to use."
52
+
47
53
  end
@@ -1,33 +1,35 @@
1
1
  class Spiceweasel::CookbookList
2
- def initialize(cookbooks = [])
2
+ def initialize(cookbooks = [], options = {})
3
3
  @create = @delete = ''
4
4
  @cookbooks = []
5
- cookbooks.each do |cookbook|
6
- cb = cookbook.keys.first
7
- if cookbook[cb] and cookbook[cb].length > 0
8
- version = cookbook[cb][0].to_s || ""
9
- args = cookbook[cb][1] || ""
10
- end
11
- STDOUT.puts "DEBUG: cookbook: #{cb} #{version}" if DEBUG
12
- @delete += "knife cookbook delete #{cb} #{version} -y\n"
13
- if File.directory?("cookbooks")
14
- if version and File.directory?("cookbooks/#{cb}")
15
- #check metadata.rb for requested version
16
- metadata = File.open("cookbooks/#{cb}/metadata.rb").grep(/^version/)[0].split()[1].gsub(/"/,'').to_s
17
- if (metadata != version)
18
- raise "Invalid version #{version} of '#{cb}' requested, #{metadata} is already in the cookbooks directory."
19
- exit(-1)
5
+ if cookbooks
6
+ cookbooks.each do |cookbook|
7
+ cb = cookbook.keys.first
8
+ if cookbook[cb] and cookbook[cb].length > 0
9
+ version = cookbook[cb][0].to_s || ""
10
+ args = cookbook[cb][1] || ""
11
+ end
12
+ STDOUT.puts "DEBUG: cookbook: #{cb} #{version}" if DEBUG
13
+ @delete += "knife cookbook#{options['knife_options']} delete #{cb} #{version} -y\n"
14
+ if File.directory?("cookbooks")
15
+ if version and File.directory?("cookbooks/#{cb}")
16
+ #check metadata.rb for requested version
17
+ metadata = File.open("cookbooks/#{cb}/metadata.rb").grep(/^version/)[0].split()[1].gsub(/"/,'').to_s
18
+ if (metadata != version)
19
+ raise "Invalid version #{version} of '#{cb}' requested, #{metadata} is already in the cookbooks directory."
20
+ exit(-1)
21
+ end
22
+ elsif !File.directory?("cookbooks/#{cb}")
23
+ @create += "knife cookbook#{options['knife_options']} site download #{cb} #{version} --file cookbooks/#{cb}.tgz #{args}\n"
24
+ @create += "tar -C cookbooks/ -xf cookbooks/#{cb}.tgz\n"
20
25
  end
21
- elsif !File.directory?("cookbooks/#{cb}")
22
- @create += "knife cookbook site download #{cb} #{version} --file cookbooks/#{cb}.tgz #{args}\n"
23
- @create += "tar -C cookbooks/ -xf cookbooks/#{cb}.tgz\n"
26
+ else
27
+ STDERR.puts "cookbooks directory not found, validation and downloading skipped"
24
28
  end
25
- else
26
- STDERR.puts "cookbooks directory not found, validation and downloading skipped"
27
- end
28
- @create += "knife cookbook upload #{cb}\n"
29
+ @create += "knife cookbook#{options['knife_options']} upload #{cb}\n"
29
30
 
30
- @cookbooks << cb
31
+ @cookbooks << cb
32
+ end
31
33
  end
32
34
  end
33
35
 
@@ -1,28 +1,30 @@
1
1
  class Spiceweasel::DataBagList
2
- def initialize(data_bags = [])
2
+ def initialize(data_bags = [], options = {})
3
3
  @create = @delete = ''
4
- data_bags.each do |data_bag|
5
- STDOUT.puts "DEBUG: data bag: #{data_bag.keys[0]}" if DEBUG
6
- @delete += "knife data bag delete #{data_bag.keys[0]} -y\n"
7
- @create += "knife data bag create #{data_bag.keys[0]}\n"
8
- items = data_bag[data_bag.keys[0]] || []
9
- secret = nil
10
- while item = items.shift
11
- STDOUT.puts "DEBUG: data bag #{data_bag.keys[0]} item: #{item}" if DEBUG
12
- if item.start_with?("secret")
13
- secret = item.split()[1]
14
- next
15
- end
16
- if item =~ /\*/ #wildcard support
17
- files = Dir.glob("data_bags/#{data_bag.keys[0]}/#{item}.json")
18
- items += files.collect {|x| x[x.rindex('/')+1..-6]}
19
- puts items
20
- next
21
- end
22
- if secret
23
- @create += "knife data bag from file #{data_bag.keys[0]} data_bags/#{data_bag.keys[0]}/#{item}.json --secret-file #{secret}\n"
24
- else
25
- @create += "knife data bag from file #{data_bag.keys[0]} data_bags/#{data_bag.keys[0]}/#{item}.json\n"
4
+ if data_bags
5
+ data_bags.each do |data_bag|
6
+ STDOUT.puts "DEBUG: data bag: #{data_bag.keys[0]}" if DEBUG
7
+ @delete += "knife data bag#{options['knife_options']} delete #{data_bag.keys[0]} -y\n"
8
+ @create += "knife data bag#{options['knife_options']} create #{data_bag.keys[0]}\n"
9
+ items = data_bag[data_bag.keys[0]] || []
10
+ secret = nil
11
+ while item = items.shift
12
+ STDOUT.puts "DEBUG: data bag #{data_bag.keys[0]} item: #{item}" if DEBUG
13
+ if item.start_with?("secret")
14
+ secret = item.split()[1]
15
+ next
16
+ end
17
+ if item =~ /\*/ #wildcard support
18
+ files = Dir.glob("data_bags/#{data_bag.keys[0]}/#{item}.json")
19
+ items += files.collect {|x| x[x.rindex('/')+1..-6]}
20
+ puts items
21
+ next
22
+ end
23
+ if secret
24
+ @create += "knife data bag#{options['knife_options']} from file #{data_bag.keys[0]} data_bags/#{data_bag.keys[0]}/#{item}.json --secret-file #{secret}\n"
25
+ else
26
+ @create += "knife data bag#{options['knife_options']} from file #{data_bag.keys[0]} data_bags/#{data_bag.keys[0]}/#{item}.json\n"
27
+ end
26
28
  end
27
29
  end
28
30
  end
@@ -1,12 +1,14 @@
1
1
  class Spiceweasel::EnvironmentList
2
- def initialize(environments = [])
2
+ def initialize(environments = [], options = {})
3
3
  @create = @delete = ''
4
4
  @environments = []
5
- environments.each do |environment|
6
- STDOUT.puts "DEBUG: environment: #{environment.keys[0]}" if DEBUG
7
- @delete += "knife environment delete #{environment.keys[0]} -y\n"
8
- @create += "knife environment from file #{environment.keys[0]}.rb\n"
9
- @environments << environment.keys[0]
5
+ if environments
6
+ environments.each do |environment|
7
+ STDOUT.puts "DEBUG: environment: #{environment.keys[0]}" if DEBUG
8
+ @delete += "knife environment#{options['knife_options']} delete #{environment.keys[0]} -y\n"
9
+ @create += "knife environment#{options['knife_options']} from file #{environment.keys[0]}.rb\n"
10
+ @environments << environment.keys[0]
11
+ end
10
12
  end
11
13
  end
12
14
 
@@ -1,33 +1,35 @@
1
1
  class Spiceweasel::NodeList
2
- def initialize(nodes, cookbook_list, environment_list, role_list)
2
+ def initialize(nodes, cookbook_list, environment_list, role_list, options = {})
3
3
  nodes ||= []
4
4
  @create = @delete = ''
5
5
 
6
- @delete += "knife node bulk_delete .* -y\n"
7
- nodes.each do |node|
8
- STDOUT.puts "DEBUG: node: #{node.keys[0]}" if DEBUG
9
- run_list = node[node.keys[0]][0].gsub(/ /,',').split(',')
10
- STDOUT.puts "DEBUG: node run_list: #{run_list}" if DEBUG
11
- Spiceweasel::RunList.new(run_list).validate(cookbook_list, environment_list, role_list)
12
- #provider support
13
- if node.keys[0].start_with?("bluebox","ec2","openstack","rackspace","slicehost","terremark")
14
- provider = node.keys[0].split()
15
- count = 1
16
- if (provider.length == 2)
17
- count = provider[1]
18
- end
19
- #create the instances
20
- count.to_i.times do
21
- @create += "knife #{provider[0]} server create #{node[node.keys[0]][1]}"
22
- if run_list.length > 0
23
- @create += " -r '#{node[node.keys[0]][0].gsub(/ /,',')}'\n"
6
+ @delete += "knife node#{options['knife_options']} bulk_delete .* -y\n"
7
+ if nodes
8
+ nodes.each do |node|
9
+ STDOUT.puts "DEBUG: node: #{node.keys[0]}" if DEBUG
10
+ run_list = node[node.keys[0]][0].gsub(/ /,',').split(',')
11
+ STDOUT.puts "DEBUG: node run_list: #{run_list}" if DEBUG
12
+ Spiceweasel::RunList.new(run_list).validate(cookbook_list, environment_list, role_list)
13
+ #provider support
14
+ if node.keys[0].start_with?("bluebox","ec2","openstack","rackspace","slicehost","terremark")
15
+ provider = node.keys[0].split()
16
+ count = 1
17
+ if (provider.length == 2)
18
+ count = provider[1]
24
19
  end
25
- end
26
- else #multinode support
27
- node.keys[0].split.each do |server|
28
- @create += "knife bootstrap #{server} #{node[node.keys[0]][1]}"
29
- if run_list.length > 0
30
- @create += " -r '#{node[node.keys[0]][0].gsub(/ /,',')}'\n"
20
+ #create the instances
21
+ count.to_i.times do
22
+ @create += "knife #{provider[0]}#{options['knife_options']} server create #{node[node.keys[0]][1]}"
23
+ if run_list.length > 0
24
+ @create += " -r '#{node[node.keys[0]][0].gsub(/ /,',')}'\n"
25
+ end
26
+ end
27
+ else #multinode support
28
+ node.keys[0].split.each do |server|
29
+ @create += "knife bootstrap#{options['knife_options']} #{server} #{node[node.keys[0]][1]}"
30
+ if run_list.length > 0
31
+ @create += " -r '#{node[node.keys[0]][0].gsub(/ /,',')}'\n"
32
+ end
31
33
  end
32
34
  end
33
35
  end
@@ -1,12 +1,14 @@
1
1
  class Spiceweasel::RoleList
2
- def initialize(roles = [])
2
+ def initialize(roles = [], options = {})
3
3
  @create = @delete = ''
4
4
  @roles = []
5
- roles.each do |role|
6
- STDOUT.puts "DEBUG: role: #{role.keys[0]}" if DEBUG
7
- @delete += "knife role delete #{role.keys[0]} -y\n"
8
- @create += "knife role from file #{role.keys[0]}.rb\n"
9
- @roles << role.keys[0]
5
+ if roles
6
+ roles.each do |role|
7
+ STDOUT.puts "DEBUG: role: #{role.keys[0]}" if DEBUG
8
+ @delete += "knife role#{options['knife_options']} delete #{role.keys[0]} -y\n"
9
+ @create += "knife role#{options['knife_options']} from file #{role.keys[0]}.rb\n"
10
+ @roles << role.keys[0]
11
+ end
10
12
  end
11
13
  end
12
14
 
@@ -1,3 +1,3 @@
1
1
  module Spiceweasel
2
- VERSION = "0.8.1"
2
+ VERSION = "0.8.2"
3
3
  end
metadata CHANGED
@@ -1,91 +1,72 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: spiceweasel
3
- version: !ruby/object:Gem::Version
4
- hash: 61
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 8
9
- - 1
10
- version: 0.8.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.2
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Matt Ray
14
9
  - Elliot Crosby-McCullough
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2011-08-11 00:00:00 -05:00
13
+ date: 2011-10-28 00:00:00.000000000 -05:00
20
14
  default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
23
17
  name: chef
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirement: &2160839960 !ruby/object:Gem::Requirement
26
19
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 3
31
- segments:
32
- - 0
33
- version: "0"
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
34
24
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: json
38
25
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
26
+ version_requirements: *2160839960
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: &2160839480 !ruby/object:Gem::Requirement
40
30
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 0
47
- version: "0"
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
48
35
  type: :runtime
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: mixlib-cli
52
36
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
37
+ version_requirements: *2160839480
38
+ - !ruby/object:Gem::Dependency
39
+ name: mixlib-cli
40
+ requirement: &2160839000 !ruby/object:Gem::Requirement
54
41
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- hash: 3
59
- segments:
60
- - 0
61
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
62
46
  type: :runtime
63
- version_requirements: *id003
64
- - !ruby/object:Gem::Dependency
65
- name: rspec
66
47
  prerelease: false
67
- requirement: &id004 !ruby/object:Gem::Requirement
48
+ version_requirements: *2160839000
49
+ - !ruby/object:Gem::Dependency
50
+ name: rspec
51
+ requirement: &2160838480 !ruby/object:Gem::Requirement
68
52
  none: false
69
- requirements:
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- hash: 3
73
- segments:
74
- - 0
75
- version: "0"
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
76
57
  type: :development
77
- version_requirements: *id004
78
- description: This provides a CLI for generating knife commands to build Chef-managed infrastructure from a simple YAML file.
79
- email:
58
+ prerelease: false
59
+ version_requirements: *2160838480
60
+ description: This provides a CLI for generating knife commands to build Chef-managed
61
+ infrastructure from a simple YAML file.
62
+ email:
80
63
  - matt@opscode.com
81
64
  - elliot.cm@gmail.com
82
- executables:
65
+ executables:
83
66
  - spiceweasel
84
67
  extensions: []
85
-
86
68
  extra_rdoc_files: []
87
-
88
- files:
69
+ files:
89
70
  - bin/spiceweasel
90
71
  - lib/spiceweasel/cli.rb
91
72
  - lib/spiceweasel/cookbook_list.rb
@@ -101,36 +82,27 @@ files:
101
82
  has_rdoc: true
102
83
  homepage: http://github.com/mattray/spiceweasel
103
84
  licenses: []
104
-
105
85
  post_install_message:
106
86
  rdoc_options: []
107
-
108
- require_paths:
87
+ require_paths:
109
88
  - lib
110
- required_ruby_version: !ruby/object:Gem::Requirement
89
+ required_ruby_version: !ruby/object:Gem::Requirement
111
90
  none: false
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- hash: 3
116
- segments:
117
- - 0
118
- version: "0"
119
- required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
96
  none: false
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- hash: 3
125
- segments:
126
- - 0
127
- version: "0"
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
128
101
  requirements: []
129
-
130
102
  rubyforge_project: spiceweasel
131
- rubygems_version: 1.3.7
103
+ rubygems_version: 1.6.2
132
104
  signing_key:
133
105
  specification_version: 3
134
106
  summary: CLI for generating Chef knife commands from a simple YAML file.
135
- test_files:
107
+ test_files:
136
108
  - spec/bin/spiceweasel_spec.rb