stack_master 2.16.0 → 2.17.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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +18 -5
  3. data/lib/stack_master/aws_driver/cloud_formation.rb +21 -19
  4. data/lib/stack_master/aws_driver/s3.rb +18 -11
  5. data/lib/stack_master/change_set.rb +5 -5
  6. data/lib/stack_master/cli.rb +24 -9
  7. data/lib/stack_master/commands/apply.rb +5 -1
  8. data/lib/stack_master/commands/delete.rb +2 -3
  9. data/lib/stack_master/commands/drift.rb +6 -3
  10. data/lib/stack_master/commands/init.rb +6 -5
  11. data/lib/stack_master/commands/nag.rb +0 -1
  12. data/lib/stack_master/commands/resources.rb +9 -1
  13. data/lib/stack_master/commands/tidy.rb +4 -1
  14. data/lib/stack_master/config.rb +16 -11
  15. data/lib/stack_master/identity.rb +2 -1
  16. data/lib/stack_master/parameter_loader.rb +3 -4
  17. data/lib/stack_master/parameter_resolver.rb +4 -1
  18. data/lib/stack_master/parameter_resolvers/acm_certificate.rb +4 -1
  19. data/lib/stack_master/parameter_resolvers/ami_finder.rb +1 -1
  20. data/lib/stack_master/parameter_resolvers/ejson.rb +7 -4
  21. data/lib/stack_master/parameter_resolvers/env.rb +1 -2
  22. data/lib/stack_master/parameter_resolvers/latest_container.rb +6 -4
  23. data/lib/stack_master/parameter_resolvers/one_password.rb +7 -3
  24. data/lib/stack_master/parameter_resolvers/parameter_store.rb +1 -5
  25. data/lib/stack_master/parameter_resolvers/security_group.rb +1 -1
  26. data/lib/stack_master/parameter_resolvers/sso_group_id.rb +22 -0
  27. data/lib/stack_master/parameter_resolvers/stack_output.rb +3 -1
  28. data/lib/stack_master/parameter_validator.rb +1 -0
  29. data/lib/stack_master/prompter.rb +11 -10
  30. data/lib/stack_master/resolver_array.rb +0 -1
  31. data/lib/stack_master/role_assumer.rb +7 -5
  32. data/lib/stack_master/security_group_finder.rb +3 -1
  33. data/lib/stack_master/sns_topic_finder.rb +3 -2
  34. data/lib/stack_master/sparkle_formation/compile_time/allowed_pattern_validator.rb +1 -2
  35. data/lib/stack_master/sparkle_formation/compile_time/allowed_values_validator.rb +2 -3
  36. data/lib/stack_master/sparkle_formation/compile_time/definitions_validator.rb +5 -5
  37. data/lib/stack_master/sparkle_formation/compile_time/empty_validator.rb +0 -2
  38. data/lib/stack_master/sparkle_formation/compile_time/max_length_validator.rb +1 -2
  39. data/lib/stack_master/sparkle_formation/compile_time/max_size_validator.rb +1 -2
  40. data/lib/stack_master/sparkle_formation/compile_time/min_length_validator.rb +2 -3
  41. data/lib/stack_master/sparkle_formation/compile_time/min_size_validator.rb +2 -3
  42. data/lib/stack_master/sparkle_formation/compile_time/number_validator.rb +1 -2
  43. data/lib/stack_master/sparkle_formation/compile_time/parameters_validator.rb +0 -1
  44. data/lib/stack_master/sparkle_formation/compile_time/state_builder.rb +0 -2
  45. data/lib/stack_master/sparkle_formation/compile_time/string_validator.rb +2 -3
  46. data/lib/stack_master/sparkle_formation/compile_time/value_builder.rb +0 -2
  47. data/lib/stack_master/sparkle_formation/compile_time/value_validator.rb +2 -3
  48. data/lib/stack_master/sparkle_formation/compile_time/value_validator_factory.rb +11 -13
  49. data/lib/stack_master/sparkle_formation/template_file.rb +0 -2
  50. data/lib/stack_master/sso_group_id_finder.rb +36 -0
  51. data/lib/stack_master/stack.rb +47 -16
  52. data/lib/stack_master/stack_definition.rb +3 -1
  53. data/lib/stack_master/stack_differ.rb +4 -0
  54. data/lib/stack_master/stack_events/fetcher.rb +3 -1
  55. data/lib/stack_master/stack_events/presenter.rb +6 -1
  56. data/lib/stack_master/stack_events/streamer.rb +3 -1
  57. data/lib/stack_master/stack_status.rb +1 -0
  58. data/lib/stack_master/template_compilers/sparkle_formation.rb +10 -7
  59. data/lib/stack_master/template_utils.rb +6 -2
  60. data/lib/stack_master/test_driver/cloud_formation.rb +28 -10
  61. data/lib/stack_master/utils.rb +1 -0
  62. data/lib/stack_master/validator.rb +6 -5
  63. data/lib/stack_master/version.rb +1 -1
  64. data/lib/stack_master.rb +5 -0
  65. metadata +49 -8
@@ -17,10 +17,13 @@ module StackMaster
17
17
  include Utils::Initializable
18
18
 
19
19
  def template_default_parameters
20
- TemplateUtils.template_hash(template).fetch('Parameters', {}).inject({}) do |result, (parameter_name, description)|
21
- result[parameter_name] = description['Default']
22
- result
23
- end
20
+ TemplateUtils
21
+ .template_hash(template)
22
+ .fetch('Parameters', {})
23
+ .inject({}) do |result, (parameter_name, description)|
24
+ result[parameter_name] = description['Default']&.to_s
25
+ result
26
+ end
24
27
  end
25
28
 
26
29
  def parameters_with_defaults
@@ -31,6 +34,7 @@ module StackMaster
31
34
  cf = StackMaster.cloud_formation_driver
32
35
  cf_stack = cf.describe_stacks({ stack_name: stack_name }).stacks.first
33
36
  return unless cf_stack
37
+
34
38
  parameters = cf_stack.parameters.inject({}) do |params_hash, param_struct|
35
39
  params_hash[param_struct.parameter_key] = param_struct.parameter_value
36
40
  params_hash
@@ -56,14 +60,27 @@ module StackMaster
56
60
  end
57
61
 
58
62
  def self.generate(stack_definition, config)
59
- parameter_hash = ParameterLoader.load(parameter_files: stack_definition.all_parameter_files, parameters: stack_definition.parameters)
63
+ parameter_hash = ParameterLoader.load(
64
+ parameter_files: stack_definition.all_parameter_files,
65
+ parameters: stack_definition.parameters
66
+ )
60
67
  template_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:template_parameters])
61
- compile_time_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:compile_time_parameters])
62
- template_body = TemplateCompiler.compile(config, stack_definition.compiler, stack_definition.template_dir, stack_definition.template, compile_time_parameters, stack_definition.compiler_options)
68
+ compile_time_parameters = ParameterResolver.resolve(
69
+ config,
70
+ stack_definition,
71
+ parameter_hash[:compile_time_parameters]
72
+ )
73
+ template_body = TemplateCompiler.compile(
74
+ config,
75
+ stack_definition.compiler,
76
+ stack_definition.template_dir,
77
+ stack_definition.template,
78
+ compile_time_parameters,
79
+ stack_definition.compiler_options
80
+ )
63
81
  template_format = TemplateUtils.identify_template_format(template_body)
64
- stack_policy_body = if stack_definition.stack_policy_file_path
65
- File.read(stack_definition.stack_policy_file_path)
66
- end
82
+ stack_policy_body =
83
+ (File.read(stack_definition.stack_policy_file_path) if stack_definition.stack_policy_file_path)
67
84
  new(region: stack_definition.region,
68
85
  stack_name: stack_definition.stack_name,
69
86
  tags: stack_definition.tags,
@@ -76,13 +93,26 @@ module StackMaster
76
93
  end
77
94
 
78
95
  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)
96
+ parameter_hash = ParameterLoader.load(
97
+ parameter_files: stack_definition.all_parameter_files,
98
+ parameters: stack_definition.parameters
99
+ )
100
+ compile_time_parameters = ParameterResolver.resolve(
101
+ config,
102
+ stack_definition,
103
+ parameter_hash[:compile_time_parameters]
104
+ )
105
+ template_body = TemplateCompiler.compile(
106
+ config,
107
+ stack_definition.compiler,
108
+ stack_definition.template_dir,
109
+ stack_definition.template,
110
+ compile_time_parameters,
111
+ stack_definition.compiler_options
112
+ )
82
113
  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
114
+ stack_policy_body =
115
+ (File.read(stack_definition.stack_policy_file_path) if stack_definition.stack_policy_file_path)
86
116
  new(region: stack_definition.region,
87
117
  stack_name: stack_definition.stack_name,
88
118
  tags: stack_definition.tags,
@@ -96,6 +126,7 @@ module StackMaster
96
126
 
97
127
  def max_template_size(use_s3)
98
128
  return TemplateUtils::MAX_S3_TEMPLATE_SIZE if use_s3
129
+
99
130
  TemplateUtils::MAX_TEMPLATE_SIZE
100
131
  end
101
132
 
@@ -65,6 +65,7 @@ module StackMaster
65
65
 
66
66
  def template_file_path
67
67
  return unless template
68
+
68
69
  File.expand_path(template, template_dir)
69
70
  end
70
71
 
@@ -85,6 +86,7 @@ module StackMaster
85
86
 
86
87
  def s3_template_file_name
87
88
  return template if ['.json', '.yaml', '.yml'].include?(File.extname(template))
89
+
88
90
  Utils.change_extension(template, 'json')
89
91
  end
90
92
 
@@ -101,7 +103,7 @@ module StackMaster
101
103
  end
102
104
 
103
105
  def parameter_file_globs
104
- [ default_parameter_glob, region_parameter_glob ] + additional_parameter_lookup_globs
106
+ [default_parameter_glob, region_parameter_glob] + additional_parameter_lookup_globs
105
107
  end
106
108
 
107
109
  def stack_policy_file_path
@@ -10,12 +10,14 @@ module StackMaster
10
10
 
11
11
  def proposed_template
12
12
  return @proposed_stack.template_body unless @proposed_stack.template_format == :json
13
+
13
14
  JSON.pretty_generate(JSON.parse(@proposed_stack.template_body)) + "\n"
14
15
  end
15
16
 
16
17
  def current_template
17
18
  return '' unless @current_stack
18
19
  return @current_stack.template_body unless @current_stack.template_format == :json
20
+
19
21
  JSON.pretty_generate(TemplateUtils.template_hash(@current_stack.template_body)) + "\n"
20
22
  end
21
23
 
@@ -81,8 +83,10 @@ module StackMaster
81
83
 
82
84
  def single_param_update?(param_name)
83
85
  return false if param_name.blank? || @current_stack.blank? || body_different?
86
+
84
87
  differences = Hashdiff.diff(@current_stack.parameters_with_defaults, @proposed_stack.parameters_with_defaults)
85
88
  return false if differences.count != 1
89
+
86
90
  diff = differences[0]
87
91
  diff[0] == "~" && diff[1] == param_name
88
92
  end
@@ -31,7 +31,9 @@ module StackMaster
31
31
  end
32
32
 
33
33
  def fetch_events
34
- PagedResponseAccumulator.call(cf, :describe_stack_events, { stack_name: @stack_name }, :stack_events).stack_events
34
+ PagedResponseAccumulator
35
+ .call(cf, :describe_stack_events, { stack_name: @stack_name }, :stack_events)
36
+ .stack_events
35
37
  end
36
38
  end
37
39
  end
@@ -10,7 +10,12 @@ module StackMaster
10
10
  end
11
11
 
12
12
  def print_event(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))
13
+ @io.puts(
14
+ Rainbow(
15
+ "#{event.timestamp.localtime} #{event.logical_resource_id} #{event.resource_type} " \
16
+ "#{event.resource_status} #{event.resource_status_reason}"
17
+ ).color(event_colour(event))
18
+ )
14
19
  end
15
20
 
16
21
  def event_colour(event)
@@ -7,7 +7,8 @@ module StackMaster
7
7
  new(stack_name, region, **args, &block).stream
8
8
  end
9
9
 
10
- def initialize(stack_name, region, from: Time.now, break_on_finish_state: true, sleep_between_fetches: 1, io: nil, &block)
10
+ def initialize(stack_name, region, from: Time.now, break_on_finish_state: true, sleep_between_fetches: 1,
11
+ io: nil, &block)
11
12
  @stack_name = stack_name
12
13
  @region = region
13
14
  @block = block
@@ -42,6 +43,7 @@ module StackMaster
42
43
  [].tap do |unseen_events|
43
44
  events.each do |event|
44
45
  next if @seen_events.include?(event.event_id)
46
+
45
47
  @seen_events << event.event_id
46
48
  unseen_events << event
47
49
  end
@@ -39,6 +39,7 @@ module StackMaster
39
39
 
40
40
  def stack
41
41
  return @stack if defined?(@stack)
42
+
42
43
  StackMaster.cloud_formation_driver.set_region(stack_definition.region)
43
44
  @stack = find_stack
44
45
  end
@@ -4,7 +4,6 @@ require 'stack_master/sparkle_formation/compile_time/state_builder'
4
4
 
5
5
  module StackMaster::TemplateCompilers
6
6
  class SparkleFormation
7
-
8
7
  CompileTime = StackMaster::SparkleFormation::CompileTime
9
8
 
10
9
  def self.require_dependencies
@@ -28,11 +27,12 @@ module StackMaster::TemplateCompilers
28
27
  private
29
28
 
30
29
  def self.compile_sparkle_template(template_dir, template, compiler_options)
31
- sparkle_path = if compiler_options['sparkle_path']
32
- File.expand_path(compiler_options['sparkle_path'])
33
- else
34
- template_dir
35
- end
30
+ sparkle_path =
31
+ if compiler_options['sparkle_path']
32
+ File.expand_path(compiler_options['sparkle_path'])
33
+ else
34
+ template_dir
35
+ end
36
36
 
37
37
  collection = ::SparkleFormation::SparkleCollection.new
38
38
  root_pack = ::SparkleFormation::Sparkle.new(
@@ -48,7 +48,10 @@ module StackMaster::TemplateCompilers
48
48
  end
49
49
 
50
50
  if compiler_options['sparkle_pack_template']
51
- raise ArgumentError.new("Template #{template.inspect} not found in any sparkle pack") unless collection.templates['aws'].include? template
51
+ unless collection.templates['aws'].include? template
52
+ raise ArgumentError.new("Template #{template.inspect} not found in any sparkle pack")
53
+ end
54
+
52
55
  template_file_path = collection.templates['aws'][template].top['path']
53
56
  else
54
57
  template_file_path = File.join(template_dir, template)
@@ -16,8 +16,9 @@ module StackMaster
16
16
  end
17
17
  end
18
18
 
19
- def template_hash(template_body=nil)
19
+ def template_hash(template_body = nil)
20
20
  return unless template_body
21
+
21
22
  template_format = identify_template_format(template_body)
22
23
  case template_format
23
24
  when :json
@@ -30,7 +31,10 @@ module StackMaster
30
31
  def maybe_compressed_template_body(template_body)
31
32
  # Do not compress the template if it's not JSON because parsing YAML as a hash ignores
32
33
  # CloudFormation-specific tags such as !Ref
33
- return template_body if template_body.size <= MAX_TEMPLATE_SIZE || identify_template_format(template_body) != :json
34
+ if template_body.size <= MAX_TEMPLATE_SIZE || identify_template_format(template_body) != :json
35
+ return template_body
36
+ end
37
+
34
38
  JSON.dump(template_hash(template_body))
35
39
  end
36
40
  end
@@ -1,3 +1,4 @@
1
+ require 'ostruct'
1
2
  require 'securerandom'
2
3
 
3
4
  module StackMaster
@@ -98,11 +99,27 @@ module StackMaster
98
99
  change_set_id = options.fetch(:change_set_name)
99
100
  change_set = @change_sets.fetch(change_set_id)
100
101
  change_details = [
101
- OpenStruct.new(evaluation: 'Static', change_source: 'ResourceReference', target: OpenStruct.new(attribute: 'Properties', requires_recreation: 'Always', name: 'blah'))
102
+ OpenStruct.new(
103
+ evaluation: 'Static',
104
+ change_source: 'ResourceReference',
105
+ target: OpenStruct.new(
106
+ attribute: 'Properties',
107
+ requires_recreation: 'Always',
108
+ name: 'blah'
109
+ )
110
+ )
102
111
  ]
103
- change = OpenStruct.new(action: 'Modify', replacement: 'True', scope: ['Properties'], details: change_details)
112
+ change = OpenStruct.new(
113
+ action: 'Modify',
114
+ replacement: 'True',
115
+ scope: ['Properties'],
116
+ details: change_details
117
+ )
104
118
  changes = [
105
- OpenStruct.new(type: 'AWS::Resource', resource_change: change)
119
+ OpenStruct.new(
120
+ type: 'AWS::Resource',
121
+ resource_change: change
122
+ )
106
123
  ]
107
124
  OpenStruct.new(change_set.merge(changes: changes, status: 'CREATE_COMPLETE'))
108
125
  end
@@ -120,15 +137,16 @@ module StackMaster
120
137
 
121
138
  def describe_stacks(options = {})
122
139
  stack_name = options[:stack_name]
123
- stacks = if stack_name
124
- if @stacks[stack_name]
125
- [@stacks[stack_name]]
140
+ stacks =
141
+ if stack_name
142
+ if @stacks[stack_name]
143
+ [@stacks[stack_name]]
144
+ else
145
+ raise Aws::CloudFormation::Errors::ValidationError.new('', 'Stack does not exist')
146
+ end
126
147
  else
127
- raise Aws::CloudFormation::Errors::ValidationError.new('', 'Stack does not exist')
148
+ @stacks.values
128
149
  end
129
- else
130
- @stacks.values
131
- end
132
150
  OpenStruct.new(stacks: stacks, next_token: nil)
133
151
  end
134
152
 
@@ -30,6 +30,7 @@ module StackMaster
30
30
 
31
31
  def hash_to_aws_tags(tags)
32
32
  return [] if tags.nil?
33
+
33
34
  tags.inject([]) do |aws_tags, (key, value)|
34
35
  aws_tags << { key: key, value: value }
35
36
  aws_tags
@@ -35,11 +35,12 @@ module StackMaster
35
35
  end
36
36
 
37
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
38
+ @stack ||=
39
+ if validate_template_parameters?
40
+ Stack.generate(@stack_definition, @config)
41
+ else
42
+ Stack.generate_without_parameters(@stack_definition, @config)
43
+ end
43
44
  end
44
45
 
45
46
  def parameter_validator
@@ -1,3 +1,3 @@
1
1
  module StackMaster
2
- VERSION = "2.16.0"
2
+ VERSION = "2.17.1"
3
3
  end
data/lib/stack_master.rb CHANGED
@@ -4,6 +4,7 @@ require 'aws-sdk-acm'
4
4
  require 'aws-sdk-cloudformation'
5
5
  require 'aws-sdk-ec2'
6
6
  require 'aws-sdk-ecr'
7
+ require 'aws-sdk-identitystore'
7
8
  require 'aws-sdk-s3'
8
9
  require 'aws-sdk-sns'
9
10
  require 'aws-sdk-ssm'
@@ -33,6 +34,7 @@ module StackMaster
33
34
  autoload :StackStatus, 'stack_master/stack_status'
34
35
  autoload :SnsTopicFinder, 'stack_master/sns_topic_finder'
35
36
  autoload :SecurityGroupFinder, 'stack_master/security_group_finder'
37
+ autoload :SsoGroupIdFinder, 'stack_master/sso_group_id_finder'
36
38
  autoload :ParameterLoader, 'stack_master/parameter_loader'
37
39
  autoload :ParameterResolver, 'stack_master/parameter_resolver'
38
40
  autoload :RoleAssumer, 'stack_master/role_assumer'
@@ -84,6 +86,7 @@ module StackMaster
84
86
  autoload :Ejson, 'stack_master/parameter_resolvers/ejson'
85
87
  autoload :SnsTopicName, 'stack_master/parameter_resolvers/sns_topic_name'
86
88
  autoload :SecurityGroup, 'stack_master/parameter_resolvers/security_group'
89
+ autoload :SsoGroupId, 'stack_master/parameter_resolvers/sso_group_id'
87
90
  autoload :LatestAmiByTags, 'stack_master/parameter_resolvers/latest_ami_by_tags'
88
91
  autoload :LatestAmi, 'stack_master/parameter_resolvers/latest_ami'
89
92
  autoload :Env, 'stack_master/parameter_resolvers/env'
@@ -137,6 +140,7 @@ module StackMaster
137
140
 
138
141
  def debug(message)
139
142
  return unless debug?
143
+
140
144
  stderr.puts Rainbow("[DEBUG] #{message}").color(:green)
141
145
  end
142
146
 
@@ -164,6 +168,7 @@ module StackMaster
164
168
  end
165
169
 
166
170
  attr_accessor :non_interactive_answer
171
+
167
172
  @non_interactive_answer = 'y'
168
173
 
169
174
  def base_dir
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stack_master
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.16.0
4
+ version: 2.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Hodgkiss
8
8
  - Glen Stampoultzis
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-07-31 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
@@ -109,6 +108,34 @@ dependencies:
109
108
  - - ">="
110
109
  - !ruby/object:Gem::Version
111
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: ostruct
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
112
139
  - !ruby/object:Gem::Dependency
113
140
  name: os
114
141
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +226,20 @@ dependencies:
199
226
  - - "~>"
200
227
  - !ruby/object:Gem::Version
201
228
  version: '1'
229
+ - !ruby/object:Gem::Dependency
230
+ name: aws-sdk-identitystore
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '1'
236
+ type: :runtime
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '1'
202
243
  - !ruby/object:Gem::Dependency
203
244
  name: aws-sdk-s3
204
245
  requirement: !ruby/object:Gem::Requirement
@@ -525,6 +566,7 @@ files:
525
566
  - lib/stack_master/parameter_resolvers/parameter_store.rb
526
567
  - lib/stack_master/parameter_resolvers/security_group.rb
527
568
  - lib/stack_master/parameter_resolvers/sns_topic_name.rb
569
+ - lib/stack_master/parameter_resolvers/sso_group_id.rb
528
570
  - lib/stack_master/parameter_resolvers/stack_output.rb
529
571
  - lib/stack_master/parameter_validator.rb
530
572
  - lib/stack_master/prompter.rb
@@ -548,6 +590,7 @@ files:
548
590
  - lib/stack_master/sparkle_formation/compile_time/value_validator.rb
549
591
  - lib/stack_master/sparkle_formation/compile_time/value_validator_factory.rb
550
592
  - lib/stack_master/sparkle_formation/template_file.rb
593
+ - lib/stack_master/sso_group_id_finder.rb
551
594
  - lib/stack_master/stack.rb
552
595
  - lib/stack_master/stack_definition.rb
553
596
  - lib/stack_master/stack_differ.rb
@@ -579,9 +622,8 @@ licenses:
579
622
  metadata:
580
623
  bug_tracker_uri: https://github.com/envato/stack_master/issues
581
624
  changelog_uri: https://github.com/envato/stack_master/blob/master/CHANGELOG.md
582
- documentation_uri: https://www.rubydoc.info/gems/stack_master/2.16.0
583
- source_code_uri: https://github.com/envato/stack_master/tree/v2.16.0
584
- post_install_message:
625
+ documentation_uri: https://www.rubydoc.info/gems/stack_master/2.17.1
626
+ source_code_uri: https://github.com/envato/stack_master/tree/v2.17.1
585
627
  rdoc_options: []
586
628
  require_paths:
587
629
  - lib
@@ -596,8 +638,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
596
638
  - !ruby/object:Gem::Version
597
639
  version: '0'
598
640
  requirements: []
599
- rubygems_version: 3.5.16
600
- signing_key:
641
+ rubygems_version: 4.0.2
601
642
  specification_version: 4
602
643
  summary: StackMaster is a sure-footed way of creating, updating and keeping track
603
644
  of Amazon (AWS) CloudFormation stacks.