toml 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,5 +4,8 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  group :test do
7
+ gem 'multi_json', '~> 1.7.8'
7
8
  gem 'minitest'
9
+ gem 'simplecov', :require => false
10
+ gem 'simplecov-gem-adapter', :require => false
8
11
  end
data/README.md CHANGED
@@ -4,6 +4,8 @@ A sane configuration format from @mojombo. More information here: https://githu
4
4
 
5
5
  This is far superior to YAML and JSON because it doesn't suck. Really it doesn't.
6
6
 
7
+ **There is a bug in Rails 2.3's vendored version of BlankSlate (a dependency of Parslet which is used for parsing TOML) that breaks Parslet; please see this [Gist](https://gist.github.com/dirk/5264004) for a workaround.**
8
+
7
9
  ## Usage
8
10
 
9
11
  Add to your Gemfile:
data/Rakefile CHANGED
@@ -45,19 +45,39 @@ end
45
45
 
46
46
  task :default => :test
47
47
 
48
- require 'rake/testtask'
49
- Rake::TestTask.new(:test) do |test|
50
- test.libs << 'lib' << 'test'
51
- test.pattern = 'test/**/test_*.rb'
52
- test.verbose = true
48
+ # require 'rake/testtask'
49
+ # Rake::TestTask.new(:test) do |test|
50
+ # test.libs << 'lib' << 'test'
51
+ # test.pattern = 'test/**/test_*.rb'
52
+ # test.verbose = true
53
+ # end
54
+ task :test do
55
+ Dir['./test/**/test_*.rb'].each {|f| require f }
53
56
  end
54
57
 
55
58
  desc "Generate RCov test coverage and open in your browser"
56
59
  task :coverage do
57
- require 'rcov'
58
- sh "rm -fr coverage"
59
- sh "rcov test/test_*.rb"
60
- sh "open coverage/index.html"
60
+ if RUBY_VERSION =~ /^1\./
61
+ require 'rubygems'
62
+ require 'bundler'
63
+ Bundler.setup(:test)
64
+ require 'simplecov'
65
+ require 'simplecov-gem-adapter'
66
+
67
+ sh "rm -fr coverage"
68
+ SimpleCov.command_name 'Unit Tests'
69
+ SimpleCov.start 'gem'
70
+ Rake::Task[:test].invoke
71
+ SimpleCov.at_exit do
72
+ SimpleCov.result.format!
73
+ sh "open coverage/index.html"
74
+ end
75
+ else
76
+ require 'rcov'
77
+ sh "rm -fr coverage"
78
+ sh "rcov test/test_*.rb"
79
+ sh "open coverage/index.html"
80
+ end
61
81
  end
62
82
 
63
83
  require 'rdoc/task'
@@ -4,7 +4,7 @@ require 'time'
4
4
  require 'parslet'
5
5
 
6
6
  require 'toml/key'
7
- require 'toml/key_group'
7
+ require 'toml/table'
8
8
  require 'toml/parslet'
9
9
  require 'toml/transformer'
10
10
  require 'toml/parser'
@@ -14,7 +14,7 @@ require 'toml/generator'
14
14
  # require 'toml/monkey_patch
15
15
 
16
16
  module TOML
17
- VERSION = '0.0.4'
17
+ VERSION = '0.1.0'
18
18
 
19
19
  def self.load(content)
20
20
  Parser.new(content).parsed
@@ -48,6 +48,9 @@ module TOML
48
48
  end
49
49
  other_pairs.each do |pair|
50
50
  key, val = pair
51
+ if key.include? '.'
52
+ raise SyntaxError, "Periods are not allowed in keys (failed on key: #{key.inspect})"
53
+ end
51
54
  @body += "#{key} = #{format(val)}\n"
52
55
  end
53
56
  @body += "\n" unless other_pairs.empty?
@@ -19,3 +19,8 @@ class Array
19
19
  "[" + self.map {|v| v.to_toml }.join(",") + "]"
20
20
  end
21
21
  end
22
+ class DateTime
23
+ def to_toml
24
+ self.to_time.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
25
+ end
26
+ end
@@ -4,22 +4,30 @@ module TOML
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")
8
-
7
+
8
+ markup += "\n" unless markup.end_with?("\n") || markup.length == 0
9
9
  begin
10
10
  tree = Parslet.new.parse(markup)
11
11
  rescue Parslet::ParseFailed => failure
12
12
  puts failure.cause.ascii_tree
