hcl-checker 1.5.0 → 1.6.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb47986f7941e27c8c23509a32796a30c309af1341c7aac468acac3c33efaa26
4
- data.tar.gz: a90c767872e02d7f6b94d044a8750969d1c1ec5236c565be051a7a8cc7b1889d
3
+ metadata.gz: 667f88b2558cf8ce0a69698c4eda47c4b157a1a97ae7e4e71589be6dca5007c4
4
+ data.tar.gz: a9e1d9c61e8575b4e4393c1a1758b007642db713a3f6ebd3243603cea13d62e6
5
5
  SHA512:
6
- metadata.gz: 9efd2312d2ff19fb9518259689491ac616923ab1df6a7eaa922d3d72e2b92a97583c3f56065c43d5bcd8660a2ec3f520df828480bfb209d1b04ab34d187e1ca8
7
- data.tar.gz: c4446a6f7b85a90fd1eb4157d5c4dbe8522497309fbe53ac63b66b66b6612a88f354028ecc074f8c7dda45e6802a21be0aca02767d9f2f1277eed509178d8e02
6
+ metadata.gz: c6312e830effebabe892a98b3b9a15d1e7ceea84edc035e95989b84cce6269ad5242ff697838ba5499bbfedfecb511cbe0c02034d38267336dbe7b2a1c1a1384
7
+ data.tar.gz: 456b8cafe4e9923f9951ec4f0b8f4fcb1f6bad3209e1fb8d4f4f1ed9c155dafbe74a8e045aa7e4becbfa516d97a4c25a07ffbc3c6a2a0481caf56b502d097a77
data/.rubocop.yml ADDED
@@ -0,0 +1,32 @@
1
+ AllCops:
2
+ NewCops: enable
3
+ Exclude:
4
+ - lib/hcl/lexer.rb
5
+ - lib/hcl/parser.rb
6
+
7
+ Layout/LineLength:
8
+ Enabled: false
9
+
10
+ Metrics/AbcSize:
11
+ Enabled: false
12
+
13
+ Metrics/BlockLength:
14
+ Enabled: false
15
+
16
+ Metrics/ClassLength:
17
+ Enabled: false
18
+
19
+ Metrics/CyclomaticComplexity:
20
+ Enabled: false
21
+
22
+ Metrics/MethodLength:
23
+ Enabled: false
24
+
25
+ Metrics/PerceivedComplexity:
26
+ Enabled: false
27
+
28
+ Style/Documentation:
29
+ Enabled: false
30
+
31
+ Style/FrozenStringLiteralComment:
32
+ EnforcedStyle: never
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # This is needed due https://nvd.nist.gov/vuln/detail/CVE-2018-14404
4
4
  # A NULL pointer dereference vulnerability exists in the xpath.c:xmlXPathCompOpEval()
@@ -7,10 +7,9 @@ source "https://rubygems.org"
7
7
  # with the use of the libxml2 library may be vulnerable to a denial of service attack due
8
8
  # to a crash of the application.
9
9
  # Nokogiri >= 1.8.5 solves this problem
10
- gem "nokogiri", ">= 1.10.8"
10
+ gem 'nokogiri', '>= 1.11.4'
11
11
 
12
-
13
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
12
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
14
13
 
15
14
  # Specify your gem's dependencies in hcl-checker.gemspec
16
15
  gemspec
data/Gemfile.lock CHANGED
@@ -1,20 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hcl-checker (1.5.0)
4
+ hcl-checker (1.6.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- diff-lcs (1.4.4)
9
+ diff-lcs (1.5.0)
10
10
  filesize (0.2.0)
11
11
  jsobfu (0.4.2)
12
12
  rkelly-remix
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)
13
+ json (2.6.1)
14
+ metasm (1.0.5)
15
+ nokogiri (1.13.6-arm64-darwin)
16
+ racc (~> 1.4)
18
17
  racc (1.5.0)
19
18
  rake (12.3.3)
20
19
  rb-readline (0.5.5)
@@ -27,27 +26,27 @@ GEM
27
26
  rb-readline (~> 0)
28
27
  rexical (1.0.7)
