stack_master 2.3.0 → 2.14.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.
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.