moonshot 2.0.0.beta6 → 3.0.4

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.
Files changed (80) hide show
  1. checksums.yaml +5 -5
  2. data/bin/moonshot +4 -1
  3. data/lib/default/bin/build.sh +0 -0
  4. data/lib/moonshot/account_context.rb +2 -0
  5. data/lib/moonshot/always_use_default_source.rb +5 -4
  6. data/lib/moonshot/artifact_repository/s3_bucket.rb +11 -5
  7. data/lib/moonshot/artifact_repository/s3_bucket_via_github_releases.rb +7 -7
  8. data/lib/moonshot/ask_user_source.rb +2 -0
  9. data/lib/moonshot/build_mechanism/github_release.rb +9 -2
  10. data/lib/moonshot/build_mechanism/script.rb +8 -7
  11. data/lib/moonshot/build_mechanism/travis_deploy.rb +5 -5
  12. data/lib/moonshot/build_mechanism/version_proxy.rb +13 -0
  13. data/lib/moonshot/change_set.rb +24 -34
  14. data/lib/moonshot/command.rb +3 -1
  15. data/lib/moonshot/command_line.rb +12 -9
  16. data/lib/moonshot/command_line_dispatcher.rb +5 -7
  17. data/lib/moonshot/commands/build.rb +6 -0
  18. data/lib/moonshot/commands/console.rb +2 -0
  19. data/lib/moonshot/commands/create.rb +16 -2
  20. data/lib/moonshot/commands/delete.rb +9 -0
  21. data/lib/moonshot/commands/deploy.rb +4 -8
  22. data/lib/moonshot/commands/doctor.rb +2 -0
  23. data/lib/moonshot/commands/generate_template.rb +46 -0
  24. data/lib/moonshot/commands/interactive_command.rb +15 -0
  25. data/lib/moonshot/commands/list.rb +2 -0
  26. data/lib/moonshot/commands/new.rb +5 -2
  27. data/lib/moonshot/commands/parameter_arguments.rb +5 -4
  28. data/lib/moonshot/commands/parent_stack_option.rb +2 -0
  29. data/lib/moonshot/commands/push.rb +2 -0
  30. data/lib/moonshot/commands/show_all_events_option.rb +2 -0
  31. data/lib/moonshot/commands/ssh.rb +4 -0
  32. data/lib/moonshot/commands/status.rb +2 -0
  33. data/lib/moonshot/commands/tag_arguments.rb +20 -0
  34. data/lib/moonshot/commands/update.rb +8 -1
  35. data/lib/moonshot/commands/version.rb +2 -0
  36. data/lib/moonshot/controller.rb +28 -13
  37. data/lib/moonshot/controller_config.rb +13 -27
  38. data/lib/moonshot/creds_helper.rb +2 -0
  39. data/lib/moonshot/deployment_mechanism/code_deploy.rb +44 -37
  40. data/lib/moonshot/doctor_helper.rb +14 -15
  41. data/lib/moonshot/dynamic_template.rb +76 -0
  42. data/lib/moonshot/interactive_logger_proxy.rb +4 -4
  43. data/lib/moonshot/json_stack_template.rb +3 -0
  44. data/lib/moonshot/parameter_collection.rb +3 -0
  45. data/lib/moonshot/parent_stack_parameter_loader.rb +7 -3
  46. data/lib/moonshot/resources.rb +2 -0
  47. data/lib/moonshot/resources_helper.rb +5 -1
  48. data/lib/moonshot/shell.rb +8 -8
  49. data/lib/moonshot/ssh_command.rb +2 -0
  50. data/lib/moonshot/ssh_command_builder.rb +3 -1
  51. data/lib/moonshot/ssh_config.rb +3 -2
  52. data/lib/moonshot/ssh_fork_executor.rb +2 -0
  53. data/lib/moonshot/ssh_target_selector.rb +3 -1
  54. data/lib/moonshot/stack.rb +73 -55
  55. data/lib/moonshot/stack_asg_printer.rb +14 -12
  56. data/lib/moonshot/stack_config.rb +3 -2
  57. data/lib/moonshot/stack_events_poller.rb +3 -1
  58. data/lib/moonshot/stack_list_printer.rb +2 -0
  59. data/lib/moonshot/stack_lister.rb +6 -2
  60. data/lib/moonshot/stack_output_printer.rb +2 -0
  61. data/lib/moonshot/stack_parameter.rb +5 -9
  62. data/lib/moonshot/stack_parameter_printer.rb +3 -1
  63. data/lib/moonshot/stack_template.rb +2 -0
  64. data/lib/moonshot/task.rb +3 -0
  65. data/lib/moonshot/tools/asg_rollout/asg.rb +22 -21
  66. data/lib/moonshot/tools/asg_rollout/asg_instance.rb +2 -0
  67. data/lib/moonshot/tools/asg_rollout/hook_exec_environment.rb +2 -0
  68. data/lib/moonshot/tools/asg_rollout/instance_health.rb +2 -0
  69. data/lib/moonshot/tools/asg_rollout.rb +16 -14
  70. data/lib/moonshot/tools/asg_rollout_config.rb +2 -0
  71. data/lib/moonshot/unicode_table.rb +5 -3
  72. data/lib/moonshot/yaml_stack_template.rb +2 -0
  73. data/lib/moonshot.rb +13 -1
  74. data/lib/plugins/backup.rb +24 -30
  75. data/lib/plugins/code_deploy_setup.rb +4 -2
  76. data/lib/plugins/dynamic_template.rb +36 -0
  77. data/lib/plugins/encrypted_parameters/kms_key.rb +26 -5
  78. data/lib/plugins/encrypted_parameters/parameter_encrypter.rb +2 -0
  79. data/lib/plugins/encrypted_parameters.rb +6 -2
  80. metadata +189 -51
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 29bfc137789e7c406cf1a235f693e12b142baa97
4
- data.tar.gz: a3a9eb8d496c61bb93f9cb7f1d97e41f6dd06fd9
2
+ SHA256:
3
+ metadata.gz: d87f616758ca8f4b32b4af436e73c565665b8753d38b3fd14d478f6a6d347ce4
4
+ data.tar.gz: 616b51d3d59341f58beb48efea6af2dba7a3821ef0dace26f4dd1eae395a34bf
5
5
  SHA512:
6
- metadata.gz: '00381ff4a8552595b8aaa0f1cec95b6c892045cad3b6a6c921bd5fb5e379405db1f7491a4282b68c18aaa55a441ce43df078b5a4100457cf2e28a9024918b737'
7
- data.tar.gz: 0e84cbf7b3f6378991a8faf7070a143f14fdca00eccea19d6ae457f0284c725975e16723151da2bc5b3185d33c472ddd0ee028f894fab70059187b25393d0fdf
6
+ metadata.gz: 8532967756fa789d68ce86fbdffc25bb053f5c483d784285b43ed1c934c40d72c03dc3ec73674bb6d06eb58bf2ec3b6f3641156ea6f7797e387e3d16ecf3ecc8
7
+ data.tar.gz: a4bcf9e2b1d6367670aa7cba505d4d561231d114dce658c2a92b10786f8eae24c25ba7052057966e5d6c8a5569633f4676eedda7d198483f7ef0c9446bd132da
data/bin/moonshot CHANGED
@@ -1,11 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require 'moonshot'
3
5
 
4
6
  # This is the main entry point for the `moonshot` command-line tool.
5
7
  begin
6
8
  Moonshot::CommandLine.new.run!
7
- rescue => e
9
+ rescue StandardError => e
8
10
  warn "#{e} (at #{e.backtrace.first})"
9
11
  raise e if ENV['MOONSHOT_BACKTRACE']
12
+
10
13
  exit 1
11
14
  end
File without changes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module AccountContext
3
5
  def self.get
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  # The AlwaysUseDefaultSource will always use the previous value in
3
5
  # the stack, or use the default value during stack creation. This is
@@ -6,12 +8,11 @@ module Moonshot
6
8
  # answer files or command-line arguments will always apply.
7
9
  class AlwaysUseDefaultSource
8
10
  def get(sp)
9
- unless sp.default?
10
- raise "Parameter #{sp.name} does not have a default, cannot use AlwaysUseDefaultSource!"
11
- end
12
-
13
11
  # Don't do anything, the default will apply on create, and the
14
12
  # previous value will be used on update.
13
+ return if sp.default?
14
+
15
+ raise "Parameter #{sp.name} does not have a default, cannot use AlwaysUseDefaultSource!"
15
16
  end
16
17
  end
17
18
  end
@@ -1,3 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../resources_helper'
4
+ require_relative '../creds_helper'
5
+ require_relative '../doctor_helper'
6
+
1
7
  # The S3Bucket stores builds in an S3 Bucket.
2
8
  #
3
9
  # For example:
@@ -19,7 +25,7 @@ class Moonshot::ArtifactRepository::S3Bucket
19
25
 
20
26
  def store_hook(build_mechanism, version_name)
21
27
  unless build_mechanism.respond_to?(:output_file)
22
- raise "S3Bucket does not know how to store artifacts from #{build_mechanism.class}, no method '#output_file'." # rubocop:disable LineLength
28
+ raise "S3Bucket does not know how to store artifacts from #{build_mechanism.class}, no method '#output_file'."
23
29
  end
24
30
 
25
31
  file = build_mechanism.output_file
@@ -41,7 +47,7 @@ class Moonshot::ArtifactRepository::S3Bucket
41
47
  def upload_to_s3(file, key)
42
48
  s3_client.put_object(
43
49
  acl: 'bucket-owner-full-control',
44
- key: key,
50
+ key:,
45
51
  body: File.open(file),
46
52
  bucket: @bucket_name,
47
53
  storage_class: 'STANDARD_IA'
@@ -51,7 +57,7 @@ class Moonshot::ArtifactRepository::S3Bucket
51
57
  def doctor_check_bucket_exists
52
58
  s3_client.get_bucket_location(bucket: @bucket_name)
53
59
  success "Bucket '#{@bucket_name}' exists."
54
- rescue => e
60
+ rescue StandardError => e
55
61
  # This is warning because the role you use for deployment may not actually
56
62
  # be able to read builds, however the instance role assigned to the nodes
57
63
  # might.
@@ -68,9 +74,9 @@ class Moonshot::ArtifactRepository::S3Bucket
68
74
  )
69
75
  s3_client.delete_object(key: 'test-object', bucket: @bucket_name)
70
76
  success 'Bucket is writable, new builds can be uploaded.'
71
- rescue => e
77
+ rescue StandardError => e
72
78
  # This is a warning because you may deploy to an environment where you have
73
79
  # read access to builds, but could not publish a new build.
74
- warning('Could not write to bucket, you may still be able to deploy existing builds.', e.message) # rubocop:disable LineLength
80
+ warning('Could not write to bucket, you may still be able to deploy existing builds.', e.message)
75
81
  end
76
82
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'moonshot/artifact_repository/s3_bucket'
2
4
  require 'moonshot/shell'
3
5
  require 'digest'
@@ -9,7 +11,7 @@ require 'retriable'
9
11
  module Moonshot::ArtifactRepository
10
12
  # S3 Bucket repository backed by GitHub releases.
11
13
  # If a SemVer package isn't found in S3, it is copied from GitHub releases.
12
- class S3BucketViaGithubReleases < S3Bucket # rubocop:disable ClassLength
14
+ class S3BucketViaGithubReleases < S3Bucket # rubocop:disable Metrics/ClassLength
13
15
  include Moonshot::BuildMechanism