29
28
  rkelly-remix (0.0.7)
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)
29
+ rspec (3.11.0)
30
+ rspec-core (~> 3.11.0)
31
+ rspec-expectations (~> 3.11.0)
32
+ rspec-mocks (~> 3.11.0)
33
+ rspec-core (3.11.0)
34
+ rspec-support (~> 3.11.0)
35
+ rspec-expectations (3.11.0)
37
36
  diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.9.0)
39
- rspec-mocks (3.9.1)
37
+ rspec-support (~> 3.11.0)
38
+ rspec-mocks (3.11.1)
40
39
  diff-lcs (>= 1.2.0, < 2.0)
41
- rspec-support (~> 3.9.0)
42
- rspec-support (3.9.3)
40
+ rspec-support (~> 3.11.0)
41
+ rspec-support (3.11.0)
43
42
 
44
43
  PLATFORMS
45
- ruby
44
+ arm64-darwin-21
46
45
 
47
46
  DEPENDENCIES
48
- bundler (~> 2.1.4)
47
+ bundler (~> 2.3.13)
49
48
  hcl-checker!
50
- nokogiri (>= 1.10.8)
49
+ nokogiri (>= 1.11.4)
51
50
  racc (= 1.5.0)
52
51
  rake (~> 12.3.3)
53
52
  rex (= 2.0.12)
@@ -55,4 +54,4 @@ DEPENDENCIES
55
54
  rspec (~> 3.0)
56
55
 
57
56
  BUNDLED WITH
58
- 2.1.4
57
+ 2.3.13
data/Rakefile CHANGED
@@ -1,18 +1,18 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new do |c|
5
- options = ["--color"]
6
- options += ["--format", "documentation"]
5
+ options = ['--color']
6
+ options += ['--format', 'documentation']
7
7
  c.rspec_opts = options
8
8
  end
9
9
 
10
- desc "Generate Grammar files for HCL"
10
+ desc 'Generate Grammar files for HCL'
11
11
  task :build_grammar do
12
12
  print 'Building Lexer'
13
- `rex ./assets/lexer.rex -o ./lib/hcl/lexer.rb`
13
+ `rex ./assets/lexer.rex -o ./lib/hcl/checker/lexer.rb`
14
14
  print "....done\n"
15
15
  print 'Building Parser'
16
- `racc ./assets/parse.y -o ./lib/hcl/parser.rb`
16
+ `racc ./assets/parse.y -o ./lib/hcl/checker/parser.rb`
17
17
  print "....done\n\n"
18
18
  end
data/assets/lexer.rex CHANGED
@@ -1,5 +1,4 @@
1
-
2
- class HCLLexer
1
+ class HCL::Checker::Lexer
3
2
  option
4
3
  independent
5
4
 
@@ -51,25 +50,26 @@ rule
51
50
  {MINUS} { [:MINUS, text]}
52
51
 
53
52
  inner
54
-
55
53
  def lex(input)
56
54
  scan_setup(input)
57
55
  tokens = []
58
56
  while token = next_token
59
57
  tokens << token
60
58
  end
59
+
61
60
  tokens
62
61
  end
63
62
 
64
63
 
65
64
  def to_boolean(input)
66
- input =
67
- if input =~ /true/
68
- true
69
- elsif input =~ /false/
70
- false
71
- end
72
- return input
65
+ case input
66
+ when /true/
67
+ true
68
+ when /false/
69
+ false
70
+ else
71
+ raise "Invalid value for `to_boolean`, expected true/false got #{input}"
72
+ end
73
73
  end
74
74
 
75
75
 
@@ -93,19 +93,21 @@ inner
93
93
  result = ''
94
94
  nested = 0
95
95
 
96
- begin
96
+ loop do
97
97
  case(text = @ss.scan_until(%r{\"|\$\{|\}|\\}))
98
98
  when %r{\$\{\z}
99
99
  nested += 1
100
100
  when %r{\}\z}
101
- nested -= 1 if nested > 0
101
+ nested -= 1 if nested.positive?
102
102
  when %r{\\\z}
103
103
  result += text.chop + @ss.getch
104
104
  next
105
105
  end
106
106
 
107
107
  result += text.to_s
108
- end until nested == 0 && text =~ %r{\"\z}
108
+
109
+ break if nested.zero? && text =~ %r{\"\z}
110
+ end
109
111
 
110
112
  result.chop
111
113
  end
data/assets/parse.y CHANGED
@@ -1,4 +1,4 @@
1
- class HCLParser
1
+ class HCL::Checker::Parser
2
2
  token BOOL
3
3
  FLOAT
4
4
  NUMBER
@@ -41,7 +41,7 @@ rule
41
41
  LEFTBRACE objectlist RIGHTBRACE
42
42
  { result = flatten_objectlist(val[1]) }
43
43
  | LEFTBRACE RIGHTBRACE
44
- { return }
44
+ { return {} }
45
45
  ;
46
46
 
47
47
  objectkey:
@@ -88,7 +88,7 @@ rule
88
88
  LEFTBRACKET listitems RIGHTBRACKET
89
89
  { result = val[1] }
90
90
  | LEFTBRACKET RIGHTBRACKET
91
- { return }
91
+ { return [] }
92
92
  ;
93
93
 
94
94
  listitems:
@@ -109,6 +109,8 @@ rule
109
109
  { result = val[0] }
110
110
  | object
111
111
  { result = val[0] }
112
+ | IDENTIFIER
113
+ { result = val[0] }
112
114
  ;
113
115
 
114
116
  number:
@@ -122,7 +124,7 @@ rule
122
124
  end
123
125
 
124
126
  ---- header
125
- require_relative './lexer'
127
+ require_relative 'lexer'
126
128
 
127
129
  ---- inner
128
130
  #//
@@ -130,19 +132,31 @@ require_relative './lexer'
130
132
  #// keys are encountered.
131
133
  #//
132
134
  #// from decoder.go: if we're at the root or we're directly within
133
- #// a list, decode to hashes, otherwise lists
135
+ #// a list, decode to hashes, otherwise lists
134
136
  #//
135
137
  #// from object.go: there is a flattened list structure
136
138
  #//
139
+ #// if @duplicate_mode is set:
140
+ #// - :array then duplicates will be appended to an array
141
+ #// - :merge then duplicates will be deep merged into a hash
142
+ #//
137
143
  def flatten_objectlist(list)
138
144
  (list || {}).each_with_object({}) do |a, h|
139
- h[a.first] =
140
- case a.last
141
- when Hash
145
+ if h.keys.include?(a.first)
146
+ case @duplicate_mode
147
+ when :array
148
+ if h[a.first].is_a?(Array)
149
+ h[a.first].push(a.last)
150
+ else
151
+ h[a.first] = [ h[a.first], a.last ]
152
+ end
153
+ when :merge
142
154
  deep_merge(h[a.first] || {}, a.last)
143
- else
144
- h[a.first] = a.last
155
+ else raise ArgumentError
145
156
  end
157
+ else
158
+ h[a.first] = a.last
159
+ end
146
160
  end
147
161
  end
148
162
 
@@ -154,10 +168,12 @@ require_relative './lexer'
154
168
  end
155
169
 
156
170
 
157
- def parse(input)
158
- @lexer = HCLLexer.new.lex(input)
171
+ def parse(input, duplicate_mode = :array)
172
+ @duplicate_mode = duplicate_mode
173
+ @lexer = HCL::Checker::Lexer.new.lex(input)
159
174
  do_parse
160
- return @result
175
+
176
+ @result
161
177
  end
162
178
 
163
179
 
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "hcl/checker"
3
+ require 'bundler/setup'
4
+ require 'hcl/checker'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "hcl/checker"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start(__FILE__)
data/hcl-checker.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require 'hcl/checker/version'
4
4
 
@@ -19,19 +19,19 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
  spec.required_ruby_version = '>= 2.5.0'
21
21
 
22
- spec.add_development_dependency 'bundler', '~> 2.1.4'
23
- spec.add_development_dependency 'rake', '~> 12.3.3'
24
- spec.add_development_dependency 'rspec', '~> 3.0'
22
+ spec.add_development_dependency 'bundler', '~> 2.3.13'
25
23
  spec.add_development_dependency 'racc', '1.5.0'
24
+ spec.add_development_dependency 'rake', '~> 12.3.3'
26
25
  spec.add_development_dependency 'rex', '2.0.12'
27
26
  spec.add_development_dependency 'rexical', '>= 1.0.7'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
+
29
+ spec.post_install_message = '
30
+ Hello, me again. This version fixes:
28
31
 
29
- spec.post_install_message = %q{
30
- Hello, me again. After several contacts of users of this gem requesting that
31
- the module name be kept only as HCL, instead of HCL1 and HCL2, I went back and
32
- kept it. Sorry for those who eventually switched from HCL to HCL1. And thanks to
33
- everyone who got in touch justifying why my change would be bad for all users.
32
+ - Update dependencies due security issues
33
+ - Support interpolation only expression list
34
34
 
35
35
  Thank you :)
36
- }
36
+ '
37
37
  end
@@ -4,8 +4,7 @@
4
4
  # from lexical definition file "./assets/lexer.rex".
5
5
  #++
6
6
 
7
-
8
- class HCLLexer
7
+ class HCL::Checker::Lexer
9
8
  require 'strscan'
10
9
 
11
10
  class ScanError < StandardError ; end
@@ -135,13 +134,14 @@ class HCLLexer
135
134
  tokens
136
135
  end
137
136
  def to_boolean(input)
138
- input =
139
- if input =~ /true/
140
- true
141
- elsif input =~ /false/
142
- false
143
- end
144
- return input
137
+ case input
138
+ when /true/
139
+ true
140
+ when /false/
141
+ false
142
+ else
143
+ raise "Invalid value for `to_boolean`, expected true/false got #{input}"
144
+ end
145
145
  end
146
146
  def consume_comment(input)
147
147
  nested = 1
@@ -159,18 +159,19 @@ class HCLLexer
159
159
  def consume_string(input)
160
160
  result = ''
161
161
  nested = 0
162
- begin
162
+ loop do
163
163
  case(text = @ss.scan_until(%r{\"|\$\{|\}|\\}))
164
164
  when %r{\$\{\z}
165
165
  nested += 1
166
166
  when %r{\}\z}
167
- nested -= 1 if nested > 0
167
+ nested -= 1 if nested.positive?
168
168
  when %r{\\\z}
169
169
  result += text.chop + @ss.getch
170
170
  next
171
171
  end
172
172
  result += text.to_s
173
- end until nested == 0 && text =~ %r{\"\z}
173
+ break if nested.zero? && text =~ %r{\"\z}
174
+ end
174
175
  result.chop
175
176
  end
176
177
  def consume_heredoc
@@ -6,29 +6,43 @@
6
6
 
7
7
  require 'racc/parser.rb'
8
8
 
9
- require_relative './lexer'
9
+ require_relative 'lexer'
10
10
 
11
- class HCLParser < Racc::Parser
11
+ module HCL
12
+ module Checker
13
+ class Parser < Racc::Parser
12
14
 
13
- module_eval(<<'...end parse.y/module_eval...', 'parse.y', 128)
15
+ module_eval(<<'...end parse.y/module_eval...', 'parse.y', 130)
14
16
  #//
15
17
  #// HCL is unclear on what one should do when duplicate
16
18
  #// keys are encountered.
17
19
  #//
18
20
  #// from decoder.go: if we're at the root or we're directly within
19
- #// a list, decode to hashes, otherwise lists
21
+ #// a list, decode to hashes, otherwise lists
20
22
  #//
21
23
  #// from object.go: there is a flattened list structure
22
24
  #//
25
+ #// if @duplicate_mode is set:
26
+ #// - :array then duplicates will be appended to an array
27
+ #// - :merge then duplicates will be deep merged into a hash
28
+ #//
23
29
  def flatten_objectlist(list)
24
30
  (list || {}).each_with_object({}) do |a, h|
25
- h[a.first] =
26
- case a.last
27
- when Hash
31
+ if h.keys.include?(a.first)
32
+ case @duplicate_mode
33
+ when :array
34
+ if h[a.first].is_a?(Array)
35
+ h[a.first].push(a.last)
36
+ else
37
+ h[a.first] = [ h[a.first], a.last ]
38
+ end
39
+ when :merge
28
40
  deep_merge(h[a.first] || {}, a.last)
29
- else
30
- h[a.first] = a.last
41
+ else raise ArgumentError
31
42
  end
43
+ else
44
+ h[a.first] = a.last
45
+ end
32
46
  end
33
47
  end
34
48
 
@@ -40,10 +54,12 @@ module_eval(<<'...end parse.y/module_eval...', 'parse.y', 128)
40
54
  end
41
55
 
42
56
 
43
- def parse(input)
44
- @lexer = HCLLexer.new.lex(input)
57
+ def parse(input, duplicate_mode = :array)
58
+ @duplicate_mode = duplicate_mode
59
+ @lexer = HCL::Checker::Lexer.new.lex(input)
45
60
  do_parse
46
- return @result
61
+
62
+ @result
47
63
  end
48
64
 
49
65
 
@@ -69,46 +85,46 @@ module_eval(<<'...end parse.y/module_eval...', 'parse.y', 128)
69
85
  ##### State transition tables begin ###
70
86
 
71
87
  racc_action_table = [
72
- 22, 29, 28, 10, 12, 26, 43, 23, 5, 14,
73
- 6, 27, 29, 28, 5, 42, 6, -10, 37, 31,
74
- 14, -11, 27, 34, 29, 28, 5, 5, 6, 6,
75
- 37, 40, 14, 17, 27, 18, 13, 14, 19, 20,
76
- 32, 41, 44 ]
88
+ 22, 29, 28, 10, 19, 26, 44, 23, 5, 14,
89
+ 6, 27, 29, 28, 13, 43, 40, 17, 37, 18,
90
+ 14, 14, 27, 34, 29, 28, 32, 5, 40, 6,
91
+ 37, 5, 14, 6, 27, 5, 41, 6, -11, -10,
92
+ 31, 42, 12, 45, 20 ]
77
93
 
78
94
  racc_action_check = [
79
- 13, 13, 13, 1, 4, 13, 33, 13, 0, 13,
80
- 0, 13, 27, 27, 14, 33, 14, 5, 27, 14,
81
- 27, 6, 27, 27, 43, 43, 30, 3, 30, 3,
82
- 43, 30, 43, 9, 43, 9, 7, 9, 10, 11,
83
- 26, 32, 41 ]
95
+ 13, 13, 13, 1, 10, 13, 33, 13, 0, 13,
96
+ 0, 13, 27, 27, 7, 33, 27, 9, 27, 9,
97
+ 27, 9, 27, 27, 44, 44, 26, 3, 44, 3,
98
+ 44, 30, 44, 30, 44, 14, 30, 14, 6, 5,
99
+ 14, 32, 4, 42, 11 ]
84
100
 
85
101
  racc_action_pointer = [
86
- 1, 3, nil, 20, -1, 9, 13, 28, nil, 26,
87
- 38, 34, nil, -2, 7, nil, nil, nil, nil, nil,
88
- nil, nil, nil, nil, nil, nil, 25, 9, nil, nil,
89
- 19, nil, 34, 1, nil, nil, nil, nil, nil, nil,
90
- nil, 26, nil, 21, nil, nil ]
102
+ 1, 3, nil, 20, 37, 31, 30, 6, nil, 10,
103
+ 4, 39, nil, -2, 28, nil, nil, nil, nil, nil,
104
+ nil, nil, nil, nil, nil, nil, 11, 9, nil, nil,
105
+ 24, nil, 34, 1, nil, nil, nil, nil, nil, nil,
106
+ nil, nil, 27, nil, 21, nil, nil ]
91
107
 
92
108
  racc_action_default = [
93
- -2, -35, -1, -3, -5, -22, -23, -35, -19, -35,
94
- -35, -7, -4, -35, -35, -20, -21, -22, -23, 46,
95
- -6, -12, -13, -14, -15, -16, -18, -35, -33, -34,
96
- -35, -9, -35, -35, -25, -26, -29, -30, -31, -32,
97
- -8, -35, -24, -28, -17, -27 ]
109
+ -2, -36, -1, -3, -5, -22, -23, -36, -19, -36,
110
+ -36, -7, -4, -36, -36, -20, -21, -22, -23, 47,
111
+ -6, -12, -13, -14, -15, -16, -18, -36, -34, -35,
112
+ -36, -9, -36, -36, -25, -26, -29, -30, -31, -32,
113
+ -33, -8, -36, -24, -28, -17, -27 ]
98
114
 
99
115
  racc_goto_table = [
100
- 11, 35, 3, 15, 1, 2, 21, 24, 25, 16,
101
- 33, nil, nil, nil, nil, nil, 30, 45, nil, nil,
116
+ 11, 35, 3, 15, 16, 33, 21, 24, 2, 1,
117
+ 25, nil, nil, nil, nil, nil, 30, nil, 46, nil,
102
118
  nil, nil, nil, nil, nil, nil, nil, 11 ]
103
119
 
104
120
  racc_goto_check = [
105
- 4, 12, 3, 5, 1, 2, 7, 5, 8, 9,
106
- 11, nil, nil, nil, nil, nil, 3, 12, nil, nil,
121
+ 4, 12, 3, 5, 9, 11, 7, 5, 2, 1,
122
+ 8, nil, nil, nil, nil, nil, 3, nil, 12, nil,
107
123
  nil, nil, nil, nil, nil, nil, nil, 4 ]
108
124
 
109
125
  racc_goto_pointer = [
110
- nil, 4, 5, 2, -3, -6, nil, -7, -5, 0,
111
- nil, -17, -26 ]
126
+ nil, 9, 8, 2, -3, -6, nil, -7, -3, -5,
127
+ nil, -22, -26 ]
112
128
 
113
129
  racc_goto_default = [
114
130
  nil, nil, nil, nil, 4, 39, 7, 36, 38, 8,
@@ -148,12 +164,13 @@ racc_reduce_table = [
148
164
  1, 32, :_reduce_30,
149
165
  1, 32, :_reduce_31,
150
166
  1, 32, :_reduce_32,
151
- 1, 27, :_reduce_33,
152
- 1, 27, :_reduce_34 ]
167
+ 1, 32, :_reduce_33,
168
+ 1, 27, :_reduce_34,
169
+ 1, 27, :_reduce_35 ]
153
170
 
154
- racc_reduce_n = 35
171
+ racc_reduce_n = 36
155
172
 
156
- racc_shift_n = 46
173
+ racc_shift_n = 47
157
174
 
158
175
  racc_token_table = {
159
176
  false => 0,
@@ -291,7 +308,7 @@ module_eval(<<'.,.,', 'parse.y', 41)
291
308
 
292
309
  module_eval(<<'.,.,', 'parse.y', 43)
293
310
  def _reduce_9(val, _values, result)
294
- return
311
+ return {}
295
312
  result
296
313
  end
297
314
  .,.,
@@ -403,7 +420,7 @@ module_eval(<<'.,.,', 'parse.y', 88)
403
420
 
404
421
  module_eval(<<'.,.,', 'parse.y', 90)
405
422
  def _reduce_25(val, _values, result)
406
- return
423
+ return []
407
424
  result
408
425
  end
409
426
  .,.,
@@ -457,7 +474,7 @@ module_eval(<<'.,.,', 'parse.y', 110)
457
474
  end
458
475
  .,.,
459
476
 
460
- module_eval(<<'.,.,', 'parse.y', 115)
477
+ module_eval(<<'.,.,', 'parse.y', 112)
461
478
  def _reduce_33(val, _values, result)
462
479
  result = val[0]
463
480
  result
@@ -471,8 +488,17 @@ module_eval(<<'.,.,', 'parse.y', 117)
471
488
  end
472
489
  .,.,
473
490
 
491
+ module_eval(<<'.,.,', 'parse.y', 119)
492
+ def _reduce_35(val, _values, result)
493
+ result = val[0]
494
+ result
495
+ end
496
+ .,.,
497
+
474
498
  def _reduce_none(val, _values, result)
475
499
  val[0]
476
500
  end
477
501
 
478
- end # class HCLParser
502
+ end # class Parser
503
+ end # module Checker
504
+ end # module HCL
@@ -1,5 +1,5 @@
1
1
  module HCL
2
2
  module Checker
3
- VERSION = '1.5.0'
3
+ VERSION = '1.6.2'.freeze
4
4
  end
5
5
  end
data/lib/hcl/checker.rb CHANGED
@@ -1,26 +1,33 @@
1
- require 'hcl/checker/version'
2
- require_relative 'lexer'
3
- require_relative 'parser'
1
+ require_relative 'checker/version'
2
+ require_relative 'checker/lexer'
3
+ require_relative 'checker/parser'
4
4
 
5
5
  module HCL
6
6
  module Checker
7
+ VALID_DUPLICATE_MODES = %i(array merge).freeze
8
+
7
9
  class << self
8
10
  attr_accessor :last_error
9
11
 
10
12
  def valid?(value)
11
- ret = HCLParser.new.parse(value)
13
+ ret = HCL::Checker::Parser.new.parse(value)
12
14
  return true if ret.is_a? Hash
15
+
13
16
  false
14
17
  rescue Racc::ParseError => e
15
18
  @last_error = e.message
19
+
16
20
  false
17
21
  end
18
22
 
19
- def parse(value)
20
- HCLParser.new.parse(value)
23
+ def parse(value, duplicate_mode = :array)
24
+ raise ArgumentError, "Invalid duplicate mode #{duplicate_mode}, must be one of #{VALID_DUPLICATE_MODES}" unless VALID_DUPLICATE_MODES.include?(duplicate_mode)
25
+
26
+ HCL::Checker::Parser.new.parse(value, duplicate_mode)
21
27
  rescue Racc::ParseError => e
22
28
  @last_error = e.message
23
- return e.message
29
+
30
+ e.message
24
31
  end
25
32
  end
26
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hcl-checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcelo Castellani
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-21 00:00:00.000000000 Z
11
+ date: 2022-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,84 +16,84 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.1.4
19
+ version: 2.3.13
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.1.4
26
+ version: 2.3.13
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: racc
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 12.3.3
33
+ version: 1.5.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 12.3.3
40
+ version: 1.5.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: 12.3.3
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: 12.3.3
55
55
  - !ruby/object:Gem::Dependency
56
- name: racc
56
+ name: rex
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.5.0
61
+ version: 2.0.12
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.5.0
68
+ version: 2.0.12
69
69
  - !ruby/object:Gem::Dependency
70
- name: rex
70
+ name: rexical
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 2.0.12
75
+ version: 1.0.7
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 2.0.12
82
+ version: 1.0.7
83
83
  - !ruby/object:Gem::Dependency
84
- name: rexical
84
+ name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.0.7
89
+ version: '3.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.0.7
96
+ version: '3.0'
97
97
  description: Hashicorp Configuration Language parser and checker for Ruby
98
98
  email:
99
99
  - marcelo@linux.com
@@ -103,6 +103,7 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - ".gitignore"
105
105
  - ".rspec"
106
+ - ".rubocop.yml"
106
107
  - ".travis.yml"
107
108
  - CODE_OF_CONDUCT.md
108
109
  - Gemfile
@@ -116,19 +117,19 @@ files:
116
117
  - bin/setup
117
118
  - hcl-checker.gemspec
118
119
  - lib/hcl/checker.rb
120
+ - lib/hcl/checker/lexer.rb
121
+ - lib/hcl/checker/parser.rb
119
122
  - lib/hcl/checker/version.rb
120
- - lib/hcl/lexer.rb
121
- - lib/hcl/parser.rb
122
123
  homepage: https://github.com/mfcastellani/hcl-checker
123
124
  licenses:
124
125
  - MIT
125
126
  metadata: {}
126
127
  post_install_message: |2
127
128
 
128
- Hello, me again. After several contacts of users of this gem requesting that
129
- the module name be kept only as HCL, instead of HCL1 and HCL2, I went back and
130
- kept it. Sorry for those who eventually switched from HCL to HCL1. And thanks to
131
- everyone who got in touch justifying why my change would be bad for all users.
129
+ Hello, me again. This version fixes:
130
+
131
+ - Update dependencies due security issues
132
+ - Support interpolation only expression list
132
133
 
133
134
  Thank you :)
134
135
  rdoc_options: []
@@ -145,8 +146,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
146
  - !ruby/object:Gem::Version
146
147
  version: '0'
147
148
  requirements: []
148
- rubygems_version: 3.0.8
149
- signing_key:
149
+ rubygems_version: 3.2.3
150
+ signing_key:
150
151
  specification_version: 4
151
152
  summary: Hashicorp Configuration Language parser for Ruby
152
153
  test_files: []