qops 1.6.1 → 1.8.1

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
- SHA1:
3
- metadata.gz: ae573e99371d225d3eca19d41a48f13a8a013819
4
- data.tar.gz: 7feba6d8f128cf7e6a62bf80cf5306d4827db491
2
+ SHA256:
3
+ metadata.gz: af7b1d924423be4fadd918150bc5bfc948012cb6db284b7fcb2bc1a9bf153937
4
+ data.tar.gz: 2ef7d27d6daaba3f569847cb2650d8b861d5690e9c79784b3dc8369d0cd12e1a
5
5
  SHA512:
6
- metadata.gz: 102be14735cf3aaf894bcc5b502f4c9bf5d9652651a592428f19978f779f740612bb6b74224273f39618427028a80c6e0f13dd4fc2a5b929d1b0959eec993831
7
- data.tar.gz: dfe5b532a6da97e65b66474267b843c50d4c1fb8d321ec4dc0ae2894b16a51eed086136b559f92958bd1eb1e59146a307022f5f9499a1689c4555d5b2d966dd9
6
+ metadata.gz: 10eb2ea844656184d4e74559237ab2486329a3e01f44dc51a847d0ec02222398addc664956cc2c41725599b78f10a73e565a97e59ce8debaf1075b101d3fc7ee
7
+ data.tar.gz: 6d5465f49155bd01622e52f2ace9a882feab6cee327f5e07aee05a84397cf9b51cf03850d596062ac6775a6b8cb1ccdcd358c35ca1aecc2ea402ecd29f634839
data/README.md CHANGED
@@ -9,13 +9,16 @@
9
9
 
10
10
  ## FAQ:
11
11
 
12
- ### Q: The `qops` gem is currently not public. How do I access it?
12
+ ### Q: Can I Override Built-In Templates
13
13
 
14
- Please add your personal gemfury source to the gem path to install it.
14
+ You can create a overridden_built_in_templates folder within you cookbooks folder.
15
+ /cookbooks/overridden_built_in_templates/unicorn/templates/default/unicorn.conf.erb
15
16
 
16
17
  ### Q: For the `qops qops:instance:run_command` command, it provides two options: one is run commands against all instances of the stack all in once, one is run commands on each instances of the stack one by one randomly. How do I use this?
17
18
 
18
- When running commands one by one, between each execution of the command, there will be a delay. The delay is config by wait_deploy. By default it is 180 seconds when it is not defined. For now, run_command command will only support commends `setup` `configure` `install_dependencies` `update_dependencies`, since commands `update_custom_cookbooks` `deploy` was implemented before.
19
+ When running commands one by one, between each execution of the command, there will be a delay. The delay is config by wait_deploy. By default it is 180 seconds when it is not defined. For now, run_command command will only support commends `setup` `configure` `install_dependencies` `update_dependencies`, `execute_recipes`, since commands `update_custom_cookbooks` `deploy` was implemented before.
20
+
21
+ When run command `execute_recipes`, a comma separated recipes should be supply, for example: cookbookname::recipename_one,cookbookname::recipename_two
19
22
 
20
23
  ### Q: How do I use QOPS to override env variables on my opsworks CHEF 11 stack?
21
24
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thor'
2
4
  require 'thor/group'
3
5
  require 'aws-sdk'
@@ -17,6 +19,7 @@ require_relative 'qops/deployment/helpers'
17
19
  require_relative 'qops/deployment/app'
18
20
  require_relative 'qops/deployment/instances'
19
21
  require_relative 'qops/deployment/stacks'
22
+ require_relative 'qops/cookbook/helpers'
20
23
  require_relative 'qops/cookbook/cookbook'
21
24
 
22
25
  # Migrate this into quandl config project
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Cookbook < Thor
2
- include Qops::Helpers
4
+ include Qops::CookbookHelpers
3
5
 
4
6
  desc 'vendor', 'Generate vendor directory to contain the cookbooks'
5
7
  def vendor
@@ -13,6 +15,7 @@ class Qops::Cookbook < Thor
13
15
  desc 'package', 'Package the cookbooks into a zip file in vendor'
14
16
  def package
15
17
  initialize_run