14
16
  include Moonshot::Shell
15
17
 
@@ -36,9 +38,7 @@ module Moonshot::ArtifactRepository
36
38
  # artifact repositories a hook before deploy.
37
39
  def filename_for_version(version)
38
40
  s3_name = super
39
- if !@output_file && release?(version) && !in_s3?(s3_name)
40
- github_to_s3(version, s3_name)
41
- end
41
+ github_to_s3(version, s3_name) if !@output_file && release?(version) && !in_s3?(s3_name)
42
42
  s3_name
43
43
  end
44
44
 
@@ -51,7 +51,7 @@ module Moonshot::ArtifactRepository
51
51
  end
52
52
 
53
53
  def in_s3?(key)
54
- s3_client.head_object(key: key, bucket: bucket_name)
54
+ s3_client.head_object(key:, bucket: bucket_name)
55
55
  rescue ::Aws::S3::Errors::NotFound
56
56
  false
57
57
  end
@@ -62,7 +62,7 @@ module Moonshot::ArtifactRepository
62
62
 
63
63
  # If there is a checksum file, attach it as well. We only support MD5
64
64
  # since that's what S3 uses.
65
- checksum_file = File.basename(file, '.tar.gz') + '.md5'
65
+ checksum_file = "#{File.basename(file, '.tar.gz')}.md5"
66
66
  cmd += " --attach=#{checksum_file}" if File.exist?(checksum_file)
67
67
 
68
68
  sh_step(cmd)
@@ -218,7 +218,7 @@ module Moonshot::ArtifactRepository
218
218
 
219
219
  def doctor_check_hub_release_download
220
220
  sh_out('hub release download --help')
221
- rescue
221
+ rescue StandardError
222
222
  critical '`hub release download` command missing, upgrade hub.' \
223
223
  ' See https://github.com/github/hub/pull/1103'
224
224
  else
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'colorize'
2
4
 
3
5
  module Moonshot
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
  require 'moonshot/shell'
3
5
  require 'open3'
@@ -31,6 +33,8 @@ module Moonshot::BuildMechanism
31
33
  parser.on('-s', '--[no-]skip-ci-status', 'Skips checks on CI jobs', TrueClass) do |value|
32
34
  @skip_ci_status = value
33
35
  end
36
+
37
+ parser
34
38
  end
35
39
 
36
40
  def doctor_hook
@@ -83,6 +87,8 @@ module Moonshot::BuildMechanism
83
87
  say("Changelog for #{version}", :yellow)
84
88
  say("#{@changes}\n\n")
85
89
 
90
+ return unless Moonshot.config.interactive
91
+
86
92
  q = "Do you want to tag and release this commit as #{version}? [y/n]"
87
93
  raise 'Release declined.' unless yes?(q)
88
94
  end
@@ -131,6 +137,7 @@ module Moonshot::BuildMechanism
131
137
 
132
138
  def hub_create_release(semver, commitish, changelog_entry)
133
139
  return if hub_release_exists(semver)
140
+
134
141
  message = "#{semver}\n\n#{changelog_entry}"
135
142
  cmd = "hub release create #{semver} --commitish=#{commitish}"
136
143
  cmd << ' --prerelease' if semver.pre || semver.build
@@ -216,7 +223,7 @@ module Moonshot::BuildMechanism
216
223
 
217
224
  def doctor_check_upstream
218
225
  sh_out('git remote | grep ^upstream$')
219
- rescue => e
226
+ rescue StandardError => e
220
227
  critical "git remote `upstream` not found.\n#{e.message}"
221
228
  else
222
229
  success 'git remote `upstream` exists.'
@@ -224,7 +231,7 @@ module Moonshot::BuildMechanism
224
231
 
225
232
  def doctor_check_hub_auth
226
233
  sh_out('hub ci-status 0.0.0')
