motherbrain 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
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