hcl-checker 1.0.6 → 1.4.0
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 +5 -5
- data/Gemfile +10 -0
- data/Gemfile.lock +28 -27
- data/README.md +6 -8
- data/assets/lexer.rex +1 -1
- data/assets/parse.y +10 -2
- data/hcl-checker.gemspec +29 -5
- data/lib/hcl/checker/version.rb +1 -1
- data/lib/hcl/lexer.rb +87 -86
- data/lib/hcl/parser.rb +123 -89
- data/lib/hcl1/checker.rb +21 -0
- data/lib/hcl1/checker/version.rb +5 -0
- data/lib/hcl1/lexer.rb +175 -0
- data/lib/hcl1/parser.rb +456 -0
- metadata +42 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 195128a0325ac3b7fa3add01a739dbe3ce0aeb5b3314edfc74d195caa3a0aa61
|
4
|
+
data.tar.gz: ab84f84386083bdbb9aaea917716ea7e8462eaed2b89a2ab4f887fb4c3b2ee93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b53587ad90fa9ed3cf6c2fbfd5cad15f6b526e62e5c63298fbd963a1629d6283a0bac0ab7276674acba8a1d67e38bc2118fe8f9a0a11a5d362afef4957cc745a
|
7
|
+
data.tar.gz: 4d908d23f548138a2e4e876709cda19321650203d13219f8ac8fe3748cd1427e628f9cb834f80bf684252a7d06d9a97d72663f3ac6c19699a0149593e3450a0d
|
data/Gemfile
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
+
# This is needed due https://nvd.nist.gov/vuln/detail/CVE-2018-14404
|
4
|
+
# A NULL pointer dereference vulnerability exists in the xpath.c:xmlXPathCompOpEval()
|
5
|
+
# function of libxml2 through 2.9.8 when parsing an invalid XPath expression in the
|
6
|
+
# XPATH_OP_AND or XPATH_OP_OR case. Applications processing untrusted XSL format inputs
|
7
|
+
# with the use of the libxml2 library may be vulnerable to a denial of service attack due
|
8
|
+
# to a crash of the application.
|
9
|
+
# Nokogiri >= 1.8.5 solves this problem
|
10
|
+
gem "nokogiri", ">= 1.10.8"
|
11
|
+
|
12
|
+
|
3
13
|
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
14
|
|
5
15
|
# Specify your gem's dependencies in hcl-checker.gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
hcl-checker (1.0
|
4
|
+
hcl-checker (1.4.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
diff-lcs (1.
|
10
|
-
filesize (0.
|
9
|
+
diff-lcs (1.4.4)
|
10
|
+
filesize (0.2.0)
|
11
11
|
jsobfu (0.4.2)
|
12
12
|
rkelly-remix
|
13
|
-
json (2.
|
14
|
-
metasm (1.0.
|
15
|
-
mini_portile2 (2.
|
16
|
-
nokogiri (1.
|
17
|
-
mini_portile2 (~> 2.
|
18
|
-
racc (1.
|
19
|
-
rake (
|
13
|
+
json (2.3.1)
|
14
|
+
metasm (1.0.4)
|
15
|
+
mini_portile2 (2.4.0)
|
16
|
+
nokogiri (1.10.10)
|
17
|
+
mini_portile2 (~> 2.4.0)
|
18
|
+
racc (1.5.0)
|
19
|
+
rake (12.3.3)
|
20
20
|
rb-readline (0.5.5)
|
21
21
|
rex (2.0.12)
|
22
22
|
filesize (~> 0)
|
@@ -25,33 +25,34 @@ GEM
|
|
25
25
|
metasm (~> 1)
|
26
26
|
nokogiri (~> 1)
|
27
27
|
rb-readline (~> 0)
|
28
|
-
rexical (1.0.
|
28
|
+
rexical (1.0.7)
|
29
29
|
rkelly-remix (0.0.7)
|
30
|
-
rspec (3.
|
31
|
-
rspec-core (~> 3.
|
32
|
-
rspec-expectations (~> 3.
|
33
|
-
rspec-mocks (~> 3.
|
34
|
-
rspec-core (3.
|
35
|
-
rspec-support (~> 3.
|
36
|
-
rspec-expectations (3.
|
30
|
+
rspec (3.9.0)
|
31
|
+
rspec-core (~> 3.9.0)
|
32
|
+
rspec-expectations (~> 3.9.0)
|
33
|
+
rspec-mocks (~> 3.9.0)
|
34
|
+
rspec-core (3.9.2)
|
35
|
+
rspec-support (~> 3.9.3)
|
36
|
+
rspec-expectations (3.9.2)
|
37
37
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
-
rspec-support (~> 3.
|
39
|
-
rspec-mocks (3.
|
38
|
+
rspec-support (~> 3.9.0)
|
39
|
+
rspec-mocks (3.9.1)
|
40
40
|
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
-
rspec-support (~> 3.
|
42
|
-
rspec-support (3.
|
41
|
+
rspec-support (~> 3.9.0)
|
42
|
+
rspec-support (3.9.3)
|
43
43
|
|
44
44
|
PLATFORMS
|
45
45
|
ruby
|
46
46
|
|
47
47
|
DEPENDENCIES
|
48
|
-
bundler (~> 1.
|
48
|
+
bundler (~> 2.1.4)
|
49
49
|
hcl-checker!
|
50
|
-
|
51
|
-
|
50
|
+
nokogiri (>= 1.10.8)
|
51
|
+
racc (= 1.5.0)
|
52
|
+
rake (~> 12.3.3)
|
52
53
|
rex (= 2.0.12)
|
53
|
-
rexical (
|
54
|
+
rexical (>= 1.0.7)
|
54
55
|
rspec (~> 3.0)
|
55
56
|
|
56
57
|
BUNDLED WITH
|
57
|
-
1.
|
58
|
+
2.1.4
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# Hcl::Checker
|
2
2
|
|
3
|
-
**Hashicorp Configuration Language** syntax checker and parser.
|
3
|
+
**Hashicorp Configuration Language** syntax checker and parser.
|
4
4
|
|
5
5
|
Parser originally created by [Sikula](https://github.com/sikula) and available
|
6
6
|
at [Ruby HCL Repository](https://github.com/sikula/ruby-hcl). Only works with
|
7
|
-
[HCL Version 1](https://github.com/hashicorp/hcl).
|
7
|
+
[HCL Version 1](https://github.com/hashicorp/hcl).
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -47,21 +47,21 @@ You can validate the `hcl_string` contents with `valid?` method. This will
|
|
47
47
|
return `true` if is a valid HCL or `false` if not.
|
48
48
|
|
49
49
|
```
|
50
|
-
2.3.2 :014 >
|
50
|
+
2.3.2 :014 > HCL1::Checker.valid? hcl_string
|
51
51
|
=> true
|
52
52
|
```
|
53
53
|
|
54
54
|
You can parse the `hcl_string` into a `Hash` with `parse` method.
|
55
55
|
|
56
56
|
```
|
57
|
-
2.3.2 :015 >
|
57
|
+
2.3.2 :015 > HCL1::Checker.parse(hcl_string)
|
58
58
|
=> {"provider"=>{"aws"=>{"region"=>"${var.aws_region}", "access_key"=>"${var.aws_access_key}", "secret_key"=>"${var.aws_secret_key}"}}, "resource"=>{"aws_vpc"=>{"default"=>{"cidr_block"=>"10.0.0.0/16", "enable_dns_hostnames"=>true, "tags"=>{"Name"=>"Event Store VPC"}}}}}
|
59
59
|
```
|
60
60
|
|
61
61
|
If after a `parse` you got `false` you can check `last_error` with:
|
62
62
|
|
63
63
|
```
|
64
|
-
2.4.2 :063 >
|
64
|
+
2.4.2 :063 > HCL1::Checker.last_error
|
65
65
|
=> "Parse error at \"eec8b16c-ee89-4ea0-bdcc-d094300a42e8\" , (invalid token: ,)"
|
66
66
|
```
|
67
67
|
|
@@ -84,7 +84,7 @@ $ bundle exec rake build_grammar
|
|
84
84
|
Building Lexer....done
|
85
85
|
Building Parser....done
|
86
86
|
```
|
87
|
-
|
87
|
+
|
88
88
|
## Contributing
|
89
89
|
|
90
90
|
Bug reports and pull requests are welcome on GitHub at
|
@@ -96,5 +96,3 @@ to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
|
96
96
|
|
97
97
|
The gem is available as open source under the terms of the [MIT
|
98
98
|
License](https://opensource.org/licenses/MIT).
|
99
|
-
|
100
|
-
|
data/assets/lexer.rex
CHANGED
data/assets/parse.y
CHANGED
@@ -26,8 +26,12 @@ rule
|
|
26
26
|
|
27
27
|
|
28
28
|
objectlist:
|
29
|
-
objectitem
|
29
|
+
objectitem COMMA
|
30
30
|
{ result = [val[0]] }
|
31
|
+
| objectitem
|
32
|
+
{ result = [val[0]] }
|
33
|
+
| objectlist objectitem COMMA
|
34
|
+
{ result = val[0] << val[1] }
|
31
35
|
| objectlist objectitem
|
32
36
|
{ result = val[0] << val[1] }
|
33
37
|
;
|
@@ -96,6 +100,10 @@ rule
|
|
96
100
|
{ result = val[0] }
|
97
101
|
| STRING
|
98
102
|
{ result = val[0] }
|
103
|
+
| list
|
104
|
+
{ result = val[0] }
|
105
|
+
| object
|
106
|
+
{ result = val[0] }
|
99
107
|
;
|
100
108
|
|
101
109
|
number:
|
@@ -122,7 +130,7 @@ require_relative './lexer'
|
|
122
130
|
#// from object.go: there is a flattened list structure
|
123
131
|
#//
|
124
132
|
def flatten_objectlist(list)
|
125
|
-
list.each_with_object({}) do |a, h|
|
133
|
+
(list || {}).each_with_object({}) do |a, h|
|
126
134
|
h[a.first] =
|
127
135
|
case a.last
|
128
136
|
when Hash
|
data/hcl-checker.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = 'hcl-checker'
|
7
7
|
spec.version = HCL::Checker::VERSION
|
8
8
|
spec.authors = ['Marcelo Castellani']
|
9
|
-
spec.email = ['marcelo
|
9
|
+
spec.email = ['marcelo@linux.com']
|
10
10
|
|
11
11
|
spec.summary = 'Hashicorp Configuration Language parser for Ruby'
|
12
12
|
spec.description = 'Hashicorp Configuration Language parser and checker for Ruby'
|
@@ -18,11 +18,35 @@ Gem::Specification.new do |spec|
|
|
18
18
|
end
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
22
|
-
spec.add_development_dependency 'rake', '~>
|
21
|
+
spec.add_development_dependency 'bundler', '~> 2.1.4'
|
22
|
+
spec.add_development_dependency 'rake', '~> 12.3.3'
|
23
23
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
|
-
spec.add_development_dependency 'racc', '1.
|
24
|
+
spec.add_development_dependency 'racc', '1.5.0'
|
25
25
|
spec.add_development_dependency 'rex', '2.0.12'
|
26
|
-
spec.add_development_dependency 'rexical', '1.0.
|
26
|
+
spec.add_development_dependency 'rexical', '>= 1.0.7'
|
27
27
|
|
28
|
+
spec.post_install_message = %q{
|
29
|
+
Hello, I am updating this Gem to support version 2.0 of the HCL.
|
30
|
+
|
31
|
+
In the meantime, it is important that you know that there will be a
|
32
|
+
compatibility break with the current version, for Gem to support both
|
33
|
+
versions.
|
34
|
+
|
35
|
+
Therefore, instead of using just HCL::Checker you must tell which
|
36
|
+
version you are using, like this:
|
37
|
+
|
38
|
+
HCL1::Checker
|
39
|
+
|
40
|
+
Or
|
41
|
+
|
42
|
+
HCL2::Checker
|
43
|
+
|
44
|
+
At the moment both HCL::Checker and HCL1::Checker will work, but with
|
45
|
+
the release of support for version 2 the HCL::Checker syntax will no
|
46
|
+
longer work.
|
47
|
+
|
48
|
+
So, update your code.
|
49
|
+
|
50
|
+
Thank you :)
|
51
|
+
}
|
28
52
|
end
|
data/lib/hcl/checker/version.rb
CHANGED
data/lib/hcl/lexer.rb
CHANGED
@@ -1,123 +1,124 @@
|
|
1
1
|
#--
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by rex 1.0.
|
3
|
+
# This file is automatically generated by rex 1.0.7
|
4
4
|
# from lexical definition file "./assets/lexer.rex".
|
5
5
|
#++
|
6
6
|
|
7
7
|
|
8
8
|
class HCLLexer
|
9
|
-
|
9
|
+
require 'strscan'
|
10
10
|
|
11
|
-
|
11
|
+
class ScanError < StandardError ; end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
attr_reader :lineno
|
14
|
+
attr_reader :filename
|
15
|
+
attr_accessor :state
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
def scan_setup(str)
|
18
|
+
@ss = StringScanner.new(str)
|
19
|
+
@lineno = 1
|
20
|
+
@state = nil
|
21
|
+
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
def action
|
24
|
+
yield
|
25
|
+
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
def scan_str(str)
|
28
|
+
scan_setup(str)
|
29
|
+
do_parse
|
30
|
+
end
|
31
|
+
alias :scan :scan_str
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
def load_file( filename )
|
34
|
+
@filename = filename
|
35
|
+
File.open(filename, "r") do |f|
|
36
|
+
scan_setup(f.read)
|
37
|
+
end
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
def scan_file( filename )
|
41
|
+
load_file(filename)
|
42
|
+
do_parse
|
43
|
+
end
|
44
44
|
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
# skips empty actions
|
50
|
-
until token = _next_token or @ss.eos?; end
|
51
|
-
token
|
52
|
-
end
|
46
|
+
def next_token
|
47
|
+
return if @ss.eos?
|
53
48
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
when nil
|
59
|
-
case
|
60
|
-
when (text = @ss.scan(/\s+/))
|
61
|
-
;
|
49
|
+
# skips empty actions
|
50
|
+
until token = _next_token or @ss.eos?; end
|
51
|
+
token
|
52
|
+
end
|
62
53
|
|
63
|
-
|
64
|
-
|
54
|
+
def _next_token
|
55
|
+
text = @ss.peek(1)
|
56
|
+
@lineno += 1 if text == "\n"
|
57
|
+
token = case @state
|
58
|
+
when nil
|
59
|
+
case
|
60
|
+
when (text = @ss.scan(/\s+/))
|
61
|
+
;
|
65
62
|
|
66
|
-
|
67
|
-
|
63
|
+
when (text = @ss.scan(/\#.*|\/\/.*$/))
|
64
|
+
;
|
68
65
|
|
69
|
-
|
70
|
-
|
66
|
+
when (text = @ss.scan(/\n|\r/))
|
67
|
+
;
|
71
68
|
|
72
|
-
|
73
|
-
|
69
|
+
when (text = @ss.scan(/\/\*/))
|
70
|
+
action { consume_comment(text) }
|
74
71
|
|
75
|
-
|
76
|
-
|
72
|
+
when (text = @ss.scan(/true|false/))
|
73
|
+
action { [:BOOL, to_boolean(text)]}
|
77
74
|
|
78
|
-
|
79
|
-
|
75
|
+
when (text = @ss.scan(/\-?\d+\.\d+/))
|
76
|
+
action { [:FLOAT, text.to_f] }
|
80
77
|
|
81
|
-
|
82
|
-
|
78
|
+
when (text = @ss.scan(/-?\d+/))
|
79
|
+
action { [:NUMBER, text.to_i] }
|
83
80
|
|
84
|
-
|
85
|
-
|
81
|
+
when (text = @ss.scan(/\"/))
|
82
|
+
action { [:STRING, consume_string(text)] }
|
86
83
|
|
87
|
-
|
88
|
-
|
84
|
+
when (text = @ss.scan(/\<<\-?/))
|
85
|
+
action { [:STRING, consume_heredoc] }
|
89
86
|
|
90
|
-
|
91
|
-
|
87
|
+
when (text = @ss.scan(/\{/))
|
88
|
+
action { [:LEFTBRACE, text]}
|
92
89
|
|
93
|
-
|
94
|
-
|
90
|
+
when (text = @ss.scan(/\}/))
|
91
|
+
action { [:RIGHTBRACE, text]}
|
95
92
|
|
96
|
-
|
97
|
-
|
93
|
+
when (text = @ss.scan(/\[/))
|
94
|
+
action { [:LEFTBRACKET, text]}
|
98
95
|
|
99
|
-
|
100
|
-
|
96
|
+
when (text = @ss.scan(/\]/))
|
97
|
+
action { [:RIGHTBRACKET, text]}
|
101
98
|
|
102
|
-
|
103
|
-
|
99
|
+
when (text = @ss.scan(/\,/))
|
100
|
+
action { [:COMMA, text]}
|
104
101
|
|
105
|
-
|
106
|
-
|
102
|
+
when (text = @ss.scan(/[a-zA-Z_][a-zA-Z0-9_\-\.]*/))
|
103
|
+
action { [:IDENTIFIER, text]}
|
107
104
|
|
108
|
-
|
109
|
-
|
105
|
+
when (text = @ss.scan(/\=/))
|
106
|
+
action { [:EQUAL, text]}
|
110
107
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
108
|
+
when (text = @ss.scan(/\-/))
|
109
|
+
action { [:MINUS, text]}
|
110
|
+
|
111
|
+
|
112
|
+
else
|
113
|
+
text = @ss.string[@ss.pos .. -1]
|
114
|
+
raise ScanError, "can not match: '" + text + "'"
|
115
|
+
end # if
|
116
|
+
|
117
|
+
else
|
118
|
+
raise ScanError, "undefined state: '" + state.to_s + "'"
|
119
|
+
end # case state
|
120
|
+
token
|
121
|
+
end # def _next_token
|
121
122
|
|
122
123
|
def lex(input)
|
123
124
|
scan_setup(input)
|