udon 0.0.0 → 0.0.1

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 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: