motherbrain 1.1.1 → 1.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9be9ce62f7fcfc6a682ed09f894e1b4aa31fe85
4
- data.tar.gz: 516d1f29441d4bf6d0744f4a8b63facfe2850036
3
+ metadata.gz: 64cea7b12adcd4f120a1b7f0a580398d5544fbe1
4
+ data.tar.gz: a176fe1c0d298ae58ce95091cd310009cec02578
5
5
  SHA512:
6
- metadata.gz: b0b5efa24f154d5557d346ac05ec20e5e4bd1f4fb0cc516cb57fda607e3a8a100b2dea5c203f61d17cd4ea853921d4f7bd54c7a517b16a8cd878989e32fbfdc5
7
- data.tar.gz: 2c6a8e012f3ec6473b86886a2e91cf6ac3de1e1eb9b085f345a9f338075201d0ee02ea8550461a00886e429ce78fcb6f5b15d39fa85585e1949803ce71f185b8
6
+ metadata.gz: c6117c6036b918db282d96af96c64a83d9142184ca213ae894b81390cc7c0d961bd397fb8cf2832498c6122fa24441b0b95d5c1a6d7ce17d6de87f9aa017f669
7
+ data.tar.gz: 12e87e68c1fab167236d1c299b5d82923a9e08bebfd9ee488d9b0a7eb8e0332ca43c33516c25ea9a654060e9e19f2882811d2bcc6f5b31e7e7e4a94eb2490d58
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 1.1.2
2
+
3
+ * [#691](https://github.com/RiotGames/motherbrain/pull/691) Add some extra error handling to NodeQuerier in order to prevent it from crashing
4
+ * [#692](https://github.com/RiotGames/motherbrain/pull/692) Fix a bug preventing Job reporting from causing the unlock to fail during enabling/disabling
5
+ * [#690](https://github.com/RiotGames/motherbrain/pull/690) More updates to gemspec to get bundler working appropriately
6
+ * [#689](https://github.com/RiotGames/motherbrain/pull/689) Update to newer versions of berkshelf, ridley, celluloid, and others
7
+
1
8
  # 1.1.1
2
9
 
3
10
  * Lock tighter on http gem
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2012-2013 Riot Games
1
+ Copyright 2012-2014 Riot Games
2
2
 
3
3
  Jamie Winsor (<jamie@vialstudios.com>)
4
4
  Jesse Howarth (<jhowarth@riotgames.com>)
@@ -31,7 +31,7 @@ module MotherBrain::API
31
31
  return nil if version.nil?
32
32
 
33
33
  ver_string = version.gsub('_', '.')
34
- Solve::Version.split(ver_string)
34
+ Semverse::Version.split(ver_string)
35
35
  ver_string
36
36
  end
37
37
  end
@@ -8,7 +8,7 @@ module MotherBrain::API
8
8
  rack_response(ex.to_json, 404, "Content-type" => "application/json")
9
9
  end
10
10
 
11
- rescue_from Solve::Errors::InvalidVersionFormat do |ex|
11
+ rescue_from Semverse::InvalidVersionFormat do |ex|
12
12
  rack_response(ex.to_json, 400, "Content-type" => "application/json")
13
13
  end
14
14
 
@@ -9,9 +9,9 @@ module MotherBrain::API::Validators
9
9
  return nil if params[attr_name].nil?
10
10
 
11
11
  ver_string = params[attr_name].gsub('_', '.')
12
- Solve::Version.split(ver_string)
12
+ Semverse::Version.split(ver_string)
13
13
  params[attr_name] = ver_string
14
- rescue Solve::Errors::InvalidVersionFormat => ex
14
+ rescue Semverse::InvalidVersionFormat => ex
15
15
  throw :error, status: 400, message: ex.to_s
16
16
  end
17
17
  end
@@ -1,5 +1,3 @@
1
- require 'faraday_middleware/response/follow_redirects'
2
-
3
1
  module MotherBrain
4
2
  module Bootstrap
5
3
  class Template
@@ -24,7 +22,7 @@ module MotherBrain
24
22
  uri = URI.parse(filename_or_url)
25
23
  begin
26
24
  conn = Faraday.new do |b|
27
- b.use FaradayMiddleware::FollowRedirects
25
+ b.use Ridley::Middleware::FollowRedirects
28
26
  b.adapter :net_http
29
27
  end
30
28
  response = conn.get filename_or_url
@@ -58,11 +58,11 @@ module MotherBrain
58
58
  end
59
59
  end
60
60
 
61
- # Override the default version with [Solve::Version]
61
+ # Override the default version with [Semverse::Version]
62
62
  #
63
- # @return [Solve::Version]
63
+ # @return [Semverse::Version]
64
64
  def version(data = nil)
65
- @version = data.nil? ? @version : Solve::Version.new(data)
65
+ @version = data.nil? ? @version : Semverse::Version.new(data)
66
66
  end
67
67
 
68
68
  private
@@ -233,11 +233,11 @@ module MotherBrain
233
233
  # @return [Hash]
234
234
  def expand_constraints(cookbook_versions)
235
235
  expanded = cookbook_versions.collect do |name, constraint|
236
- [name, Solve::Constraint.new(constraint).to_s]
236
+ [name, Semverse::Constraint.new(constraint).to_s]
237
237
  end
238
238
 
239
239
  Hash[expanded]
240
- rescue Solve::Errors::InvalidConstraintFormat => ex
240
+ rescue Semverse::InvalidConstraintFormat => ex
241
241
  raise ArgumentError, ex
242
242
  end
243
243
 
@@ -125,17 +125,17 @@ module MotherBrain
125
125
  end
126
126
 
127
127
  response = if options[:override_recipes]
128
- override_recipes = options[:override_recipes]
128
+ override_recipes = options[:override_recipes]
129
129
 
130
- cmd_recipe_syntax = override_recipes.join(',') { |recipe| "recipe[#{recipe}]" }
131
- log.info { "Running Chef client with override runlist '#{cmd_recipe_syntax}' on: #{host}" }
132
- chef_run_response = chef_connection.node.execute_command(host, "chef-client --override-runlist #{cmd_recipe_syntax}")
130
+ cmd_recipe_syntax = override_recipes.join(',') { |recipe| "recipe[#{recipe}]" }
131
+ log.info { "Running Chef client with override runlist '#{cmd_recipe_syntax}' on: #{host}" }
132
+ chef_run_response = safe_remote(host) { chef_connection.node.execute_command(host, "chef-client --override-runlist #{cmd_recipe_syntax}") }
133
133
 
134
- chef_run_response
135
- else
136
- log.info { "Running Chef client on: #{host}" }
137
- chef_connection.node.chef_run(host)
138
- end
134
+ chef_run_response
135
+ else
136
+ log.info { "Running Chef client on: #{host}" }
137
+ safe_remote(host) { chef_connection.node.chef_run(host) }
138
+ end
139
139
 
140
140
  if response.error?
141
141
  log.info { "Failed Chef client run on: #{host}" }
@@ -181,7 +181,7 @@ module MotherBrain
181
181
  abort RemoteCommandError.new("cannot put_secret without a hostname or ipaddress")
182
182
  end
183
183
 
184
- response = chef_connection.node.put_secret(host)
184
+ response = safe_remote(host) { chef_connection.node.put_secret(host) }
185
185
 
186
186
  if response.error?
187
187
  log.info { "Failed to put secret file on: #{host}" }
@@ -205,7 +205,7 @@ module MotherBrain
205
205
  abort RemoteCommandError.new("cannot execute command without a hostname or ipaddress")
206
206
  end
207
207
 
208
- response = chef_connection.node.execute_command(host, command)
208
+ response = safe_remote(host) { chef_connection.node.execute_command(host, command) }
209
209
 
210
210
  if response.error?
211
211
  log.info { "Failed to execute command on: #{host}" }
@@ -250,7 +250,7 @@ module MotherBrain
250
250
  if (client_id = node_name(host)).nil?
251
251
  return nil
252
252
  end
253
- chef_connection.client.find(client_id).try(:name)
253
+ safe_remote(host) { chef_connection.client.find(client_id).try(:name) }
254
254
  end
255
255
 
256
256
  # Asynchronously remove Chef from a target host and purge it's client and node object from the
@@ -329,7 +329,12 @@ module MotherBrain
329
329
 
330
330
  job.set_status("Cleaning up the host's file system.")
331
331
  futures << chef_connection.node.future(:uninstall_chef, host, options.slice(:skip_chef))
332
- futures.map(&:value)
332
+
333
+ begin
334
+ safe_remote(host) { futures.map(&:value) }
335
+ rescue RemoteCommandError => e
336
+ job.report_failure
337
+ end
333
338
 
334
339
  job.report_success
335
340
  ensure
@@ -358,9 +363,11 @@ module MotherBrain
358
363
  end
359
364
 
360
365
  job.set_status("Host registered as #{node_name}.")
361
- node = chef_connection.node.find(node_name)
366
+
367
+ node = fetch_node(job, node_name)
362
368
 
363
369
  required_run_list = []
370
+ success = false
364
371
  chef_synchronize(chef_environment: node.chef_environment, force: options[:force], job: job) do
365
372
  if node.run_list.include?(DISABLED_RUN_LIST_ENTRY)
366
373
  required_run_list = on_dynamic_services(job, node) do |dynamic_service, plugin|
@@ -377,14 +384,18 @@ module MotherBrain
377
384
  node.run_list = node.run_list.reject { |r| r == DISABLED_RUN_LIST_ENTRY }
378
385
 
379
386
  if node.save
380
- job.report_success "#{node.name} enabled successfully."
387
+ job.set_status "#{node.name} enabled successfully."
388
+ success = true
381
389
  else
382
- job.report_failure "#{node.name} did not save! Disabled run_list entry was unable to be removed to the node."
390
+ job.set_status "#{node.name} did not save! Disabled run_list entry was unable to be removed to the node."
383
391
  end
384
392
  else
385
- job.report_success("#{node.name} is not disabled. No need to enable.")
393
+ job.set_status("#{node.name} is not disabled. No need to enable.")
394
+ success = true
386
395
  end
387
396
  end
397
+
398
+ job.report_boolean(success)
388
399
  rescue MotherBrain::ResourceLocked => e
389
400
  job.report_failure e.message
390
401
  ensure
@@ -411,11 +422,15 @@ module MotherBrain
411
422
  "node name may not be available. #{host} was not disabled!")
412
423
  end
413
424
  job.set_status("Host registered as #{node_name}.")
414
- node = chef_connection.node.find(node_name)
425
+
426
+ node = fetch_node(job, node_name)
427
+
415
428
  required_run_list = []
429
+ success = false
416
430
  chef_synchronize(chef_environment: node.chef_environment, force: options[:force], job: job) do
417
431
  if node.run_list.include?(DISABLED_RUN_LIST_ENTRY)
418
- job.report_success("#{node.name} is already disabled.")
432
+ job.set_status("#{node.name} is already disabled.")
433
+ success = true
419
434
  else
420
435
  required_run_list = on_dynamic_services(job, node) do |dynamic_service, plugin|
421
436
  dynamic_service.node_state_change(job,
@@ -425,20 +440,25 @@ module MotherBrain
425
440
  false)
426
441
  end
427
442
  end
428
- if !required_run_list.empty?
429
- job.set_status "Running chef with the following run list: #{required_run_list.inspect}"
430
- self.bulk_chef_run(job, [node], required_run_list)
431
- else
432
- job.set_status "No recipes required to run."
433
- end
434
443
 
435
- node.run_list = [DISABLED_RUN_LIST_ENTRY].concat(node.run_list)
436
- if node.save
437
- job.report_success "#{node.name} disabled."
438
- else
439
- job.report_failure "#{node.name} did not save! Disabled run_list entry was unable to be added to the node."
444
+ if !success
445
+ if !required_run_list.empty?
446
+ job.set_status "Running chef with the following run list: #{required_run_list.inspect}"
447
+ self.bulk_chef_run(job, [node], required_run_list)
448
+ else
449
+ job.set_status "No recipes required to run."
450
+ end
451
+
452
+ node.run_list = [DISABLED_RUN_LIST_ENTRY].concat(node.run_list)
453
+ if node.save
454
+ job.set_status "#{node.name} disabled."
455
+ success = true
456
+ else
457
+ job.set_status "#{node.name} did not save! Disabled run_list entry was unable to be added to the node."
458
+ end
440
459
  end
441
460
  end
461
+ job.report_boolean(success)
442
462
  rescue MotherBrain::ResourceLocked => e
443
463
  job.report_failure e.message
444
464
  ensure
@@ -492,7 +512,7 @@ module MotherBrain
492
512
  abort RemoteCommandError.new("cannot execute a ruby_script without a hostname or ipaddress")
493
513
  end
494
514
 
495
- response = chef_connection.node.ruby_script(host, command_lines)
515
+ response = safe_remote(host) { chef_connection.node.ruby_script(host, command_lines) }
496
516
 
497
517
  if response.error?
498
518
  raise RemoteScriptError.new(response.stderr.chomp)
@@ -527,5 +547,21 @@ module MotherBrain
527
547
  end
528
548
  end.flatten.uniq
529
549
  end
550
+
551
+ def fetch_node(job, node_name)
552
+ node = safe_remote(node_name) { chef_connection.node.find(node_name) }
553
+ rescue RemoteCommandError => e
554
+ job.report_failure("Encountered error retrieving the node object.")
555
+ end
556
+
557
+ def safe_remote(host = nil)
558
+ yield
559
+ rescue Exception => e
560
+ msg = "Unhandled Exception: [#{e.class}] #{e.message}"
561
+ msg = "[#{host}] #{msg}" if host
562
+ log.warn { msg }
563
+ log.debug { e.backtrace.join("\n") }
564
+ abort RemoteCommandError.new(msg, host)
565
+ end
530
566
  end
531
567
  end
@@ -258,7 +258,7 @@ module MotherBrain
258
258
 
259
259
  potentials = list(name: name, remote: false).map(&:version)
260
260
  potentials += remote_cookbook_versions(name) if options[:remote]
261
- potentials = potentials.collect { |version| Solve::Version.new(version) }.uniq.sort.reverse
261
+ potentials = potentials.collect { |version| Semverse::Version.new(version) }.uniq.sort.reverse
262
262
 
263
263
  potentials.find do |version|
264
264
  found = find(name, version.to_s, options.slice(:remote))
@@ -412,7 +412,7 @@ module MotherBrain
412
412
  #
413
413
  # @param [String] plugin_name
414
414
  # name of the plugin
415
- # @param [String, Solve::Constraint] constraint
415
+ # @param [String, Semverse::Constraint] constraint
416
416
  # constraint to satisfy
417
417
  #
418
418
  # @option options [Boolean] :remote (false)
@@ -424,7 +424,7 @@ module MotherBrain
424
424
  # @return [MB::Plugin]
425
425
  def satisfy(plugin_name, constraint, options = {})
426
426
  options = options.reverse_merge(remote: false)
427
- constraint = Solve::Constraint.new(constraint)
427
+ constraint = Semverse::Constraint.new(constraint)
428
428
 
429
429
  # Optimize for equality operator. Don't need to find all of the versions if
430
430
  # we only care about one.
@@ -435,7 +435,7 @@ module MotherBrain
435
435
  else
436
436
  graph = Solve::Graph.new
437
437
  versions(plugin_name, options[:remote]).each do |version|
438
- graph.artifacts(plugin_name, version)
438
+ graph.artifact(plugin_name, version)
439
439
  end
440
440
 
441
441
  solution = Solve.it!(graph, [[plugin_name, constraint]])
@@ -444,7 +444,7 @@ module MotherBrain
444
444
  # calling versions() and including a {remote: true} option.
445
445
  find(plugin_name, version, remote: false)
446
446
  end
447
- rescue Solve::Errors::NoSolutionError
447
+ rescue Semverse::NoSolutionError
448
448
  abort PluginNotFound.new(plugin_name, constraint)
449
449
  end
450
450
 
data/lib/mb/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module MotherBrain
2
- VERSION = '1.1.1'
2
+ VERSION = '1.1.2'
3
3
  end
data/lib/motherbrain.rb CHANGED
@@ -21,6 +21,7 @@ require 'mb/grape_ext'
21
21
  require 'mb/ridley_ext'
22
22
  require 'mb/thor_ext'
23
23
  require 'berkshelf'
24
+ require 'semverse'
24
25
 
25
26
  module MotherBrain
26
27
  autoload :API, 'mb/api'
data/man/man_helper.rb CHANGED
@@ -17,7 +17,7 @@ module MB
17
17
 
18
18
  metadata = MB::CookbookMetadata.new
19
19
  metadata.name = "plugin"
20
- metadata.version = Solve::Version.new("1.0.0")
20
+ metadata.version = Semverse::Version.new("1.0.0")
21
21
 
22
22
  plugin = MB::Plugin.new(metadata)
23
23
 
data/motherbrain.gemspec CHANGED
@@ -34,7 +34,8 @@ Gem::Specification.new do |s|
34
34
  s.require_paths = ["lib"]
35
35
  s.version = MotherBrain::VERSION
36
36
 
37
- s.add_dependency 'celluloid', '~> 0.15'
37
+ s.add_dependency 'celluloid', '~> 0.16.pre'
38
+ s.add_dependency 'celluloid-io', '~> 0.16.pre'
38
39
  # s.add_dependency 'dcell', '~> 0.14.0'
39
40
  s.add_dependency 'reel', '~> 0.4.0'
40
41
  s.add_dependency 'reel-rack'
@@ -42,11 +43,10 @@ Gem::Specification.new do |s|
42
43
  s.add_dependency 'grape', '~> 0.6.0'
43
44
  s.add_dependency 'net-ssh'
44
45
  s.add_dependency 'net-sftp'
45
- s.add_dependency 'solve', '>= 0.4.4'
46
- s.add_dependency 'ridley-connectors', '~> 1.7.1'
46
+ s.add_dependency 'solve', '~> 1.1'
47
+ s.add_dependency 'ridley-connectors', '~> 2.0'
47
48
  s.add_dependency 'thor', '~> 0.18.0'
48
- s.add_dependency 'faraday', '< 0.9.0'
49
- s.add_dependency 'faraday_middleware'
49
+ s.add_dependency 'faraday', '~> 0.9'
50
50
  s.add_dependency 'multi_json'
51
51
  s.add_dependency 'fog', '~> 1.10.0'
52
52
  s.add_dependency 'json', '>= 1.8.0'
@@ -55,5 +55,6 @@ Gem::Specification.new do |s|
55
55
  s.add_dependency 'buff-platform', '~> 0.1'
56
56
  s.add_dependency 'buff-ruby_engine', '~> 0.1'
57
57
  s.add_dependency 'grape-swagger', '~> 0.6.0'
58
- s.add_dependency 'berkshelf', '~> 3.0.0.beta7'
58
+ s.add_dependency 'berkshelf', '~> 3.0'
59
+ s.add_dependency 'semverse', '~> 1.1'
59
60
  end
@@ -1,5 +1,5 @@
1
1
  RSpec.configuration.before(:each) do
2
- class Celluloid::ActorProxy
2
+ class Celluloid::CellProxy
3
3
  [ :should_receive, :should_not_receive, :stub, :stub_chain, :should, :should_not ].each do |method|
4
4
  undef_method(method) if method_defined?(method)
5
5
  end
@@ -53,8 +53,8 @@ describe MotherBrain::CookbookMetadata do
53
53
  subject.long_description.should eql("Installs/Configures motherbrain")
54
54
  end
55
55
 
56
- it "sets a Solve::Version value for 'version'" do
57
- subject.version.should be_a(Solve::Version)
56
+ it "sets a Semverse::Version value for 'version'" do
57
+ subject.version.should be_a(Semverse::Version)
58
58
  subject.version.to_s.should eql("0.1.0")
59
59
  end
60
60
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motherbrain
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamie Winsor
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2014-04-02 00:00:00.000000000 Z
18
+ date: 2014-04-18 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: celluloid
@@ -23,14 +23,28 @@ dependencies:
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: '0.15'
26
+ version: 0.16.pre
27
27
  type: :runtime
28
28
  prerelease: false
29
29
  version_requirements: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: '0.15'
33
+ version: 0.16.pre
34
+ - !ruby/object:Gem::Dependency
35
+ name: celluloid-io
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.16.pre
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 0.16.pre
34
48
  - !ruby/object:Gem::Dependency
35
49
  name: reel
36
50
  requirement: !ruby/object:Gem::Requirement
@@ -119,30 +133,30 @@ dependencies:
119
133
  name: solve
120
134
  requirement: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - '>='
136
+ - - ~>
123
137
  - !ruby/object:Gem::Version
124
- version: 0.4.4
138
+ version: '1.1'
125
139
  type: :runtime
126
140
  prerelease: false
127
141
  version_requirements: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - '>='
143
+ - - ~>
130
144
  - !ruby/object:Gem::Version
131
- version: 0.4.4
145
+ version: '1.1'
132
146
  - !ruby/object:Gem::Dependency
133
147
  name: ridley-connectors
134
148
  requirement: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ~>
137
151
  - !ruby/object:Gem::Version
138
- version: 1.7.1
152
+ version: '2.0'
139
153
  type: :runtime
140
154
  prerelease: false
141
155
  version_requirements: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - ~>
144
158
  - !ruby/object:Gem::Version
145
- version: 1.7.1
159
+ version: '2.0'
146
160
  - !ruby/object:Gem::Dependency
147
161
  name: thor
148
162
  requirement: !ruby/object:Gem::Requirement
@@ -161,30 +175,16 @@ dependencies:
161
175
  name: faraday
162
176
  requirement: !ruby/object:Gem::Requirement
163
177
  requirements:
164
- - - <
165
- - !ruby/object:Gem::Version
166
- version: 0.9.0
167
- type: :runtime
168
- prerelease: false
169
- version_requirements: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - <
172
- - !ruby/object:Gem::Version
173
- version: 0.9.0
174
- - !ruby/object:Gem::Dependency
175
- name: faraday_middleware
176
- requirement: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - '>='
178
+ - - ~>
179
179
  - !ruby/object:Gem::Version
180
- version: '0'
180
+ version: '0.9'
181
181
  type: :runtime
182
182
  prerelease: false
183
183
  version_requirements: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - '>='
185
+ - - ~>
186
186
  - !ruby/object:Gem::Version
187
- version: '0'
187
+ version: '0.9'
188
188
  - !ruby/object:Gem::Dependency
189
189
  name: multi_json
190
190
  requirement: !ruby/object:Gem::Requirement
@@ -303,14 +303,28 @@ dependencies:
303
303
  requirements:
304
304
  - - ~>
305
305
  - !ruby/object:Gem::Version
306
- version: 3.0.0.beta7
306
+ version: '3.0'
307
+ type: :runtime
308
+ prerelease: false
309
+ version_requirements: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - ~>
312
+ - !ruby/object:Gem::Version
313
+ version: '3.0'
314
+ - !ruby/object:Gem::Dependency
315
+ name: semverse
316
+ requirement: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ~>
319
+ - !ruby/object:Gem::Version
320
+ version: '1.1'
307
321
  type: :runtime
308
322
  prerelease: false
309
323
  version_requirements: !ruby/object:Gem::Requirement
310
324
  requirements:
311
325
  - - ~>
312
326
  - !ruby/object:Gem::Version
313
- version: 3.0.0.beta7
327
+ version: '1.1'
314
328
  description: An orchestrator for Chef
315
329
  email:
316
330
  - jamie@vialstudios.com
@@ -607,7 +621,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
607
621
  version: '0'
608
622
  requirements: []
609
623
  rubyforge_project:
610
- rubygems_version: 2.0.14
624
+ rubygems_version: 2.2.2
611
625
  signing_key:
612
626
  specification_version: 4
613
627
  summary: An orchestrator for Chef