stack_master 2.3.0 → 2.14.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +22 -0
  3. data/README.md +100 -23
  4. data/lib/stack_master/aws_driver/cloud_formation.rb +5 -2
  5. data/lib/stack_master/aws_driver/s3.rb +5 -5
  6. data/lib/stack_master/change_set.rb +5 -5
  7. data/lib/stack_master/cli.rb +49 -15
  8. data/lib/stack_master/cloudformation_interpolating_eruby.rb +57 -0
  9. data/lib/stack_master/cloudformation_template_eruby.rb +32 -0
  10. data/lib/stack_master/commands/apply.rb +2 -14
  11. data/lib/stack_master/commands/compile.rb +1 -1
  12. data/lib/stack_master/commands/drift.rb +118 -0
  13. data/lib/stack_master/commands/init.rb +1 -1
  14. data/lib/stack_master/commands/nag.rb +30 -0
  15. data/lib/stack_master/commands/resources.rb +1 -1
  16. data/lib/stack_master/commands/status.rb +1 -1
  17. data/lib/stack_master/commands/tidy.rb +1 -1
  18. data/lib/stack_master/commands/validate.rb +1 -1
  19. data/lib/stack_master/config.rb +9 -1
  20. data/lib/stack_master/diff.rb +45 -0
  21. data/lib/stack_master/identity.rb +37 -5
  22. data/lib/stack_master/parameter_loader.rb +4 -5
  23. data/lib/stack_master/parameter_resolvers/acm_certificate.rb +2 -2
  24. data/lib/stack_master/parameter_resolvers/ami_finder.rb +3 -3
  25. data/lib/stack_master/parameter_resolvers/latest_container.rb +1 -1
  26. data/lib/stack_master/parameter_resolvers/parameter_store.rb +3 -3
  27. data/lib/stack_master/parameter_resolvers/stack_output.rb +1 -1
  28. data/lib/stack_master/parameter_validator.rb +53 -0
  29. data/lib/stack_master/role_assumer.rb +3 -2
  30. data/lib/stack_master/security_group_finder.rb +1 -1
  31. data/lib/stack_master/sns_topic_finder.rb +1 -1
  32. data/lib/stack_master/sparkle_formation/compile_time/empty_validator.rb +1 -1
  33. data/lib/stack_master/sparkle_formation/template_file.rb +2 -50
  34. data/lib/stack_master/stack.rb +23 -10
  35. data/lib/stack_master/stack_definition.rb +27 -10
  36. data/lib/stack_master/stack_differ.rb +15 -39
  37. data/lib/stack_master/stack_events/presenter.rb +1 -1
  38. data/lib/stack_master/template_compilers/cfndsl.rb +3 -2
  39. data/lib/stack_master/template_compilers/sparkle_formation.rb +1 -1
  40. data/lib/stack_master/template_compilers/yaml_erb.rb +19 -0
  41. data/lib/stack_master/template_utils.rb +9 -3
  42. data/lib/stack_master/validator.rb +25 -8
  43. data/lib/stack_master/version.rb +1 -1
  44. data/lib/stack_master.rb +23 -2
  45. metadata +73 -17
@@ -27,23 +27,17 @@ module StackMaster
27
27
  template_default_parameters.merge(parameters)
28
28
  end
29
29
 
30
- def missing_parameters?
31
- parameters_with_defaults.any? do |key, value|
32
- value == nil
33
- end
34
- end
35
-
36
30
  def self.find(region, stack_name)
37
31
  cf = StackMaster.cloud_formation_driver
38
- cf_stack = cf.describe_stacks(stack_name: stack_name).stacks.first
32
+ cf_stack = cf.describe_stacks({ stack_name: stack_name }).stacks.first
39
33
  return unless cf_stack
40
34
  parameters = cf_stack.parameters.inject({}) do |params_hash, param_struct|
41
35
  params_hash[param_struct.parameter_key] = param_struct.parameter_value
