udon 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -6,10 +6,11 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "shoulda", ">= 0"
9
+ gem "minitest", ">= 0"
10
10
  gem "bundler", "~> 1.0.0"
11
11
  gem "jeweler", "~> 1.6.4"
12
12
  gem "rcov", ">= 0"
13
13
  gem "reek", "~> 1.2.8"
14
14
  gem "roodi", "~> 2.1.0"
15
+ gem "genmachine", "~> 0.1.6"
15
16
  end
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'rdoc/task'
3
4
  require 'rubygems'
4
5
  require 'bundler'
5
6
  begin
@@ -11,6 +12,16 @@ rescue Bundler::BundlerError => e
11
12
  end
12
13
  require 'rake'
13
14
 
15
+ file "lib/udon/udon_parser.rb" => ["machines/udon.machine"] do |t|
16
+ sh "genmachine -o lib/udon/ -l ruby --no-executable -c UdonParser #{t.prerequisites.join(' ')}"
17
+ end
18
+ task :install => [:build_parser]
19
+
20
+ task :build_parser do |t|
21
+ sh "rm -f lib/udon/udon_parser.rb"
22
+ Rake::Task['lib/udon/udon_parser.rb'].execute
23
+ end
24
+
14
25
  require 'jeweler'
15
26
  Jeweler::Tasks.new do |gem|
16
27
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
@@ -29,14 +40,16 @@ require 'rake/testtask'
29
40
  Rake::TestTask.new(:test) do |test|
30
41
  test.libs << 'lib' << 'test'
31
42
  test.pattern = 'test/**/test_*.rb'
32
- test.verbose = true
43
+ test.verbose = false
33
44
  end
34
45
 
46
+ task :test => ['lib/udon/udon_parser.rb']
47
+
35
48
  require 'rcov/rcovtask'
36
49
  Rcov::RcovTask.new do |test|
37
50
  test.libs << 'test'
38
51
  test.pattern = 'test/**/test_*.rb'
39
- test.verbose = true
52
+ test.verbose = false
40
53
  test.rcov_opts << '--exclude "gems/*"'
41
54
  end
42
55
 
@@ -55,7 +68,6 @@ end
55
68
 
56
69
  task :default => :test
57
70
 
58
- require 'rake/rdoctask'
59
71
  Rake::RDocTask.new do |rdoc|
