kdl 2.0.1 → 2.1.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 +4 -4
- data/Gemfile +1 -1
- data/lib/kdl/builder.rb +76 -0
- data/lib/kdl/document.rb +5 -1
- data/lib/kdl/error.rb +18 -5
- data/lib/kdl/kdl.tab.rb +89 -89
- data/lib/kdl/kdl.yy +9 -9
- data/lib/kdl/node.rb +4 -0
- data/lib/kdl/parser_common.rb +5 -1
- data/lib/kdl/tokenizer.rb +16 -18
- data/lib/kdl/v1/kdl.yy +2 -2
- data/lib/kdl/v1/value.rb +1 -1
- data/lib/kdl/value.rb +1 -1
- data/lib/kdl/version.rb +1 -1
- data/lib/kdl.rb +22 -7
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24483470a3eb179aeb4a3e2e759693a4e818316cb7cb6c3b019b22b2318504af
|
4
|
+
data.tar.gz: 73ce32af9afa6ebcd4be7a73add2ee1077e08aad71425863b75b1581613a2628
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2ea10129c13825376583228ce0d5e91f888c89e6adb0787f02c1f046801d79809b0fa2997799b30237493b70717c1bc5423eefc360d07387333709157f6690b
|
7
|
+
data.tar.gz: fbbf3d6e8d148ab9a67855ed8751d31b1f28adc1a4798309c6dc6344d02042c655997ab9abfe833b32686f58cc1fb9da4024bb56e62794d14c7b0c1b201fedc4
|
data/Gemfile
CHANGED
data/lib/kdl/builder.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KDL
|
4
|
+
class Builder < BasicObject
|
5
|
+
class Error < ::KDL::Error; end
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@nesting = []
|
9
|
+
@document = Document.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def document(&block)
|
13
|
+
yield if block
|
14
|
+
@document
|
15
|
+
end
|
16
|
+
|
17
|
+
def node(name = nil, *args, type: nil, **props, &block)
|
18
|
+
n = Node.new(name&.to_s || "node", type:)
|
19
|
+
@nesting << n
|
20
|
+
args.each do |value|
|
21
|
+
case value
|
22
|
+
when ::Hash
|
23
|
+
value.each { |k, v| prop k, v }
|
24
|
+
else arg value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
props.each do |key, value|
|
28
|
+
prop key, value
|
29
|
+
end
|
30
|
+
yield if block
|
31
|
+
@nesting.pop
|
32
|
+
if parent = current_node
|
33
|
+
parent.children << n
|
34
|
+
else
|
35
|
+
@document << n
|
36
|
+
end
|
37
|
+
n
|
38
|
+
end
|
39
|
+
alias _ node
|
40
|
+
|
41
|
+
def arg(value, type: nil)
|
42
|
+
if n = current_node
|
43
|
+
val = Value.from(value)
|
44
|
+
val = val.as_type(type) if type
|
45
|
+
n.arguments << val
|
46
|
+
val
|
47
|
+
else
|
48
|
+
raise Error, "Can't do argument, not inside Node"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def prop(key, value, type: nil)
|
53
|
+
key = key.to_s
|
54
|
+
if n = current_node
|
55
|
+
val = Value.from(value)
|
56
|
+
val = val.as_type(type) if type
|
57
|
+
n.properties[key] = val
|
58
|
+
val
|
59
|
+
else
|
60
|
+
raise Error, "Can't do property, not inside Node"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def method_missing(name, *args, **props, &block)
|
65
|
+
node name, *args, **props, &block
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def current_node
|
71
|
+
return nil if @nesting.empty?
|
72
|
+
|
73
|
+
@nesting.last
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/kdl/document.rb
CHANGED
@@ -6,7 +6,7 @@ module KDL
|
|
6
6
|
|
7
7
|
attr_accessor :nodes
|
8
8
|
|
9
|
-
def initialize(nodes)
|
9
|
+
def initialize(nodes = [])
|
10
10
|
@nodes = nodes
|
11
11
|
end
|
12
12
|
|
@@ -21,6 +21,10 @@ module KDL
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
def <<(node)
|
25
|
+
nodes << node
|
26
|
+
end
|
27
|
+
|
24
28
|
def arg(key)
|
25
29
|
self[key]&.arguments&.first&.value
|
26
30
|
end
|
data/lib/kdl/error.rb
CHANGED
@@ -1,13 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module KDL
|
4
|
-
class Error < StandardError
|
4
|
+
class Error < StandardError
|
5
|
+
attr_reader :filename, :line, :column
|
6
|
+
|
7
|
+
def initialize(message, filename = nil, line = nil, column = nil)
|
8
|
+
message += " (#{line}:#{column})" if line
|
9
|
+
message = "#{[filename, line, column].compact.join(':')}: #{message}" if filename
|
10
|
+
super(message)
|
11
|
+
@filename = filename
|
12
|
+
@line = line
|
13
|
+
@column = column
|
14
|
+
end
|
15
|
+
end
|
5
16
|
|
6
17
|
class VersionMismatchError < Error
|
7
18
|
attr_reader :version, :parser_version
|
8
19
|
|
9
|
-
def initialize(message, version = nil, parser_version = nil)
|
10
|
-
super(message)
|
20
|
+
def initialize(message, version = nil, parser_version = nil, filename = nil)
|
21
|
+
super(message, filename, 1, 1)
|
11
22
|
@version = version
|
12
23
|
@parser_version = parser_version
|
13
24
|
end
|
@@ -16,9 +27,11 @@ module KDL
|
|
16
27
|
class UnsupportedVersionError < Error
|
17
28
|
attr_reader :version
|
18
29
|
|
19
|
-
def initialize(message, version = nil)
|
20
|
-
super(message)
|
30
|
+
def initialize(message, version = nil, filename = nil)
|
31
|
+
super(message, filename, 1, 1)
|
21
32
|
@version = version
|
22
33
|
end
|
23
34
|
end
|
35
|
+
|
36
|
+
class ParseError < Error; end
|
24
37
|
end
|
data/lib/kdl/kdl.tab.rb
CHANGED
@@ -29,100 +29,100 @@ module_eval(<<'...end kdl.yy/module_eval...', 'kdl.yy', 78)
|
|
29
29
|
##### State transition tables begin ###
|
30
30
|
|
31
31
|
racc_action_table = [
|
32
|
-
20, 21, 22, 9,
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
6,
|
46
|
-
7,
|
47
|
-
|
32
|
+
20, 21, 22, 9, 34, 26, 20, 21, 22, 20,
|
33
|
+
21, 22, 19, 18, 5, 6, 34, 18, 19, 20,
|
34
|
+
21, 22, 7, 18, 34, 18, 34, 5, 6, 72,
|
35
|
+
86, 19, 20, 21, 22, 7, 18, -39, 20, 21,
|
36
|
+
22, -40, 34, 88, 19, -41, 5, 6, 74, 18,
|
37
|
+
19, 18, 34, 84, 7, 49, 50, 51, 55, 56,
|
38
|
+
59, 60, 58, 71, 6, 34, 34, 19, -54, -54,
|
39
|
+
92, 7, 49, 50, 51, 55, 56, 59, 60, 58,
|
40
|
+
20, 21, 22, 93, 19, 76, 77, 78, 55, 56,
|
41
|
+
59, 60, 58, 34, 34, -63, -63, 19, 34, 34,
|
42
|
+
34, 34, -63, 18, 5, 6, nil, 18, 18, 18,
|
43
|
+
18, nil, 7, 5, 6, 5, 6, 5, 6, nil,
|
44
|
+
30, 7, nil, 7, nil, 7, 5, 6, 5, 6,
|
45
|
+
71, 6, 5, 6, 7, nil, 7, nil, 7, nil,
|
46
|
+
7, 71, 6, 71, 6, nil, nil, nil, 30, 7,
|
47
|
+
30, 7, 76, 77, 78, 55, 56, 59, 60, 58 ]
|
48
48
|
|
49
49
|
racc_action_check = [
|
50
|
-
2, 2, 2, 1,
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
50
|
+
2, 2, 2, 1, 32, 9, 3, 3, 3, 14,
|
51
|
+
14, 14, 2, 32, 3, 3, 41, 2, 3, 81,
|
52
|
+
81, 81, 3, 3, 19, 41, 34, 81, 81, 44,
|
53
|
+
81, 81, 82, 82, 82, 81, 81, 49, 17, 17,
|
54
|
+
17, 50, 45, 82, 82, 51, 17, 17, 52, 82,
|
55
|
+
17, 45, 62, 79, 17, 43, 43, 43, 43, 43,
|
56
|
+
43, 43, 43, 43, 43, 84, 71, 43, 71, 71,
|
57
|
+
90, 43, 33, 33, 33, 33, 33, 33, 33, 33,
|
58
|
+
38, 38, 38, 91, 33, 74, 74, 74, 74, 74,
|
59
|
+
74, 74, 74, 15, 42, 15, 42, 74, 63, 65,
|
60
|
+
66, 80, 15, 42, 0, 0, nil, 63, 65, 66,
|
61
|
+
80, nil, 0, 12, 12, 28, 28, 30, 30, nil,
|
62
|
+
12, 12, nil, 28, nil, 30, 37, 37, 40, 40,
|
63
|
+
64, 64, 72, 72, 37, nil, 40, nil, 64, nil,
|
64
|
+
72, 85, 85, 87, 87, nil, nil, nil, 85, 85,
|
65
|
+
87, 87, 54, 54, 54, 54, 54, 54, 54, 54 ]
|
66
66
|
|
67
67
|
racc_action_pointer = [
|
68
|
-
|
69
|
-
nil, nil,
|
70
|
-
nil, nil, nil, nil, nil, nil, nil, nil,
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
nil,
|
75
|
-
|
76
|
-
|
77
|
-
|
68
|
+
94, 3, -2, 4, nil, nil, nil, nil, nil, 5,
|
69
|
+
nil, nil, 103, nil, 7, 83, nil, 36, nil, 14,
|
70
|
+
nil, nil, nil, nil, nil, nil, nil, nil, 105, nil,
|
71
|
+
107, nil, -6, 70, 16, nil, nil, 116, 78, nil,
|
72
|
+
118, 6, 84, 53, 17, 32, nil, nil, nil, 21,
|
73
|
+
25, 29, 32, nil, 150, nil, nil, nil, nil, nil,
|
74
|
+
nil, nil, 42, 88, 120, 89, 90, nil, nil, nil,
|
75
|
+
nil, 56, 122, nil, 83, nil, nil, nil, nil, 38,
|
76
|
+
91, 17, 30, nil, 55, 131, nil, 133, nil, nil,
|
77
|
+
57, 70, nil, nil ]
|
78
78
|
|
79
79
|
racc_action_default = [
|
80
80
|
-63, -64, -1, -2, -3, -58, -59, -60, -61, -64,
|
81
81
|
-6, -7, -64, -9, -64, -11, -17, -64, -36, -63,
|
82
|
-
-39, -40, -41, -4, -5, -62,
|
83
|
-
-34, -10, -22, -54, -23, -37, -64, -
|
84
|
-
-
|
85
|
-
-47, -64, -43, -64, -48, -49, -50, -51, -52,
|
86
|
-
-55, -63, -15, -63, -64, -14, -31, -19, -21,
|
87
|
-
-58, -63, -29, -64, -44, -45, -46, -47, -64,
|
88
|
-
-64, -64, -42, -63, -63, -25, -63, -24, -38,
|
89
|
-
-64, -27, -26 ]
|
82
|
+
-39, -40, -41, -4, -5, -62, 94, -8, -32, -33,
|
83
|
+
-34, -10, -63, -22, -54, -56, -23, -37, -64, -57,
|
84
|
+
-35, -12, -13, -63, -64, -57, -30, -18, -20, -45,
|
85
|
+
-46, -47, -64, -43, -64, -48, -49, -50, -51, -52,
|
86
|
+
-53, -55, -63, -15, -63, -64, -14, -31, -19, -21,
|
87
|
+
-28, -58, -63, -29, -64, -44, -45, -46, -47, -64,
|
88
|
+
-16, -64, -64, -42, -63, -63, -25, -63, -24, -38,
|
89
|
+
-64, -64, -27, -26 ]
|
90
90
|
|
91
91
|
racc_goto_table = [
|
92
|
-
17, 17, 2, 23, 24, 3, 25,
|
93
|
-
|
94
|
-
|
95
|
-
43, 25,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
23, 24, 4, 25,
|
101
|
-
nil,
|
102
|
-
nil, nil, nil,
|
92
|
+
17, 17, 2, 23, 24, 3, 25, 1, 54, 47,
|
93
|
+
31, 4, 85, 87, 75, 41, 32, 36, 54, 68,
|
94
|
+
38, 67, 37, 42, 73, 66, 48, nil, 52, nil,
|
95
|
+
43, 25, 63, 62, nil, 40, 69, nil, 52, nil,
|
96
|
+
25, 33, 67, 25, 73, nil, nil, nil, 37, 54,
|
97
|
+
83, nil, nil, nil, nil, nil, nil, 80, 45, 67,
|
98
|
+
61, nil, nil, 79, nil, nil, nil, 65, 45, 37,
|
99
|
+
nil, 65, nil, nil, 82, nil, nil, 81, nil, 17,
|
100
|
+
17, 23, 24, 4, 25, 89, 90, nil, 91, 65,
|
101
|
+
nil, 65, 65, nil, nil, nil, nil, 61, nil, nil,
|
102
|
+
nil, nil, nil, nil, nil, nil, 65 ]
|
103
103
|
|
104
104
|
racc_goto_check = [
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
5, 6, 4, 24,
|
114
|
-
nil,
|
115
|
-
nil, nil, nil,
|
105
|
+
18, 18, 2, 5, 6, 3, 24, 1, 10, 17,
|
106
|
+
9, 4, 7, 7, 22, 13, 12, 5, 10, 17,
|
107
|
+
12, 20, 3, 14, 20, 13, 19, nil, 15, nil,
|
108
|
+
18, 24, 14, 15, nil, 3, 19, nil, 15, nil,
|
109
|
+
24, 16, 20, 24, 20, nil, nil, nil, 3, 10,
|
110
|
+
17, nil, nil, nil, nil, nil, nil, 14, 16, 20,
|
111
|
+
16, nil, nil, 12, nil, nil, nil, 16, 16, 3,
|
112
|
+
nil, 16, nil, nil, 2, nil, nil, 3, nil, 18,
|
113
|
+
18, 5, 6, 4, 24, 12, 12, nil, 12, 16,
|
114
|
+
nil, 16, 16, nil, nil, nil, nil, 16, nil, nil,
|
115
|
+
nil, nil, nil, nil, nil, nil, 16 ]
|
116
116
|
|
117
117
|
racc_goto_pointer = [
|
118
|
-
nil,
|
119
|
-
-
|
120
|
-
-
|
118
|
+
nil, 7, 2, 5, 11, 0, 1, -69, nil, -4,
|
119
|
+
-25, nil, 1, -17, -9, -5, 26, -24, -2, -7,
|
120
|
+
-21, nil, -40, nil, 3 ]
|
121
121
|
|
122
122
|
racc_goto_default = [
|
123
|
-
nil, nil, nil, 28,
|
124
|
-
14, 15,
|
125
|
-
|
123
|
+
nil, nil, nil, 28, 35, 10, 11, 12, 27, 13,
|
124
|
+
14, 15, 44, 70, nil, 16, 39, nil, 64, nil,
|
125
|
+
46, 29, 53, 57, 8 ]
|
126
126
|
|
127
127
|
racc_reduce_table = [
|
128
128
|
0, 0, :racc_error,
|
@@ -161,15 +161,15 @@ racc_reduce_table = [
|
|
161
161
|
1, 28, :_reduce_none,
|
162
162
|
1, 41, :_reduce_none,
|
163
163
|
2, 41, :_reduce_none,
|
164
|
-
1,
|
165
|
-
2,
|
164
|
+
1, 38, :_reduce_none,
|
165
|
+
2, 38, :_reduce_none,
|
166
166
|
6, 30, :_reduce_38,
|
167
167
|
1, 35, :_reduce_39,
|
168
168
|
1, 35, :_reduce_40,
|
169
169
|
1, 35, :_reduce_41,
|
170
|
-
3,
|
171
|
-
1,
|
172
|
-
2,
|
170
|
+
3, 39, :_reduce_42,
|
171
|
+
1, 37, :_reduce_none,
|
172
|
+
2, 37, :_reduce_44,
|
173
173
|
1, 42, :_reduce_45,
|
174
174
|
1, 42, :_reduce_46,
|
175
175
|
1, 42, :_reduce_47,
|
@@ -179,10 +179,10 @@ racc_reduce_table = [
|
|
179
179
|
1, 42, :_reduce_51,
|
180
180
|
1, 43, :_reduce_52,
|
181
181
|
1, 43, :_reduce_53,
|
182
|
+
1, 36, :_reduce_none,
|
183
|
+
2, 36, :_reduce_none,
|
184
|
+
1, 32, :_reduce_none,
|
182
185
|
1, 32, :_reduce_none,
|
183
|
-
2, 32, :_reduce_none,
|
184
|
-
1, 39, :_reduce_none,
|
185
|
-
1, 39, :_reduce_none,
|
186
186
|
1, 44, :_reduce_none,
|
187
187
|
1, 44, :_reduce_none,
|
188
188
|
1, 44, :_reduce_none,
|
@@ -192,7 +192,7 @@ racc_reduce_table = [
|
|
192
192
|
|
193
193
|
racc_reduce_n = 64
|
194
194
|
|
195
|
-
racc_shift_n =
|
195
|
+
racc_shift_n = 94
|
196
196
|
|
197
197
|
racc_token_table = {
|
198
198
|
false => 0,
|
@@ -270,14 +270,14 @@ Racc_token_to_s_table = [
|
|
270
270
|
"untyped_node",
|
271
271
|
"type",
|
272
272
|
"node_decl",
|
273
|
-
"
|
273
|
+
"ws_star",
|
274
274
|
"node_children",
|
275
275
|
"empty_childrens",
|
276
276
|
"identifier",
|
277
|
+
"ws_plus",
|
277
278
|
"value",
|
278
279
|
"slashdash",
|
279
280
|
"property",
|
280
|
-
"ws_star",
|
281
281
|
"empty_children",
|
282
282
|
"semicolon_term",
|
283
283
|
"untyped_value",
|
data/lib/kdl/kdl.yy
CHANGED
@@ -22,16 +22,16 @@ rule
|
|
22
22
|
unterm_node : untyped_node { val[0] }
|
23
23
|
| type untyped_node { val[1].as_type(val[0], @type_parsers.fetch(val[0], nil)) }
|
24
24
|
untyped_node : node_decl { val[0].tap { |x| x.children = [] } }
|
25
|
-
| node_decl
|
26
|
-
| node_decl
|
27
|
-
| node_decl
|
28
|
-
| node_decl
|
29
|
-
| node_decl
|
25
|
+
| node_decl ws_star node_children { val[0].tap { |x| x.children = val[2] } }
|
26
|
+
| node_decl ws_star empty_childrens { val[0].tap { |x| x.children = [] } }
|
27
|
+
| node_decl ws_star empty_childrens node_children { val[0].tap { |x| x.children = val[3] } }
|
28
|
+
| node_decl ws_star node_children empty_childrens { val[0].tap { |x| x.children = val[2] } }
|
29
|
+
| node_decl ws_star empty_childrens node_children empty_childrens { val[0].tap { |x| x.children = val[3] } }
|
30
30
|
node_decl : identifier { @output_module::Node.new(val[0]) }
|
31
31
|
| node_decl ws_plus value { val[0].tap { |x| x.arguments << val[2] } }
|
32
|
-
| node_decl
|
32
|
+
| node_decl ws_star slashdash value { val[0] }
|
33
33
|
| node_decl ws_plus property { val[0].tap { |x| x.properties[val[2][0]] = val[2][1] } }
|
34
|
-
| node_decl
|
34
|
+
| node_decl ws_star slashdash property { val[0] }
|
35
35
|
| node_decl ws_plus { val[0] }
|
36
36
|
empty_node : slashdash node
|
37
37
|
node_children : ws_star LBRACE nodes RBRACE { val[2] }
|
@@ -86,8 +86,8 @@ rule
|
|
86
86
|
2
|
87
87
|
end
|
88
88
|
|
89
|
-
def parse(str)
|
90
|
-
@tokenizer = ::KDL::Tokenizer.new(str)
|
89
|
+
def parse(str, filename: nil)
|
90
|
+
@tokenizer = ::KDL::Tokenizer.new(str, filename:)
|
91
91
|
check_version
|
92
92
|
do_parse
|
93
93
|
end
|
data/lib/kdl/node.rb
CHANGED
data/lib/kdl/parser_common.rb
CHANGED
@@ -21,8 +21,12 @@ module KDL
|
|
21
21
|
def check_version
|
22
22
|
return unless doc_version = @tokenizer.version_directive
|
23
23
|
if doc_version != parser_version
|
24
|
-
raise VersionMismatchError.new("
|
24
|
+
raise VersionMismatchError.new("version mismatch, document specified v#{doc_version}, but this is a v#{parser_version} parser", doc_version, parser_version)
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def on_error(t, val, vstack)
|
29
|
+
raise KDL::ParseError.new("unexpected #{token_to_str(t)} #{val&.value.inspect}", @tokenizer.filename, val&.line, val&.column)
|
30
|
+
end
|
27
31
|
end
|
28
32
|
end
|
data/lib/kdl/tokenizer.rb
CHANGED
@@ -4,12 +4,6 @@ require 'bigdecimal'
|
|
4
4
|
|
5
5
|
module KDL
|
6
6
|
class Tokenizer
|
7
|
-
class Error < ::KDL::Error
|
8
|
-
def initialize(message, line, column)
|
9
|
-
super("#{message} (#{line}:#{column})")
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
7
|
class Token
|
14
8
|
attr_reader :type, :value, :line, :column, :meta
|
15
9
|
|
@@ -30,10 +24,9 @@ module KDL
|
|
30
24
|
def to_s
|
31
25
|
"#{value.inspect} (#{line}:#{column})"
|
32
26
|
end
|
33
|
-
alias inspect to_s
|
34
27
|
end
|
35
28
|
|
36
|
-
attr_reader :index
|
29
|
+
attr_reader :index, :filename
|
37
30
|
|
38
31
|
SYMBOLS = {
|
39
32
|
'{' => :LBRACE,
|
@@ -72,13 +65,14 @@ module KDL
|
|
72
65
|
|
73
66
|
VERSION_PATTERN = /\A\/-[#{WHITESPACE.join}]*kdl-version[#{WHITESPACE.join}]+(\d+)[#{WHITESPACE.join}]*[#{NEWLINES.join}]/
|
74
67
|
|
75
|
-
def initialize(str, start = 0)
|
68
|
+
def initialize(str, start = 0, filename: nil)
|
76
69
|
@str = debom(str)
|
77
|
-
@context = nil
|
78
|
-
@rawstring_hashes = nil
|
79
70
|
@start = start
|
80
71
|
@index = start
|
81
72
|
@buffer = +""
|
73
|
+
@filename = filename
|
74
|
+
@context = nil
|
75
|
+
@rawstring_hashes = nil
|
82
76
|
@done = false
|
83
77
|
@previous_context = nil
|
84
78
|
@line = 1
|
@@ -201,7 +195,7 @@ module KDL
|
|
201
195
|
traverse(1)
|
202
196
|
end
|
203
197
|
when '\\'
|
204
|
-
t = Tokenizer.new(@str, @index + 1)
|
198
|
+
t = Tokenizer.new(@str, @index + 1, filename:)
|
205
199
|
la = t.next_token
|
206
200
|
if la[0] == :NEWLINE || la[0] == :EOF || (la[0] == :WS && (lan = t.next_token[0]) == :NEWLINE || lan == :EOF)
|
207
201
|
traverse_to(t.index)
|
@@ -433,7 +427,7 @@ module KDL
|
|
433
427
|
@comment_nesting = 1
|
434
428
|
traverse(2)
|
435
429
|
elsif c == "\\"
|
436
|
-
t = Tokenizer.new(@str, @index + 1)
|
430
|
+
t = Tokenizer.new(@str, @index + 1, filename:)
|
437
431
|
la = t.next_token
|
438
432
|
if la[0] == :NEWLINE || la[0] == :EOF || (la[0] == :WS && (lan = t.next_token[0]) == :NEWLINE || lan == :EOF)
|
439
433
|
traverse_to(t.index)
|
@@ -446,7 +440,7 @@ module KDL
|
|
446
440
|
return token(:WS, -@buffer)
|
447
441
|
end
|
448
442
|
when :equals
|
449
|
-
t = Tokenizer.new(@str, @index)
|
443
|
+
t = Tokenizer.new(@str, @index, filename:)
|
450
444
|
la = t.next_token
|
451
445
|
if la[0] == :WS
|
452
446
|
@buffer << la[1].value
|
@@ -488,9 +482,9 @@ module KDL
|
|
488
482
|
|
489
483
|
def raise_error(error)
|
490
484
|
case error
|
491
|
-
when String then raise
|
485
|
+
when String then raise ParseError.new(error, @filename, @line, @column)
|
492
486
|
when Error then raise error
|
493
|
-
else raise
|
487
|
+
else raise ParseError.new(error.message, @filename, @line, @column)
|
494
488
|
end
|
495
489
|
end
|
496
490
|
|
@@ -611,8 +605,10 @@ module KDL
|
|
611
605
|
def unescape(string, rgx = UNESCAPE)
|
612
606
|
string
|
613
607
|
.gsub(rgx) { |m| replace_esc(m) }
|
614
|
-
.gsub(/\\u\{[0-9a-fA-F]
|
615
|
-
|
608
|
+
.gsub(/\\u\{[0-9a-fA-F]+\}/) do |m|
|
609
|
+
digits = m[3..-2]
|
610
|
+
raise_error "Invalid code point #{m}" if digits.length > 6
|
611
|
+
i = Integer(digits, 16)
|
616
612
|
if i < 0 || i > 0x10FFFF || (0xD800..0xDFFF).include?(i)
|
617
613
|
raise_error "Invalid code point #{m}"
|
618
614
|
end
|
@@ -637,6 +633,8 @@ module KDL
|
|
637
633
|
|
638
634
|
def dedent(string)
|
639
635
|
split = string.split(NEWLINES_PATTERN)
|
636
|
+
return "" if split.empty?
|
637
|
+
|
640
638
|
lines = split.partition.with_index { |_, i| i.even? }.first
|
641
639
|
if split.last.match?(NEWLINES_PATTERN)
|
642
640
|
indent = ""
|
data/lib/kdl/v1/kdl.yy
CHANGED
data/lib/kdl/v1/value.rb
CHANGED
@@ -83,7 +83,7 @@ module KDL
|
|
83
83
|
when ::Float then Float.new(value)
|
84
84
|
when TrueClass, FalseClass then Boolean.new(value)
|
85
85
|
when NilClass then Null
|
86
|
-
else raise Error("
|
86
|
+
else raise Error("unsupported value type: #{value.class}")
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
data/lib/kdl/value.rb
CHANGED
@@ -167,7 +167,7 @@ module KDL
|
|
167
167
|
when ::Float then Float.new(value)
|
168
168
|
when TrueClass, FalseClass then Boolean.new(value)
|
169
169
|
when NilClass then Null
|
170
|
-
else raise Error
|
170
|
+
else raise Error, "unsupported value type: #{value.class}"
|
171
171
|
end
|
172
172
|
end
|
173
173
|
end
|
data/lib/kdl/version.rb
CHANGED
data/lib/kdl.rb
CHANGED
@@ -10,6 +10,7 @@ require "kdl/string_dumper"
|
|
10
10
|
require "kdl/types"
|
11
11
|
require "kdl/parser_common"
|
12
12
|
require "kdl/kdl.tab"
|
13
|
+
require "kdl/builder"
|
13
14
|
require "kdl/v1"
|
14
15
|
|
15
16
|
module KDL
|
@@ -23,28 +24,30 @@ module KDL
|
|
23
24
|
parse(input, **options)
|
24
25
|
end
|
25
26
|
|
26
|
-
def self.parse(input, version: default_version, output_version: default_output_version, **options)
|
27
|
+
def self.parse(input, version: default_version, output_version: default_output_version, filename: nil, **options)
|
27
28
|
case version
|
28
29
|
when 2
|
29
|
-
Parser.new(output_module: output_module(output_version || 2), **options).parse(input)
|
30
|
+
Parser.new(output_module: output_module(output_version || 2), **options).parse(input, filename:)
|
30
31
|
when 1
|
31
|
-
V1::Parser.new.parse(input, output_module: output_module(output_version || 1), **options)
|
32
|
+
V1::Parser.new.parse(input, output_module: output_module(output_version || 1), filename:, **options)
|
32
33
|
when nil
|
33
34
|
auto_parse(input, output_version:, **options)
|
34
35
|
else
|
35
|
-
raise UnsupportedVersionError.new("
|
36
|
+
raise UnsupportedVersionError.new("unsupported version '#{version}'", version)
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
39
40
|
def self.load_file(filespec, **options)
|
40
|
-
|
41
|
+
File.open(filespec, 'r:BOM|UTF-8') do |file|
|
42
|
+
parse(file.read, **options, filename: file.to_path)
|
43
|
+
end
|
41
44
|
end
|
42
45
|
|
43
46
|
def self.auto_parse(input, output_version: default_output_version, **options)
|
44
47
|
parse(input, version: 2, output_version: output_version || 2, **options)
|
45
48
|
rescue VersionMismatchError => e
|
46
49
|
parse(input, version: e.version, output_version: output_version || e.version, **options)
|
47
|
-
rescue
|
50
|
+
rescue ParseError => e
|
48
51
|
parse(input, version: 1, output_version: output_version || 1, **options) rescue raise e
|
49
52
|
end
|
50
53
|
|
@@ -53,8 +56,20 @@ module KDL
|
|
53
56
|
when 1 then KDL::V1
|
54
57
|
when 2 then KDL
|
55
58
|
else
|
56
|
-
warn "Unknown output_version
|
59
|
+
warn "[WARNING] Unknown output_version '#{version}', defaulting to v2"
|
57
60
|
KDL
|
58
61
|
end
|
59
62
|
end
|
63
|
+
|
64
|
+
def self.build(&block)
|
65
|
+
builder = Builder.new
|
66
|
+
if block.arity >= 1
|
67
|
+
builder.document do
|
68
|
+
yield builder
|
69
|
+
end
|
70
|
+
else
|
71
|
+
builder.instance_exec(&block)
|
72
|
+
builder.document
|
73
|
+
end
|
74
|
+
end
|
60
75
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kdl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danielle Smith
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-09-04 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: racc
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- bin/setup
|
88
88
|
- kdl.gemspec
|
89
89
|
- lib/kdl.rb
|
90
|
+
- lib/kdl/builder.rb
|
90
91
|
- lib/kdl/document.rb
|
91
92
|
- lib/kdl/error.rb
|
92
93
|
- lib/kdl/kdl.tab.rb
|