42
36
  params_hash
43
37
  end
44
- template_body ||= cf.get_template(stack_name: stack_name, template_stage: 'Original').template_body
38
+ template_body ||= cf.get_template({ stack_name: stack_name, template_stage: 'Original' }).template_body
45
39
  template_format = TemplateUtils.identify_template_format(template_body)
46
- stack_policy_body ||= cf.get_stack_policy(stack_name: stack_name).stack_policy_body
40
+ stack_policy_body ||= cf.get_stack_policy({ stack_name: stack_name }).stack_policy_body
47
41
  outputs = cf_stack.outputs
48
42
 
49
43
  new(region: region,
@@ -62,7 +56,7 @@ module StackMaster
62
56
  end
63
57
 
64
58
  def self.generate(stack_definition, config)
65
- parameter_hash = ParameterLoader.load(stack_definition.parameter_files)
59
+ parameter_hash = ParameterLoader.load(parameter_files: stack_definition.all_parameter_files, parameters: stack_definition.parameters)
66
60
  template_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:template_parameters])
67
61
  compile_time_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:compile_time_parameters])
68
62
  template_body = TemplateCompiler.compile(config, stack_definition.compiler, stack_definition.template_dir, stack_definition.template, compile_time_parameters, stack_definition.compiler_options)
@@ -81,6 +75,25 @@ module StackMaster
81
75
  stack_policy_body: stack_policy_body)
82
76
  end
83
77
 
78
+ def self.generate_without_parameters(stack_definition, config)
79
+ parameter_hash = ParameterLoader.load(parameter_files: stack_definition.all_parameter_files, parameters: stack_definition.parameters)
80
+ compile_time_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:compile_time_parameters])
81
+ template_body = TemplateCompiler.compile(config, stack_definition.compiler, stack_definition.template_dir, stack_definition.template, compile_time_parameters, stack_definition.compiler_options)
82
+ template_format = TemplateUtils.identify_template_format(template_body)
83
+ stack_policy_body = if stack_definition.stack_policy_file_path
84
+ File.read(stack_definition.stack_policy_file_path)
85
+ end
86
+ new(region: stack_definition.region,
87
+ stack_name: stack_definition.stack_name,
88
+ tags: stack_definition.tags,
89
+ parameters: {},
90
+ template_body: template_body,
91
+ template_format: template_format,
92
+ role_arn: stack_definition.role_arn,
93
+ notification_arns: stack_definition.notification_arns,
94
+ stack_policy_body: stack_policy_body)
95
+ end
96
+
84
97
  def max_template_size(use_s3)
85
98
  return TemplateUtils::MAX_S3_TEMPLATE_SIZE if use_s3
86
99
  TemplateUtils::MAX_TEMPLATE_SIZE
@@ -16,7 +16,10 @@ module StackMaster
16
16
  :additional_parameter_lookup_dirs,
17
17
  :s3,
18
18
  :files,
19
- :compiler_options
19
+ :compiler_options,
20
+ :parameters_dir,
21
+ :parameters,
22
+ :parameter_files
20
23
 
21
24
  attr_reader :compiler
22
25
 
@@ -32,8 +35,12 @@ module StackMaster
32
35
  @compiler = nil
33
36
  super
34
37
  @additional_parameter_lookup_dirs ||= []
38
+ @base_dir ||= ""
35
39
  @template_dir ||= File.join(@base_dir, 'templates')
40
+ @parameters_dir ||= File.join(@base_dir, 'parameters')
36
41
  @allowed_accounts = Array(@allowed_accounts)
42
+ @parameters ||= {}
43
+ @parameter_files ||= []
37
44
  end
38
45
 
39
46
  def ==(other)
@@ -56,13 +63,9 @@ module StackMaster
56
63
  @compiler_options == other.compiler_options
57
64
  end
58
65
 
59
- def compiler=(compiler)
60
- @compiler = compiler.&to_sym
61
- end
62
-
63
66
  def template_file_path