60
72
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
61
73
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.0.1
data/lib/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,205 @@
1
+ require 'strscan'
2
+ $KCODE="U"
3
+
4
+ module UdonParser
5
+ def self.parse(str) Parser.new(str).parse end
6
+ def self.parse_file(fname) Parser.new(IO.read(fname)).parse end
7
+
8
+ class UHash < Hash
9
+ def <<(kv) k,v = kv; self[k] = v end
10
+ end
11
+
12
+ class UString < String
13
+ def <<(v)
14
+ begin
15
+ super([v].pack('U*'))
16
+ rescue
17
+ super(v)
18
+ end
19
+ end
20
+ end
21
+
22
+ class UNode
23
+ attr_accessor :name, :m,:a,:c
24
+ def initialize(params={})
25
+ @m = params.delete(:m) || UHash.new
26
+ @m[:sline] ||= params.delete(:sline)
27
+ @m[:schr] ||= params.delete(:schr)
28
+ @a= params.delete(:a) || UHash.new
29
+ @c= params.delete(:c) || []
30
+ @name = params.delete(:name)
31
+ end
32
+ def <<(val) @c<<val end
33
+ def [](key) @c[key] end
34
+ end
35
+
36
+ class Parser < StringScanner
37
+ def init(source, opts={})
38
+ opts ||= {}
39
+ super ensure_encoding(source)
40
+ @global = {}
41
+ end
42
+
43
+ def ensure_encoding(source)
44
+ if defined?(::Encoding)
45
+ if source.encoding == ::Encoding::ASCII_8BIT
46
+ b = source[0, 4].bytes.to_a
47
+ source =
48
+ case
49
+ when b.size>=4 && b[0]==0 && b[1]==0 && b[2]==0
50
+ source.dup.force_encoding(::Encoding::UTF_32BE).encode!(::Encoding::UTF_8)
51
+ when b.size>=4 && b[0]==0 && b[2]==0
52
+ source.dup.force_encoding(::Encoding::UTF_16BE).encode!(::Encoding::UTF_8)
53
+ when b.size>=4 && b[1]==0 && b[2]==0 && b[3]==0
54
+ source.dup.force_encoding(::Encoding::UTF_32LE).encode!(::Encoding::UTF_8)
55
+ when b.size>=4 && b[1]==0 && b[3]==0
56
+ source.dup.force_encoding(::Encoding::UTF_16LE).encode!(::Encoding::UTF_8)
57
+ else source.dup end
58
+ else source = source.encode(::Encoding::UTF_8) end
59
+ source.force_encoding(::Encoding::ASCII_8BIT)
60
+ else
61
+ b = source
62
+ source =
63
+ case
64
+ when b.size >= 4 && b[0] == 0 && b[1] == 0 && b[2] == 0; Iconv.iconv('utf-8', 'utf-32be', b)
65
+ when b.size >= 4 && b[0] == 0 && b[2] == 0; Iconv.iconv('utf-8', 'utf-16be', b)
66
+ when b.size >= 4 && b[1] == 0 && b[2] == 0 && b[3] == 0; Iconv.iconv('utf-8', 'utf-32le', b)
67
+ when b.size >= 4 && b[1] == 0 && b[3] == 0; Iconv.iconv('utf-8', 'utf-16le', b)
68
+ else b end
69
+ end
70
+ return source
71
+ end
72
+
73
+ def parse
74
+ reset
75
+ @line = 1
76
+ @pos = 1
77
+ @leading = true
78
+ @indent = 0
79
+ @ast = document
80
+ return @ast
81
+ end
82
+
83
+ private
84
+
85
+ def error(msg)
86
+ $stderr.puts "#{msg} | line: #{@line} | char: #{@pos}"
87
+ end
88
+
89
+ def global_state(c)
90
+ # Unicode newline characters & combinations
91
+ # Plus leading space for indents.
92
+ # Also tracks line and position for the AST
93
+ @last_is_newline = @last_is_space = false
94
+ case c
95
+ when 0x0b, 0x0c, 0x85, 0x2028, 0x2029
96
+ @last_is_newline = true; @line += 1; @pos = 1
97
+ @leading = true; @indent = 0
98
+ when 0x0a
99
+ nc = peek(4).unpack('U')[0]
100
+ if nc == 0x0d then getch; c = "\n\r" end
101
+ @last_is_newline = true; @line += 1; @pos = 1
102
+ @leading = true; @indent = 0
103
+ when 0x0d
104
+ nc = peek(4).unpack('U')[0]
105
+ if nc == 0x0a then getch; c = "\r\n" end
106
+ @last_is_newline = true; @line += 1; @pos = 1
107
+ @leading = true; @indent = 0
108
+ when 0x20
109
+ @indent += 1 if @leading
110
+ @last_is_space = true; @pos += 1
111
+ else @leading = false; @pos += 1 end
112
+ return @last_c = c
113
+ end
114
+
115
+ def nl?() return @last_is_newline end
116
+ def space?() return @last_is_space end
117
+
118
+ def nextchar
119
+ if @fwd then @fwd = false; return @last_c
120
+ else
121
+ c = getch
122
+ if c.nil?
123
+ c = :eof
124
+ @last_is_space = @last_is_newline = false
125
+ return @last_c = c
126
+ end
127
+ return global_state(c.unpack('U')[0])
128
+ end
129
+ end
130
+
131
+ def eof?() return @last_c == :eof end
132
+
133
+ def document(p=nil,name='document')
134
+ state=':data_or_child'
135
+ s = []
136
+ a ||= UString.new
137
+ b ||= UString.new
138
+ trash ||= UString.new
139
+ loop do
140
+ c = nextchar
141
+ state = '{eof}' if c==:eof
142
+ case state
143
+ when ':data_or_child'
144
+ case
145
+ when nl?; @fwd=true; (a<<b if b.size>0); b=UString.new; state=':data'; next
146
+ when space?; b<<c; next
147
+ when c==35,c==124; @fwd=true; (trash<<b if b.size>0); b=UString.new; state=':child'; next
148
+ else @fwd=true; (a<<b if b.size>0); b=UString.new; state=':data'; next
149
+ end
150
+ when ':child'
151
+ if c==35
152
+ @fwd=true; (s<<a if a.size>0); a=UString.new; state=comment(':data_or_child',s); next
153
+ end
154
+ when '{eof}'
155
+ @fwd=true; (a<<b if b.size>0); b=UString.new; (s<<a if a.size>0); a=UString.new; return(s)
156
+ when ':data'
157
+ case
158
+ when nl?; a<<c; (s<<a if a.size>0); a=UString.new; state=':data_or_child'; next
159
+ else a<<c; next
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ def comment(ns,p=nil,name='comment')
166
+ ipar=@indent
167
+ ibase=ipar+100
168
+ state=':1st:ws'
169
+ s = UNode.new(:name=>name,:sline=>@line,:schr=>@pos)
170
+ a ||= UString.new
171
+ loop do
172
+ c = nextchar
173
+ state = '{eof}' if c==:eof
174
+ case state
175
+ when ':nl'
176
+ case
177
+ when (@indent>ibase); @fwd=true; state=':child'; next
178
+ when nl?,(c>8&&c<11),space?; next
179
+ when (@indent<=ipar); @fwd=true; p<<s; return(ns)
180
+ else a<<c; ibase = @indent; state=':child'; next
181
+ end
182
+ when ':child'
183
+ case
184
+ when nl?; (s<<a if a.size>0); a=UString.new; state=':nl'; next
185
+ else a<<c; next
186
+ end
187
+ when ':1st'
188
+ case
189
+ when nl?; (s<<a if a.size>0); a=UString.new; state=':nl'; next
190
+ else a<<c; next
191
+ end
192
+ when '{eof}'
193
+ @fwd=true; (s<<a if a.size>0); a=UString.new; p<<s; return(ns)
194
+ when ':1st:ws'
195
+ case
196
+ when c==9,space?; next
197
+ when nl?; state=':nl'; next
198
+ else a<<c; state=':1st'; next
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ end
205
+ end
data/lib/udon.rb CHANGED
@@ -1,3 +1,19 @@
1
1
  module Udon