18
+ move_custom_templates
16
19
  Dir.chdir(config.cookbook_dir) do
17
20
  remove_zip_files
18
21
  system("zip -r #{artifact_name} vendor/*")
@@ -115,20 +118,6 @@ class Qops::Cookbook < Thor
115
118
  config
116
119
  end
117
120
 
118
- def config
119
- return @_config if @_config
120
-
121
- @_config ||= Qops::Environment.new
122
-
123
- %w[cookbook_dir cookbook_s3_bucket cookbook_s3_path cookbook_name cookbook_version].each do |var|
124
- fail ArgumentError.new("Must specify a '#{var}' in the config") if !@_config.respond_to?(var) && !@_config.configuration.respond_to?(var)
125
- end
126
-
127
- fail ArgumentError.new("Cannot find/do not have access to cookbook directory: #{@_config.cookbook_dir}") unless Dir.exist?(@_config.cookbook_dir)
128
-
129
- @_config
130
- end
131
-
132
121
  def s3
133
122
  @s3 ||= Aws::S3::Client.new(**aws_configs)
134
123
  end
@@ -156,6 +145,17 @@ class Qops::Cookbook < Thor
156
145
  File.join(config.cookbook_dir, 'vendor')
157
146
  end
158
147
 
148
+ def move_custom_templates
149
+ Dir.chdir(config.cookbook_dir) do
150
+ custom_template_directory = File.join('vendor', config.cookbook_name, 'overridden_built_in_templates')
151
+ if File.directory?(custom_template_directory)
152
+ say('Moving Custom Templates:', :green)
153
+ system("mv #{custom_template_directory}/* vendor")
154
+ system("rm -rf #{custom_template_directory}")
155
+ end
156
+ end
157
+ end
158
+
159
159
  def remove_zip_files
160
160
  FileUtils.rm Dir.glob("#{config.cookbook_name}*.zip")
161
161
  say("Cleaned up directory '#{config.cookbook_dir}/*.zip'", :green)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Qops::CookbookHelpers
4
+ extend ActiveSupport::Concern
5
+
6
+ include Qops::Helpers
7
+
8
+ included do
9
+ class_option :profile, type: :string, aliases: '-p', desc: 'An AWS profile to use'
10
+ class_option :force_config, type: :boolean, aliases: '-f', desc: 'Force qops to read options from config. by default qops will search aws opsworks stack'
11
+ class_option :verbose, type: :boolean, aliases: '-v', desc: 'Provides additional information when running for debugging purposes.'
12
+ end
13
+
14
+ private
15
+
16
+ def config
17
+ return @_config if @_config
18
+
19
+ @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config], verbose: options[:verbose])
20
+
21
+ %w[cookbook_dir cookbook_s3_bucket cookbook_s3_path cookbook_name cookbook_version].each do |var|
22
+ fail ArgumentError.new("Must specify a '#{var}' in the config") if !@_config.respond_to?(var) && !@_config.configuration.respond_to?(var)
23
+ end
24
+
25
+ fail ArgumentError.new("Cannot find/do not have access to cookbook directory: #{@_config.cookbook_dir}") unless Dir.exist?(@_config.cookbook_dir)
26
+
27
+ @_config
28
+ end
29
+
30
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Deploy < Thor
2
4
  include Qops::DeployHelpers
3
5
 
@@ -8,9 +10,7 @@ class Qops::Deploy < Thor
8
10
  instances = config.deploy_type == 'staging' ? [retrieve_instance].compact : retrieve_instances
9
11
  online_instances = instances.select { |instance| instance.status == 'online' }
10
12
 
11
- if online_instances.empty?
12
- raise 'Could not find any running instance(s) to deploy to. Perhaps you need to run "qops:instance:up" first'
13
- end
13
+ raise 'Could not find any running instance(s) to deploy to. Perhaps you need to run "qops:instance:up" first' if online_instances.empty?
14
14
 
15
15
  if config.deploy_type == 'staging'
16
16
  puts "Preparing to deploy branch #{revision_used} to instance #{online_instances.first.hostname}"
@@ -32,9 +32,7 @@ class Qops::Deploy < Thor
32
32
  base_deployment_params[:app_id] = config.application_id
