toml 0.0.1 → 0.0.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.
- data/Gemfile +8 -0
- data/Gemfile.lock +20 -0
- data/README.md +23 -57
- data/lib/toml.rb +15 -1
- data/lib/toml/key.rb +9 -0
- data/lib/toml/key_group.rb +9 -0
- data/lib/toml/parser.rb +27 -54
- data/lib/toml/parslet.rb +67 -0
- data/lib/toml/transformer.rb +74 -0
- data/test/spec.toml +43 -0
- data/test/test_parser.rb +50 -0
- data/toml.gemspec +14 -4
- metadata +30 -4
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
toml (0.0.1)
|
5
|
+
parslet
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
blankslate (2.1.2.4)
|
11
|
+
minitest (4.6.1)
|
12
|
+
parslet (1.5.0)
|
13
|
+
blankslate (~> 2.0)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
minitest
|
20
|
+
toml!
|
data/README.md
CHANGED
@@ -1,69 +1,35 @@
|
|
1
|
-
|
2
|
-
=======
|
1
|
+
# TOML
|
3
2
|
|
4
|
-
|
3
|
+
A sane configuration format from @mojombo. More information here: https://github.com/mojombo/toml
|
5
4
|
|
6
|
-
|
7
|
-
external dependencies like Jeweler or Hoe? Ever thought that Rake and a hand
|
8
|
-
crafted gemspec should be enough to deal with these problems? If so, then
|
9
|
-
RakeGem is here to make your life awesome!
|
5
|
+
## Usage
|
10
6
|
|
11
|
-
|
12
|
-
copy into your project and easily customize to match your specific needs. It
|
13
|
-
ships with a few Rake tasks to help you keep your gemspec up-to-date, build
|
14
|
-
a gem, and release your library and gem to the world.
|
7
|
+
It's simple, really.
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
with your system without too much editing.
|
9
|
+
```ruby
|
10
|
+
content = <<-TOML
|
19
11
|
|
20
|
-
|
21
|
-
[
|
12
|
+
# Hello, this is an example.
|
13
|
+
[things]
|
14
|
+
other = "things"
|
15
|
+
what = 900000
|
22
16
|
|
23
|
-
|
17
|
+
TOML
|
24
18
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
versions and copy any custom stuff from your existing Rakefile and gemspec
|
29
|
-
into them. As long as you're careful, the rake tasks should keep working.
|
19
|
+
parser = TOML::Parser.new(content).parsed
|
20
|
+
# => { "things" => { "other" => "things", "what" => 900000 } }
|
21
|
+
```
|
30
22
|
|
31
|
-
|
23
|
+
You can also use the same API as `YAML` if you'd like:
|
32
24
|
|
33
|
-
|
34
|
-
|
25
|
+
```ruby
|
26
|
+
TOML.load("thing = 9")
|
27
|
+
# => {"thing" => 9}
|
35
28
|
|
36
|
-
|
37
|
-
|
29
|
+
TOML.load_file("my_file.toml")
|
30
|
+
# => {"whatever" => "keys"}
|
31
|
+
```
|
38
32
|
|
39
|
-
|
40
|
-
VERSION = '0.1.0'
|
41
|
-
end
|
33
|
+
## Contributors
|
42
34
|
|
43
|
-
|
44
|
-
line by itself.
|
45
|
-
|
46
|
-
# UPDATING THE VERSION
|
47
|
-
|
48
|
-
In order to make a new release, you'll want to update the version. With
|
49
|
-
RakeGem, you only need to do that in the `lib/NAME.rb` file. Everything else
|
50
|
-
will use this find the canonical version of the library.
|
51
|
-
|
52
|
-
# TASKS
|
53
|
-
|
54
|
-
RakeGem provides three rake tasks:
|
55
|
-
|
56
|
-
`rake gemspec` will update your gemspec with the latest version (taken from
|
57
|
-
the `lib/NAME.rb` file) and file list (as reported by `git ls-files`).
|
58
|
-
|
59
|
-
`rake build` will update your gemspec, build your gemspec into a gem, and
|
60
|
-
place it in the `pkg` directory.
|
61
|
-
|
62
|
-
`rake release` will update your gemspec, build your gem, make a commit with
|
63
|
-
the message `Release 0.1.0` (with the correct version, obviously), tag the
|
64
|
-
commit with `v0.1.0` (again with the correct version), and push the `master`
|
65
|
-
branch and new tag to `origin`.
|
66
|
-
|
67
|
-
Keep in mind that these are just simple Rake tasks and you can edit them
|
68
|
-
however you please. Don't want to auto-commit or auto-push? Just delete those
|
69
|
-
lines. You can bend RakeGem to your own needs. That's the whole point!
|
35
|
+
Written by Jeremy McAnally (@jm) and Dirk Gadsden (@dirk) based on TOML from Tom Preston-Werner (@mojombo).
|
data/lib/toml.rb
CHANGED
@@ -1,8 +1,22 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__))
|
2
2
|
|
3
3
|
require 'time'
|
4
|
+
require 'parslet'
|
5
|
+
|
6
|
+
require 'toml/key'
|
7
|
+
require 'toml/key_group'
|
8
|
+
require 'toml/parslet'
|
9
|
+
require 'toml/transformer'
|
4
10
|
require 'toml/parser'
|
5
11
|
|
6
12
|
module TOML
|
7
|
-
VERSION = '0.0.
|
13
|
+
VERSION = '0.0.2'
|
14
|
+
|
15
|
+
def self.load(content)
|
16
|
+
Parser.new(content).parsed
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.load_file(path)
|
20
|
+
Parser.new(File.read(path)).parsed
|
21
|
+
end
|
8
22
|
end
|
data/lib/toml/key.rb
ADDED
data/lib/toml/parser.rb
CHANGED
@@ -1,67 +1,40 @@
|
|
1
|
-
module TOML
|
1
|
+
module TOML
|
2
2
|
class Parser
|
3
3
|
attr_reader :parsed
|
4
4
|
|
5
5
|
def initialize(markup)
|
6
|
-
|
6
|
+
# Make sure we have a newline on the end
|
7
|
+
markup += "\n" unless markup.end_with?("\n")
|
7
8
|
|
9
|
+
tree = Parslet.new.parse(markup)
|
10
|
+
parts = Transformer.new.apply(tree)
|
11
|
+
|
8
12
|
@parsed = {}
|
9
|
-
@
|
10
|
-
|
11
|
-
|
12
|
-
if
|
13
|
-
|
14
|
-
elsif
|
15
|
-
|
16
|
-
elsif line =~ /\s?(.*)=(.*)/
|
17
|
-
add_key($1, $2)
|
13
|
+
@current = @parsed
|
14
|
+
|
15
|
+
parts.each do |part|
|
16
|
+
if part.is_a? Key
|
17
|
+
@current[part.key] = part.value
|
18
|
+
elsif part.is_a? KeyGroup
|
19
|
+
resolve_key_group(part)
|
18
20
|
else
|
19
|
-
raise "
|
21
|
+
raise "Unrecognized part: #{part.inspect}"
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
23
|
-
|
24
|
-
def
|
25
|
-
@
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
def coerce(value)
|
38
|
-
value = value.strip
|
39
|
-
if value =~ /\[(.*)\]/
|
40
|
-
# array
|
41
|
-
array = $1.split(",").map {|s| s.strip.gsub(/\"(.*)\"/, '\1')}
|
42
|
-
return array
|
43
|
-
elsif value =~ /\"(.*)\"/
|
44
|
-
# string
|
45
|
-
return $1
|
46
|
-
end
|
47
|
-
|
48
|
-
begin
|
49
|
-
time = Time.parse(value)
|
50
|
-
return time
|
51
|
-
rescue
|
52
|
-
end
|
53
|
-
|
54
|
-
begin
|
55
|
-
int = Integer(value)
|
56
|
-
return int
|
57
|
-
rescue
|
25
|
+
|
26
|
+
def resolve_key_group(kg)
|
27
|
+
@current = @parsed
|
28
|
+
|
29
|
+
path = kg.keys.dup
|
30
|
+
while k = path.shift
|
31
|
+
if @current.has_key? k
|
32
|
+
# pass
|
33
|
+
else
|
34
|
+
@current[k] = {}
|
35
|
+
end
|
36
|
+
@current = @current[k]
|
58
37
|
end
|
59
|
-
|
60
|
-
raise "lol no clue what [#{value}] is"
|
61
|
-
end
|
62
|
-
|
63
|
-
def close_key_group
|
64
|
-
@current_key_group = ""
|
65
38
|
end
|
66
39
|
end
|
67
|
-
end
|
40
|
+
end
|
data/lib/toml/parslet.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
module TOML
|
2
|
+
class Parslet < ::Parslet::Parser
|
3
|
+
rule(:document) { (key_group | key_value | comment_line).repeat(0) }
|
4
|
+
root :document
|
5
|
+
|
6
|
+
rule(:value) {
|
7
|
+
array.as(:array) |
|
8
|
+
string |
|
9
|
+
datetime.as(:datetime) |
|
10
|
+
float.as(:float) |
|
11
|
+
integer.as(:integer) |
|
12
|
+
boolean
|
13
|
+
}
|
14
|
+
|
15
|
+
rule(:array) {
|
16
|
+
str("[") >> (
|
17
|
+
all_space >> value >>
|
18
|
+
(all_space >> str(",") >> all_space >> value).repeat(0) >>
|
19
|
+
all_space
|
20
|
+
).maybe >> str("]")
|
21
|
+
}
|
22
|
+
|
23
|
+
rule(:key_value) { space >> key.as(:key) >> space >> str("=") >> space >> value >> space >> comment.maybe >> str("\n") >> all_space }
|
24
|
+
rule(:key_group) { space >> str("[") >> key_group_name.as(:key_group) >> str("]") >> space >> comment.maybe >> str("\n") >> all_space }
|
25
|
+
|
26
|
+
rule(:key) { match("[^. \t\\]]").repeat(1) }
|
27
|
+
rule(:key_group_name) { key.as(:key) >> (str(".") >> key.as(:key)).repeat(0) }
|
28
|
+
|
29
|
+
rule(:comment_line) { comment >> str("\n") >> all_space }
|
30
|
+
rule(:comment) { str("#") >> match("[^\n]").repeat(0) }
|
31
|
+
|
32
|
+
rule(:space) { match("[ \t]").repeat(0) }
|
33
|
+
rule(:all_space) { match("[ \t\r\n]").repeat(0) }
|
34
|
+
|
35
|
+
rule(:string) {
|
36
|
+
str('"') >> (
|
37
|
+
match("[^\"\\\\]") |
|
38
|
+
(str("\\") >> match("[0tnr\"\\\\]"))
|
39
|
+
).repeat(0).as(:string) >> str('"')
|
40
|
+
}
|
41
|
+
|
42
|
+
rule(:sign) { str("-") }
|
43
|
+
rule(:integer) {
|
44
|
+
str("0") | (sign.maybe >> match("[1-9]") >> match("[0-9]").repeat(0))
|
45
|
+
}
|
46
|
+
|
47
|
+
rule(:float) {
|
48
|
+
sign.maybe >> match("[0-9]").repeat(1) >> str(".") >> match("[0-9]").repeat(1)
|
49
|
+
}
|
50
|
+
|
51
|
+
rule(:boolean) { str("true").as(:true) | str("false").as(:false) }
|
52
|
+
|
53
|
+
rule(:date) {
|
54
|
+
match("[0-9]").repeat(4,4) >> str("-") >>
|
55
|
+
match("[0-9]").repeat(2,2) >> str("-") >>
|
56
|
+
match("[0-9]").repeat(2,2)
|
57
|
+
}
|
58
|
+
|
59
|
+
rule(:time) {
|
60
|
+
match("[0-9]").repeat(2,2) >> str(":") >>
|
61
|
+
match("[0-9]").repeat(2,2) >> str(":") >>
|
62
|
+
match("[0-9]").repeat(2,2)
|
63
|
+
}
|
64
|
+
|
65
|
+
rule(:datetime) { date >> str("T") >> time >> str("Z") }
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module TOML
|
2
|
+
class Transformer < ::Parslet::Transform
|
3
|
+
# Utility to properly handle escape sequences in parsed string.
|
4
|
+
def self.parse_string(val)
|
5
|
+
e = val.length
|
6
|
+
s = 0
|
7
|
+
o = []
|
8
|
+
while s < e
|
9
|
+
if val[s] == "\\"
|
10
|
+
s += 1
|
11
|
+
case val[s]
|
12
|
+
when "t"
|
13
|
+
o << "\t"
|
14
|
+
when "n"
|
15
|
+
o << "\n"
|
16
|
+
when "\\"
|
17
|
+
o << "\\"
|
18
|
+
when '"'
|
19
|
+
o << '"'
|
20
|
+
when "r"
|
21
|
+
o << "\r"
|
22
|
+
when "0"
|
23
|
+
o << "\0"
|
24
|
+
else
|
25
|
+
raise "Unexpected escape character: '\\#{val[s]}'"
|
26
|
+
end
|
27
|
+
else
|
28
|
+
o << val[s]
|
29
|
+
end
|
30
|
+
s += 1
|
31
|
+
end
|
32
|
+
o.join
|
33
|
+
end
|
34
|
+
|
35
|
+
# Clean up arrays
|
36
|
+
rule(:array => subtree(:ar)) { ar.is_a?(Array) ? ar : [ar] }
|
37
|
+
|
38
|
+
# Clean up simples (inside arrays)
|
39
|
+
rule(:integer => simple(:i)) { i.to_i }
|
40
|
+
rule(:float => simple(:f)) { f.to_f }
|
41
|
+
rule(:string => simple(:s)) {
|
42
|
+
Transformer.parse_string(s.to_s)
|
43
|
+
}
|
44
|
+
rule(:datetime => simple(:d)) { DateTime.iso8601(d) }
|
45
|
+
rule(:true => simple(:b)) { true }
|
46
|
+
rule(:false => simple(:b)) { false }
|
47
|
+
|
48
|
+
# TODO: Refactor to remove redundancy
|
49
|
+
rule(:key => simple(:k), :array => subtree(:ar)) { Key.new(k.to_s, ar) }
|
50
|
+
rule(:key => simple(:k), :integer => simple(:i)) { Key.new(k.to_s, i.to_i) }
|
51
|
+
rule(:key => simple(:k), :float => simple(:f)) { Key.new(k.to_s, f.to_f) }
|
52
|
+
rule(:key => simple(:k), :string => simple(:s)) {
|
53
|
+
Key.new(k.to_s, Transformer.parse_string(s.to_s))
|
54
|
+
}
|
55
|
+
rule(:key => simple(:k), :datetime => simple(:d)) {
|
56
|
+
Key.new(k.to_s, DateTime.iso8601(d))
|
57
|
+
}
|
58
|
+
rule(:key => simple(:k), :true => simple(:b)) { Key.new(k.to_s, true) }
|
59
|
+
rule(:key => simple(:k), :false => simple(:b)) { Key.new(k.to_s, false) }
|
60
|
+
|
61
|
+
# Make keys just be strings
|
62
|
+
rule(:key => simple(:k)) { k }
|
63
|
+
|
64
|
+
# Then objectify the key_groups
|
65
|
+
rule(:key_group => simple(:kg)) {
|
66
|
+
KeyGroup.new([kg.to_s])
|
67
|
+
}
|
68
|
+
|
69
|
+
# Captures array-like key-groups
|
70
|
+
rule(:key_group => subtree(:kg)) {
|
71
|
+
KeyGroup.new(kg.map &:to_s)
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
data/test/spec.toml
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Comment
|
2
|
+
|
3
|
+
# String
|
4
|
+
string = "string\n\t\"string"
|
5
|
+
|
6
|
+
# Integer
|
7
|
+
integer = 42
|
8
|
+
|
9
|
+
# Float
|
10
|
+
pi = 3.14159
|
11
|
+
|
12
|
+
# Booleans
|
13
|
+
true = true
|
14
|
+
false = false
|
15
|
+
|
16
|
+
# DateTime
|
17
|
+
datetime = 1979-05-27T07:32:00Z
|
18
|
+
|
19
|
+
# Keygroup
|
20
|
+
[a.b.c]
|
21
|
+
d = "test"
|
22
|
+
|
23
|
+
[e]
|
24
|
+
f = "test"
|
25
|
+
|
26
|
+
# Post line comment
|
27
|
+
[comments]
|
28
|
+
on = "a line" # with markup
|
29
|
+
|
30
|
+
# Multi-line arrays
|
31
|
+
[arrays]
|
32
|
+
# Simple array
|
33
|
+
simple = [1, 2, 3]
|
34
|
+
|
35
|
+
# Nested array
|
36
|
+
nested = [[[1], 2], 3]
|
37
|
+
|
38
|
+
multi = ["lines", "are",
|
39
|
+
"super", "cool", "lol",
|
40
|
+
"amirite"]
|
41
|
+
|
42
|
+
# Uneven spacing
|
43
|
+
uneven = [1, 2, 3, 4, 5 ]
|
data/test/test_parser.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler/setup'
|
4
|
+
|
5
|
+
require 'toml'
|
6
|
+
require 'minitest/autorun'
|
7
|
+
|
8
|
+
class TestParser < MiniTest::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
filepath = File.join(File.dirname(__FILE__), 'spec.toml')
|
11
|
+
@doc = TOML::Parser.new(File.read(filepath)).parsed
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_string
|
15
|
+
assert_equal @doc["string"], "string\n\t\"string"
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_integer
|
19
|
+
assert_equal @doc["integer"], 42
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_float
|
23
|
+
assert_equal @doc["pi"], 3.14159
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_datetime
|
27
|
+
assert_equal @doc["datetime"], DateTime.iso8601("1979-05-27T07:32:00Z")
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_booleans
|
31
|
+
assert_equal @doc["true"], true
|
32
|
+
assert_equal @doc["false"], false
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_simple_array
|
36
|
+
assert_equal @doc["arrays"]["simple"], [1, 2, 3]
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_nested_array
|
40
|
+
assert_equal @doc["arrays"]["nested"], [[[1], 2], 3]
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_simple_keygroup
|
44
|
+
assert_equal @doc["e"]["f"], "test"
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_nested_keygroup
|
48
|
+
assert_equal @doc["a"]["b"]["c"]["d"], "test"
|
49
|
+
end
|
50
|
+
end
|
data/toml.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'toml'
|
16
|
-
s.version = '0.0.
|
17
|
-
s.date = '2013-02-
|
16
|
+
s.version = '0.0.2'
|
17
|
+
s.date = '2013-02-24'
|
18
18
|
|
19
19
|
## Make sure your summary is short. The description may be as long
|
20
20
|
## as you like.
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
|
|
24
24
|
## List the primary authors. If there are a bunch of authors, it's probably
|
25
25
|
## better to set the email to an email list or something. If you don't have
|
26
26
|
## a custom homepage, consider using your GitHub URL or the like.
|
27
|
-
s.authors = ["Jeremy McAnally"]
|
27
|
+
s.authors = ["Jeremy McAnally", "Dirk Gadsden"]
|
28
28
|
s.email = 'jeremy@github.com'
|
29
29
|
s.homepage = 'http://github.com/jm/toml'
|
30
30
|
|
@@ -36,17 +36,27 @@ Gem::Specification.new do |s|
|
|
36
36
|
## LICENSE files to the extra_rdoc_files list.
|
37
37
|
s.rdoc_options = ["--charset=UTF-8"]
|
38
38
|
s.extra_rdoc_files = %w[README.md LICENSE]
|
39
|
-
|
39
|
+
|
40
|
+
s.add_dependency 'parslet'
|
41
|
+
|
40
42
|
## Leave this section as-is. It will be automatically generated from the
|
41
43
|
## contents of your Git repository via the gemspec task. DO NOT REMOVE
|
42
44
|
## THE MANIFEST COMMENTS, they are used as delimiters by the task.
|
43
45
|
# = MANIFEST =
|
44
46
|
s.files = %w[
|
47
|
+
Gemfile
|
48
|
+
Gemfile.lock
|
45
49
|
LICENSE
|
46
50
|
README.md
|
47
51
|
Rakefile
|
48
52
|
lib/toml.rb
|
53
|
+
lib/toml/key.rb
|
54
|
+
lib/toml/key_group.rb
|
49
55
|
lib/toml/parser.rb
|
56
|
+
lib/toml/parslet.rb
|
57
|
+
lib/toml/transformer.rb
|
58
|
+
test/spec.toml
|
59
|
+
test/test_parser.rb
|
50
60
|
toml.gemspec
|
51
61
|
]
|
52
62
|
# = MANIFEST =
|
metadata
CHANGED
@@ -1,16 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jeremy McAnally
|
9
|
+
- Dirk Gadsden
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
13
|
-
dependencies:
|
13
|
+
date: 2013-02-24 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: parslet
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
14
31
|
description: Parse your TOML, seriously.
|
15
32
|
email: jeremy@github.com
|
16
33
|
executables: []
|
@@ -19,11 +36,19 @@ extra_rdoc_files:
|
|
19
36
|
- README.md
|
20
37
|
- LICENSE
|
21
38
|
files:
|
39
|
+
- Gemfile
|
40
|
+
- Gemfile.lock
|
22
41
|
- LICENSE
|
23
42
|
- README.md
|
24
43
|
- Rakefile
|
25
44
|
- lib/toml.rb
|
45
|
+
- lib/toml/key.rb
|
46
|
+
- lib/toml/key_group.rb
|
26
47
|
- lib/toml/parser.rb
|
48
|
+
- lib/toml/parslet.rb
|
49
|
+
- lib/toml/transformer.rb
|
50
|
+
- test/spec.toml
|
51
|
+
- test/test_parser.rb
|
27
52
|
- toml.gemspec
|
28
53
|
homepage: http://github.com/jm/toml
|
29
54
|
licenses: []
|
@@ -50,4 +75,5 @@ rubygems_version: 1.8.23
|
|
50
75
|
signing_key:
|
51
76
|
specification_version: 2
|
52
77
|
summary: Parse your TOML.
|
53
|
-
test_files:
|
78
|
+
test_files:
|
79
|
+
- test/test_parser.rb
|