stackup 1.6.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 281a4cc419891f70b5a8251d52c080a678e21d2a76a57a0e715b478987c5d967
4
- data.tar.gz: e1848f7cccad92a7a6883f3947daa68e70d1b72ad00bfa72727f0def2590ee89
3
+ metadata.gz: cb7a5ebe9211d108f0289506fc5e917f58f7499823206dc22228f31b36992bcc
4
+ data.tar.gz: ba7d5a374e7a694fd52a1e7831d77b8dc1187d8dc3d1864dc19fbd6d00f76a3d
5
5
  SHA512:
6
- metadata.gz: 59cd63007ce56b284e7176c82f354174bb78dec2fba84443e2b1a28465df5ed68cd0bc1ccd2474dab7572c61ebb85d9de328e12216395d0e68c8101863b0110a
7
- data.tar.gz: 3acf8d1d83307ef2851001558c7880c4d43692f740254531369713e4cb7d38f3595398195cfd8f67460b10c1bd94cd7dca08a833fdf51371ef0a1c914addcffc
6
+ metadata.gz: 957ccabd6908e09039974ccd4204bcbbb0efb709fd46730a1d7da4559dffb98092845ce10bfc5a7325a3d4d38bf3c380a76fb3bc032de44714e0c6b5e0cc3dea
7
+ data.tar.gz: e94af1775282fbddfe2cfd9a895f557c55a09d79ca9d89738ef9be8219b0a448d74b178d553dd32738cffcab68b067fbcef7078b69fa0d08807124ed2fdae706
data/CHANGES.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # CHANGES
2
2
 
3
+ ## 1.8.0 (2022-08-23)
4
+
5
+ * Feature: Add support for ruby 3.1
6
+ * Dev: Upgrade dev setup and base docker image to ruby 3.1
7
+ * Dev: Replace docker-compose dev setup with normal docker
8
+ * Dev: Add helpers to easily test all supported ruby versions locally
9
+
10
+ ## 1.7.2 (2021-12-24)
11
+
12
+ * Upgrade dev setup and base docker image to ruby 3.0
13
+
14
+ ## 1.7.1 (2021-08-31)
15
+
16
+ * Dependency upgrades. Uplift of release process.
17
+ * M1/arm64 support for docker image releases.
18
+
19
+ ## 1.7.0 (2020-11-25)
20
+
21
+ * Feature: --no-fail-on-empty-change-set
22
+
3
23
  ## 1.6.0 (2020-11-19)
4
24
 