64
67
  return unless template
65
- File.expand_path(File.join(template_dir, template))
68
+ File.expand_path(template, template_dir)
66
69
  end
67
70
 
68
71
  def files_dir
@@ -85,7 +88,15 @@ module StackMaster
85
88
  Utils.change_extension(template, 'json')
86
89
  end
87
90
 
88
- def parameter_files
91
+ def all_parameter_files
92
+ if parameter_files.empty?
93
+ parameter_files_from_globs
94
+ else
95
+ parameter_files
96
+ end
97
+ end
98
+
99
+ def parameter_files_from_globs
89
100
  parameter_file_globs.map(&Dir.method(:glob)).flatten
90
101
  end
91
102
 
@@ -101,20 +112,26 @@ module StackMaster
101
112
  !s3.nil?
102
113
  end
103
114
 
115
+ def parameter_files
116
+ Array(@parameter_files).map do |file|
117
+ File.expand_path(file, parameters_dir)
118
+ end
119
+ end
120
+
104
121
  private
105
122
 
106
123
  def additional_parameter_lookup_globs
107
124
  additional_parameter_lookup_dirs.map do |a|
108
- File.join(base_dir, 'parameters', a, "#{stack_name_glob}.y*ml")
125
+ File.join(parameters_dir, a, "#{stack_name_glob}.y*ml")
109
126
  end
110
127
  end
111
128
 
112
129
  def region_parameter_glob
113
- File.join(base_dir, 'parameters', "#{region}", "#{stack_name_glob}.y*ml")
130
+ File.join(parameters_dir, "#{region}", "#{stack_name_glob}.y*ml")
114
131
  end
115
132
 
116
133
  def default_parameter_glob
117
- File.join(base_dir, 'parameters', "#{stack_name_glob}.y*ml")
134
+ File.join(parameters_dir, "#{stack_name_glob}.y*ml")
118
135
  end
119
136
 
120
137
  def stack_name_glob
@@ -10,13 +10,13 @@ module StackMaster
10
10
 
11
11
  def proposed_template
12
12
  return @proposed_stack.template_body unless @proposed_stack.template_format == :json
13
- JSON.pretty_generate(JSON.parse(@proposed_stack.template_body))
13
+ JSON.pretty_generate(JSON.parse(@proposed_stack.template_body)) + "\n"
14
14
  end
15
15
 
16
16
  def current_template
17
17
  return '' unless @current_stack
18
18
  return @current_stack.template_body unless @current_stack.template_format == :json
19
- JSON.pretty_generate(TemplateUtils.template_hash(@current_stack.template_body))
19
+ JSON.pretty_generate(TemplateUtils.template_hash(@current_stack.template_body)) + "\n"
20
20
  end
21
21
 
22
22
  def current_parameters
@@ -39,24 +39,30 @@ module StackMaster
39
39
  end
40
40
 
41
41
  def body_different?
42
- body_diff != ''
42
+ body_diff.different?
43
43
  end
44
44
 
45
45
  def body_diff
46
- @body_diff ||= Diffy::Diff.new(current_template, proposed_template, context: 7, include_diff_info: true).to_s
46
+ @body_diff ||= Diff.new(name: 'Stack',
47
+ before: current_template,
48
+ after: proposed_template,
49
+ context: 7)
47
50
  end
48
51
 
49
52
  def params_different?
50
- params_diff != ''
53
+ parameters_diff.different?
51
54
  end
52
55
 
53
- def params_diff
54
- @param_diff ||= Diffy::Diff.new(current_parameters, proposed_parameters, {}).to_s
56
+ def parameters_diff
57
+ @param_diff ||= Diff.new(name: 'Parameters',
58
+ before: current_parameters,
59
+ after: proposed_parameters)
55
60
  end
56
61
 
57
62
  def output_diff