13
13
  end
14
14
 
15
- parts = Transformer.new.apply(tree)
16
15
 
16
+ parts = Transformer.new.apply(tree) || []
17
17
  @parsed = {}
18
18
  @current = @parsed
19
19
  @current_path = ''
20
20
 
21
21
  parts.each do |part|
22
22
  if part.is_a? Key
23
+ # If @current is an array then we're in a key-group
24
+ if @current.is_a? Array
25
+ # Make sure there's a table to work with.
26
+ @current << {} if @current.last.nil?
27
+ # Set the key on the table.
28
+ @current.last[part.key] = part.value
29
+ next
30
+ end
23
31
  # Make sure the key isn't already set
24
32
  if !@current.is_a?(Hash) || @current.has_key?(part.key)
25
33
  err = "Cannot override key '#{part.key}'"
@@ -30,28 +38,62 @@ module TOML
30
38
  end
31
39
  # Set the key-value into the current hash
32
40
  @current[part.key] = part.value
33
- elsif part.is_a? KeyGroup
34
- resolve_key_group(part)
41
+ elsif part.is_a?(TableArray)
42
+ resolve_table_array(part)
43
+ elsif part.is_a?(Table)
44
+ resolve_table(part)
35
45
  else
36
46
  raise "Unrecognized part: #{part.inspect}"
37
47
  end
38
48
  end
39
49
  end
40
50
 
41
- def resolve_key_group(kg)
51
+ def resolve_table_array(t)
42
52
  @current = @parsed
43
-
44
- path = kg.keys.dup
53
+ path = t.name.dup
45
54
  @current_path = path.join('.')
46
-
47
- while k = path.shift
48
- if @current.has_key? k
49
- # pass
55
+ while n = path.shift
56
+ # If it's a table-array then get the last item.
57
+ @current = @current.last if @current.is_a? Array
58
+
59
+ # If it's the last item:
60
+ if path.length == 0
61
+ # If the current table has an item:
62
+ if @current.has_key?(n)
63
+ # And that item is already a table-array:
64
+ if @current[n].is_a? Array
65
+ # Then add an item to that table-array.
66
+ @current[n] << {}
67
+ else
68
+ raise "Cannot override table array '#{t.name.join '.'}'"
69
+ end
70
+ else
71
+ # Create a new table array if nothing exists here.
72
+ @current[n] = []
73
+ end
74
+ elsif @current.has_key? n
75
+ # Don't do anything if we're just moving into tables.
50
76
  else
51
- @current[k] = {}
77
+ @current[n] = {}
52
78
  end
53
- @current = @current[k]
79
+ @current = @current[n]
54
80
  end
55
81
  end
82
+
83
+ def resolve_table(t)
84
+ @current = @parsed
85
+
86
+ path = t.name.dup
87
+ @current_path = path.join('.')
88
+ while k = path.shift
89
+ # If it's a table-array then get the last item.
90
+ @current = @current.last if @current.is_a? Array
91
+ # Create a new table if one doesn't exist.
92
+ @current[k] = {} if !@current.has_key? k
93
+ # Move into the table.
94
+ @current = @current[k]
95
+ end
96
+ end#/resolve_key_group
97
+
56
98
  end
57
99
  end
@@ -2,7 +2,7 @@ module TOML
2
2
  class Parslet < ::Parslet::Parser
3
3
  rule(:document) {
4
4
  all_space >>
5
- (key_group | key_value | comment_line).repeat(0) >>
5
+ (table | table_array | key_value | comment_line).repeat >>
6
6
  all_space
7
7
  }
8
8
  root :document
@@ -18,17 +18,19 @@ module TOML
18
18
 
19
19
  # Finding comments in multiline arrays requires accepting a bunch of
20
20
  # possible newlines and stuff before the comment
21
- rule(:array_comments) { (all_space >> comment_line).repeat(0) }
21
+ rule(:array_comments) { (all_space >> comment_line).repeat }
22
22
 
23
23
  rule(:array) {
24
- str("[") >> ( array_comments >> # Match any comments on first line
24
+ str("[") >> all_space >> array_comments >>
25
+ ( array_comments >> # Match any comments on first line
25
26
  all_space >> value >> array_comments >>
26
27
  (
27
28
  # Separator followed by any comments
28
29
  all_space >> str(",") >> array_comments >>
29
30
  # Value followed by any comments
30
31
  all_space >> value >> array_comments
31
- ).repeat(0) >>
32
+ ).repeat >>
33
+ (all_space >> str(",")).maybe >> # possible trailing comma
32
34
  all_space >> array_comments # Grab any remaining comments just in case
33
35
  ).maybe.as(:array) >> str("]")
34
36
  }
