toml-rb 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/init.rb +1 -0
- data/lib/toml/dumper.rb +1 -1
- data/lib/toml/grammars/document.citrus +19 -1
- data/lib/toml/grammars/primitive.citrus +2 -2
- data/lib/toml/inline_table.rb +15 -0
- data/lib/toml/keyvalue.rb +3 -1
- data/lib/toml/parser.rb +6 -2
- data/test/example-v0.4.0.toml +244 -0
- data/test/grammar_test.rb +24 -0
- data/test/toml_examples.rb +60 -39
- data/test/toml_test.rb +3 -3
- data/toml-rb.gemspec +1 -1
- metadata +4 -3
- data/test/example-v0.3.1.toml +0 -180
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7c6222b73b280deabe97bc55a0eee9224412f76
|
4
|
+
data.tar.gz: b48c90b9abef1ab81ffb5051be7a575ed9b6383f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bfb79b2cd16c3291d315d94d52be611d581c6a2e7eaca967f9d838af3fc56250f377ebbf2126a11e1153318fe642b16479c2895dcc75366274c8c3ef7623c07
|
7
|
+
data.tar.gz: 236b967fa06c531cf2a50cca3ea22a69ea4ae9bad978ceba75fd43c381c32b7b49b10796f7c150c9d96dede5decd2c36f6c7c3b1e0332c34a2d24b906199cc55
|
data/README.md
CHANGED
data/init.rb
CHANGED
@@ -4,6 +4,7 @@ ROOT = File.dirname(File.expand_path(__FILE__))
|
|
4
4
|
|
5
5
|
require "#{ROOT}/lib/toml/string"
|
6
6
|
require "#{ROOT}/lib/toml/table_array"
|
7
|
+
require "#{ROOT}/lib/toml/inline_table"
|
7
8
|
require "#{ROOT}/lib/toml/keyvalue"
|
8
9
|
require "#{ROOT}/lib/toml/keygroup"
|
9
10
|
require "#{ROOT}/lib/toml/parser"
|
data/lib/toml/dumper.rb
CHANGED
@@ -15,6 +15,24 @@ grammar Document
|
|
15
15
|
end
|
16
16
|
|
17
17
|
rule keyvalue
|
18
|
-
(space? key space? '=' space? v:(
|
18
|
+
(space? key space? '=' space? v:(toml_values) comment?) <Keyvalue>
|
19
19
|
end
|
20
|
+
|
21
|
+
rule inline_table
|
22
|
+
(space? '{' (keyvalue (',' keyvalue)*)? space? '}' ) <InlineTable>
|
23
|
+
end
|
24
|
+
|
25
|
+
rule inline_table_array
|
26
|
+
("[" indent? (hash_array)* ","? indent? comment? indent? "]" indent?) <InlineTableArray>
|
27
|
+
end
|
28
|
+
|
29
|
+
rule hash_array
|
30
|
+
comment | (inline_table ("," indent? (inline_table | comment))*)
|
31
|
+
end
|
32
|
+
|
33
|
+
rule toml_values
|
34
|
+
primitive | inline_table_array | inline_table | array
|
35
|
+
end
|
36
|
+
|
37
|
+
|
20
38
|
end
|
@@ -72,7 +72,7 @@ grammar Primitive
|
|
72
72
|
end
|
73
73
|
|
74
74
|
rule integer
|
75
|
-
(sign? [0-
|
75
|
+
(sign? [0-9_]+) { to_str.to_i }
|
76
76
|
end
|
77
77
|
|
78
78
|
rule sign
|
@@ -104,7 +104,7 @@ grammar Primitive
|
|
104
104
|
end
|
105
105
|
|
106
106
|
rule bare_key
|
107
|
-
[a-zA-Z_] [a-zA-
|
107
|
+
[a-zA-Z_] [a-zA-Z0-9_-]*
|
108
108
|
end
|
109
109
|
|
110
110
|
rule quoted_key
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module InlineTable
|
2
|
+
def value
|
3
|
+
keyvalue_pairs = captures[:keyvalue].map(&:value)
|
4
|
+
|
5
|
+
Hash[keyvalue_pairs.map { |kv| [kv.key, kv.value] }]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module InlineTableArray
|
10
|
+
def value
|
11
|
+
tables = captures[:hash_array].map { |x| x.captures[:inline_table] }
|
12
|
+
|
13
|
+
tables.flatten.map(&:value)
|
14
|
+
end
|
15
|
+
end
|
data/lib/toml/keyvalue.rb
CHANGED
@@ -2,6 +2,8 @@ module TOML
|
|
2
2
|
class ValueOverwriteError < StandardError; end
|
3
3
|
|
4
4
|
class Keyvalue
|
5
|
+
attr_reader :key, :value
|
6
|
+
|
5
7
|
def initialize(key, value)
|
6
8
|
@key, @value = key, value
|
7
9
|
end
|
@@ -13,7 +15,7 @@ module TOML
|
|
13
15
|
end
|
14
16
|
|
15
17
|
def accept_visitor(parser)
|
16
|
-
parser.visit_keyvalue
|
18
|
+
parser.visit_keyvalue self
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
data/lib/toml/parser.rb
CHANGED
@@ -24,11 +24,15 @@ module TOML
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def visit_keygroup(keygroup)
|
27
|
-
@current = keygroup.navigate_keys
|
27
|
+
@current = keygroup.navigate_keys @hash, @symbolize_keys
|
28
28
|
end
|
29
29
|
|
30
30
|
def visit_keyvalue(keyvalue)
|
31
|
-
keyvalue.assign
|
31
|
+
keyvalue.assign @current, @symbolize_keys
|
32
|
+
end
|
33
|
+
|
34
|
+
def visit_inline_table(inline_table)
|
35
|
+
inline_table.assign @current, @symbolize_keys
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
@@ -0,0 +1,244 @@
|
|
1
|
+
################################################################################
|
2
|
+
## Comment
|
3
|
+
|
4
|
+
# Speak your mind with the hash symbol. They go from the symbol to the end of
|
5
|
+
# the line.
|
6
|
+
|
7
|
+
|
8
|
+
################################################################################
|
9
|
+
## Table
|
10
|
+
|
11
|
+
# Tables (also known as hash tables or dictionaries) are collections of
|
12
|
+
# key/value pairs. They appear in square brackets on a line by themselves.
|
13
|
+
|
14
|
+
[table]
|
15
|
+
|
16
|
+
key = "value" # Yeah, you can do this.
|
17
|
+
|
18
|
+
# Nested tables are denoted by table names with dots in them. Name your tables
|
19
|
+
# whatever crap you please, just don't use #, ., [ or ].
|
20
|
+
|
21
|
+
[table.subtable]
|
22
|
+
|
23
|
+
key = "another value"
|
24
|
+
|
25
|
+
# You don't need to specify all the super-tables if you don't want to. TOML
|
26
|
+
# knows how to do it for you.
|
27
|
+
|
28
|
+
# [x] you
|
29
|
+
# [x.y] don't
|
30
|
+
# [x.y.z] need these
|
31
|
+
[x.y.z.w] # for this to work
|
32
|
+
|
33
|
+
|
34
|
+
################################################################################
|
35
|
+
## Inline Table
|
36
|
+
|
37
|
+
# Inline tables provide a more compact syntax for expressing tables. They are
|
38
|
+
# especially useful for grouped data that can otherwise quickly become verbose.
|
39
|
+
# Inline tables are enclosed in curly braces `{` and `}`. No newlines are
|
40
|
+
# allowed between the curly braces unless they are valid within a value.
|
41
|
+
|
42
|
+
[table.inline]
|
43
|
+
|
44
|
+
name = { first = "Tom", last = "Preston-Werner" }
|
45
|
+
point = { x = 1, y = 2 }
|
46
|
+
|
47
|
+
|
48
|
+
################################################################################
|
49
|
+
## String
|
50
|
+
|
51
|
+
# There are four ways to express strings: basic, multi-line basic, literal, and
|
52
|
+
# multi-line literal. All strings must contain only valid UTF-8 characters.
|
53
|
+
|
54
|
+
[string.basic]
|
55
|
+
|
56
|
+
basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."
|
57
|
+
|
58
|
+
[string.multiline]
|
59
|
+
|
60
|
+
# The following strings are byte-for-byte equivalent:
|
61
|
+
key1 = "One\nTwo"
|
62
|
+
key2 = """One\nTwo"""
|
63
|
+
key3 = """
|
64
|
+
One
|
65
|
+
Two"""
|
66
|
+
|
67
|
+
[string.multiline.continued]
|
68
|
+
|
69
|
+
# The following strings are byte-for-byte equivalent:
|
70
|
+
key1 = "The quick brown fox jumps over the lazy dog."
|
71
|
+
|
72
|
+
key2 = """
|
73
|
+
The quick brown \
|
74
|
+
|
75
|
+
|
76
|
+
fox jumps over \
|
77
|
+
the lazy dog."""
|
78
|
+
|
79
|
+
key3 = """\
|
80
|
+
The quick brown \
|
81
|
+
fox jumps over \
|
82
|
+
the lazy dog.\
|
83
|
+
"""
|
84
|
+
|
85
|
+
[string.literal]
|
86
|
+
|
87
|
+
# What you see is what you get.
|
88
|
+
winpath = 'C:\Users\nodejs\templates'
|
89
|
+
winpath2 = '\\ServerX\admin$\system32\'
|
90
|
+
quoted = 'Tom "Dubs" Preston-Werner'
|
91
|
+
regex = '<\i\c*\s*>'
|
92
|
+
|
93
|
+
|
94
|
+
[string.literal.multiline]
|
95
|
+
|
96
|
+
regex2 = '''I [dw]on't need \d{2} apples'''
|
97
|
+
lines = '''
|
98
|
+
The first newline is
|
99
|
+
trimmed in raw strings.
|
100
|
+
All other whitespace
|
101
|
+
is preserved.
|
102
|
+
'''
|
103
|
+
|
104
|
+
|
105
|
+
################################################################################
|
106
|
+
## Integer
|
107
|
+
|
108
|
+
# Integers are whole numbers. Positive numbers may be prefixed with a plus sign.
|
109
|
+
# Negative numbers are prefixed with a minus sign.
|
110
|
+
|
111
|
+
[integer]
|
112
|
+
|
113
|
+
key1 = +99
|
114
|
+
key2 = 42
|
115
|
+
key3 = 0
|
116
|
+
key4 = -17
|
117
|
+
|
118
|
+
[integer.underscores]
|
119
|
+
|
120
|
+
# For large numbers, you may use underscores to enhance readability. Each
|
121
|
+
# underscore must be surrounded by at least one digit.
|
122
|
+
key1 = 1_000
|
123
|
+
key2 = 5_349_221
|
124
|
+
key3 = 1_2_3_4_5 # valid but inadvisable
|
125
|
+
|
126
|
+
|
127
|
+
################################################################################
|
128
|
+
## Float
|
129
|
+
|
130
|
+
# A float consists of an integer part (which may be prefixed with a plus or
|
131
|
+
# minus sign) followed by a fractional part and/or an exponent part.
|
132
|
+
|
133
|
+
[float.fractional]
|
134
|
+
|
135
|
+
key1 = +1.0
|
136
|
+
key2 = 3.1415
|
137
|
+
key3 = -0.01
|
138
|
+
|
139
|
+
[float.exponent]
|
140
|
+
|
141
|
+
key1 = 5e+22
|
142
|
+
key2 = 1e6
|
143
|
+
key3 = -2E-2
|
144
|
+
|
145
|
+
[float.both]
|
146
|
+
|
147
|
+
key = 6.626e-34
|
148
|
+
|
149
|
+
[float.underscores]
|
150
|
+
|
151
|
+
key1 = 9_224_617.445_991_228_313
|
152
|
+
key2 = 1e1_000
|
153
|
+
|
154
|
+
|
155
|
+
################################################################################
|
156
|
+
## Boolean
|
157
|
+
|
158
|
+
# Booleans are just the tokens you're used to. Always lowercase.
|
159
|
+
|
160
|
+
[boolean]
|
161
|
+
|
162
|
+
True = true
|
163
|
+
False = false
|
164
|
+
|
165
|
+
|
166
|
+
################################################################################
|
167
|
+
## Datetime
|
168
|
+
|
169
|
+
# Datetimes are RFC 3339 dates.
|
170
|
+
|
171
|
+
[datetime]
|
172
|
+
|
173
|
+
key1 = 1979-05-27T07:32:00Z
|
174
|
+
key2 = 1979-05-27T00:32:00-07:00
|
175
|
+
key3 = 1979-05-27T00:32:00.999999-07:00
|
176
|
+
|
177
|
+
|
178
|
+
################################################################################
|
179
|
+
## Array
|
180
|
+
|
181
|
+
# Arrays are square brackets with other primitives inside. Whitespace is
|
182
|
+
# ignored. Elements are separated by commas. Data types may not be mixed.
|
183
|
+
|
184
|
+
[array]
|
185
|
+
|
186
|
+
key1 = [ 1, 2, 3 ]
|
187
|
+
key2 = [ "red", "yellow", "green" ]
|
188
|
+
key3 = [ [ 1, 2 ], [3, 4, 5] ]
|
189
|
+
key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok
|
190
|
+
|
191
|
+
# Arrays can also be multiline. So in addition to ignoring whitespace, arrays
|
192
|
+
# also ignore newlines between the brackets. Terminating commas are ok before
|
193
|
+
# the closing bracket.
|
194
|
+
|
195
|
+
key5 = [
|
196
|
+
1, 2, 3
|
197
|
+
]
|
198
|
+
key6 = [
|
199
|
+
1,
|
200
|
+
2, # this is ok
|
201
|
+
]
|
202
|
+
|
203
|
+
|
204
|
+
################################################################################
|
205
|
+
## Array of Tables
|
206
|
+
|
207
|
+
# These can be expressed by using a table name in double brackets. Each table
|
208
|
+
# with the same double bracketed name will be an element in the array. The
|
209
|
+
# tables are inserted in the order encountered.
|
210
|
+
|
211
|
+
[[products]]
|
212
|
+
|
213
|
+
name = "Hammer"
|
214
|
+
sku = 738594937
|
215
|
+
|
216
|
+
[[products]]
|
217
|
+
|
218
|
+
[[products]]
|
219
|
+
|
220
|
+
name = "Nail"
|
221
|
+
sku = 284758393
|
222
|
+
color = "gray"
|
223
|
+
|
224
|
+
|
225
|
+
# You can create nested arrays of tables as well.
|
226
|
+
|
227
|
+
[[fruit]]
|
228
|
+
name = "apple"
|
229
|
+
|
230
|
+
[fruit.physical]
|
231
|
+
color = "red"
|
232
|
+
shape = "round"
|
233
|
+
|
234
|
+
[[fruit.variety]]
|
235
|
+
name = "red delicious"
|
236
|
+
|
237
|
+
[[fruit.variety]]
|
238
|
+
name = "granny smith"
|
239
|
+
|
240
|
+
[[fruit]]
|
241
|
+
name = "banana"
|
242
|
+
|
243
|
+
[[fruit.variety]]
|
244
|
+
name = "plantain"
|
data/test/grammar_test.rb
CHANGED
@@ -83,17 +83,26 @@ class GrammarTest < Test::Unit::TestCase
|
|
83
83
|
def test_integer
|
84
84
|
match = Document.parse('26', root: :number)
|
85
85
|
assert_equal(26, match.value)
|
86
|
+
|
87
|
+
match = Document.parse('1_200_000_999', root: :number)
|
88
|
+
assert_equal(1_200_000_999, match.value)
|
86
89
|
end
|
87
90
|
|
88
91
|
def test_float
|
89
92
|
match = Document.parse('1.69', root: :number)
|
90
93
|
assert_equal(1.69, match.value)
|
91
94
|
|
95
|
+
match = Document.parse('1_000.69', root: :number)
|
96
|
+
assert_equal(1000.69, match.value)
|
97
|
+
|
92
98
|
match = Document.parse('1e6', root: :number)
|
93
99
|
assert_equal(1e6, match.value)
|
94
100
|
|
95
101
|
match = Document.parse('1.02e-46', root: :number)
|
96
102
|
assert_equal(1.02e-46, match.value)
|
103
|
+
|
104
|
+
match = Document.parse('+1e4_000_000', root: :number)
|
105
|
+
assert_equal(1e4_000_000, match.value)
|
97
106
|
end
|
98
107
|
|
99
108
|
def test_signed_numbers
|
@@ -135,6 +144,10 @@ class GrammarTest < Test::Unit::TestCase
|
|
135
144
|
|
136
145
|
match = Document.parse('[ ["hey", "TOML"], [2,4] ]', root: :array)
|
137
146
|
assert_equal([%w(hey TOML), [2, 4]], match.value)
|
147
|
+
|
148
|
+
match = Document.parse('[ { one = 1 }, { two = 2, three = 3} ]',
|
149
|
+
root: :inline_table_array)
|
150
|
+
assert_equal([{ 'one' => 1 }, { 'two' => 2, 'three' => 3 }], match.value)
|
138
151
|
end
|
139
152
|
|
140
153
|
def test_multiline_array
|
@@ -162,6 +175,17 @@ class GrammarTest < Test::Unit::TestCase
|
|
162
175
|
assert_equal(Time.utc(1986, 8, 28, 18, 15, 0.123), match.value)
|
163
176
|
end
|
164
177
|
|
178
|
+
def test_inline_table
|
179
|
+
match = Document.parse('{ }', root: :inline_table)
|
180
|
+
assert_equal({}, match.value)
|
181
|
+
|
182
|
+
match = Document.parse('{ simple = true, params = 2 }', root: :inline_table)
|
183
|
+
assert_equal({ 'simple' => true, 'params' => 2 }, match.value)
|
184
|
+
|
185
|
+
match = Document.parse('{ nest = { hard = true } }', root: :inline_table)
|
186
|
+
assert_equal({ 'nest' => { 'hard' => true } }, match.value)
|
187
|
+
end
|
188
|
+
|
165
189
|
private
|
166
190
|
|
167
191
|
# Creates all the alternatives of valid indentations to test
|
data/test/toml_examples.rb
CHANGED
@@ -1,77 +1,98 @@
|
|
1
1
|
class TomlExamples
|
2
|
-
def self.
|
2
|
+
def self.example_v_0_4_0
|
3
3
|
{
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
"table" => {
|
5
|
+
"key" => "value",
|
6
|
+
"subtable" => {
|
7
|
+
"key" => "another value"
|
8
|
+
},
|
9
|
+
"inline" => {
|
10
|
+
"name" => {
|
11
|
+
"first" => "Tom",
|
12
|
+
"last" => "Preston-Werner"
|
13
|
+
},
|
14
|
+
"point" => {
|
15
|
+
"x" => 1,
|
16
|
+
"y" => 2
|
17
|
+
}
|
10
18
|
}
|
11
19
|
},
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
20
|
+
"x" => {
|
21
|
+
"y" => {
|
22
|
+
"z" => {
|
23
|
+
"w" => {}
|
16
24
|
}
|
17
25
|
}
|
18
26
|
},
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
'key1' => "One\nTwo",
|
23
|
-
'key2' => "One\nTwo",
|
24
|
-
'key3' => "One\nTwo"
|
27
|
+
"string" => {
|
28
|
+
"basic" => {
|
29
|
+
"basic" => "I'm a string. \"You can quote me\". Name\tJos\\u00E9\nLocation\tSF."
|
25
30
|
},
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
+
"multiline" => {
|
32
|
+
"key1" => "One\nTwo",
|
33
|
+
"key2" => "One\nTwo",
|
34
|
+
"key3" => "One\nTwo",
|
35
|
+
"continued" => {
|
36
|
+
"key1" => "The quick brown fox jumps over the lazy dog.",
|
37
|
+
"key2" => "The quick brown fox jumps over the lazy dog.",
|
38
|
+
"key3" => "The quick brown fox jumps over the lazy dog."
|
31
39
|
}
|
32
40
|
},
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
"regex2" => "I
|
40
|
-
|
41
|
+
"literal" => {
|
42
|
+
"winpath" => "C:\\Users\\nodejs\\templates",
|
43
|
+
"winpath2" => "\\\\ServerX\\admin$\\system32\\",
|
44
|
+
"quoted" => "Tom\"Dubs\"Preston-Werner",
|
45
|
+
"regex" => "<\\i\\c*\\s*>",
|
46
|
+
"multiline" => {
|
47
|
+
"regex2" => "I[
|
48
|
+
dw
|
49
|
+
]on'tneed\\d{
|
50
|
+
2
|
51
|
+
}apples",
|
52
|
+
"lines" => "Thefirstnewlineis\ntrimmedinrawstrings.\nAllotherwhitespace\nispreserved.\n"
|
41
53
|
}
|
42
54
|
}
|
43
55
|
},
|
44
|
-
"
|
56
|
+
"integer" => {
|
45
57
|
"key1" => 99,
|
46
58
|
"key2" => 42,
|
47
59
|
"key3" => 0,
|
48
|
-
"key4" => -17
|
60
|
+
"key4" => -17,
|
61
|
+
"underscores" => {
|
62
|
+
"key1" => 1000,
|
63
|
+
"key2" => 5349221,
|
64
|
+
"key3" => 12345
|
65
|
+
}
|
49
66
|
},
|
50
|
-
"
|
67
|
+
"float" => {
|
51
68
|
"fractional" => {
|
52
69
|
"key1" => 1.0,
|
53
70
|
"key2" => 3.1415,
|
54
71
|
"key3" => -0.01
|
55
72
|
},
|
56
|
-
"both" => {
|
57
|
-
"key" => 6.626e-34
|
58
|
-
},
|
59
73
|
"exponent" => {
|
60
74
|
"key1" => 5.0e+22,
|
61
75
|
"key2" => 1000000.0,
|
62
76
|
"key3" => -0.02
|
77
|
+
},
|
78
|
+
"both" => {
|
79
|
+
"key" => 6.626e-34
|
80
|
+
},
|
81
|
+
"underscores" => {
|
82
|
+
"key1" => 9224617.445991227,
|
83
|
+
"key2" => 1e1_000
|
63
84
|
}
|
64
85
|
},
|
65
|
-
"
|
86
|
+
"boolean" => {
|
66
87
|
"True" => true,
|
67
88
|
"False" => false
|
68
89
|
},
|
69
|
-
"
|
90
|
+
"datetime" => {
|
70
91
|
"key1" => Time.utc(1979, 05, 27, 07, 32, 0),
|
71
92
|
"key2" => Time.new(1979, 05, 27, 00, 32, 0, '-07:00'),
|
72
93
|
"key3" => Time.new(1979, 05, 27, 00, 32, 0.999999, '-07:00')
|
73
94
|
},
|
74
|
-
"
|
95
|
+
"array" => {
|
75
96
|
"key1" => [1, 2, 3],
|
76
97
|
"key2" => %w(red yellow green),
|
77
98
|
"key3" => [[1, 2], [3, 4, 5]],
|
data/test/toml_test.rb
CHANGED
@@ -2,10 +2,10 @@ require_relative 'helper'
|
|
2
2
|
require_relative 'toml_examples'
|
3
3
|
|
4
4
|
class TomlTest < Test::Unit::TestCase
|
5
|
-
def
|
6
|
-
path = File.join(File.dirname(__FILE__), 'example-v0.
|
5
|
+
def test_file_v_0_4_0
|
6
|
+
path = File.join(File.dirname(__FILE__), 'example-v0.4.0.toml')
|
7
7
|
parsed = TOML.load_file(path)
|
8
|
-
hash = TomlExamples.
|
8
|
+
hash = TomlExamples.example_v_0_4_0
|
9
9
|
|
10
10
|
assert_equal hash['Array'], parsed['Array']
|
11
11
|
assert_equal hash['Booleans'], parsed['Booleans']
|
data/toml-rb.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toml-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emiliano Mancuso
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-02-
|
12
|
+
date: 2015-02-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: citrus
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- lib/toml/grammars/document.citrus
|
49
49
|
- lib/toml/grammars/helper.citrus
|
50
50
|
- lib/toml/grammars/primitive.citrus
|
51
|
+
- lib/toml/inline_table.rb
|
51
52
|
- lib/toml/keygroup.rb
|
52
53
|
- lib/toml/keyvalue.rb
|
53
54
|
- lib/toml/parser.rb
|
@@ -55,7 +56,7 @@ files:
|
|
55
56
|
- lib/toml/table_array.rb
|
56
57
|
- test/dumper_test.rb
|
57
58
|
- test/errors_test.rb
|
58
|
-
- test/example-v0.
|
59
|
+
- test/example-v0.4.0.toml
|
59
60
|
- test/example.toml
|
60
61
|
- test/grammar_test.rb
|
61
62
|
- test/hard_example.toml
|
data/test/example-v0.3.1.toml
DELETED
@@ -1,180 +0,0 @@
|
|
1
|
-
# Comment
|
2
|
-
# I am a comment. Hear me roar. Roar.
|
3
|
-
|
4
|
-
# Table
|
5
|
-
# Tables (also known as hash tables or dictionaries) are collections of key/value pairs.
|
6
|
-
# They appear in square brackets on a line by themselves.
|
7
|
-
|
8
|
-
[Table]
|
9
|
-
|
10
|
-
key = "value" # Yeah, you can do this.
|
11
|
-
|
12
|
-
# Nested tables are denoted by table names with dots in them. Name your tables whatever crap you please, just don't use #, ., [ or ].
|
13
|
-
|
14
|
-
[dog.tater]
|
15
|
-
type = "pug"
|
16
|
-
|
17
|
-
# You don't need to specify all the super-tables if you don't want to. TOML knows how to do it for you.
|
18
|
-
|
19
|
-
# [x] you
|
20
|
-
# [x.y] don't
|
21
|
-
# [x.y.z] need these
|
22
|
-
[x.y.z.w] # for this to work
|
23
|
-
|
24
|
-
# String
|
25
|
-
# There are four ways to express strings: basic, multi-line basic, literal, and multi-line literal.
|
26
|
-
# All strings must contain only valid UTF-8 characters.
|
27
|
-
|
28
|
-
[String]
|
29
|
-
basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."
|
30
|
-
|
31
|
-
[String.Multiline]
|
32
|
-
|
33
|
-
# The following strings are byte-for-byte equivalent:
|
34
|
-
key1 = "One\nTwo"
|
35
|
-
key2 = """One\nTwo"""
|
36
|
-
key3 = """
|
37
|
-
One
|
38
|
-
Two"""
|
39
|
-
|
40
|
-
[String.Multilined.Singleline]
|
41
|
-
|
42
|
-
# The following strings are byte-for-byte equivalent:
|
43
|
-
key1 = "The quick brown fox jumps over the lazy dog."
|
44
|
-
|
45
|
-
key2 = """
|
46
|
-
The quick brown \
|
47
|
-
|
48
|
-
|
49
|
-
fox jumps over \
|
50
|
-
the lazy dog."""
|
51
|
-
|
52
|
-
key3 = """\
|
53
|
-
The quick brown \
|
54
|
-
fox jumps over \
|
55
|
-
the lazy dog.\
|
56
|
-
"""
|
57
|
-
|
58
|
-
[String.Literal]
|
59
|
-
|
60
|
-
# What you see is what you get.
|
61
|
-
winpath = 'C:\Users\nodejs\templates'
|
62
|
-
winpath2 = '\\ServerX\admin$\system32\'
|
63
|
-
quoted = 'Tom "Dubs" Preston-Werner'
|
64
|
-
regex = '<\i\c*\s*>'
|
65
|
-
|
66
|
-
[String.Literal.Multiline]
|
67
|
-
|
68
|
-
regex2 = '''I [dw]on't need \d{2} apples'''
|
69
|
-
lines = '''
|
70
|
-
The first newline is
|
71
|
-
trimmed in raw strings.
|
72
|
-
All other whitespace
|
73
|
-
is preserved.
|
74
|
-
'''
|
75
|
-
|
76
|
-
# Integer
|
77
|
-
# Integers are whole numbers. Positive numbers may be prefixed with a plus sign.
|
78
|
-
# Negative numbers are prefixed with a minus sign.
|
79
|
-
|
80
|
-
[Integer]
|
81
|
-
key1 = +99
|
82
|
-
key2 = 42
|
83
|
-
key3 = 0
|
84
|
-
key4 = -17
|
85
|
-
|
86
|
-
# Float
|
87
|
-
# A float consists of an integer part (which may be prefixed with a plus or minus sign)
|
88
|
-
# followed by a fractional part and/or an exponent part.
|
89
|
-
|
90
|
-
[Float.fractional]
|
91
|
-
|
92
|
-
# fractional
|
93
|
-
key1 = +1.0
|
94
|
-
key2 = 3.1415
|
95
|
-
key3 = -0.01
|
96
|
-
|
97
|
-
[Float.exponent]
|
98
|
-
|
99
|
-
# exponent
|
100
|
-
key1 = 5e+22
|
101
|
-
key2 = 1e6
|
102
|
-
key3 = -2E-2
|
103
|
-
|
104
|
-
[Float.both]
|
105
|
-
|
106
|
-
# both
|
107
|
-
key = 6.626e-34
|
108
|
-
|
109
|
-
# Boolean
|
110
|
-
# Booleans are just the tokens you're used to. Always lowercase.
|
111
|
-
|
112
|
-
[Booleans]
|
113
|
-
True = true
|
114
|
-
False = false
|
115
|
-
|
116
|
-
# Datetime
|
117
|
-
# Datetimes are RFC 3339 dates.
|
118
|
-
|
119
|
-
[Datetime]
|
120
|
-
key1 = 1979-05-27T07:32:00Z
|
121
|
-
key2 = 1979-05-27T00:32:00-07:00
|
122
|
-
key3 = 1979-05-27T00:32:00.999999-07:00
|
123
|
-
|
124
|
-
# Array
|
125
|
-
# Arrays are square brackets with other primitives inside. Whitespace is ignored. Elements are separated by commas. Data types may not be mixed.
|
126
|
-
|
127
|
-
[Array]
|
128
|
-
key1 = [ 1, 2, 3 ]
|
129
|
-
key2 = [ "red", "yellow", "green" ]
|
130
|
-
key3 = [ [ 1, 2 ], [3, 4, 5] ]
|
131
|
-
key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok
|
132
|
-
|
133
|
-
#Arrays can also be multiline. So in addition to ignoring whitespace, arrays also ignore newlines between the brackets.
|
134
|
-
# Terminating commas are ok before the closing bracket.
|
135
|
-
|
136
|
-
key5 = [
|
137
|
-
1, 2, 3
|
138
|
-
]
|
139
|
-
key6 = [
|
140
|
-
1,
|
141
|
-
2, # this is ok
|
142
|
-
]
|
143
|
-
|
144
|
-
# Array of Tables
|
145
|
-
# These can be expressed by using a table name in double brackets.
|
146
|
-
# Each table with the same double bracketed name will be an element in the array.
|
147
|
-
# The tables are inserted in the order encountered.
|
148
|
-
|
149
|
-
[[products]]
|
150
|
-
name = "Hammer"
|
151
|
-
sku = 738594937
|
152
|
-
|
153
|
-
[[products]]
|
154
|
-
|
155
|
-
[[products]]
|
156
|
-
name = "Nail"
|
157
|
-
sku = 284758393
|
158
|
-
color = "gray"
|
159
|
-
|
160
|
-
|
161
|
-
# You can create nested arrays of tables as well.
|
162
|
-
|
163
|
-
[[fruit]]
|
164
|
-
name = "apple"
|
165
|
-
|
166
|
-
[fruit.physical]
|
167
|
-
color = "red"
|
168
|
-
shape = "round"
|
169
|
-
|
170
|
-
[[fruit.variety]]
|
171
|
-
name = "red delicious"
|
172
|
-
|
173
|
-
[[fruit.variety]]
|
174
|
-
name = "granny smith"
|
175
|
-
|
176
|
-
[[fruit]]
|
177
|
-
name = "banana"
|
178
|
-
|
179
|
-
[[fruit.variety]]
|
180
|
-
name = "plantain"
|