58
- display_diff('Stack', body_diff)
59
- display_diff('Parameters', params_diff)
63
+ body_diff.display
64
+ parameters_diff.display
65
+
60
66
  unless noecho_keys.empty?
61
67
  StackMaster.stdout.puts " * can not tell if NoEcho parameters are different."
62
68
  end
@@ -83,38 +89,8 @@ module StackMaster
83
89
 
84
90
  private
85
91
 
86
- def display_diff(thing, diff)
87
- StackMaster.stdout.print "#{thing} diff: "
88
- if diff == ''
89
- StackMaster.stdout.puts "No changes"
90
- else
91
- StackMaster.stdout.puts
92
- diff.each_line do |line|
93
- if line.start_with?('+')
94
- StackMaster.stdout.print colorize(line, :green)
95
- elsif line.start_with?('-')
96
- StackMaster.stdout.print colorize(line, :red)
97
- else
98
- StackMaster.stdout.print line
99
- end
100
- end
101
- end
102
- end
103
-
104
92
  def sort_params(hash)
105
93
  hash.sort.to_h
106
94
  end
107
-
108
- def colorize(text, color)
109
- if colorize?
110
- text.colorize(color)
111
- else
112
- text
113
- end
114
- end
115
-
116
- def colorize?
117
- ENV.fetch('COLORIZE') { 'true' } == 'true'
118
- end
119
95
  end
120
96
  end
@@ -10,7 +10,7 @@ module StackMaster
10
10
  end
11
11
 
12
12
  def print_event(event)
13
- @io.puts "#{event.timestamp.localtime} #{event.logical_resource_id} #{event.resource_type} #{event.resource_status} #{event.resource_status_reason}".colorize(event_colour(event))
13
+ @io.puts Rainbow("#{event.timestamp.localtime} #{event.logical_resource_id} #{event.resource_type} #{event.resource_status} #{event.resource_status_reason}").color(event_colour(event))
14
14
  end
15
15
 
16
16
  def event_colour(event)
@@ -2,14 +2,15 @@ module StackMaster::TemplateCompilers
2
2
  class Cfndsl
3
3
  def self.require_dependencies
4
4
  require 'cfndsl'
5
+ require 'json'
5
6
  end
6
7
 
7
8
  def self.compile(template_dir, template, compile_time_parameters, _compiler_options = {})
8
- CfnDsl.disable_binding
9
9
  CfnDsl::ExternalParameters.defaults.clear # Ensure there's no leakage across invocations
10
10
  CfnDsl::ExternalParameters.defaults(compile_time_parameters.symbolize_keys)
11
11
  template_file_path = File.join(template_dir, template)
12
- ::CfnDsl.eval_file_with_extras(template_file_path).to_json
12
+ json_hash = ::CfnDsl.eval_file_with_extras(template_file_path).as_json
13
+ JSON.pretty_generate(json_hash)
13
14
  end
14
15
 
15
16
  StackMaster::TemplateCompiler.register(:cfndsl, self)
@@ -22,7 +22,7 @@ module StackMaster::TemplateCompilers
22
22
  sparkle_template.compile_state = create_state(definitions, compile_time_parameters)
23
23
  end
24
24
 
25
- JSON.pretty_generate(sparkle_template)
25
+ JSON.pretty_generate(sparkle_template.dump)
26
26
  end
27
27
 
28
28
  private
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StackMaster::TemplateCompilers
4
+ class YamlErb
5
+ def self.require_dependencies
6
+ require 'yaml'
7
+ end
8
+
9
+ def self.compile(template_dir, template, compile_time_parameters, _compiler_options = {})
10
+ template_file_path = File.join(template_dir, template)
11
+ template = StackMaster::CloudFormationTemplateEruby.new(File.read(template_file_path))
12
+ template.filename = template_file_path
13
+
14
+ template.result(params: compile_time_parameters)
15
+ end
16
+
17
+ StackMaster::TemplateCompiler.register(:yaml_erb, self)
18
+ end
19
+ end
@@ -2,12 +2,18 @@ module StackMaster
2
2
  module TemplateUtils
3
3
  MAX_TEMPLATE_SIZE = 51200
4
4
  MAX_S3_TEMPLATE_SIZE = 460800
5
+ # Matches if the first non-whitespace character is a '{', handling cases
6
+ # with leading whitespace and extra (whitespace-only) lines.
7
+ JSON_IDENTIFICATION_PATTERN = Regexp.new('\A\s*{', Regexp::MULTILINE)
5
8
 
6
9
  extend self
7
10
 
8
11
  def identify_template_format(template_body)
9
- return :json if template_body =~ /^{/x # ignore leading whitespaces
10
- :yaml
12
+ if template_body =~ JSON_IDENTIFICATION_PATTERN
13
+ :json
14
+ else
15
+ :yaml
16
+ end
11
17
  end
12
18
 
13
19
  def template_hash(template_body=nil)
@@ -28,4 +34,4 @@ module StackMaster
28
34
  JSON.dump(template_hash(template_body))
29
35
  end
30
36
  end
31
- end
37
+ end
@@ -1,21 +1,22 @@
1
1
  module StackMaster
2
2
  class Validator
3
- def self.valid?(stack_definition, config)
4
- new(stack_definition, config).perform
3
+ def self.valid?(stack_definition, config, options)
4
+ new(stack_definition, config, options).perform
5
5
  end
6
6
 
7
- def initialize(stack_definition, config)
7
+ def initialize(stack_definition, config, options)
8
8
  @stack_definition = stack_definition
9
9
  @config = config
10
+ @options = options
10
11
  end
11
12
 
12
13
  def perform
13
- parameter_hash = ParameterLoader.load(@stack_definition.parameter_files)
14
- compile_time_parameters = ParameterResolver.resolve(@config, @stack_definition, parameter_hash[:compile_time_parameters])
15
-
16
14
  StackMaster.stdout.print "#{@stack_definition.stack_name}: "
17
- template_body = TemplateCompiler.compile(@config, @stack_definition.compiler, @stack_definition.template_dir, @stack_definition.template, compile_time_parameters, @stack_definition.compiler_options)
18
- cf.validate_template(template_body: TemplateUtils.maybe_compressed_template_body(template_body))
15
+ if validate_template_parameters? && parameter_validator.missing_parameters?
16
+ StackMaster.stdout.puts "invalid\n#{parameter_validator.error_message}"
17
+ return false
18
+ end
19
+ cf.validate_template(template_body: TemplateUtils.maybe_compressed_template_body(stack.template_body))
19
20
  StackMaster.stdout.puts "valid"
20
21
  true
21
22
  rescue Aws::CloudFormation::Errors::ValidationError => e
@@ -25,8 +26,24 @@ module StackMaster
25
26
 
26
27
  private
27
28
 
29
+ def validate_template_parameters?
30
+ @options.validate_template_parameters
31
+ end
32
+
28
33
  def cf
29
34
  @cf ||= StackMaster.cloud_formation_driver
30
35
  end
36
+
37
+ def stack
38
+ @stack ||= if validate_template_parameters?
39
+ Stack.generate(@stack_definition, @config)
40
+ else
41
+ Stack.generate_without_parameters(@stack_definition, @config)
42
+ end
43
+ end
44
+
45
+ def parameter_validator
46
+ @parameter_validator ||= ParameterValidator.new(stack: stack, stack_definition: @stack_definition)
47
+ end
31
48
  end
32
49
  end
@@ -1,3 +1,3 @@
1
1
  module StackMaster
2
- VERSION = "2.3.0"
2
+ VERSION = "2.14.1"
3
3
  end
data/lib/stack_master.rb CHANGED
@@ -7,7 +7,9 @@ require 'aws-sdk-ecr'
7
7
  require 'aws-sdk-s3'
8
8
  require 'aws-sdk-sns'
9
9
  require 'aws-sdk-ssm'
10
- require 'colorize'
10
+ require 'aws-sdk-iam'
11
+ require 'rainbow'
12
+ require 'active_support'
11
13
  require 'active_support/core_ext/hash/keys'
12
14
  require 'active_support/core_ext/object/blank'
13
15
  require 'active_support/core_ext/string/inflections'
@@ -23,6 +25,7 @@ module StackMaster
23
25
  autoload :CLI, 'stack_master/cli'
24
26
  autoload :CtrlC, 'stack_master/ctrl_c'
25
27
  autoload :Command, 'stack_master/command'
28
+ autoload :Diff, 'stack_master/diff'
26
29
  autoload :VERSION, 'stack_master/version'
27
30
  autoload :Stack, 'stack_master/stack'
28
31
  autoload :Prompter, 'stack_master/prompter'
@@ -42,18 +45,23 @@ module StackMaster
42
45
  autoload :StackDefinition, 'stack_master/stack_definition'
43
46
  autoload :TemplateCompiler, 'stack_master/template_compiler'
44
47
  autoload :Identity, 'stack_master/identity'
48
+ autoload :CloudFormationInterpolatingEruby, 'stack_master/cloudformation_interpolating_eruby'
49
+ autoload :CloudFormationTemplateEruby, 'stack_master/cloudformation_template_eruby'
45
50
 
46
51
  autoload :StackDiffer, 'stack_master/stack_differ'
47
52
  autoload :Validator, 'stack_master/validator'
53
+ autoload :ParameterValidator, 'stack_master/parameter_validator'
48
54
 
49
55
  require 'stack_master/template_compilers/sparkle_formation'
50
56
  require 'stack_master/template_compilers/json'
51
57
  require 'stack_master/template_compilers/yaml'
58
+ require 'stack_master/template_compilers/yaml_erb'
52
59
  require 'stack_master/template_compilers/cfndsl'
53
60
 
54
61
  module Commands
55
62
  autoload :TerminalHelper, 'stack_master/commands/terminal_helper'
56
63
  autoload :Apply, 'stack_master/commands/apply'
64
+ autoload :Drift, 'stack_master/commands/drift'
57
65
  autoload :Events, 'stack_master/commands/events'
58
66
  autoload :Outputs, 'stack_master/commands/outputs'
59
67
  autoload :Init, 'stack_master/commands/init'
@@ -66,6 +74,7 @@ module StackMaster
66
74
  autoload :Delete, 'stack_master/commands/delete'
67
75
  autoload :Status, 'stack_master/commands/status'
68
76
  autoload :Tidy, 'stack_master/commands/tidy'
77
+ autoload :Nag, 'stack_master/commands/nag'
69
78
  end
70
79
 
71
80
  module ParameterResolvers
@@ -128,7 +137,7 @@ module StackMaster
128
137
 
129
138
  def debug(message)
130
139
  return unless debug?
131
- stderr.puts "[DEBUG] #{message}".colorize(:green)
140
+ stderr.puts Rainbow("[DEBUG] #{message}").color(:green)
132
141
  end
133
142
 
134
143
  def quiet!
@@ -196,4 +205,16 @@ module StackMaster
196
205
  def stderr=(io)
197
206
  @stderr = io
198
207
  end
208
+
209
+ def colorize(text, color)
210
+ if colorize?
211
+ Rainbow(text).color(color)
212
+ else
213
+ text
214
+ end
215
+ end
216
+
217
+ def colorize?
218
+ ENV.fetch('COLORIZE') { 'true' } == 'true'
219
+ end
199
220
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stack_master
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Hodgkiss
8
8
  - Glen Stampoultzis
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-03-18 00:00:00.000000000 Z
12
+ date: 2024-03-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -143,20 +143,20 @@ dependencies:
143
143
  requirements:
144
144
  - - ">="
145
145
  - !ruby/object:Gem::Version
146
- version: 4.5.2
146
+ version: 4.6.0
147
147
  - - "<"
148
148
  - !ruby/object:Gem::Version
149
- version: '5'
149
+ version: '6'
150
150
  type: :runtime
151
151
  prerelease: false
152
152
  version_requirements: !ruby/object:Gem::Requirement
153
153
  requirements:
154
154
  - - ">="
155
155
  - !ruby/object:Gem::Version
156
- version: 4.5.2
156
+ version: 4.6.0
157
157
  - - "<"
158
158
  - !ruby/object:Gem::Version
159
- version: '5'
159
+ version: '6'
160
160
  - !ruby/object:Gem::Dependency
161
161
  name: aws-sdk-acm
162
162
  requirement: !ruby/object:Gem::Requirement
@@ -255,6 +255,34 @@ dependencies:
255
255
  - - "~>"
256
256
  - !ruby/object:Gem::Version
257
257
  version: '1'
258
+ - !ruby/object:Gem::Dependency
259
+ name: aws-sdk-iam
260
+ requirement: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '1'
265
+ type: :runtime
266
+ prerelease: false
267
+ version_requirements: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '1'
272
+ - !ruby/object:Gem::Dependency
273
+ name: sorted_set
274
+ requirement: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ type: :runtime
280
+ prerelease: false
281
+ version_requirements: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
258
286
  - !ruby/object:Gem::Dependency
259
287
  name: diffy
260
288
  requirement: !ruby/object:Gem::Requirement
@@ -284,7 +312,7 @@ dependencies:
284
312
  - !ruby/object:Gem::Version
285
313
  version: '0'
286
314
  - !ruby/object:Gem::Dependency
287
- name: colorize
315
+ name: rainbow
288
316
  requirement: !ruby/object:Gem::Requirement
289
317
  requirements:
290
318
  - - ">="
@@ -357,16 +385,16 @@ dependencies:
357
385
  name: cfndsl
358
386
  requirement: !ruby/object:Gem::Requirement
359
387
  requirements:
360
- - - "<"
388
+ - - "~>"
361
389
  - !ruby/object:Gem::Version
362
- version: '1.0'
390
+ version: '1'
363
391
  type: :runtime
364
392
  prerelease: false
365
393
  version_requirements: !ruby/object:Gem::Requirement
366
394
  requirements:
367
- - - "<"
395
+ - - "~>"
368
396
  - !ruby/object:Gem::Version
369
- version: '1.0'
397
+ version: '1'
370
398
  - !ruby/object:Gem::Dependency
371
399
  name: multi_json
372
400
  requirement: !ruby/object:Gem::Requirement
@@ -423,6 +451,26 @@ dependencies:
423
451
  - - ">="
424
452
  - !ruby/object:Gem::Version
425
453
  version: '0'
454
+ - !ruby/object:Gem::Dependency
455
+ name: cfn-nag
456
+ requirement: !ruby/object:Gem::Requirement
457
+ requirements:
458
+ - - ">="
459
+ - !ruby/object:Gem::Version
460
+ version: 0.6.7
461
+ - - "<"
462
+ - !ruby/object:Gem::Version
463
+ version: 0.9.0
464
+ type: :runtime
465
+ prerelease: false
466
+ version_requirements: !ruby/object:Gem::Requirement
467
+ requirements:
468
+ - - ">="
469
+ - !ruby/object:Gem::Version
470
+ version: 0.6.7
471
+ - - "<"
472
+ - !ruby/object:Gem::Version
473
+ version: 0.9.0
426
474
  description: ''
427
475
  email:
428
476
  - steve@hodgkiss.me
@@ -432,6 +480,7 @@ executables:
432
480
  extensions: []
433
481
  extra_rdoc_files: []
434
482
  files:
483
+ - LICENSE.txt
435
484
  - README.md
436
485
  - bin/stack_master
437
486
  - lib/stack_master.rb
@@ -439,15 +488,19 @@ files:
439
488
  - lib/stack_master/aws_driver/s3.rb
440
489
  - lib/stack_master/change_set.rb
441
490
  - lib/stack_master/cli.rb
491
+ - lib/stack_master/cloudformation_interpolating_eruby.rb
492
+ - lib/stack_master/cloudformation_template_eruby.rb
442
493
  - lib/stack_master/command.rb
443
494
  - lib/stack_master/commands/apply.rb
444
495
  - lib/stack_master/commands/compile.rb
445
496
  - lib/stack_master/commands/delete.rb
446
497
  - lib/stack_master/commands/diff.rb
498
+ - lib/stack_master/commands/drift.rb
447
499
  - lib/stack_master/commands/events.rb
448
500
  - lib/stack_master/commands/init.rb
449
501
  - lib/stack_master/commands/lint.rb
450
502
  - lib/stack_master/commands/list_stacks.rb
503
+ - lib/stack_master/commands/nag.rb
451
504
  - lib/stack_master/commands/outputs.rb
452
505
  - lib/stack_master/commands/resources.rb
453
506
  - lib/stack_master/commands/status.rb
@@ -456,6 +509,7 @@ files:
456
509
  - lib/stack_master/commands/validate.rb
457
510
  - lib/stack_master/config.rb
458
511
  - lib/stack_master/ctrl_c.rb
512
+ - lib/stack_master/diff.rb
459
513
  - lib/stack_master/identity.rb
460
514
  - lib/stack_master/paged_response_accumulator.rb
461
515
  - lib/stack_master/parameter_loader.rb
@@ -472,6 +526,7 @@ files:
472
526
  - lib/stack_master/parameter_resolvers/security_group.rb
473
527
  - lib/stack_master/parameter_resolvers/sns_topic_name.rb
474
528
  - lib/stack_master/parameter_resolvers/stack_output.rb
529
+ - lib/stack_master/parameter_validator.rb
475
530
  - lib/stack_master/prompter.rb
476
531
  - lib/stack_master/resolver_array.rb
477
532
  - lib/stack_master/role_assumer.rb
@@ -506,6 +561,7 @@ files:
506
561
  - lib/stack_master/template_compilers/json.rb
507
562
  - lib/stack_master/template_compilers/sparkle_formation.rb
508
563
  - lib/stack_master/template_compilers/yaml.rb
564
+ - lib/stack_master/template_compilers/yaml_erb.rb
509
565
  - lib/stack_master/template_utils.rb
510
566
  - lib/stack_master/test_driver/cloud_formation.rb
511
567
  - lib/stack_master/test_driver/s3.rb
@@ -523,9 +579,9 @@ licenses:
523
579
  metadata:
524
580
  bug_tracker_uri: https://github.com/envato/stack_master/issues
525
581
  changelog_uri: https://github.com/envato/stack_master/blob/master/CHANGELOG.md
526
- documentation_uri: https://www.rubydoc.info/gems/stack_master/2.3.0
527
- source_code_uri: https://github.com/envato/stack_master/tree/v2.3.0
528
- post_install_message:
582
+ documentation_uri: https://www.rubydoc.info/gems/stack_master/2.14.1
583
+ source_code_uri: https://github.com/envato/stack_master/tree/v2.14.1
584
+ post_install_message:
529
585
  rdoc_options: []
530
586
  require_paths:
531
587
  - lib
@@ -540,8 +596,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
540
596
  - !ruby/object:Gem::Version
541
597
  version: '0'
542
598
  requirements: []
543
- rubygems_version: 3.1.2
544
- signing_key:
599
+ rubygems_version: 3.3.26
600
+ signing_key:
545
601
  specification_version: 4
546
602
  summary: StackMaster is a sure-footed way of creating, updating and keeping track
547
603
  of Amazon (AWS) CloudFormation stacks.