@@ -39,51 +41,57 @@ module TOML
39
41
  space >> value.as(:value) >>
40
42
  space >> comment.maybe >> str("\n") >> all_space
41
43
  }
42
- rule(:key_group) {
44
+ rule(:table) {
43
45
  space >> str("[") >>
44
- key_group_name.as(:key_group) >>
46
+ table_name.as(:table) >>
45
47
  str("]") >>
46
48
  space >> comment.maybe >> str("\n") >> all_space
47
49
  }
50
+ rule(:table_array) {
51
+ space >> str("[[") >>
52
+ table_name.as(:table_array) >>
53
+ str("]]") >>
54
+ space >> comment.maybe >> str("\n") >> all_space
55
+ }
48
56
 
49
- rule(:key) { match("[^. \t\\]]").repeat(1) }
50
- rule(:key_group_name) { key.as(:key) >> (str(".") >> key.as(:key)).repeat(0) }
57
+ rule(:key) { match["^. \t\\]"].repeat(1) }
58
+ rule(:table_name) { key.as(:key) >> (str(".") >> key.as(:key)).repeat }
51
59
 
52
60
  rule(:comment_line) { comment >> str("\n") >> all_space }
53
- rule(:comment) { str("#") >> match("[^\n]").repeat(0) }
61
+ rule(:comment) { str("#") >> match["^\n"].repeat }
54
62
 
55
- rule(:space) { match("[ \t]").repeat(0) }
56
- rule(:all_space) { match("[ \t\r\n]").repeat(0) }
63
+ rule(:space) { match[" \t"].repeat }
64
+ rule(:all_space) { match[" \t\r\n"].repeat }
57
65
 
58
66
  rule(:string) {
59
67
  str('"') >> (
60
- match("[^\"\\\\]") |
61
- (str("\\") >> match("[0tnr\"\\\\]"))
62
- ).repeat(0).as(:string) >> str('"')
68
+ match["^\"\\\\"] |
69
+ (str("\\") >> match["0tnr\"\\\\"])
70
+ ).repeat.as(:string) >> str('"')
63
71
  }
64
72
 
65
73
  rule(:sign) { str("-") }
66
74
  rule(:sign?) { sign.maybe }
67
75
 
68
76
  rule(:integer) {
69
- str("0") | (sign? >> match("[1-9]") >> match("[0-9]").repeat(0))
77
+ str("0") | (sign? >> match["1-9"] >> match["0-9"].repeat)
70
78
  }
71
79
  rule(:float) {
72
- sign? >> match("[0-9]").repeat(1) >> str(".") >> match("[0-9]").repeat(1)
80
+ sign? >> match["0-9"].repeat(1) >> str(".") >> match["0-9"].repeat(1)
73
81
  }
74
82
 
75
83
  rule(:boolean) { str("true").as(:true) | str("false").as(:false) }
76
84
 
77
85
  rule(:date) {
78
- match("[0-9]").repeat(4,4) >> str("-") >>
79
- match("[0-9]").repeat(2,2) >> str("-") >>
80
- match("[0-9]").repeat(2,2)
86
+ match["0-9"].repeat(4,4) >> str("-") >>
87
+ match["0-9"].repeat(2,2) >> str("-") >>
88
+ match["0-9"].repeat(2,2)
81
89
  }
82
90
 
83
91
  rule(:time) {
84
- match("[0-9]").repeat(2,2) >> str(":") >>
85
- match("[0-9]").repeat(2,2) >> str(":") >>
86
- match("[0-9]").repeat(2,2)
92
+ match["0-9"].repeat(2,2) >> str(":") >>
93
+ match["0-9"].repeat(2,2) >> str(":") >>
94
+ match["0-9"].repeat(2,2)
87
95
  }
88
96
 
89
97
  rule(:datetime) { date >> str("T") >> time >> str("Z") }
@@ -0,0 +1,10 @@
1
+ module TOML
2
+ class Table
3
+ # :name is array of strings
4
+ attr_reader :name
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+ end
9
+ class TableArray < Table; end
10
+ end
@@ -7,9 +7,9 @@ module TOML
7
7
  s = 0
8
8
  o = []
9
9
  while s < e