2
+ require 'udon/udon_parser'
3
+ VERSION = File.exist?(File.join(File.dirname(__FILE__),'VERSION')) ? File.read(File.join(File.dirname(__FILE__),'VERSION')) : ""
4
+ class << self
5
+ def version() VERSION end
2
6
 
7
+ def parse(source, opts={})
8
+ pp_ast = opts.delete(:pp_ast) || false
9
+ res = UdonParser::Parser.new(source, opts).parse
10
+ if pp_ast
11
+ require 'pp'
12
+ puts "\n----------------- AST ---------------------"
13
+ pp res
14
+ puts "\n-------------------------------------------"
15
+ end
16
+ return res
17
+ end
18
+ end
3
19
  end
@@ -0,0 +1,42 @@
1
+ Main entrypoint - a complete udon document
2
+
3
+ +-----------------+----------+-----+----------------+-------------------------+
4
+ | document()::[] | | | | :data_or_child |
5
+ | :data_or_child | [\n] | | a<<<b | :data |
6
+ | :data_or_child | [ ] | b<< | | :data_or_child |
7
+ | :data_or_child | [#|] | | trash<<<b | :child |
8
+ | :data_or_child | . | | a<<<b | :data |
9
+
10
+ | :data | [\n] | a<< | s<<<a | :data_or_child |
11
+ | :data | . | a<< | | :data |
12
+ | :child | [#] | | s<<<a | comment(:data_or_child) |
13
+ | {eof} | | | a<<<b; s<<<a | <done> |
14
+ # TODO: lots more children
15
+
16
+ For error recovery (go to the next line)
17
+ #+-----------------+----------+-----+----------------+--------------+
18
+ #| to_nextline(ns) | | | | :scan |
19
+ #| :scan | {eof?} | | | <ns> |
20
+ #| :scan | [\n] | | | <ns> |
21
+ #| :scan | . | << | | :scan |
22
+ #+-----------------+----------+-----+----------------+--------------+
23
+
24
+ Block comments
25
+ +-----------------+-----------------+-----+-----------------+--------------+
26
+ | comment(ns)::U | | | ipar=$indent | :1st:ws |
27
+ : : : : ibase=ipar+100 : :
28
+ | :1st:ws | [ \t] | << | | :1st:ws |
29
+ | :1st:ws | [\n] | << | | :nl |
30
+ | :1st:ws | . | a<< | | :1st |
31
+ | :1st | [\n] | << | s<<<a | :nl |
32
+ | :1st | . | a<< | | :1st |
33
+ | :nl | {$indent>ibase} | | | :child |
34
+ | :nl | [ \t\n] | << | | :nl |
35
+ | :nl | {$indent<=ipar} | | p<<s | <ns> |
36
+ | :nl | . | a<< | ibase = $indent | :child |
37
+ | :child | [\n] | << | s<<<a | :nl |
38
+ | :child | . | a<< | | :child |
39
+ | {eof} | | | s<<<a; p<<s | <ns> |
40
+ +-----------------+-----------------+-----+-----------------+--------------+
41
+
42
+
data/test/helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ $KCODE = 'U'
1
2
  require 'rubygems'
2
3
  require 'bundler'
3
4
  begin
@@ -7,12 +8,83 @@ rescue Bundler::BundlerError => e
7
8
  $stderr.puts "Run `bundle install` to install missing gems"
8
9
  exit e.status_code
9
10
  end
10
- require 'test/unit'
11
- require 'shoulda'
11
+ require 'iconv'
12
+ require 'minitest/unit'
13
+ require 'minitest/autorun'
14
+ require 'minitest/pride'
12
15
 
13
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
16
  $LOAD_PATH.unshift(File.dirname(__FILE__))
17
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
18
+
15
19
  require 'udon'
16
20
 
17
- class Test::Unit::TestCase
21
+ class String
22
+ def udon; Udon.parse(self) end
23
+ def udon_pp; Udon.parse(self, :pp_ast=>true) end
18
24
  end
25
+
26
+ class Array
27
+ def gcd; inject(){|n1,n2| n1.gcd(n2)} end
28
+ end
29
+
30
+
31
+ def gaussian(mean, stddev)
32
+ theta = 2 * Math::PI * rand
33
+ rho = Math.sqrt(-2 * Math.log(1 - rand))
34
+ scale = stddev * rho
35
+ if rand >= 0.5
36
+ return mean + scale * Math.cos(theta)
37
+ else
38
+ return mean + scale * Math.sin(theta)
39
+ end
40
+ end
41
+
42
+ def randstr(avg_length, char_dists = [[0.1,' '],[0.1,('A'..'Z')],[0.8,('a'..'z')]])
43
+ ret = ''
44
+ char_dists = char_dists.scan /./umn if char_dists.is_a?(String)
45
+ chrs = char_dists.sort_by{|n|n[0]}
46
+ chrs.map! do |k,ch|
47
+ if ch.nil?
48
+ ch = k
49
+ k = 1.0 / chrs.size.to_f
50
+ end
51
+ if ch.is_a?(Range)
52
+ if ch.max.is_a?(String)
53
+ [k, ((ch.min.unpack('U')[0])..(ch.max.unpack('U')[0]))]
54
+ else [k, ch] end
55
+ elsif ch.is_a?(Integer)
56
+ [k, (ch..ch)]
57
+ elsif ch.is_a?(String) && ch.scan(/./u).length == 1
58
+ [k, ((ch.unpack('U')[0])..(ch.unpack('U')[0]))]
59
+ elsif ch.is_a?(String)
60
+ [k, ch.unpack('U*')]
61
+ else
62
+ raise ArgumentError, 'Ranges and strings only'
63
+ end
64
+ end
65
+ len = [gaussian(avg_length,avg_length/3.0).round, 0].max
66
+ (0..len).each do
67
+ range_sel = rand
68
+ prob_sum = 0.0
69
+ chrs.each do |prob,cr|
70
+ prob_sum += prob
71
+ if prob_sum > range_sel
72
+ if cr.is_a?(Range)
73
+ ret << [(cr.min + rand(cr.max - cr.min + 1))].pack('U')
74
+ else
75
+ ret << cr[rand(cr.length)]
76
+ end
77
+ break
78
+ end
79
+ end
80
+ end
81
+ # (To fix iconv bug: cr http://po-ru.com/diary/fixing-invalid-utf-8-in-ruby-revisited/ )
82
+ ret = ret + ' '
83
+ Iconv.iconv('UTF-8//IGNORE', 'UTF-8', ret)
84
+ return ret[0..-2]
85
+ end
86
+
87
+ class MiniTest::Unit::TestCase
88
+ end
89
+
90
+ MiniTest::Unit.autorun
data/test/test_udon.rb CHANGED
@@ -1,7 +1,35 @@
1
1
  require 'helper'
2
+ $KCODE='U'
2
3
 
3
- class TestUdon < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
4
+ class TestUdon < MiniTest::Unit::TestCase
5
+ def test_blank_documents
6
+ assert_equal(''.udon,[])
7
+ (0..5).each do
8
+ s = randstr(200," \t\n\r")
9
+ assert_equal(s.udon.join(''),s)
10
+ end
11
+ end
12
+
13
+ def test_passthrough_documents
14
+ chars = [[0.10, " \t"],
15
+ [0.05, "\n\r"],
16
+ [0.40, ('a'..'z')],
17
+ [0.15, ('A'..'Z')],
18
+ [0.15, ('0'..'9')],
19
+ [0.075, (32..126)],
20
+ [0.05, (0..255)],
21
+ [0.025, (0..0xffff)]]
22
+ (0..5).each do
23
+ s = randstr(500,chars)
24
+ s.gsub! /^\s*(<\||#|\|)/u, ''
25
+ assert_equal(s.udon.join(''),s)
26
+ end
27
+ end
28
+
29
+ def test_block_comments
30
+ #leading = randstr(200," \t\n\r")
31
+ #comment = "# hello\na"
32
+ #following = randstr(200," \t\n\r")
33
+ #(leading + comment + following).udon_pp
6
34
  end
7
35
  end
data/udon.gemspec ADDED
@@ -0,0 +1,70 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{udon}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Joseph Wecker"]
12
+ s.date = %q{2011-08-18}
13
+ s.description = %q{Parse and generate udon, inspired by zml, haml, json, and more.}
14
+ s.email = %q{joseph.wecker@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "LICENSE.txt",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/VERSION",
27
+ "lib/udon.rb",
28
+ "lib/udon/udon_parser.rb",
29
+ "machines/udon.machine",
30
+ "test/helper.rb",
31
+ "test/test_udon.rb",
32
+ "udon.gemspec"
33
+ ]
34
+ s.homepage = %q{http://udon.io}
35
+ s.licenses = ["MIT"]
36
+ s.require_paths = ["lib"]
37
+ s.rubygems_version = %q{1.6.2}
38
+ s.summary = %q{Universal Document and Object Notation}
39
+
40
+ if s.respond_to? :specification_version then
41
+ s.specification_version = 3
42
+
43
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
44
+ s.add_development_dependency(%q<minitest>, [">= 0"])
45
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
46
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
47
+ s.add_development_dependency(%q<rcov>, [">= 0"])
48
+ s.add_development_dependency(%q<reek>, ["~> 1.2.8"])
49
+ s.add_development_dependency(%q<roodi>, ["~> 2.1.0"])
50
+ s.add_development_dependency(%q<genmachine>, ["~> 0.1.6"])
51
+ else
52
+ s.add_dependency(%q<minitest>, [">= 0"])
53
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
54
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
55
+ s.add_dependency(%q<rcov>, [">= 0"])
56
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
57
+ s.add_dependency(%q<roodi>, ["~> 2.1.0"])
58
+ s.add_dependency(%q<genmachine>, ["~> 0.1.6"])
59
+ end
60
+ else
61
+ s.add_dependency(%q<minitest>, [">= 0"])
62
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
64
+ s.add_dependency(%q<rcov>, [">= 0"])
65
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
66
+ s.add_dependency(%q<roodi>, ["~> 2.1.0"])
67
+ s.add_dependency(%q<genmachine>, ["~> 0.1.6"])
68
+ end
69
+ end
70
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: udon
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 0
10
- version: 0.0.0
9
+ - 1
10
+ version: 0.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joseph Wecker
@@ -15,10 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-12 00:00:00 -07:00
18
+ date: 2011-08-18 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
+ type: :development
22
23
  requirement: &id001 !ruby/object:Gem::Requirement
23
24
  none: false
24
25
  requirements:
@@ -28,11 +29,11 @@ dependencies:
28
29
  segments:
29
30
  - 0
30
31
  version: "0"
31
- name: shoulda
32
+ name: minitest
32
33
  version_requirements: *id001
33
34
  prerelease: false
34
- type: :development
35
35
  - !ruby/object:Gem::Dependency
36
+ type: :development
36
37
  requirement: &id002 !ruby/object:Gem::Requirement
37
38
  none: false
38
39
  requirements:
@@ -47,8 +48,8 @@ dependencies:
47
48
  name: bundler
48
49
  version_requirements: *id002
49
50
  prerelease: false
50
- type: :development
51
51
  - !ruby/object:Gem::Dependency
52
+ type: :development
52
53
  requirement: &id003 !ruby/object:Gem::Requirement
53
54
  none: false
54
55
  requirements:
@@ -63,8 +64,8 @@ dependencies:
63
64
  name: jeweler
64
65
  version_requirements: *id003
65
66
  prerelease: false
66
- type: :development
67
67
  - !ruby/object:Gem::Dependency
68
+ type: :development
68
69
  requirement: &id004 !ruby/object:Gem::Requirement
69
70
  none: false
70
71
  requirements:
@@ -77,8 +78,8 @@ dependencies:
77
78
  name: rcov
78
79
  version_requirements: *id004
79
80
  prerelease: false
80
- type: :development
81
81
  - !ruby/object:Gem::Dependency
82
+ type: :development
82
83
  requirement: &id005 !ruby/object:Gem::Requirement
83
84
  none: false
84
85
  requirements:
@@ -93,8 +94,8 @@ dependencies:
93
94
  name: reek
94
95
  version_requirements: *id005
95
96
  prerelease: false
96
- type: :development
97
97
  - !ruby/object:Gem::Dependency
98
+ type: :development
98
99
  requirement: &id006 !ruby/object:Gem::Requirement
99
100
  none: false
100
101
  requirements:
@@ -109,7 +110,22 @@ dependencies:
109
110
  name: roodi
110
111
  version_requirements: *id006
111
112
  prerelease: false
113
+ - !ruby/object:Gem::Dependency
112
114
  type: :development
115
+ requirement: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ hash: 23
121
+ segments:
122
+ - 0
123
+ - 1
124
+ - 6
125
+ version: 0.1.6
126
+ name: genmachine
127
+ version_requirements: *id007
128
+ prerelease: false
113
129
  description: Parse and generate udon, inspired by zml, haml, json, and more.
114
130
  email: joseph.wecker@gmail.com
115
131
  executables: []
@@ -126,9 +142,13 @@ files:
126
142
  - README.rdoc
127
143
  - Rakefile
128
144
  - VERSION
145
+ - lib/VERSION
129
146
  - lib/udon.rb
147
+ - lib/udon/udon_parser.rb
148
+ - machines/udon.machine
130
149
  - test/helper.rb
131
150
  - test/test_udon.rb
151
+ - udon.gemspec
132
152
  has_rdoc: true
133
153
  homepage: http://udon.io
134
154
  licenses: