cfn-model 0.1.28 → 0.1.29
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.
- checksums.yaml +4 -4
- data/bin/cfn_parse +1 -1
- data/lib/cfn-model/model/cfn_model.rb +3 -2
- data/lib/cfn-model/monkey_patches/psych/nodes/node.rb +5 -0
- data/lib/cfn-model/parser/cfn_parser.rb +43 -5
- data/lib/cfn-model/psych/handlers/line_number_handler.rb +18 -0
- data/lib/cfn-model/psych/visitors/to_ruby_with_line_numbers.rb +18 -0
- data/lib/cfn-model/validator/cloudformation_validator.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d727b122287e1f97d8c2f75323e7ab57553b8265cff424a06abd8127e4cc5893
|
4
|
+
data.tar.gz: ff0dd5f3e93115b884a4e217366688d960025b0ed54355a9a0a092d8e5de121b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c2a43026c14efb0de73770172ea6d1f89f3ee2c96b9f69ee19dd6ffa58b4e7f41d7b8854540d3c27c0e476bde42738b50a3a63d1adbdc60066edbbf368f3a55
|
7
|
+
data.tar.gz: b4e3e37b0b8176d28d67dde05b0860104aa19ec1828f753737047f8290efe320e1f46dbc7a257bec6a5db29375b500282b63af74478fe92f1e40cba947379b17
|
data/bin/cfn_parse
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'references'
|
2
2
|
|
3
3
|
class CfnModel
|
4
|
-
attr_reader :resources, :parameters
|
4
|
+
attr_reader :resources, :parameters, :line_numbers
|
5
5
|
|
6
6
|
##
|
7
7
|
# if you really want it, here it is - the raw Hash from YAML.load. you'll have to mess with structural nits of
|
@@ -13,6 +13,7 @@ class CfnModel
|
|
13
13
|
@parameters = {}
|
14
14
|
@resources = {}
|
15
15
|
@raw_model = nil
|
16
|
+
@line_numbers = {}
|
16
17
|
end
|
17
18
|
|
18
19
|
##
|
@@ -78,4 +79,4 @@ class CfnModel
|
|
78
79
|
def to_s
|
79
80
|
@resources.to_s
|
80
81
|
end
|
81
|
-
end
|
82
|
+
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'psych'
|
2
3
|
require 'json'
|
3
4
|
require 'cfn-model/parser/transform_registry'
|
4
5
|
require 'cfn-model/validator/cloudformation_validator'
|
5
6
|
require 'cfn-model/validator/reference_validator'
|
7
|
+
require 'cfn-model/psych/handlers/line_number_handler'
|
8
|
+
require 'cfn-model/psych/visitors/to_ruby_with_line_numbers'
|
9
|
+
require 'cfn-model/monkey_patches/psych/nodes/node'
|
6
10
|
require_relative 'parser_registry'
|
7
11
|
require_relative 'parameter_substitution'
|
8
12
|
require_relative 'parser_error'
|
@@ -32,18 +36,31 @@ class CfnParser
|
|
32
36
|
##
|
33
37
|
# Given raw json/yml CloudFormation template, returns a CfnModel object
|
34
38
|
# or raise ParserErrors if something is amiss with the format
|
35
|
-
def parse(cloudformation_yml, parameter_values_json=nil)
|
36
|
-
cfn_model = parse_without_parameters(cloudformation_yml)
|
39
|
+
def parse(cloudformation_yml, parameter_values_json=nil, with_line_numbers=false)
|
40
|
+
cfn_model = parse_without_parameters(cloudformation_yml, with_line_numbers)
|
37
41
|
|
38
42
|
apply_parameter_values(cfn_model, parameter_values_json)
|
39
43
|
|
40
44
|
cfn_model
|
41
45
|
end
|
42
46
|
|
43
|
-
def
|
47
|
+
def parse_with_line_numbers(cloudformation_yml)
|
48
|
+
handler = LineNumberHandler.new
|
49
|
+
parser = Psych::Parser.new(handler)
|
50
|
+
handler.parser = parser
|
51
|
+
parser.parse(cloudformation_yml)
|
52
|
+
ToRubyWithLineNumbers.create.accept(handler.root).first
|
53
|
+
end
|
54
|
+
|
55
|
+
def parse_without_parameters(cloudformation_yml, with_line_numbers=false)
|
44
56
|
pre_validate_model cloudformation_yml
|
45
57
|
|
46
|
-
cfn_hash =
|
58
|
+
cfn_hash =
|
59
|
+
if with_line_numbers
|
60
|
+
parse_with_line_numbers(cloudformation_yml)
|
61
|
+
else
|
62
|
+
YAML.load cloudformation_yml
|
63
|
+
end
|
47
64
|
|
48
65
|
# Transform raw resources in template as performed by
|
49
66
|
# transforms
|
@@ -55,7 +72,11 @@ class CfnParser
|
|
55
72
|
cfn_model.raw_model = cfn_hash
|
56
73
|
|
57
74
|
# pass 1: wire properties into ModelElement objects
|
58
|
-
|
75
|
+
if with_line_numbers
|
76
|
+
transform_hash_into_model_elements_with_numbers cfn_hash, cfn_model
|
77
|
+
else
|
78
|
+
transform_hash_into_model_elements cfn_hash, cfn_model
|
79
|
+
end
|
59
80
|
transform_hash_into_parameters cfn_hash, cfn_model
|
60
81
|
|
61
82
|
# pass 2: tie together separate resources only where necessary to make life easier for rule logic
|
@@ -103,6 +124,23 @@ class CfnParser
|
|
103
124
|
cfn_model
|
104
125
|
end
|
105
126
|
|
127
|
+
def transform_hash_into_model_elements_with_numbers(cfn_hash, cfn_model)
|
128
|
+
cfn_hash['Resources'].each do |resource_name, resource|
|
129
|
+
resource_class = class_from_type_name resource['Type']['value']
|
130
|
+
|
131
|
+
resource_object = resource_class.new(cfn_model)
|
132
|
+
resource_object.logical_resource_id = resource_name
|
133
|
+
resource_object.resource_type = resource['Type']['value']
|
134
|
+
resource_object.metadata = resource['Metadata']
|
135
|
+
|
136
|
+
assign_fields_based_upon_properties resource_object, resource
|
137
|
+
|
138
|
+
cfn_model.resources[resource_name] = resource_object
|
139
|
+
cfn_model.line_numbers[resource_name] = resource['Type']['line']
|
140
|
+
end
|
141
|
+
cfn_model
|
142
|
+
end
|
143
|
+
|
106
144
|
def transform_hash_into_parameters(cfn_hash, cfn_model)
|
107
145
|
return cfn_model unless cfn_hash.has_key?('Parameters')
|
108
146
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# We need to provide a handler that will add the line to the node
|
2
|
+
# as it is parsed. TreeBuilder is the "usual" handler, that
|
3
|
+
# creates the AST.
|
4
|
+
class LineNumberHandler < Psych::TreeBuilder
|
5
|
+
|
6
|
+
# The handler needs access to the parser in order to call mark
|
7
|
+
attr_accessor :parser
|
8
|
+
|
9
|
+
# We are only interested in scalars, so here we override
|
10
|
+
# the method so that it calls mark and adds the line info
|
11
|
+
# to the node.
|
12
|
+
def scalar value, anchor, tag, plain, quoted, style
|
13
|
+
mark = parser.mark
|
14
|
+
node = super
|
15
|
+
node.line = mark.line
|
16
|
+
node
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class ToRubyWithLineNumbers < Psych::Visitors::ToRuby
|
2
|
+
def revive_hash hash, o
|
3
|
+
o.children.each_slice(2) { |k,v|
|
4
|
+
key = accept(k)
|
5
|
+
val = accept(v)
|
6
|
+
line = v.respond_to?(:line) ? v.line : v.start_line
|
7
|
+
|
8
|
+
# This is the important bit. If the value is a scalar,
|
9
|
+
# we replace it with the desired hash.
|
10
|
+
if v.is_a?(::Psych::Nodes::Scalar) && key == 'Type'
|
11
|
+
val = { "value" => val, "line" => line + 1} # line is 0 based, so + 1
|
12
|
+
end
|
13
|
+
|
14
|
+
hash[key] = val
|
15
|
+
}
|
16
|
+
hash
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfn-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kascic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- lib/cfn-model/model/security_group_ingress.rb
|
71
71
|
- lib/cfn-model/model/statement.rb
|
72
72
|
- lib/cfn-model/model/topic_policy.rb
|
73
|
+
- lib/cfn-model/monkey_patches/psych/nodes/node.rb
|
73
74
|
- lib/cfn-model/parser/cfn_parser.rb
|
74
75
|
- lib/cfn-model/parser/ec2_instance_parser.rb
|
75
76
|
- lib/cfn-model/parser/ec2_network_interface_parser.rb
|
@@ -85,6 +86,8 @@ files:
|
|
85
86
|
- lib/cfn-model/parser/security_group_parser.rb
|
86
87
|
- lib/cfn-model/parser/transform_registry.rb
|
87
88
|
- lib/cfn-model/parser/with_policy_document_parser.rb
|
89
|
+
- lib/cfn-model/psych/handlers/line_number_handler.rb
|
90
|
+
- lib/cfn-model/psych/visitors/to_ruby_with_line_numbers.rb
|
88
91
|
- lib/cfn-model/schema/AWS_CloudFront_Distribution.yml
|
89
92
|
- lib/cfn-model/schema/AWS_EC2_Instance.yml
|
90
93
|
- lib/cfn-model/schema/AWS_EC2_NetworkInterface.yml
|