10
- if val[s] == "\\"
10
+ if val[s].chr == "\\"
11
11
  s += 1
12
- case val[s]
12
+ case val[s].chr
13
13
  when "t"
14
14
  o << "\t"
15
15
  when "n"
@@ -26,7 +26,7 @@ module TOML
26
26
  raise "Unexpected escape character: '\\#{val[s]}'"
27
27
  end
28
28
  else
29
- o << val[s]
29
+ o << val[s].chr
30
30
  end
31
31
  s += 1
32
32
  end
@@ -36,6 +36,11 @@ module TOML
36
36
  # Clean up arrays
37
37
  # rule(:array => subtree(:ar)) { ar.is_a?(Array) ? ar : [ar] }
38
38
 
39
+ # Empty file
40
+ rule('') {
41
+ nil
42
+ }
43
+
39
44
  # Clean up simple value hashes
40
45
  rule(:integer => simple(:i)) { i.to_i }
41
46
  rule(:float => simple(:f)) { f.to_f }
@@ -88,13 +93,22 @@ module TOML
88
93
  rule(:key => simple(:k)) { k }
89
94
 
90
95
  # Then objectify the key_groups
91
- rule(:key_group => simple(:kg)) {
92
- KeyGroup.new([kg.to_s])
96
+ rule(:table => simple(:kg)) {
97
+ Table.new([kg.to_s])
93
98
  }
94
99
 
95
100
  # Captures array-like key-groups
96
- rule(:key_group => subtree(:kg)) {
97
- KeyGroup.new(kg.map &:to_s)
101
+ rule(:table => subtree(:kg)) {
102
+ Table.new(kg.map &:to_s)
103
+ }
104
+
105
+ # Single name table-arrays
106
+ rule(:table_array => simple(:name)) {
107
+ TableArray.new([name.to_s])
108
+ }
109
+ # Multi-part (a.b.c) table-arrays
110
+ rule(:table_array => subtree(:names)) {
111
+ TableArray.new(names.map &:to_s)
98
112
  }
99
113
  end
100
114
  end
File without changes
@@ -0,0 +1,33 @@
1
+ # Test file for TOML
2
+ # Only this one tries to emulate a TOML file written by a user of the kind of parser writers probably hate
3
+ # This part you'll really hate
4
+
5
+ [the]
6
+ test_string = "You'll hate me after this - #" # " Annoying, isn't it?
7
+
8
+ [the.hard]
9
+ test_array = [ "] ", " # "] # ] There you go, parse this!
10
+ test_array2 = [ "Test #11 ]proved that", "Experiment #9 was a success" ]
11
+ # You didn't think it'd as easy as chucking out the last #, did you?
12
+ another_test_string = " Same thing, but with a string #"
13
+ harder_test_string = " And when \"'s are in the string, along with # \"" # "and comments are there too"
14
+ # Things will get harder
15
+
16
+ [the.hard.bit#]
17
+ what? = "You don't think some user won't do that?"
18
+ multi_line_array = [
19
+ "]",
20
+ # ] Oh yes I did
21
+ ]
22
+
23
+ # Each of the following keygroups/key value pairs should produce an error. Uncomment to them to test
24
+
25
+ #[error] if you didn't catch this, your parser is broken
26
+ #string = "Anything other than tabs, spaces and newline after a keygroup or key value pair has ended should produce an error unless it is a comment" like this
27
+ #array = [
28
+ # "This might most likely happen in multiline arrays",
29
+ # Like here,
30
+ # "or here,
31
+ # and here"
32
+ # ] End of array comment, forgot the #
33
+ #number = 3.14 pi <--again forgot the #
@@ -40,6 +40,18 @@ simple = [1, 2, 3]
40
40
  # Nested array
41
41
  nested = [[1, 2], [3]]
42
42
 
43
+ # Empty array
44
+ empty = []
45
+
46
+ # Multiline empty
47
+ multiline_empty = [
48
+ ]
49
+
50
+ # Multiline empty with comment
51
+ multiline_empty_comment = [
52
+ # You look nice today
53
+ ]
54
+
43
55
  # Multiline array
44
56
  multiline = [
45
57
  1,
@@ -47,6 +59,13 @@ multiline = [
47
59
  3
48
60
  ]
49
61
 
62
+ # Multiline array
63
+ multiline_trailing_comma = [
64
+ 1,
65
+ 2,
66
+ 3,
67
+ ]
68
+
50
69
  # With comments
51
70
  multiline_comments = [ # 0
52
71
  1, # 1
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'toml'
5
+ require 'minitest/autorun'
6
+
7
+ class TestEmpty < MiniTest::Test
8
+
9
+ def setup
10
+ filepath = File.join(File.dirname(__FILE__), "empty.toml")
11
+ @doc = TOML::Parser.new(File.read(filepath)).parsed
12
+ end
13
+
14
+ def test_empty
15
+ assert_equal ({}), @doc, "Empty document parsed incorrectly"
16
+ end
17
+
18
+ end
@@ -5,7 +5,7 @@ require 'bundler/setup'
5
5
  require 'toml'
6
6
  require 'minitest/autorun'
7
7
 
8
- class TestGenerator < MiniTest::Unit::TestCase
8
+ class TestGenerator < MiniTest::Test
9
9
  def setup
10
10
  @doc = {
11
11
  "integer" => 1,
@@ -18,16 +18,23 @@ class TestGenerator < MiniTest::Unit::TestCase
18
18
  "group" => {
19
19
  "value" => "lol"
20
20
  }
21
- }
21
+ },
22
+ "date" => DateTime.now
22
23
  }
23
24
 
24
25
  end
25
26
 
26
27
  def test_generator
27
- body = TOML::Generator.new(@doc).body
28
+ doc = @doc.clone
29
+ body = TOML::Generator.new(doc).body
28
30
 
29
31
  doc_parsed = TOML::Parser.new(body).parsed
30
32
 
31
- assert_equal @doc, doc_parsed
33
+ # Extracting dates since Ruby's DateTime equality testing sucks.
34
+ original_date = doc.delete "date"
35
+ parsed_date = doc_parsed.delete "date"
36
+
37
+ assert_equal doc, doc_parsed
38
+ assert_equal original_date.to_time.to_s, parsed_date.to_time.to_s
32
39
  end
33
40
  end
@@ -5,7 +5,7 @@ require 'bundler/setup'
5
5
  require 'toml'
6
6
  require 'minitest/autorun'
7
7
 
8
- class TestParser < MiniTest::Unit::TestCase
8
+ class TestParser < MiniTest::Test
9
9
  def setup
10
10
  filepath = File.join(File.dirname(__FILE__), 'spec.toml')
11
11
  @doc = TOML::Parser.new(File.read(filepath)).parsed
@@ -49,14 +49,30 @@ class TestParser < MiniTest::Unit::TestCase
49
49
  assert_equal [[1, 2], [3]], @doc["arrays"]["nested"]
50
50
  end
51
51
 
52
+ def test_empty_array
53
+ assert_equal [], @doc["arrays"]["empty"]
54
+ end
55
+
56
+ def test_empty_multiline_array
57
+ assert_equal [], @doc["arrays"]["multiline_empty"]
58
+ end
59
+
60
+ def test_empty_multiline_array_with_comment
61
+ assert_equal [], @doc["arrays"]["multiline_empty_comment"]
62
+ end
63
+
52
64
  def test_multiline_arrays
53
65
  assert_equal ["lines", "are", "super", "cool", "lol", "amirite"], @doc["arrays"]["multi"]
54
66
  end
55
-
67
+
56
68
  def test_multiline_array
57
69
  assert_equal @doc["arrays"]["multiline"], [1, 2, 3]
58
70
  end
59
-
71
+
72
+ def test_multiline_array_with_trailing_comma
73
+ assert_equal @doc["arrays"]["multiline_trailing_comma"], [1, 2, 3]
74
+ end
75
+
60
76
  def test_multiline_array_with_comments
61
77
  assert_equal @doc["arrays"]["multiline_comments"], [1, 2, 3]
62
78
  end
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'toml'
4
+ require 'minitest/autorun'
5
+
6
+ class TestParserHardExample < MiniTest::Test
7
+ def setup
8
+ filepath = File.join(File.dirname(__FILE__), 'hard_example.toml')
9
+ # @doc = TOML::Parser.new(File.read(filepath)).parsed
10
+ @doc = TOML.load_file(filepath)
11
+ end
12
+
13
+ def test_the_test_string
14
+ assert_equal @doc["the"]["test_string"], "You'll hate me after this - #"
15
+ end
16
+ end
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'toml'
4
+ require 'minitest/autorun'
5
+
6
+ class TestParserTableArrays < MiniTest::Test
7
+ def setup
8
+ doc = '
9
+ [[fruit]]
10
+ name = "apple"
11
+
12
+ [fruit.physical]
13
+ color = "red"
14
+ shape = "round"
15
+
16
+ [[fruit.variety]]
17
+ name = "red delicious"
18
+
19
+ [[fruit.variety]]
20
+ name = "granny smith"
21
+
22
+ [[fruit]]
23
+ name = "banana"
24
+
25
+ [[fruit.variety]]
26
+ name = "plantain"
27
+ '
28
+ @doc = TOML.load(doc)
29
+ #require 'pp'
30
+ #PP.pp @doc
31
+ end
32
+
33
+ def test_doc
34
+ assert_equal @doc, {
35
+ "fruit"=>
36
+ [{"name"=>"apple",
37
+ "physical"=>{"color"=>"red", "shape"=>"round"},
38
+ "variety"=>[{"name"=>"red delicious"}, {"name"=>"granny smith"}]},
39
+ {"name"=>"banana", "variety"=>[{"name"=>"plantain"}]}]
40
+ }
41
+ end
42
+ end
@@ -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.4'
17
- s.date = '2013-03-28'
16
+ s.version = '0.1.0'
17
+ s.date = '2013-12-05'
18
18
 
19
19
  ## Make sure your summary is short. The description may be as long
20
20
  ## as you like.
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
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'
40
+ s.add_dependency "parslet", "~> 1.5.0"
41
41
 
42
42
  ## Leave this section as-is. It will be automatically generated from the
43
43
  ## contents of your Git repository via the gemspec task. DO NOT REMOVE
@@ -51,14 +51,19 @@ Gem::Specification.new do |s|
51
51
  lib/toml.rb
52
52
  lib/toml/generator.rb
53
53
  lib/toml/key.rb
54
- lib/toml/key_group.rb
55
54
  lib/toml/monkey_patch.rb
56
55
  lib/toml/parser.rb
57
56
  lib/toml/parslet.rb
57
+ lib/toml/table.rb
58
58
  lib/toml/transformer.rb
59
+ test/empty.toml
60
+ test/hard_example.toml
59
61
  test/spec.toml
62
+ test/test_empty.rb
60
63
  test/test_generator.rb
61
64
  test/test_parser.rb
65
+ test/test_parser_hard.rb
66
+ test/test_table_arrays.rb
62
67
  test/tmp.rb
63
68
  toml.gemspec
64
69
  ]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,24 +10,24 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-03-28 00:00:00.000000000 Z
13
+ date: 2013-12-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parslet
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ! '>='
20
+ - - ~>
21
21
  - !ruby/object:Gem::Version
22
- version: '0'
22
+ version: 1.5.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  none: false
27
27
  requirements:
28
- - - ! '>='
28
+ - - ~>
29
29
  - !ruby/object:Gem::Version
30
- version: '0'
30
+ version: 1.5.0
31
31
  description: Parse your TOML, seriously.
32
32
  email: jeremy@github.com
33
33
  executables: []
@@ -43,14 +43,19 @@ files:
43
43
  - lib/toml.rb
44
44
  - lib/toml/generator.rb
45
45
  - lib/toml/key.rb
46
- - lib/toml/key_group.rb
47
46
  - lib/toml/monkey_patch.rb
48
47
  - lib/toml/parser.rb
49
48
  - lib/toml/parslet.rb
49
+ - lib/toml/table.rb
50
50
  - lib/toml/transformer.rb
51
+ - test/empty.toml
52
+ - test/hard_example.toml
51
53
  - test/spec.toml
54
+ - test/test_empty.rb
52
55
  - test/test_generator.rb
53
56
  - test/test_parser.rb
57
+ - test/test_parser_hard.rb
58
+ - test/test_table_arrays.rb
54
59
  - test/tmp.rb
55
60
  - toml.gemspec
56
61
  homepage: http://github.com/jm/toml
@@ -79,5 +84,8 @@ signing_key:
79
84
  specification_version: 2
80
85
  summary: Parse your TOML.
81
86
  test_files:
87
+ - test/test_empty.rb
82
88
  - test/test_generator.rb
83
89
  - test/test_parser.rb
90
+ - test/test_parser_hard.rb
91
+ - test/test_table_arrays.rb
@@ -1,9 +0,0 @@
1
- module TOML
2
- class KeyGroup
3
- attr_reader :keys
4
-
5
- def initialize(keys)
6
- @keys = keys
7
- end
8
- end
9
- end