227
- rescue => e
234
+ rescue StandardError => e
228
235
  critical "`hub` failed, install hub and authorize it.\n#{e.message}"
229
236
  else
230
237
  success '`hub` installed and authorized.'
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'open3'
2
- include Open3
3
4
 
4
5
  # Compile a release artifact using a shell script.
5
6
  #
@@ -18,6 +19,8 @@ class Moonshot::BuildMechanism::Script
18
19
  include Moonshot::ResourcesHelper
19
20
  include Moonshot::DoctorHelper
20
21
 
22
+ include Open3
23
+
21
24
  attr_reader :output_file
22
25
 
23
26
  def initialize(script, output_file: 'output.tar.gz')
@@ -35,12 +38,12 @@ class Moonshot::BuildMechanism::Script
35
38
  'OUTPUT_FILE' => @output_file
36
39
  }
37
40
  ilog.start_threaded "Running Script: #{@script}" do |s|
38
- run_script(s, env: env)
41
+ run_script(s, env:)
39
42
  end
40
43
  end
41
44
 
42
45
  def post_build_hook(_version)
43
- unless File.exist?(@output_file) # rubocop:disable GuardClause
46
+ unless File.exist?(@output_file) # rubocop:disable Style/GuardClause
44
47
  raise 'Build command did not produce output file!'
45
48
  end
46
49
  end
@@ -61,10 +64,8 @@ class Moonshot::BuildMechanism::Script
61
64
  end
62
65
 
63
66
  result = wait.value
64
- if result.exitstatus == 0
65
- step.success "Build script #{@script} exited successfully!"
66
- end
67
- unless result.exitstatus == 0
67
+ step.success "Build script #{@script} exited successfully!" if result.exitstatus.zero?
68
+ unless result.exitstatus.zero?
68
69
  ilog.error "Build script failed with exit status #{result.exitstatus}!"
69
70
  ilog.error output.join("\n")
70
71
  step.failure "Build script #{@script} failed with exit status #{result.exitstatus}!"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'moonshot/shell'
2
4
  require 'travis'
3
5
  require 'travis/pro'
@@ -25,8 +27,7 @@ module Moonshot::BuildMechanism
25
27
  @cli_args = "-r #{@slug} #{@endpoint}"
26
28
  end
27
29
 
28
- def pre_build_hook(_)
29
- end
30
+ def pre_build_hook(_); end
30
31
 
31
32
  def build_hook(version)
32
33
  job_number = find_build_and_job(version)
@@ -34,8 +35,7 @@ module Moonshot::BuildMechanism
34
35
  check_build(version)
35
36
  end
36
37
 
37
- def post_build_hook(_)
38
- end
38
+ def post_build_hook(_); end
39
39
 
40
40
  private
41
41
 
@@ -120,7 +120,7 @@ module Moonshot::BuildMechanism
120
120
 
121
121
  def doctor_check_travis_auth
122
122
  sh_out("bundle exec travis raw #{@endpoint} repos/#{@slug}")
123
- rescue => e
123
+ rescue StandardError => e
124
124
  critical "`travis` not available or not authorized.\n#{e.message}"
125
125
  else
126
126
  success '`travis` installed and authorized.'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
  require 'semantic'
3
5
 
@@ -37,6 +39,17 @@ class Moonshot::BuildMechanism::VersionProxy
37
39
  active(version).post_build_hook(version)
38
40
  end
39
41
 
42
+ def build_cli_hook(parser)
43
+ # Expose any command line arguments provided by the build mechanisms. We
44
+ # don't know the version at this point, so we can't call the hook on only
45
+ # the one we're going to use, which may result in options being exposed that
46
+ # are only applicable for one of the build mechanisms.
47
+ parser = @release.build_cli_hook(parser) if @release.respond_to?(:build_cli_hook)
48
+ parser = @dev.build_cli_hook(parser) if @dev.respond_to?(:build_cli_hook)
49
+
50
+ parser
51
+ end
52
+
40
53
  private
41
54
 
42
55
  def active(version)
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  class ChangeSet
3
- attr_reader :name
4
- attr_reader :stack_name
5
+ attr_reader :name, :stack_name
5
6
 
6
7
  def initialize(name, stack_name)
7
8
  @name = name
@@ -11,9 +12,7 @@ module Moonshot
11
12
  end
12
13
 
13
14
  def confirm?
14
- unless Moonshot.config.interactive
15
- raise 'Cannot confirm ChangeSet when interactive mode is disabled!'
16
- end
15
+ raise 'Cannot confirm ChangeSet when interactive mode is disabled!' unless Moonshot.config.interactive
17
16
 
18
17
  loop do
19
18
  print 'Apply changes? '
@@ -21,6 +20,7 @@ module Moonshot
21
20
 
22
21
  return true if resp == 'yes'
23
22
  return false if resp == 'no'
23
+
24
24
  puts "Please enter 'yes' or 'no'!"
25
25
  end
26
26
  end
@@ -39,9 +39,10 @@ module Moonshot
39
39
  @change_set.changes.map(&:resource_change).each do |c|
40
40
  puts "* #{c.action} #{c.logical_resource_id} (#{c.resource_type})"
41
41
 
42
- if c.replacement == 'True'
42
+ case c.replacement
43
+ when 'True'
43
44
  puts ' - Will be replaced'
44
- elsif c.replacement == 'Conditional'
45
+ when 'Conditional'
45
46
  puts ' - May be replaced (Conditional)'
46
47
  end
47
48
 
@@ -60,47 +61,36 @@ module Moonshot
60
61
  wait_for_change_set unless @change_set
61
62
  @cf_client.execute_change_set(
62
63
  change_set_name: @name,
63
- stack_name: @stack_name)
64
+ stack_name: @stack_name
65
+ )
64
66
  end
65
67
 
66
68
  def delete
67
69
  wait_for_change_set unless @change_set
68
70
  @cf_client.delete_change_set(
69
71
  change_set_name: @name,
70
- stack_name: @stack_name)
72
+ stack_name: @stack_name
73
+ )
71
74
  rescue Aws::CloudFormation::Errors::InvalidChangeSetStatus
72
75
  sleep 1
73
76
  retry
74
77
  end
75
78
 
76
- # NOTE: At the time of this patch, AWS-SDK native Waiters do not
77
- # have support for ChangeSets. Once they add this, we can make
78
- # this code much better.
79
- # Still no support for this waiter, but it's planned.
80
- # https://github.com/aws/aws-sdk-ruby/issues/1388
81
79
  def wait_for_change_set
82
- wait_seconds = Moonshot.config.changeset_wait_time || 90
83
- start = Time.now.to_i
84
-
85
- loop do
86
- resp = @cf_client.describe_change_set(
87
- change_set_name: @name,
88
- stack_name: @stack_name)
89
-
90
- if %w(CREATE_COMPLETE FAILED).include?(resp.status)
91
- @change_set = resp
92
- return
93
- end
94
-
95
- if Time.now.to_i > start + wait_seconds
96
- raise "ChangeSet did not complete creation within #{wait_seconds} seconds!"
80
+ begin
81
+ @cf_client.wait_until(:change_set_create_complete,
82
+ stack_name: @stack_name,
83
+ change_set_name: @name)
84
+ rescue Aws::Waiters::Errors::FailureStateError => e
85
+ if e.message != 'stopped waiting, encountered a failure state'
86
+ throw e
87
+ else
88
+ puts "The change set didn't contain any new changes."
97
89
  end
98
-
99
- sleep 5 # http://bit.ly/1qY1ZXJ
100
- # Wait 5 seconds because other waiters seem to wait at least 5 seconds
101
- # before repeating requests.
102
- # See: https://github.com/aws/aws-sdk-ruby/blob/master/aws-sdk-core/apis/cloudformation/2010-05-15/waiters-2.json#L5
103
90
  end
91
+
92
+ @change_set = @cf_client.describe_change_set(stack_name: @stack_name,
93
+ change_set_name: @name)
104
94
  end
105
95
  end
106
96
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'optparse'
2
4
 
3
5
  module Moonshot
@@ -44,7 +46,7 @@ module Moonshot
44
46
  # Degrade to a more compatible logger if the terminal seems outdated,
45
47
  # or at the users request.
46
48
  if !$stdout.isatty || !@use_interactive_logger
47
- log = Logger.new(STDOUT)
49
+ log = Logger.new($stdout)
48
50
  controller.config.interactive_logger = InteractiveLoggerProxy.new(log)
49
51
  end
50
52
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  # This class implements the command-line `moonshot` tool.
3
5
  class CommandLine
@@ -10,7 +12,7 @@ module Moonshot
10
12
  @classes || []
11
13
  end
12
14
 
13
- def run! # rubocop:disable CyclomaticComplexity, MethodLength, PerceivedComplexity
15
+ def run! # rubocop:disable Metrics/MethodLength
14
16
  # Commands defined as Moonshot::Commands require a properly
15
17
  # configured Moonshot.rb and supporting files. Without them, we only
16
18
  # support `--help` and `new`.
@@ -24,7 +26,7 @@ module Moonshot
24
26
 
25
27
  if Dir.pwd == '/'
26
28
  warn 'No Moonfile.rb found, are you in a project? Maybe you need to '\
27
- 'create one with `moonshot new <app_name>`?'
29
+ 'create one with `moonshot new <app_name>`?'
28
30
  raise 'No Moonfile found'
29
31
  end
30
32
 
@@ -51,7 +53,7 @@ module Moonshot
51
53
 
52
54
  # Determine what command is being run, which should be the first argument.
53
55
  command = ARGV.shift
54
- if %w(--help -h help).include?(command) || command.nil?
56
+ if %w[--help -h help].include?(command) || command.nil?
55
57
  usage
56
58
  return
57
59
  end
@@ -94,7 +96,7 @@ module Moonshot
94
96
  max_len = fields.map(&:first).map(&:size).max
95
97
 
96
98
  fields.each do |f|
97
- line = format(" %-#{max_len}s # %s", *f)
99
+ line = format(" %-#{max_len}s # %s", *f) # rubocop:disable Lint/FormatParameterMismatch
98
100
  warn line
99
101
  end
100
102
  end
@@ -117,9 +119,9 @@ module Moonshot
117
119
 
118
120
  def commandify(klass)
119
121
  word = klass.to_s.split('::').last
120
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2'.freeze)
121
- word.gsub!(/([a-z\d])([A-Z])/, '\1_\2'.freeze)
122
- word.tr!('_'.freeze, '-'.freeze)
122
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
123
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
124
+ word.tr!('_', '-')
123
125
  word.downcase!
124
126
  word
125
127
  end
@@ -127,10 +129,11 @@ module Moonshot
127
129
  def handle_early_commands
128
130
  # If this is a legacy (Thor) help command, re-write it as
129
131
  # OptionParser format.
130
- if ARGV[0] == 'help'
132
+ case ARGV[0]
133
+ when 'help'
131
134
  ARGV.delete_at(0)
132
135
  ARGV.push('-h')
133
- elsif ARGV[0] == 'new'
136
+ when 'new'
134
137
  app_name = ARGV[1]
135
138
  ::Moonshot::Commands::New.run!(app_name)
136
139
  return true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  class CommandLineDispatcher
3
5
  def initialize(command, klass, args)
@@ -46,18 +48,14 @@ module Moonshot
46
48
 
47
49
  # Each mechanism / plugin may manipulate the OptionParser object
48
50
  # associated with this command.
49
- [:build_mechanism, :deployment_mechanism, :artifact_repository].each do |prov|
51
+ %i[build_mechanism deployment_mechanism artifact_repository].each do |prov|
50
52
  provider = Moonshot.config.send(prov)
51
53
 
52
- if provider.respond_to?(hook_func_name(@command))
53
- parser = provider.send(hook_func_name(@command), parser)
54
- end
54
+ parser = provider.send(hook_func_name(@command), parser) if provider.respond_to?(hook_func_name(@command))
55
55
  end
56
56
 
57
57
  Moonshot.config.plugins.each do |plugin|
58
- if plugin.respond_to?(hook_func_name(@command))
59
- parser = plugin.send(hook_func_name(@command), parser)
60
- end
58
+ parser = plugin.send(hook_func_name(@command), parser) if plugin.respond_to?(hook_func_name(@command))
61
59
  end
62
60
 
63
61
  parser
@@ -1,6 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'interactive_command'
4
+
1
5
  module Moonshot
2
6
  module Commands
3
7
  class Build < Moonshot::Command
8
+ include InteractiveCommand
9
+
4
10
  self.usage = 'build VERSION'
5
11
  self.description = 'Build a release artifact, ready for deployment'
6
12
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pry'
2
4
 
3
5
  module Moonshot
@@ -1,7 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'parameter_arguments'
4
+ require_relative 'tag_arguments'
5
+ require_relative 'show_all_events_option'
6
+ require_relative 'parent_stack_option'
7
+
1
8
  module Moonshot
2
9
  module Commands
3
10
  class Create < Moonshot::Command
4
11
  include ParameterArguments
12
+ include TagArguments
5
13
  include ShowAllEventsOption
6
14
  include ParentStackOption
7
15
 
@@ -14,13 +22,19 @@ module Moonshot
14
22
  @deploy = true
15
23
 
16
24
  parser = super
17
- parser.on('-d', '--[no-]deploy', TrueClass, 'Choose if code should be deployed immediately after the stack is created') do |v| # rubocop:disable LineLength
25
+ desc = 'Choose if code should be deployed immediately after the stack is created'
26
+ parser.on('-d', '--[no-]deploy', TrueClass, desc) do |v|
18
27
  @deploy = v
19
28
  end
20
29
 
21
- parser.on('--version VERSION_NAME', 'Version for initial deployment. If unset, a new development build is created from the local directory') do |v| # rubocop:disable LineLength
30
+ desc = 'Version for initial deployment. If unset, a new development build is created from the local directory'
31
+ parser.on('--version VERSION_NAME', desc) do |v|
22
32
  @version = v
23
33
  end
34
+
35
+ parser.on('--template-file=FILE', 'Override the path to the CloudFormation template.') do |v|
36
+ Moonshot.config.template_file = v
37
+ end
24
38
  end
25
39
 
26
40
  def execute
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class Delete < Moonshot::Command
@@ -6,6 +8,13 @@ module Moonshot
6
8
  self.usage = 'delete [options]'
7
9
  self.description = 'Delete an existing environment'
8
10
 
11
+ def parser
12
+ parser = super
13
+ parser.on('--template-file=FILE', 'Override the path to the CloudFormation template.') do |v|
14
+ Moonshot.config.template_file = v
15
+ end
16
+ end
17
+
9
18
  def execute
10
19
  controller.delete
11
20
  end
@@ -1,17 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class Deploy < Moonshot::Command
6
+ include InteractiveCommand
7
+
4
8
  self.usage = 'deploy VERSION'
5
9
  self.description = 'Deploy a versioned release to the environment'
6
10
 
7
- def parser
8
- parser = super
9
-
10
- parser.on('--[no-]interactive', TrueClass, 'Use interactive prompts.') do |v|
11
- Moonshot.config.interactive = v
12
- end
13
- end
14
-
15
11
  def execute(version_name)
16
12
  controller.deploy_version(version_name)
17
13
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class Doctor < Moonshot::Command