5
25
  * Feature: Support --service-role-arn on "change-set create"
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # stackup
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/stackup.png)](http://badge.fury.io/rb/stackup)
4
- [![Build Status](https://travis-ci.org/realestate-com-au/stackup.svg?branch=master)](https://travis-ci.org/realestate-com-au/stackup)
4
+ [![Build Status](https://travis-ci.com/realestate-com-au/stackup.svg?branch=main)](https://travis-ci.com/realestate-com-au/stackup)
5
5
 
6
6
  Stackup provides a CLI and a simplified Ruby API for dealing with
7
7
  AWS CloudFormation stacks.
@@ -70,7 +70,7 @@ This will:
70
70
  * monitor events until the stack update is complete
71
71
 
72
72
  Requests will retry 3 times by default. After this limit is exceeded, `ERROR: Rate exceeded` failures will be logged.
73
- You can increase the limit using the `--retry-limit` option, or by setting the `$AWS_RETRY_LIMIT` environment variable.
73
+ You can increase the limit using the `--retry-limit` option, or by setting the `$AWS_API_RETRY_LIMIT` environment variable.
74
74
 
75
75
  For more details on usage, see
76
76
 
@@ -191,7 +191,7 @@ Where a template URL references an object in S3, `stackup` leverages [CloudForma
191
191
  Non-S3 URLs are also supported, though in that case `stackup` must fetch the content itself:
192
192
 
193
193
  $ stackup mystack up \
194
- -t https://raw.githubusercontent.com/realestate-com-au/stackup/master/examples/template.yml
194
+ -t https://raw.githubusercontent.com/realestate-com-au/stackup/main/examples/template.yml
195
195
 
196
196
  ### Stack deletion
197
197
 
@@ -218,6 +218,8 @@ The change-set name defaults to "pending", but can be overridden using `--name`.
218
218
 
219
219
  The `change-set create` subcommand, like the `up` command, supports `--service-role-arn` to specify a service role.
220
220
 
221
+ It is impossible to create a change set with no changes. By default, stackup will only return successfully if a change set was actually created, and will otherwise fail. If the `--no-fail-on-empty-change-set` option is provided, stackup will return successfully if a change set was created _or_ if no change set was created because no changes were needed.
222
+
221
223
  ## Programmatic usage
222
224
 
223
225
  Get a handle to a `Stack` object as follows:
@@ -307,19 +309,18 @@ This policy grants the principal all actions required by `stackup up` for any cl
307
309
  ### Running tests
308
310
 
309
311
  `auto/test` will run the tests in a Docker container.
312
+ `auto/lint` will run the linter in a Docker container.
310
313
 
311
314
  ### Releasing
312
315
 
313
- Releasing is done manually, not by CI. The release process will push tags to GitHub, push the gem to rubygems and push the docker image to DockerHub.
316
+ Releasing is done mostly by CI. The automated process will push tags to GitHub, push the docker images to DockerHub. It won't yet push the gem to `rubygems.org`, but we're working ok it..
314
317
 
315
318
  Prerequisites:
316
319
 
317
- * You must be logged into docker hub via `docker login`. Your user must have permission to push to `realestate/stackup`
318
- * You must have a rubygems account with permission to push to the `stackup` gem. (`auto/release` will ask for your username and password)
319
- * You must have cloned this repo via HTTPS and have a github account with permission to push. (`auto/release` will ask for your username and a GitHub personal access token)
320
-
321
- To release:
320
+ * You must have a rubygems account with permission to push to the `stackup` gem. (`auto/release-gem` will ask for your username and password)
321
+ * You have bumped the version number in `lib/stackup/version.rb`.
322
+ * You have checked the `CHANGES.md` file to make sure it is reasonable and has the changes for this new version.
322
323
 
323
- ```
324
- auto/release
325
- ```
324
+ To release the rubygem.
325
+ 1. `auto/release-gem`
326
+ 2. On REA's internal CI tool of choice, find the build for `stackup-ci` and trigger a new build from `HEAD`. This will always grab the latest code from here and release the rest of the parts.
data/bin/stackup CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  $LOAD_PATH << File.expand_path("../lib", __dir__)
4
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "stackup/error_handling"
2
4
 
3
5
  module Stackup
@@ -51,19 +53,9 @@ module Stackup
51
53
  # @raise [Stackup::NoSuchStack] if the stack doesn't exist
52
54
  #
53
55
  def create(options = {})
54
- options = options.dup
55
- options[:stack_name] = stack.name
56
- options[:change_set_name] = name
57
- options[:change_set_type] = stack.exists? ? "UPDATE" : "CREATE"
58
- force = options.delete(:force)
59
- options[:template_body] = MultiJson.dump(options.delete(:template)) if options[:template]
60
- # optionally override template_body with the original template to preserve formatting (& comments in YAML)
61
- template_orig = options.delete(:template_orig)
62
- options[:template_body] = template_orig if options.delete(:preserve)
63
- options[:parameters] = Parameters.new(options[:parameters]).to_a if options[:parameters]
64
- options[:tags] = normalize_tags(options[:tags]) if options[:tags]
65
- options[:capabilities] ||= ["CAPABILITY_NAMED_IAM"]
66
- delete if force
56
+ options = validate_options(options)
57
+ delete if options.delete(:force)
58
+ allow_empty_change_set = options.delete(:allow_empty_change_set)
67
59
  handling_cf_errors do
68
60
  cf_client.create_change_set(options)
69
61
  loop do
@@ -73,6 +65,10 @@ module Stackup
73
65
  when /COMPLETE/
74
66
  return current.status
75
67
  when "FAILED"
68
+ if allow_empty_change_set && (current.status_reason == "The submitted information didn't contain changes. Submit different information to create a change set.")
69
+ return current.status_reason
70
+ end
71
+
76
72
  logger.error(current.status_reason)
77
73
  raise StackUpdateError, "change-set creation failed" if status == "FAILED"
78
74
  end
@@ -145,6 +141,21 @@ module Stackup
145
141
  stack.send(:wait_poll_interval)
146
142
  end
147
143
 
144
+ def validate_options(original)
145
+ options = original.dup
146
+ options[:stack_name] = stack.name
147
+ options[:change_set_name] = name
148
+ options[:change_set_type] = stack.exists? ? "UPDATE" : "CREATE"
149
+ options[:template_body] = MultiJson.dump(options.delete(:template)) if options[:template]
150
+ # optionally override template_body with the original template to preserve formatting (& comments in YAML)
151
+ template_orig = options.delete(:template_orig)
152
+ options[:template_body] = template_orig if options.delete(:preserve)
153
+ options[:parameters] = Parameters.new(options[:parameters]).to_a if options[:parameters]
154
+ options[:tags] = normalize_tags(options[:tags]) if options[:tags]
155
+ options[:capabilities] ||= ["CAPABILITY_NAMED_IAM"]
156
+ options
157
+ end
158
+
148
159
  end
149
160
 
150
161
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "diffy"
2
4
  require "stackup/utils"
3
5
  require "yaml"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "stackup/errors"
2
4
 
3
5
  module Stackup
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stackup
2
4
 
3
5
  # Base Stackup Exception class
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "clamp"
2
4
  require "console_logger"
3
5
  require "multi_json"
@@ -203,9 +205,7 @@ module Stackup
203
205
  :multivalued => true, :default => ["CAPABILITY_NAMED_IAM"]
204
206
 
205
207
  def execute
206
- unless template_source || use_previous_template?
207
- signal_usage_error "Specify either --template or --use-previous-template"
208
- end
208
+ signal_usage_error "Specify either --template or --use-previous-template" unless template_source || use_previous_template?
209
209
  options = {}
210
210
  if template_source
211
211
  if template_source.s3?
@@ -248,8 +248,6 @@ module Stackup
248
248
  end
249
249
  end
250
250
 
251
- private
252
-
253
251
  def pad(s, width)
254
252
  (s || "").ljust(width)
255
253
  end
@@ -280,6 +278,9 @@ module Stackup
280
278
  option ["--force"], :flag,
281
279
  "replace existing change-set of the same name"
282
280
 
281
+ option ["--no-fail-on-empty-change-set"], :flag, "don't fail on empty change-set",
282
+ :attribute_name => :allow_empty_change_set
283
+
283
284
  include HasParameters
284
285
 
285
286
  option "--tags", "FILE", "stack tags file",
@@ -296,9 +297,7 @@ module Stackup
296
297
  :multivalued => true, :default => ["CAPABILITY_NAMED_IAM"]
297
298
 
298
299
  def execute
299
- unless template_source || use_previous_template?
300
- signal_usage_error "Specify either --template or --use-previous-template"
301
- end
300
+ signal_usage_error "Specify either --template or --use-previous-template" unless template_source || use_previous_template?
302
301
  options = {}
303
302
  if template_source
304
303
  if template_source.s3?
@@ -314,6 +313,7 @@ module Stackup
314
313
  options[:role_arn] = service_role_arn if service_role_arn
315
314
  options[:use_previous_template] = use_previous_template?
316
315
  options[:force] = force?
316
+ options[:allow_empty_change_set] = allow_empty_change_set?
317
317
  options[:capabilities] = capability_list
318
318
  options[:preserve] = preserve_template_formatting?
319
319
  report_change do
@@ -359,8 +359,6 @@ module Stackup
359
359
 
360
360
  end
361
361
 
362
- private
363
-
364
362
  def change_set
365
363
  stack.change_set(change_set_name)
366
364
  end
@@ -402,8 +400,6 @@ module Stackup
402
400
  puts differ.diff(current, planned, context_lines)
403
401
  end
404
402
 
405
- private
406
-
407
403
  def differ
408
404
  Stackup::Differ.new(diff_format, &method(:format_data))
409
405
  end
@@ -464,8 +460,6 @@ module Stackup
464
460
  end
465
461
  end
466
462
 
467
- private
468
-
469
463
  def display_event(e)
470
464
  if data?
471
465
  display_data(event_data(e))
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stackup
2
4
 
3
5
  # Parameters to a CloudFormation template.
@@ -17,12 +19,12 @@ module Stackup
17
19
  def hashify(parameters)
18
20
  {}.tap do |result|
19
21
  parameters.each do |p|
20
- begin
21
- p_struct = ParameterStruct.new(p)
22
- result[p_struct.key] = p_struct.value
23
- rescue ArgumentError
24
- raise ArgumentError, "invalid parameter record: #{p.inspect}"
25
- end
22
+
23
+ p_struct = ParameterStruct.new(p)
24
+ result[p_struct.key] = p_struct.value
25
+ rescue ArgumentError
26
+ raise ArgumentError, "invalid parameter record: #{p.inspect}"
27
+
26
28
  end
27
29
  end
28
30
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rake/tasklib"
2
4
  require "tempfile"
3
5
  require "yaml"
@@ -39,8 +41,7 @@ module Stackup
39
41
  def define
40
42
  namespace(name) do
41
43
 
42
- data_options = []
43
- data_options << DataOption.for("--template", template)
44
+ data_options = [DataOption.for("--template", template)]
44
45
  data_options << DataOption.for("--parameters", parameters) if parameters
45
46
  data_options << DataOption.for("--tags", tags) if tags
46
47
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "aws-sdk-cloudformation"
2
4
  require "stackup/stack"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "open-uri"
2
4
  require "stackup/stack"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "aws-sdk-cloudformation"
2
4
 
3
5
  module Stackup
@@ -14,10 +16,9 @@ module Stackup
14
16
 
15
17
  attr_accessor :stack
16
18
 
17
- # rubocop:disable Lint/HandleExceptions
18
-
19
19
  # Yield all events since the last call
20
20
  #
21
+ # rubocop:disable Lint/SuppressedException
21
22
  def each_new_event
22
23
  new_events = []
23
24
  stack.events.each do |event|
@@ -40,8 +41,7 @@ module Stackup
40
41
  nil
41
42
  rescue Aws::CloudFormation::Errors::ValidationError
42
43
  end
43
-
44
- # rubocop:enable Lint/HandleExceptions
44
+ # rubocop:enable Lint/SuppressedException
45
45
 
46
46
  private
47
47
 
data/lib/stackup/utils.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stackup
2
4
 
3
5
  # Generates diffs of data.
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stackup
2
4
 
3
- VERSION = "1.6.0".freeze
5
+ VERSION = "1.8.0"
4
6
 
5
7
  end
data/lib/stackup/yaml.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "yaml"
2
4
 
3
5
  module Stackup
@@ -22,7 +24,8 @@ module Stackup
22
24
  # `!Foo blah` as a shortcut for `{ "Fn::Foo" => blah }`
23
25
  #
24
26
  def load(yaml, filename = nil)
25
- tree = ::YAML.parse(yaml, filename)
27
+ legacy_yaml = Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.0")
28
+ tree = legacy_yaml ? ::YAML.parse(yaml, filename) : ::YAML.parse(yaml, :filename => filename)
26
29
  return tree unless tree
27
30
 
28
31
  CloudFormationToRuby.create.accept(tree)
data/lib/stackup.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "forwardable"
2
4
  require "stackup/service"
3
5
  require "stackup/stack"
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "byebug"
2
4
  require "console_logger"
3
5
 
@@ -1,23 +1,61 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "stackup/main_command"
2
4
 
3
5
  describe Stackup::MainCommand do
4
- context "change-set create --service-role-arn"
6
+
7
+ let(:mock_change_set) { double }
8
+
9
+ before(:example) do
10
+ mock_stackup = double
11
+ mock_stack = double
12
+ allow_any_instance_of(Stackup::MainCommand).to receive(:Stackup).and_return(mock_stackup)
13
+ allow(mock_stackup).to receive(:stack).and_return(mock_stack)
14
+ allow(mock_stack).to receive(:change_set).and_return(mock_change_set)
15
+ end
16
+
17
+ context "change-set create --service-role-arn" do
5
18
  it "invokes stack.change_set.create with role arn passed through" do
6
- mock_stackup = double()
7
- mock_stack = double()
8
- mock_change_set = double()
9
- allow_any_instance_of(Stackup::MainCommand).to receive(:Stackup).and_return(mock_stackup)
10
- allow(mock_stackup).to receive(:stack).and_return(mock_stack)
11
- allow(mock_stack).to receive(:change_set).and_return(mock_change_set)
19
+ expected_args = {
20
+ :role_arn => "arn:aws:iam::000000000000:role/example"
21
+ }
22
+ expect(mock_change_set).to receive(:create).with(hash_including(expected_args))
23
+
24
+ Stackup::MainCommand.run("stackup", [
25
+ "STACK-NAME", "change-set", "create",
26
+ "--template", "examples/template.yml",
27
+ "--service-role-arn", "arn:aws:iam::000000000000:role/example"
28
+ ])
29
+ end
30
+ end
12
31
 
32
+ context "change-set create" do
33
+ it "invokes stack.change_set.create with allow_empty_change_set nil" do
13
34
  expected_args = {
14
- role_arn: "arn:aws:iam::000000000000:role/example"
35
+ :allow_empty_change_set => nil
15
36
  }
16
37
  expect(mock_change_set).to receive(:create).with(hash_including(expected_args))
17
38
 
18
39
  Stackup::MainCommand.run("stackup", [
19
- "STACK-NAME", "change-set", "create",
20
- "--template", "examples/template.yml",
21
- "--service-role-arn", "arn:aws:iam::000000000000:role/example"])
40
+ "STACK-NAME", "change-set", "create",
41
+ "--template", "examples/template.yml"
42
+ ])
22
43
  end
44
+ end
45
+
46
+ context "change-set create --no-fail-on-empty-change-set" do
47
+ it "invokes stack.change_set.create with allow_empty_change_set true" do
48
+ expected_args = {
49
+ :allow_empty_change_set => true
50
+ }
51
+ expect(mock_change_set).to receive(:create).with(hash_including(expected_args))
52
+
53
+ Stackup::MainCommand.run("stackup", [
54
+ "STACK-NAME", "change-set", "create",
55
+ "--template", "examples/template.yml",
56
+ "--no-fail-on-empty-change-set"
57
+ ])
58
+ end
59
+ end
60
+
23
61
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  require "stackup/parameters"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
  require "stackup/rake_tasks"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  require "multi_json"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  require "stackup/stack"
@@ -429,6 +431,38 @@ describe Stackup::Stack do
429
431
 
430
432
  end
431
433
 
434
+ context "when allow_empty_change_set is nil and there are no changes" do
435
+ it "raises an exception" do
436
+ cf_client.stub_responses(:describe_change_set, [{
437
+ :status => "FAILED",
438
+ :status_reason => "The submitted information didn't contain changes. Submit different information to create a change set."
439
+ }])
440
+ expect { create_change_set }.to raise_error(Stackup::StackUpdateError)
441
+ end
442
+ end
443
+
444
+ context "when allow_empty_change_set is true and there are no changes" do
445
+ it "does not raise an exception" do
446
+ cf_client.stub_responses(:describe_change_set, [{
447
+ :status => "FAILED",
448
+ :status_reason => "The submitted information didn't contain changes. Submit different information to create a change set."
449
+ }])
450
+ options[:allow_empty_change_set] = true
451
+ expect { create_change_set }.not_to raise_error
452
+ end
453
+ end
454
+
455
+ context "when allow_empty_change_set is true and there is some other failure" do
456
+ it "raises an exception" do
457
+ cf_client.stub_responses(:describe_change_set, [{
458
+ :status => "FAILED",
459
+ :status_reason => "some other failure message"
460
+ }])
461
+ options[:allow_empty_change_set] = true
462
+ expect { create_change_set }.to raise_error(Stackup::StackUpdateError)
463
+ end
464
+ end
465
+
432
466
  end
433
467
 
434
468
  describe "#change_set#execute" do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  require "aws-sdk-cloudformation"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  require "stackup/utils"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  require "stackup/yaml"
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stackup
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
- - Mike Williams
8
- - Arvind Kunday
7
+ - Danial Pearce
8
+ - Ahmed Shash
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-11-19 00:00:00.000000000 Z
12
+ date: 2022-08-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-cloudformation
@@ -83,8 +83,8 @@ dependencies:
83
83
  version: '0'
84
84
  description:
85
85
  email:
86
- - mike.williams@rea-group.com
87
- - arvind.kunday@rea-group.com
86
+ - danial.pearce@rea-group.com
87
+ - ahmed.shash@rea-group.com
88
88
  executables:
89
89
  - stackup
90
90
  extensions: []
@@ -128,16 +128,16 @@ require_paths:
128
128
  - lib
129
129
  required_ruby_version: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - ">="
131
+ - - ">"
132
132
  - !ruby/object:Gem::Version
133
- version: '0'
133
+ version: '2.6'
134
134
  required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  requirements: []
140
- rubygems_version: 3.0.3
140
+ rubygems_version: 3.3.7
141
141
  signing_key:
142
142
  specification_version: 4
143
143
  summary: Manage CloudFormation stacks