33
33
  end
34
34
 
35
- if config.deploy_type != 'production'
36
- base_deployment_params[:custom_json] = custom_json.to_json
37
- end
35
+ base_deployment_params[:custom_json] = custom_json.to_json if config.deploy_type != 'production'
38
36
 
39
37
  manifest = {
40
38
  environment: config.deploy_type
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Qops::DeployHelpers
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -8,7 +10,11 @@ module Qops::DeployHelpers
8
10
  class_option :branch, type: :string, aliases: '-b', desc: 'The branch to use when deploying to staging type environments'
9
11
  class_option :hostname, type: :string, aliases: '-h', desc: 'Fully override the hostname that qops would normally give the instance'
10
12
  class_option :profile, type: :string, aliases: '-p', desc: 'An AWS profile to use'
11
- class_option :force_config, type: :boolean, aliases: '-f', desc: 'force qops to read options from config. by default qops will search aws opsworks stack'
13
+ class_option :force_config, type: :boolean, aliases: '-f', desc: 'Force qops to read options from config. by default qops will search aws opsworks stack'
14
+ class_option :verbose, type: :boolean, aliases: '-v', desc: 'Provides additional information when running for debugging purposes.'
15
+ class_option :command_for_run_command, type: :string, aliases: '-c', desc: 'The command to use when run_command'
16
+ class_option :recipes, type: :string, aliases: '-r', desc: 'The recipes to use when run_command execute_recipes'
17
+ class_option :options_for_run_command, type: :string, aliases: '-o', desc: 'options for run_command such as current, all_in_once or one_by_one'
12
18
  end
13
19
 
14
20
  private
@@ -16,7 +22,7 @@ module Qops::DeployHelpers
16
22
  def config
17
23
  return @_config if @_config
18
24
  Qops::Environment.notifiers
19
- @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config])
25
+ @_config ||= Qops::Environment.new(profile: options[:profile], force_config: options[:force_config], verbose: options[:verbose])
20
26
 
21
27
  fail "Invalid configure deploy_type detected: #{@_config.deploy_type}" unless %w[staging production].include?(@_config.deploy_type)
22
28
 
@@ -108,7 +114,7 @@ module Qops::DeployHelpers
108
114
  return 'master' unless config.deploy_type == 'staging'
109
115
  if options[:branch].present?
110
116
  options[:branch]
111
- elsif `git --version` # rubocop:disable Lint/LiteralInCondition
117
+ elsif `git --version` # rubocop:disable Lint/LiteralAsCondition
112
118
  `git symbolic-ref --short HEAD`.strip
113
119
  else
114
120
  'master'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
2
4
  include Qops::DeployHelpers
3
5
 
@@ -55,9 +57,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
55
57
 
56
58
  # Start the instance if necessary
57
59
  print 'Booting instance ...'
58
- unless %w[online booting].include?(instance.status)
59
- config.opsworks.start_instance(instance_id: instance_id)
60
- end
60
+ config.opsworks.start_instance(instance_id: instance_id) unless %w[online booting].include?(instance.status)
61
61
 
