cfndsl 0.16.6 → 0.16.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -7
- data/bin/cfndsl +1 -0
- data/cfndsl.gemspec +1 -1
- data/lib/cfndsl/jsonable.rb +4 -0
- data/lib/cfndsl/orchestration_template.rb +2 -0
- data/lib/cfndsl/patches.rb +51 -39
- data/lib/cfndsl/plurals.rb +9 -9
- data/lib/cfndsl/rake_task.rb +1 -0
- data/lib/cfndsl/specification.rb +9 -7
- data/lib/cfndsl/types.rb +1 -0
- data/lib/cfndsl/version.rb +1 -1
- data/lib/deep_merge/core.rb +2 -0
- data/sample/autoscale.rb +0 -1
- data/sample/autoscale2.rb +2 -2
- data/sample/export.rb +3 -3
- data/sample/import.rb +2 -2
- data/spec/fixtures/test.rb +2 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5288f90b75b1ba02860fc1b9a7a6feea6a90d1d18476dc4f9f6779ffea073d1
|
4
|
+
data.tar.gz: f4b821f8261b474bd85bbf9d248b83a4971e017932df31f54e0d99fbcea105c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dce8cb78e563d0d8a514c7c4a5c9034c2b94f05a7abc0cdef51b83ab6dba0b5edfbf0af791d51283af69ab4820abb4f57c048f5ca2d1955edc0f8ea41b6c5b1
|
7
|
+
data.tar.gz: 1ca869af3522ddc2b719b1d6620bed102bfd691de702271bff9c3cb633dd353070f0e3929cd1249f02cc832ad03f2c2aaaab957b53ebb760475f5ecd41afcbfd
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [0.16.
|
4
|
-
[Full Changelog](https://github.com/cfndsl/cfndsl/compare/v0.16.
|
3
|
+
## [0.16.7](https://github.com/cfndsl/cfndsl/tree/0.16.7) (2018-11-12)
|
4
|
+
[Full Changelog](https://github.com/cfndsl/cfndsl/compare/v0.16.6...0.16.7)
|
5
|
+
|
6
|
+
**Closed issues:**
|
7
|
+
|
8
|
+
- Cloudformation Specification version 2.12.0 has missing types [\#377](https://github.com/cfndsl/cfndsl/issues/377)
|
9
|
+
- Value of property CreditSpecification must be an object [\#376](https://github.com/cfndsl/cfndsl/issues/376)
|
10
|
+
|
11
|
+
**Merged pull requests:**
|
12
|
+
|
13
|
+
- add missing types fixes \#377 [\#378](https://github.com/cfndsl/cfndsl/pull/378) ([gergnz](https://github.com/gergnz))
|
14
|
+
|
15
|
+
## [v0.16.6](https://github.com/cfndsl/cfndsl/tree/v0.16.6) (2018-05-30)
|
16
|
+
[Full Changelog](https://github.com/cfndsl/cfndsl/compare/v0.16.5...v0.16.6)
|
5
17
|
|
6
18
|
**Fixed bugs:**
|
7
19
|
|
@@ -49,10 +61,6 @@
|
|
49
61
|
## [v0.16.1](https://github.com/cfndsl/cfndsl/tree/v0.16.1) (2017-12-02)
|
50
62
|
[Full Changelog](https://github.com/cfndsl/cfndsl/compare/v0.16.0...v0.16.1)
|
51
63
|
|
52
|
-
**Closed issues:**
|
53
|
-
|
54
|
-
- Metadata / AWS::CloudFormation::Interface support? [\#357](https://github.com/cfndsl/cfndsl/issues/357)
|
55
|
-
|
56
64
|
**Merged pull requests:**
|
57
65
|
|
58
66
|
- 352 update contacts repos [\#355](https://github.com/cfndsl/cfndsl/pull/355) ([gergnz](https://github.com/gergnz))
|
@@ -83,7 +91,6 @@
|
|
83
91
|
**Closed issues:**
|
84
92
|
|
85
93
|
- backtrace shown when incorrect resource name is passed to -g [\#338](https://github.com/cfndsl/cfndsl/issues/338)
|
86
|
-
- Condition and ALB ListenerRule Conditions get merged [\#337](https://github.com/cfndsl/cfndsl/issues/337)
|
87
94
|
- Request to include support for AWS::Logs::SubscriptionFilter [\#335](https://github.com/cfndsl/cfndsl/issues/335)
|
88
95
|
- Support for Lambda backed custom resources with shorthand [\#315](https://github.com/cfndsl/cfndsl/issues/315)
|
89
96
|
- Merging cfnlego, cfn2dsl into cfndsl [\#272](https://github.com/cfndsl/cfndsl/issues/272)
|
data/bin/cfndsl
CHANGED
data/cfndsl.gemspec
CHANGED
data/lib/cfndsl/jsonable.rb
CHANGED
@@ -44,6 +44,7 @@ module CfnDsl
|
|
44
44
|
# Equivalent to the CloudFormation template built in function Fn::And
|
45
45
|
def FnAnd(array)
|
46
46
|
raise 'The array passed to Fn::And must have at least 2 elements and no more than 10' if !array || array.count < 2 || array.count > 10
|
47
|
+
|
47
48
|
Fn.new('And', array)
|
48
49
|
end
|
49
50
|
|
@@ -69,6 +70,7 @@ module CfnDsl
|
|
69
70
|
# Equivalent to the CloudFormation template built in function Fn::Or
|
70
71
|
def FnOr(array)
|
71
72
|
raise 'The array passed to Fn::Or must have at least 2 elements and no more than 10' if !array || array.count < 2 || array.count > 10
|
73
|
+
|
72
74
|
Fn.new('Or', array)
|
73
75
|
end
|
74
76
|
|
@@ -80,8 +82,10 @@ module CfnDsl
|
|
80
82
|
# Equivalent to the CloudFormation template built in function Fn::Sub
|
81
83
|
def FnSub(string, substitutions = nil)
|
82
84
|
raise ArgumentError, 'The first argument passed to Fn::Sub must be a string' unless string.is_a? String
|
85
|
+
|
83
86
|
if substitutions
|
84
87
|
raise ArgumentError, 'The second argument passed to Fn::Sub must be a Hash' unless substitutions.is_a? Hash
|
88
|
+
|
85
89
|
Fn.new('Sub', [string, substitutions])
|
86
90
|
else
|
87
91
|
Fn.new('Sub', string)
|
@@ -29,6 +29,7 @@ module CfnDsl
|
|
29
29
|
parts = resource.split('::')
|
30
30
|
until parts.empty?
|
31
31
|
break if CfnDsl.reserved_items.include? parts.first
|
32
|
+
|
32
33
|
abreve_name = parts.join('_')
|
33
34
|
if accessors.key? abreve_name
|
34
35
|
accessors.delete abreve_name # Delete potentially ambiguous names
|
@@ -78,6 +79,7 @@ module CfnDsl
|
|
78
79
|
sname = CfnDsl::Plurals.singularize pname
|
79
80
|
|
80
81
|
return if sname == pname
|
82
|
+
|
81
83
|
resource.class_eval do
|
82
84
|
CfnDsl.method_names(sname) do |method|
|
83
85
|
define_method(method) do |value = nil, &block|
|
data/lib/cfndsl/patches.rb
CHANGED
@@ -8,56 +8,56 @@ module CfnDsl
|
|
8
8
|
{
|
9
9
|
'AWS::Serverless::Function' => {
|
10
10
|
'Properties' => {
|
11
|
-
'Handler'
|
12
|
-
'Runtime'
|
13
|
-
'CodeUri'
|
14
|
-
'FunctionName'
|
15
|
-
'Description'
|
16
|
-
'MemorySize'
|
17
|
-
'Timeout'
|
18
|
-
'Role'
|
19
|
-
'Policies'
|
20
|
-
'Environment'
|
21
|
-
'VpcConfig'
|
22
|
-
'Events'
|
23
|
-
'Tags'
|
24
|
-
'Tracing'
|
25
|
-
'KmsKeyArn'
|
26
|
-
'DeadLetterQueue'
|
27
|
-
'DeploymentPreference'
|
28
|
-
'AutoPublishAlias'
|
11
|
+
'Handler' => { 'PrimitiveType' => 'String' },
|
12
|
+
'Runtime' => { 'PrimitiveType' => 'String' },
|
13
|
+
'CodeUri' => { 'PrimitiveType' => 'String' },
|
14
|
+
'FunctionName' => { 'PrimitiveType' => 'String' },
|
15
|
+
'Description' => { 'PrimitiveType' => 'String' },
|
16
|
+
'MemorySize' => { 'PrimitiveType' => 'Integer' },
|
17
|
+
'Timeout' => { 'PrimitiveType' => 'Integer' },
|
18
|
+
'Role' => { 'PrimitiveType' => 'String' },
|
19
|
+
'Policies' => { 'Type' => 'List', 'ItemType' => 'Policy' },
|
20
|
+
'Environment' => { 'PrimitiveType' => 'Json' },
|
21
|
+
'VpcConfig' => { 'Type' => 'VpcConfig' },
|
22
|
+
'Events' => { 'PrimitiveType' => 'Json' },
|
23
|
+
'Tags' => { 'PrimitiveType' => 'Json' },
|
24
|
+
'Tracing' => { 'PrimitiveType' => 'String' },
|
25
|
+
'KmsKeyArn' => { 'PrimitiveType' => 'String' },
|
26
|
+
'DeadLetterQueue' => { 'PrimitiveType' => 'Json' },
|
27
|
+
'DeploymentPreference' => { 'Type' => 'DeploymentPreference' },
|
28
|
+
'AutoPublishAlias' => { 'PrimitiveType' => 'String' },
|
29
29
|
'ReservedConcurrentExecutions' => { 'PrimitiveType' => 'Integer' }
|
30
30
|
}
|
31
31
|
},
|
32
32
|
'AWS::Serverless::Api' => {
|
33
33
|
'Properties' => {
|
34
|
-
'Name'
|
35
|
-
'StageName'
|
36
|
-
'DefinitionUri'
|
37
|
-
'DefinitionBody'
|
38
|
-
'CacheClusterEnabled'
|
39
|
-
'CacheClusterSize'
|
40
|
-
'Variables'
|
41
|
-
'MethodSettings'
|
34
|
+
'Name' => { 'PrimitiveType' => 'String' },
|
35
|
+
'StageName' => { 'PrimitiveType' => 'String' },
|
36
|
+
'DefinitionUri' => { 'PrimitiveType' => 'String' },
|
37
|
+
'DefinitionBody' => { 'PrimitiveType' => 'Json' },
|
38
|
+
'CacheClusterEnabled' => { 'PrimitiveType' => 'Boolean' },
|
39
|
+
'CacheClusterSize' => { 'PrimitiveType' => 'String' },
|
40
|
+
'Variables' => { 'PrimitiveType' => 'Json' },
|
41
|
+
'MethodSettings' => { 'PrimitiveType' => 'Json' },
|
42
42
|
'EndpointConfiguration' => { 'PrimitiveType' => 'String' },
|
43
|
-
'BinaryMediaTypes'
|
44
|
-
'Cors'
|
43
|
+
'BinaryMediaTypes' => { 'Type' => 'List', 'PrimitiveType' => 'String' },
|
44
|
+
'Cors' => { 'PrimitiveType' => 'String' }
|
45
45
|
}
|
46
46
|
},
|
47
47
|
'AWS::Serverless::SimpleTable' => {
|
48
48
|
'Properties' => {
|
49
49
|
'PrimaryKey' => { 'Type' => 'PrimaryKey' },
|
50
50
|
'ProvisionedThroughput' => { 'Type' => 'ProvisionedThroughput' },
|
51
|
-
'Tags'
|
52
|
-
'TableName'
|
51
|
+
'Tags' => { 'PrimitiveType' => 'Json' },
|
52
|
+
'TableName' => { 'PrimitiveType' => 'String' }
|
53
53
|
}
|
54
54
|
},
|
55
55
|
'AWS::SSM::Parameter' => {
|
56
56
|
'Properties' => {
|
57
|
-
'Name'
|
57
|
+
'Name' => { 'PrimitiveType' => 'String' },
|
58
58
|
'Description' => { 'PrimitiveType' => 'String' },
|
59
|
-
'Type'
|
60
|
-
'Value'
|
59
|
+
'Type' => { 'PrimitiveType' => 'String' },
|
60
|
+
'Value' => { 'PrimitiveType' => 'String' }
|
61
61
|
}
|
62
62
|
}
|
63
63
|
}
|
@@ -71,7 +71,19 @@ module CfnDsl
|
|
71
71
|
'AWS::EC2::LaunchTemplate.Tag' => {
|
72
72
|
'Properties' => {
|
73
73
|
'Value' => { 'PrimitiveType' => 'String' },
|
74
|
-
'Key'
|
74
|
+
'Key' => { 'PrimitiveType' => 'String' }
|
75
|
+
}
|
76
|
+
},
|
77
|
+
'AWS::EC2::SpotFleet.Tag' => {
|
78
|
+
'Properties' => {
|
79
|
+
'Value' => { 'PrimitiveType' => 'String' },
|
80
|
+
'Key' => { 'PrimitiveType' => 'String' }
|
81
|
+
}
|
82
|
+
},
|
83
|
+
'AWS::DLM::LifecyclePolicy.Tag' => {
|
84
|
+
'Properties' => {
|
85
|
+
'Value' => { 'PrimitiveType' => 'String' },
|
86
|
+
'Key' => { 'PrimitiveType' => 'String' }
|
75
87
|
}
|
76
88
|
},
|
77
89
|
'AWS::Serverless::SimpleTable.PrimaryKey' => {
|
@@ -82,14 +94,14 @@ module CfnDsl
|
|
82
94
|
},
|
83
95
|
'AWS::Serverless::SimpleTable.ProvisionedThroughput' => {
|
84
96
|
'Properties' => {
|
85
|
-
'ReadCapacityUnits'
|
97
|
+
'ReadCapacityUnits' => { 'PrimitiveType' => 'Integer' },
|
86
98
|
'WriteCapacityUnits' => { 'PrimitiveType' => 'Integer' }
|
87
99
|
}
|
88
100
|
},
|
89
101
|
'AWS::Serverless::Function.Policy' => {
|
90
102
|
'Properties' => {
|
91
103
|
'PolicyDocument' => { 'PrimitiveType' => 'Json' },
|
92
|
-
'PolicyName'
|
104
|
+
'PolicyName' => { 'PrimitiveType' => 'String' }
|
93
105
|
}
|
94
106
|
},
|
95
107
|
'AWS::Serverless::Function.VpcConfig' => {
|
@@ -101,9 +113,9 @@ module CfnDsl
|
|
101
113
|
'AWS::Serverless::Function.DeploymentPreference' => {
|
102
114
|
'Properties' => {
|
103
115
|
'Enabled' => { 'PrimitiveType' => 'Boolean' },
|
104
|
-
'Type'
|
105
|
-
'Alarms'
|
106
|
-
'Hooks'
|
116
|
+
'Type' => { 'PrimitiveType' => 'String' },
|
117
|
+
'Alarms' => { 'Type' => 'List', 'PrimitiveType' => 'String' },
|
118
|
+
'Hooks' => { 'Type' => 'List', 'PrimitiveType' => 'String' }
|
107
119
|
}
|
108
120
|
}
|
109
121
|
}
|
data/lib/cfndsl/plurals.rb
CHANGED
@@ -5,15 +5,15 @@ module CfnDsl
|
|
5
5
|
|
6
6
|
@plurals = {
|
7
7
|
'AssumeRolePolicyDocument' => 'AssumeRolePolicyDocument',
|
8
|
-
'CreationPolicy'
|
9
|
-
'DBSecurityGroupIngress'
|
10
|
-
'Metadata'
|
11
|
-
'Policy'
|
12
|
-
'PolicyDocument'
|
13
|
-
'Property'
|
14
|
-
'SecurityGroupEgress'
|
15
|
-
'SecurityGroupIngress'
|
16
|
-
'UpdatePolicy'
|
8
|
+
'CreationPolicy' => 'CreationPolicy',
|
9
|
+
'DBSecurityGroupIngress' => 'DBSecurityGroupIngress',
|
10
|
+
'Metadata' => 'Metadata',
|
11
|
+
'Policy' => 'Policies',
|
12
|
+
'PolicyDocument' => 'PolicyDocument',
|
13
|
+
'Property' => 'Properties',
|
14
|
+
'SecurityGroupEgress' => 'SecurityGroupEgress',
|
15
|
+
'SecurityGroupIngress' => 'SecurityGroupIngress',
|
16
|
+
'UpdatePolicy' => 'UpdatePolicy'
|
17
17
|
}
|
18
18
|
@singles = @plurals.invert
|
19
19
|
|
data/lib/cfndsl/rake_task.rb
CHANGED
data/lib/cfndsl/specification.rb
CHANGED
@@ -41,14 +41,14 @@ module CfnDsl
|
|
41
41
|
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity
|
42
42
|
def self.extract_types(spec)
|
43
43
|
primitive_types = {
|
44
|
-
'String'
|
45
|
-
'Boolean'
|
46
|
-
'Json'
|
47
|
-
'Integer'
|
48
|
-
'Number'
|
49
|
-
'Double'
|
44
|
+
'String' => 'String',
|
45
|
+
'Boolean' => 'Boolean',
|
46
|
+
'Json' => 'Json',
|
47
|
+
'Integer' => 'Integer',
|
48
|
+
'Number' => 'Number',
|
49
|
+
'Double' => 'Double',
|
50
50
|
'Timestamp' => 'Timestamp',
|
51
|
-
'Long'
|
51
|
+
'Long' => 'Long'
|
52
52
|
}
|
53
53
|
spec.each_with_object(primitive_types) do |(property_name, property_info), types|
|
54
54
|
# In order to name things uniquely and allow for connections
|
@@ -58,6 +58,7 @@ module CfnDsl
|
|
58
58
|
root_resource_name = root_resource ? root_resource[1].gsub(/::/, '') : property_name
|
59
59
|
property_name = property_name.gsub(/::|\./, '')
|
60
60
|
next unless property_info['Properties']
|
61
|
+
|
61
62
|
properties = property_info['Properties'].each_with_object({}) do |(nested_prop_name, nested_prop_info), extracted|
|
62
63
|
if nested_prop_info['Type'] == 'Map' || nested_prop_info['Type'] == 'Json'
|
63
64
|
# The Map type and the incorrectly labelled Json type
|
@@ -84,6 +85,7 @@ module CfnDsl
|
|
84
85
|
|
85
86
|
def self.determine_spec_file
|
86
87
|
return CfnDsl.specification_file if File.exist? CfnDsl.specification_file
|
88
|
+
|
87
89
|
File.expand_path('aws/resource_specification.json', __dir__)
|
88
90
|
end
|
89
91
|
|
data/lib/cfndsl/types.rb
CHANGED
@@ -58,6 +58,7 @@ module CfnDsl
|
|
58
58
|
classes.each_pair do |typename, type|
|
59
59
|
typeval = types_list['Types'][typename]
|
60
60
|
next unless typeval.respond_to?(:each_pair)
|
61
|
+
|
61
62
|
typeval.each_pair do |attr_name, attr_type|
|
62
63
|
if attr_type.is_a?(Array)
|
63
64
|
klass = type_def.const_get(attr_type[0])
|
data/lib/cfndsl/version.rb
CHANGED
data/lib/deep_merge/core.rb
CHANGED
@@ -85,6 +85,7 @@ module DeepMerge
|
|
85
85
|
knockout_prefix = options[:knockout_prefix] || nil
|
86
86
|
raise InvalidParameter, 'knockout_prefix cannot be an empty string in deep_merge!' if knockout_prefix == ''
|
87
87
|
raise InvalidParameter, 'overwrite_unmergeable must be true if knockout_prefix is specified in deep_merge!' if knockout_prefix && !overwrite_unmergeable
|
88
|
+
|
88
89
|
# if present: we will split and join arrays on this char before merging
|
89
90
|
array_split_char = options[:unpack_arrays] || false
|
90
91
|
# request that we avoid merging arrays
|
@@ -103,6 +104,7 @@ module DeepMerge
|
|
103
104
|
di = options[:debug_indent] || ''
|
104
105
|
# do nothing if source is nil
|
105
106
|
return dest if !merge_nil_values && source.nil?
|
107
|
+
|
106
108
|
# if dest doesn't exist, then simply copy source to it
|
107
109
|
if !dest && overwrite_unmergeable
|
108
110
|
dest = source; return dest
|
data/sample/autoscale.rb
CHANGED
data/sample/autoscale2.rb
CHANGED
@@ -89,8 +89,8 @@ a stack from this template.
|
|
89
89
|
AutoScalingGroup('WebServerGroup') do
|
90
90
|
UpdatePolicy('AutoScalingRollingUpdate',
|
91
91
|
'MinInstancesInService' => '1',
|
92
|
-
'MaxBatchSize'
|
93
|
-
'PauseTime'
|
92
|
+
'MaxBatchSize' => '1',
|
93
|
+
'PauseTime' => 'PT15M')
|
94
94
|
AvailabilityZones FnGetAZs('')
|
95
95
|
LaunchConfigurationName Ref('LaunchConfig')
|
96
96
|
MinSize 1
|
data/sample/export.rb
CHANGED
@@ -3,10 +3,10 @@ CloudFormation do
|
|
3
3
|
GroupDescription 'Allow incoming HTTP traffic from anywhere'
|
4
4
|
SecurityGroupIngress [
|
5
5
|
{
|
6
|
-
'CidrIp'
|
6
|
+
'CidrIp' => '0.0.0.0/0',
|
7
7
|
'IpProtocol' => 'tcp',
|
8
|
-
'FromPort'
|
9
|
-
'ToPort'
|
8
|
+
'FromPort' => 80,
|
9
|
+
'ToPort' => 80
|
10
10
|
}
|
11
11
|
]
|
12
12
|
end
|
data/sample/import.rb
CHANGED
data/spec/fixtures/test.rb
CHANGED
@@ -73,8 +73,8 @@ CloudFormation do
|
|
73
73
|
AutoScalingGroup('ASG') do
|
74
74
|
UpdatePolicy('AutoScalingRollingUpdate',
|
75
75
|
'MinInstancesInService' => '1',
|
76
|
-
'MaxBatchSize'
|
77
|
-
'PauseTime'
|
76
|
+
'MaxBatchSize' => '1',
|
77
|
+
'PauseTime' => 'PT15M')
|
78
78
|
AvailabilityZones FnGetAZs('')
|
79
79
|
LaunchConfigurationName Ref('LaunchConfig')
|
80
80
|
MinSize 1
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfndsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Jack
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2018-
|
14
|
+
date: 2018-11-11 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -143,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
143
143
|
requirements:
|
144
144
|
- - "~>"
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version: '2.
|
146
|
+
version: '2.2'
|
147
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
149
|
- - ">="
|
@@ -151,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
151
|
version: '0'
|
152
152
|
requirements: []
|
153
153
|
rubyforge_project:
|
154
|
-
rubygems_version: 2.7.
|
154
|
+
rubygems_version: 2.7.8
|
155
155
|
signing_key:
|
156
156
|
specification_version: 4
|
157
157
|
summary: AWS Cloudformation DSL
|