hcl-checker 1.4.0 → 1.6.1

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.
@@ -0,0 +1,496 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.5.2
4
+ # from Racc grammar file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+
9
+ require_relative 'lexer'
10
+
11
+ module HCL
12
+ module Checker
13
+ class Parser < Racc::Parser
14
+
15
+ module_eval(<<'...end parse.y/module_eval...', 'parse.y', 128)
16
+ #//
17
+ #// HCL is unclear on what one should do when duplicate
18
+ #// keys are encountered.
19
+ #//
20
+ #// from decoder.go: if we're at the root or we're directly within
21
+ #// a list, decode to hashes, otherwise lists
22
+ #//
23
+ #// from object.go: there is a flattened list structure
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
+ #//
29
+ def flatten_objectlist(list)
30
+ (list || {}).each_with_object({}) do |a, h|
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
40
+ deep_merge(h[a.first] || {}, a.last)
41
+ else raise ArgumentError
42
+ end
43
+ else
44
+ h[a.first] = a.last
45
+ end
46
+ end
47
+ end
48
+
49
+
50
+ def on_error(error_token_id, error_value, value_stack)
51
+ error_message = value_stack.to_s.split(',').last.gsub(']', '')
52
+ header = "Parse error at #{error_message} #{error_value} (invalid token: #{error_value})"
53
+ raise Racc::ParseError, header
54
+ end
55
+
56
+
57
+ def parse(input, duplicate_mode = :array)
58
+ @duplicate_mode = duplicate_mode
59
+ @lexer = HCL::Checker::Lexer.new.lex(input)
60
+ do_parse
61
+
62
+ @result
63
+ end
64
+
65
+
66
+ def next_token
67
+ @lexer.shift
68
+ end
69
+
70
+ def deep_merge(hash1, hash2)
71
+ hash2.keys.each do |key|
72
+ value1 = hash1[key]
73
+ value2 = hash2[key]
74
+
75
+ if value1.is_a?(Hash) && value2.is_a?(Hash)
76
+ hash1[key] = deep_merge(value1, value2)
77
+ else
78
+ hash1[key] = value2
79
+ end
80
+ end
81
+
82
+ hash1
83
+ end
84
+ ...end parse.y/module_eval...
85
+ ##### State transition tables begin ###
86
+
87
+ racc_action_table = [
88
+ 22, 29, 28, 10, 19, 26, 43, 23, 5, 14,
89
+ 6, 27, 29, 28, 5, 42, 6, 13, 37, 40,
90
+ 14, 32, 27, 34, 29, 28, 5, 5, 6, 6,
91
+ 37, 31, 14, 17, 27, 18, -11, 14, -10, 41,
92
+ 12, 44, 20 ]
93
+
94
+ racc_action_check = [
95
+ 13, 13, 13, 1, 10, 13, 33, 13, 0, 13,
96
+ 0, 13, 27, 27, 30, 33, 30, 7, 27, 30,
97
+ 27, 26, 27, 27, 43, 43, 14, 3, 14, 3,
98
+ 43, 14, 43, 9, 43, 9, 6, 9, 5, 32,
99
+ 4, 41, 11 ]
100
+
101
+ racc_action_pointer = [
102
+ 1, 3, nil, 20, 35, 30, 28, 9, nil, 26,
103
+ 4, 37, nil, -2, 19, nil, nil, nil, nil, nil,
104
+ nil, nil, nil, nil, nil, nil, 6, 9, nil, nil,
105
+ 7, nil, 32, 1, nil, nil, nil, nil, nil, nil,
106
+ nil, 25, nil, 21, nil, nil ]
107
+
108
+ racc_action_default = [
109
+ -2, -35, -1, -3, -5, -22, -23, -35, -19, -35,
110
+ -35, -7, -4, -35, -35, -20, -21, -22, -23, 46,
111
+ -6, -12, -13, -14, -15, -16, -18, -35, -33, -34,
112
+ -35, -9, -35, -35, -25, -26, -29, -30, -31, -32,
113
+ -8, -35, -24, -28, -17, -27 ]
114
+
115
+ racc_goto_table = [
116
+ 11, 35, 3, 15, 16, 33, 21, 24, 2, 1,
117
+ 25, nil, nil, nil, nil, nil, 30, 45, nil, nil,
118
+ nil, nil, nil, nil, nil, nil, nil, 11 ]
119
+
120
+ racc_goto_check = [
121
+ 4, 12, 3, 5, 9, 11, 7, 5, 2, 1,
122
+ 8, nil, nil, nil, nil, nil, 3, 12, nil, nil,
123
+ nil, nil, nil, nil, nil, nil, nil, 4 ]
124
+
125
+ racc_goto_pointer = [
126
+ nil, 9, 8, 2, -3, -6, nil, -7, -3, -5,
127
+ nil, -22, -26 ]
128
+
129
+ racc_goto_default = [
130
+ nil, nil, nil, nil, 4, 39, 7, 36, 38, 8,
131
+ 9, nil, nil ]
132
+
133
+ racc_reduce_table = [
134
+ 0, 0, :racc_error,
135
+ 1, 21, :_reduce_1,
136
+ 0, 22, :_reduce_2,
137
+ 1, 22, :_reduce_none,
138
+ 2, 23, :_reduce_4,
139
+ 1, 23, :_reduce_5,
140
+ 3, 23, :_reduce_6,
141
+ 2, 23, :_reduce_7,
142
+ 3, 25, :_reduce_8,
143
+ 2, 25, :_reduce_9,
144
+ 1, 26, :_reduce_10,
145
+ 1, 26, :_reduce_11,
146
+ 3, 24, :_reduce_12,
147
+ 3, 24, :_reduce_13,
148
+ 3, 24, :_reduce_14,
149
+ 3, 24, :_reduce_15,
150
+ 3, 24, :_reduce_16,
151
+ 6, 24, :_reduce_17,
152
+ 3, 24, :_reduce_18,
153
+ 1, 24, :_reduce_19,
154
+ 2, 29, :_reduce_20,
155
+ 2, 29, :_reduce_21,
156
+ 1, 30, :_reduce_22,
157
+ 1, 30, :_reduce_23,
158
+ 3, 28, :_reduce_24,
159
+ 2, 28, :_reduce_25,
160
+ 1, 31, :_reduce_26,
161
+ 3, 31, :_reduce_27,
162
+ 2, 31, :_reduce_28,
163
+ 1, 32, :_reduce_29,
164
+ 1, 32, :_reduce_30,
165
+ 1, 32, :_reduce_31,
166
+ 1, 32, :_reduce_32,
167
+ 1, 27, :_reduce_33,
168
+ 1, 27, :_reduce_34 ]
169
+
170
+ racc_reduce_n = 35
171
+
172
+ racc_shift_n = 46
173
+
174
+ racc_token_table = {
175
+ false => 0,
176
+ :error => 1,
177
+ :BOOL => 2,
178
+ :FLOAT => 3,
179
+ :NUMBER => 4,
180
+ :COMMA => 5,
181
+ :COMMAEND => 6,
182
+ :IDENTIFIER => 7,
183
+ :EQUAL => 8,
184
+ :STRING => 9,
185
+ :MINUS => 10,
186
+ :LEFTBRACE => 11,
187
+ :RIGHTBRACE => 12,
188
+ :LEFTBRACKET => 13,
189
+ :RIGHTBRACKET => 14,
190
+ :LEFTPARENTHESES => 15,
191
+ :RIGHTPARENTHESES => 16,
192
+ :PERIOD => 17,
193
+ :EPLUS => 18,
194
+ :EMINUS => 19 }
195
+
196
+ racc_nt_base = 20
197
+
198
+ racc_use_result_var = true
199
+
200
+ Racc_arg = [
201
+ racc_action_table,
202
+ racc_action_check,
203
+ racc_action_default,
204
+ racc_action_pointer,
205
+ racc_goto_table,
206
+ racc_goto_check,
207
+ racc_goto_default,
208
+ racc_goto_pointer,
209
+ racc_nt_base,
210
+ racc_reduce_table,
211
+ racc_token_table,
212
+ racc_shift_n,
213
+ racc_reduce_n,
214
+ racc_use_result_var ]
215
+
216
+ Racc_token_to_s_table = [
217
+ "$end",
218
+ "error",
219
+ "BOOL",
220
+ "FLOAT",
221
+ "NUMBER",
222
+ "COMMA",
223
+ "COMMAEND",
224
+ "IDENTIFIER",
225
+ "EQUAL",
226
+ "STRING",
227
+ "MINUS",
228
+ "LEFTBRACE",
229
+ "RIGHTBRACE",
230
+ "LEFTBRACKET",
231
+ "RIGHTBRACKET",
232
+ "LEFTPARENTHESES",
233
+ "RIGHTPARENTHESES",
234
+ "PERIOD",
235
+ "EPLUS",
236
+ "EMINUS",
237
+ "$start",
238
+ "target",
239
+ "top",
240
+ "objectlist",
241
+ "objectitem",
242
+ "object",
243
+ "objectkey",
244
+ "number",
245
+ "list",
246
+ "block",
247
+ "block_id",
248
+ "listitems",
249
+ "listitem" ]
250
+
251
+ Racc_debug_parser = false
252
+
253
+ ##### State transition tables end #####
254
+
255
+ # reduce 0 omitted
256
+
257
+ module_eval(<<'.,.,', 'parse.y', 21)
258
+ def _reduce_1(val, _values, result)
259
+ @result = flatten_objectlist(val[0])
260
+ result
261
+ end
262
+ .,.,
263
+
264
+ module_eval(<<'.,.,', 'parse.y', 24)
265
+ def _reduce_2(val, _values, result)
266
+ result = val[0]
267
+ result
268
+ end
269
+ .,.,
270
+
271
+ # reduce 3 omitted
272
+
273
+ module_eval(<<'.,.,', 'parse.y', 30)
274
+ def _reduce_4(val, _values, result)
275
+ result = [val[0]]
276
+ result
277
+ end
278
+ .,.,
279
+
280
+ module_eval(<<'.,.,', 'parse.y', 32)
281
+ def _reduce_5(val, _values, result)
282
+ result = [val[0]]
283
+ result
284
+ end
285
+ .,.,
286
+
287
+ module_eval(<<'.,.,', 'parse.y', 34)
288
+ def _reduce_6(val, _values, result)
289
+ result = val[0] << val[1]
290
+ result
291
+ end
292
+ .,.,
293
+
294
+ module_eval(<<'.,.,', 'parse.y', 36)
295
+ def _reduce_7(val, _values, result)
296
+ result = val[0] << val[1]
297
+ result
298
+ end
299
+ .,.,
300
+
301
+ module_eval(<<'.,.,', 'parse.y', 41)
302
+ def _reduce_8(val, _values, result)
303
+ result = flatten_objectlist(val[1])
304
+ result
305
+ end
306
+ .,.,
307
+
308
+ module_eval(<<'.,.,', 'parse.y', 43)
309
+ def _reduce_9(val, _values, result)
310
+ return {}
311
+ result
312
+ end
313
+ .,.,
314
+
315
+ module_eval(<<'.,.,', 'parse.y', 48)
316
+ def _reduce_10(val, _values, result)
317
+ result = val[0]
318
+ result
319
+ end
320
+ .,.,
321
+
322
+ module_eval(<<'.,.,', 'parse.y', 50)
323
+ def _reduce_11(val, _values, result)
324
+ result = val[0]
325
+ result
326
+ end
327
+ .,.,
328
+
329
+ module_eval(<<'.,.,', 'parse.y', 55)
330
+ def _reduce_12(val, _values, result)
331
+ result = val[0], val[2]
332
+ result
333
+ end
334
+ .,.,
335
+
336
+ module_eval(<<'.,.,', 'parse.y', 57)
337
+ def _reduce_13(val, _values, result)
338
+ result = val[0], val[2]
339
+ result
340
+ end
341
+ .,.,
342
+
343
+ module_eval(<<'.,.,', 'parse.y', 59)
344
+ def _reduce_14(val, _values, result)
345
+ result = val[0], val[2]
346
+ result
347
+ end
348
+ .,.,
349
+
350
+ module_eval(<<'.,.,', 'parse.y', 61)
351
+ def _reduce_15(val, _values, result)
352
+ result = val[0], val[2]
353
+ result
354
+ end
355
+ .,.,
356
+
357
+ module_eval(<<'.,.,', 'parse.y', 63)
358
+ def _reduce_16(val, _values, result)
359
+ result = val[0], val[2]
360
+ result
361
+ end
362
+ .,.,
363
+
364
+ module_eval(<<'.,.,', 'parse.y', 65)
365
+ def _reduce_17(val, _values, result)
366
+ result = val[0], "#{val[2]}(#{val[4]})"
367
+ result
368
+ end
369
+ .,.,
370
+
371
+ module_eval(<<'.,.,', 'parse.y', 67)
372
+ def _reduce_18(val, _values, result)
373
+ result = val[0], val[2]
374
+ result
375
+ end
376
+ .,.,
377
+
378
+ module_eval(<<'.,.,', 'parse.y', 69)
379
+ def _reduce_19(val, _values, result)
380
+ result = val[0]
381
+ result
382
+ end
383
+ .,.,
384
+
385
+ module_eval(<<'.,.,', 'parse.y', 74)
386
+ def _reduce_20(val, _values, result)
387
+ result = val[0], val[1]
388
+ result
389
+ end
390
+ .,.,
391
+
392
+ module_eval(<<'.,.,', 'parse.y', 76)
393
+ def _reduce_21(val, _values, result)
394
+ result = val[0], {val[1][0] => val[1][1]}
395
+ result
396
+ end
397
+ .,.,
398
+
399
+ module_eval(<<'.,.,', 'parse.y', 81)
400
+ def _reduce_22(val, _values, result)
401
+ result = val[0]
402
+ result
403
+ end
404
+ .,.,
405
+
406
+ module_eval(<<'.,.,', 'parse.y', 83)
407
+ def _reduce_23(val, _values, result)
408
+ result = val[0]
409
+ result
410
+ end
411
+ .,.,
412
+
413
+ module_eval(<<'.,.,', 'parse.y', 88)
414
+ def _reduce_24(val, _values, result)
415
+ result = val[1]
416
+ result
417
+ end
418
+ .,.,
419
+
420
+ module_eval(<<'.,.,', 'parse.y', 90)
421
+ def _reduce_25(val, _values, result)
422
+ return []
423
+ result
424
+ end
425
+ .,.,
426
+
427
+ module_eval(<<'.,.,', 'parse.y', 95)
428
+ def _reduce_26(val, _values, result)
429
+ result = [val[0]]
430
+ result
431
+ end
432
+ .,.,
433
+
434
+ module_eval(<<'.,.,', 'parse.y', 97)
435
+ def _reduce_27(val, _values, result)
436
+ result = val[0] << val[2]
437
+ result
438
+ end
439
+ .,.,
440
+
441
+ module_eval(<<'.,.,', 'parse.y', 99)
442
+ def _reduce_28(val, _values, result)
443
+ result = val[0]
444
+ result
445
+ end
446
+ .,.,
447
+
448
+ module_eval(<<'.,.,', 'parse.y', 104)
449
+ def _reduce_29(val, _values, result)
450
+ result = val[0]
451
+ result
452
+ end
453
+ .,.,
454
+
455
+ module_eval(<<'.,.,', 'parse.y', 106)
456
+ def _reduce_30(val, _values, result)
457
+ result = val[0]
458
+ result
459
+ end
460
+ .,.,
461
+
462
+ module_eval(<<'.,.,', 'parse.y', 108)
463
+ def _reduce_31(val, _values, result)
464
+ result = val[0]
465
+ result
466
+ end
467
+ .,.,
468
+
469
+ module_eval(<<'.,.,', 'parse.y', 110)
470
+ def _reduce_32(val, _values, result)
471
+ result = val[0]
472
+ result
473
+ end
474
+ .,.,
475
+
476
+ module_eval(<<'.,.,', 'parse.y', 115)
477
+ def _reduce_33(val, _values, result)
478
+ result = val[0]
479
+ result
480
+ end
481
+ .,.,
482
+
483
+ module_eval(<<'.,.,', 'parse.y', 117)
484
+ def _reduce_34(val, _values, result)
485
+ result = val[0]
486
+ result
487
+ end
488
+ .,.,
489
+
490
+ def _reduce_none(val, _values, result)
491
+ val[0]
492
+ end
493
+
494
+ end # class Parser
495
+ end # module Checker
496
+ end # module HCL
@@ -1,5 +1,5 @@
1
1
  module HCL
2
2
  module Checker
3
- VERSION = '1.4.0'
3
+ VERSION = '1.6.1'.freeze
4
4
  end
5
5
  end
data/lib/hcl/checker.rb CHANGED
@@ -1,21 +1,34 @@
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
- def self.valid?(value)
8
- ret = HCLParser.new.parse(value)
9
- return true if ret.is_a? Hash
10
- false
11
- rescue
12
- false
13
- end
7
+ VALID_DUPLICATE_MODES = %i(array merge).freeze
8
+
9
+ class << self
10
+ attr_accessor :last_error
11
+
12
+ def valid?(value)
13
+ ret = HCL::Checker::Parser.new.parse(value)
14
+ return true if ret.is_a? Hash
15
+
16
+ false
17
+ rescue Racc::ParseError => e
18
+ @last_error = e.message
19
+
20
+ false
21
+ end
22
+
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)
27
+ rescue Racc::ParseError => e
28
+ @last_error = e.message
14
29
 
15
- def self.parse(value)
16
- HCLParser.new.parse(value)
17
- rescue Racc::ParseError => e
18
- return e.message
30
+ e.message
31
+ end
19
32
  end
20
33
  end
21
34
  end