62
62
  manifest = {
63
63
  environment: config.deploy_type,
@@ -144,9 +144,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
144
144
  def clean
145
145
  initialize_run
146
146
 
147
- if config.deploy_type == 'production'
148
- fail "Cannot clean instances in a #{config.deploy_type} environment"
149
- end
147
+ fail "Cannot clean instances in a #{config.deploy_type} environment" if config.deploy_type == 'production'
150
148
 
151
149
  terminated_instances = []
152
150
 
@@ -194,20 +192,42 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
194
192
  initialize_run
195
193
  instances = retrieve_instances
196
194
 
197
- puts "Preparing to run command to all servers (#{instances.map(&:hostname).join(', ')})"
195
+ command = options[:command_for_run_command] || ask('Which command you want to execute?', limited_to: %w[setup configure install_dependencies update_dependencies execute_recipes])
196
+
197
+ option = options[:options_for_run_command] || ask('Which command you want to execute?', limited_to: %w[current all_in_once one_by_one])
198
198
 
199
- command = ask('Which command you want to execute?', limited_to: %w[setup configure install_dependencies update_dependencies])
199
+ puts "Preparing to run command to all servers (#{instances.map(&:hostname).join(', ')})" if option != 'current'
200
200
 
201
- option = ask('Which command you want to execute?', limited_to: %w[all_in_once one_by_one])
201
+ recipes = options[:recipes] || ask('Recipes list?') if command == 'execute_recipes'
202
202
 
203
203
  base_deployment_params = {
204
204
  stack_id: config.stack_id,
205
- command: { name: command.to_s }
205
+ command: {
206
+ name: command.to_s
207
+ }
206
208
  }
207
209
 
210
+ base_deployment_params[:command][:args] = { recipes: recipes.split(',') } if recipes
211
+
212
+ puts "#{base_deployment_params}"
213
+
208
214
  manifest = { environment: config.deploy_type }
209
215
 
210
216
  case option
217
+ when 'current'
218
+
219
+ instance = retrieve_instance if config.deploy_type == 'staging'
220
+
221
+ if instance.nil?
222
+ puts 'No instance available to execute_recipes'
223
+ exit(0)
224
+ else
225
+ instance_id = instance.instance_id
226
+ end
227
+
228
+ print "Run command #{command} on instance #{instance_id}"
229
+ deployment_params = base_deployment_params.deep_dup
230
+ run_opsworks_command(base_deployment_params, [instance_id])
211
231
  when 'all_in_once'
212
232
  print "Run command #{command} on all instances at once ..."
213
233
  deployment_params = base_deployment_params.deep_dup
@@ -297,9 +317,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
297
317
 
298
318
  def terminate_instance(instance_id)
299
319
  # Remove schedule if time based instance
300
- if config.autoscale_type == 'timer'
301
- config.opsworks.set_time_based_auto_scaling(instance_id: instance_id, auto_scaling_schedule: {})
302
- end
320
+ config.opsworks.set_time_based_auto_scaling(instance_id: instance_id, auto_scaling_schedule: {}) if config.autoscale_type == 'timer'
303
321
 
304
322
  # Get the instance from the id
305
323
  instance = retrieve_instance(instance_id)
@@ -314,9 +332,7 @@ class Qops::Instance < Thor # rubocop:disable Metrics/ClassLength
314
332
 
315
333
  # Attempt to shutdown the instance
316
334
  print "Attempting instance #{instance_id} - #{instance.hostname} shutdown ..."
317
- unless instance.status == 'stopped'
318
- config.opsworks.stop_instance(instance_id: instance_id)
319
- end
335
+ config.opsworks.stop_instance(instance_id: instance_id) unless instance.status == 'stopped'
320
336
 
321
337
  manifest = {
322
338
  environment: config.deploy_type,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Qops::Stack < Thor
2
4
  include Qops::DeployHelpers
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'quandl/config'
2
4
 
3
5
  module Qops
@@ -26,17 +28,35 @@ module Qops
26
28
  puts Rainbow(message).bg(:black).red
27
29
  when :warning
28
30
  puts Rainbow(message).bg(:black).yellow
31
+ when :good
32
+ puts Rainbow(message).bg(:black).green
29
33
  else
30
34
  puts message
31
35
  end
32
36
  end
33
37
 
34
- def initialize(profile: nil, force_config: false)
38
+ def initialize(profile: nil, force_config: false, verbose: false)
35
39
  @_aws_config = { region: configuration.region }
36
40
  @_aws_config[:profile] = profile unless profile.nil?
41
+
37
42
  @_force_config = force_config
38
- profile.nil? ? opsworks.config.credentials.credentials : @_aws_config[:profile] = profile
39
- puts Rainbow("using aws profile #{profile}").bg(:black).green unless profile.nil?
43
+ @_verbose = verbose
44
+
45
+ if profile.nil?
46
+ opsworks.config.credentials.credentials
47
+ else
48
+ parsed_creds = Aws.shared_config.instance_variable_get('@parsed_credentials')[profile]
49
+ role_credentials = Aws::AssumeRoleCredentials.new(
50
+ role_arn: parsed_creds['role_arn'],
51
+ role_session_name: profile
52
+ )
53
+ @_aws_config[:credentials] = role_credentials
54
+
55
+ puts Rainbow("Using AWS profile #{profile}").bg(:black).green
56
+ end
57
+
58
+ Aws.config.update(@_aws_config)
59
+
40
60
  puts Rainbow('Forcing Qops to read the opsworks parameter strictly from yaml') if force_config
41
61
  %w[deploy_type region app_name].each do |v|
42
62
  fail "Please configure #{v} before continuing." unless option?(v)
@@ -55,12 +75,12 @@ module Qops
55
75
  end
56
76
 
57
77
  def stack_id(options = {})
58
- return configuration.stack_id if @_force_config
78
+ return configuration.stack_id if force_config?
59
79
  stack(options).stack_id
60
80
  end
61
81
 
62
82
  def subnet(options = {})
63
- return configuration.subnet if @_force_config
83
+ return configuration.subnet if force_config?
64
84
  stack(options).default_subnet_id
65
85
  end
66
86
 
@@ -69,9 +89,9 @@ module Qops
69
89
  end
70
90
 
71
91
  def layer_id(_options = {})
72
- return configuration.layer_id if @_force_config
92
+ return configuration.layer_id if force_config?
73
93
  name = configuration.layer_name
74
- puts "searching for #{name}"
94
+ verbose_output("Searching for layer : #{name}")
75
95
  layer = layers.find { |l| l.name.match(/#{name}/i) }
76
96
  layer.layer_id
77
97
  end
@@ -85,7 +105,7 @@ module Qops
85
105
  end
86
106
 
87
107
  def application_id(options = {})
88
- return configuration.application_id if @_force_config
108
+ return configuration.application_id if force_config?
89
109
  apps(options).first.app_id
90
110
  end
91
111
 
@@ -136,13 +156,25 @@ module Qops
136
156
  end
137
157
 
138
158
  def elb
139
- @_elb_client ||= Aws::ElasticLoadBalancing::Client.new(region: 'us-east-1', profile: @_aws_config[:profile])
159
+ @_elb_client ||= Aws::ElasticLoadBalancing::Client.new(**@_aws_config)
140
160
  end
141
161
 
142
162
  def cookbook_json
143
163
  configuration.cookbook_json || 'custom.json'
144
164
  end
145
165
 
166
+ def verbose?
167
+ @_verbose
168
+ end
169
+
170
+ def verbose_output(text)
171
+ self.class.print_with_colour(text, :warning) if verbose?
172
+ end
173
+
174
+ def force_config?
175
+ @_force_config
176
+ end
177
+
146
178
  def option?(key)
147
179
  respond_to?(key.to_sym) || configuration.instance_variable_get(:@table).keys.include?(key.to_sym)
148
180
  end
@@ -172,18 +204,24 @@ module Qops
172
204
  :stack_id
173
205
  else
174
206
  id = identity_from_config
175
- msg = Rainbow("Using opsworks.yml config #{id}: #{configuration.send(id)}")
176
- puts(msg.bg(:black).green)
207
+ self.class.print_with_colour("Using opsworks.yml config #{id}: #{configuration.send(id)}", :good)
177
208
  id
178
209
  end
179
210
  end
180
211
 
181
212
  def search_stack(key, value)
182
- stack = opsworks.describe_stacks.stacks.find { |s| s.send(key) == value }
213
+ verbose_output("Searching for stack : #{value}")
214
+
215
+ stack = opsworks.describe_stacks.stacks.find do |s|
216
+ verbose_output("Found stack: #{s.send(key)}")
217
+ s.send(key) == value
218
+ end
219
+
183
220
  unless stack
184
- puts Rainbow("Could not find stack with #{key} = #{value}").bg(:black).red
221
+ self.class.print_with_colour("Could not find stack with #{key} = #{value}", :error)
185
222
  exit(-1)
186
223
  end
224
+
187
225
  stack
188
226
  end
189
227
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Qops::Helpers
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qops
4
- VERSION = '1.6.1'.freeze
4
+ VERSION = '1.8.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Basset
@@ -12,22 +12,28 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2017-10-20 00:00:00.000000000 Z
15
+ date: 2020-05-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
- name: qthor
18
+ name: activesupport
19
19
  requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.19.1.4
23
+ version: 4.2.1
24
+ - - "<"
25
+ - !ruby/object:Gem::Version
26
+ version: '7.0'
24
27
  type: :runtime
25
28
  prerelease: false
26
29
  version_requirements: !ruby/object:Gem::Requirement
27
30
  requirements:
28
31
  - - ">="
29
32
  - !ruby/object:Gem::Version
30
- version: 0.19.1.4
33
+ version: 4.2.1
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '7.0'
31
37
  - !ruby/object:Gem::Dependency
32
38
  name: aws-sdk
33
39
  requirement: !ruby/object:Gem::Requirement
@@ -46,58 +52,58 @@ dependencies:
46
52
  name: quandl-config
47
53
  requirement: !ruby/object:Gem::Requirement
48
54
  requirements:
49
- - - ">="
55
+ - - "~>"
50
56
  - !ruby/object:Gem::Version
51
- version: 0.1.0
57
+ version: 1.0.0
52
58
  type: :runtime
53
59
  prerelease: false
54
60
  version_requirements: !ruby/object:Gem::Requirement
55
61
  requirements:
56
- - - ">="
62
+ - - "~>"
57
63
  - !ruby/object:Gem::Version
58
- version: 0.1.0
64
+ version: 1.0.0
59
65
  - !ruby/object:Gem::Dependency
60
66
  name: quandl-slack
61
67
  requirement: !ruby/object:Gem::Requirement
62
68
  requirements:
63
- - - ">="
69
+ - - "~>"
64
70
  - !ruby/object:Gem::Version
65
- version: '0'
71
+ version: 0.0.2
66
72
  type: :runtime
67
73
  prerelease: false
68
74
  version_requirements: !ruby/object:Gem::Requirement
69
75
  requirements:
70
- - - ">="
76
+ - - "~>"
71
77
  - !ruby/object:Gem::Version
72
- version: '0'
78
+ version: 0.0.2
73
79
  - !ruby/object:Gem::Dependency
74
- name: activesupport
80
+ name: rainbow
75
81
  requirement: !ruby/object:Gem::Requirement
76
82
  requirements:
77
- - - ">="
83
+ - - "~>"
78
84
  - !ruby/object:Gem::Version
79
- version: 4.2.1
85
+ version: 2.0.0
80
86
  type: :runtime
81
87
  prerelease: false
82
88
  version_requirements: !ruby/object:Gem::Requirement
83
89
  requirements:
84
- - - ">="
90
+ - - "~>"
85
91
  - !ruby/object:Gem::Version
86
- version: 4.2.1
92
+ version: 2.0.0
87
93
  - !ruby/object:Gem::Dependency
88
- name: rainbow
94
+ name: thor
89
95
  requirement: !ruby/object:Gem::Requirement
90
96
  requirements:
91
97
  - - "~>"
92
98
  - !ruby/object:Gem::Version
93
- version: 2.0.0
99
+ version: 0.20.0
94
100
  type: :runtime
95
101
  prerelease: false
96
102
  version_requirements: !ruby/object:Gem::Requirement
97
103
  requirements:
98
104
  - - "~>"
99
105
  - !ruby/object:Gem::Version
100
- version: 2.0.0
106
+ version: 0.20.0
101
107
  description: Help to automate opsworks project deployments with single commands.
102
108
  email:
103
109
  - support@quandl.com
@@ -110,6 +116,7 @@ files:
110
116
  - bin/qops
111
117
  - lib/qops.rb
112
118
  - lib/qops/cookbook/cookbook.rb
119
+ - lib/qops/cookbook/helpers.rb
113
120
  - lib/qops/deployment/app.rb
114
121
  - lib/qops/deployment/helpers.rb
115
122
  - lib/qops/deployment/instances.rb
@@ -136,8 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
143
  - !ruby/object:Gem::Version
137
144
  version: '0'
138
145
  requirements: []
139
- rubyforge_project:
140
- rubygems_version: 2.6.12
146
+ rubygems_version: 3.0.8
141
147
  signing_key:
142
148
  specification_version: 4
143
149
  summary: Helper commands for deployment of opsworks projects.