tadpole 0.1.0

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.
Files changed (60) hide show
  1. data/LICENSE +22 -0
  2. data/README.html +222 -0
  3. data/README.markdown +259 -0
  4. data/benchmarks/eval-vs-non-eval.rb +13 -0
  5. data/benchmarks/require-vs-none.rb +10 -0
  6. data/benchmarks/run-caching.rb +20 -0
  7. data/examples/example1/custom/html/body/important.html +4 -0
  8. data/examples/example1/custom/html/body/setup.rb +6 -0
  9. data/examples/example1/custom/html/setup.rb +3 -0
  10. data/examples/example1/default/html/body/info.erb +3 -0
  11. data/examples/example1/default/html/body/setup.rb +11 -0
  12. data/examples/example1/default/html/main.haml +6 -0
  13. data/examples/example1/default/html/setup.rb +3 -0
  14. data/examples/example1/run.rb +6 -0
  15. data/examples/example2/run.rb +5 -0
  16. data/examples/example2/tadpole/html/content.haml +5 -0
  17. data/examples/example2/tadpole/html/main.haml +17 -0
  18. data/examples/example2/tadpole/html/readme/setup.rb +6 -0
  19. data/examples/example2/tadpole/html/setup.rb +6 -0
  20. data/examples/example2/tadpole/markdown/copyright.md +5 -0
  21. data/examples/example2/tadpole/markdown/examples.md +76 -0
  22. data/examples/example2/tadpole/markdown/quick/create.md +34 -0
  23. data/examples/example2/tadpole/markdown/quick/heirarchical.md +34 -0
  24. data/examples/example2/tadpole/markdown/quick/override.md +28 -0
  25. data/examples/example2/tadpole/markdown/quick/quick.erb +5 -0
  26. data/examples/example2/tadpole/markdown/quick/setup.rb +4 -0
  27. data/examples/example2/tadpole/markdown/readme/readme_notice.txt +7 -0
  28. data/examples/example2/tadpole/markdown/readme/setup.rb +4 -0
  29. data/examples/example2/tadpole/markdown/setup.rb +3 -0
  30. data/examples/example2/tadpole/markdown/title.md +5 -0
  31. data/examples/example2/tadpole/markdown/what.md +25 -0
  32. data/examples/example2/tadpole/markdown/why.md +41 -0
  33. data/lib/tadpole/filters.rb +50 -0
  34. data/lib/tadpole/local_template.rb +32 -0
  35. data/lib/tadpole/main.rb +125 -0
  36. data/lib/tadpole/providers/erb.rb +26 -0
  37. data/lib/tadpole/providers/file.rb +9 -0
  38. data/lib/tadpole/providers/haml.rb +21 -0
  39. data/lib/tadpole/providers/markaby.rb +7 -0
  40. data/lib/tadpole/providers/section_provider.rb +62 -0
  41. data/lib/tadpole/providers/template.rb +24 -0
  42. data/lib/tadpole/template.rb +258 -0
  43. data/lib/tadpole.rb +32 -0
  44. data/spec/basic_spec.rb +88 -0
  45. data/spec/examples/filters/a.txt +0 -0
  46. data/spec/examples/filters/b.txt +0 -0
  47. data/spec/examples/filters/setup.rb +9 -0
  48. data/spec/examples/render/1/a.txt +1 -0
  49. data/spec/examples/render/1/b.txt +1 -0
  50. data/spec/examples/render/1/d.erb +1 -0
  51. data/spec/examples/render/1/setup.rb +13 -0
  52. data/spec/examples/render/2/setup.rb +9 -0
  53. data/spec/examples/render/3/setup.rb +12 -0
  54. data/spec/examples/render/4/a.erb +1 -0
  55. data/spec/examples/render/4/setup.rb +9 -0
  56. data/spec/examples/render/5/setup.rb +17 -0
  57. data/spec/examples/render/6/setup.rb +12 -0
  58. data/spec/filters_spec.rb +37 -0
  59. data/spec/render_spec.rb +32 -0
  60. metadata +136 -0
@@ -0,0 +1,258 @@
1
+ require 'ostruct'
2
+
3
+ class OpenHashStruct < OpenStruct
4
+ def [](key) send(key.to_s) end
5
+ def []=(k,v) send(key.to_s+'=', v) end
6
+ def to_hash; @table.dup end
7
+ alias has_key? respond_to?
8
+ end
9
+
10
+ module Tadpole
11
+ module Template
12
+ class MissingSectionError < Exception; end
13
+
14
+ module ClassMethods
15
+ attr_accessor :path, :template_paths, :sections
16
+ attr_accessor :before_run_filters, :before_section_filters
17
+
18
+ def run(*args, &block)
19
+ new(*args).run(&block)
20
+ end
21
+
22
+ def new(opts = {}, &block)
23
+ obj = Object.new.extend(self)
24
+ class << obj;
25
+ extend ClassMethods
26
+ include Filters::InstanceMethods
27
+ end
28
+ obj.instance_eval("def class; #{self} end", __FILE__, __LINE__)
29
+ obj.send(:initialize, opts, &block)
30
+ obj
31
+ end
32
+ end
33
+
34
+ def self.included(klass)
35
+ klass.extend(ClassMethods)
36
+ end
37
+
38
+ attr_accessor :options
39
+ attr_accessor :current_section, :subsections
40
+
41
+ def options; @options ||= OpenHashStruct.new end
42
+
43
+ def options=(hash)
44
+ if hash.is_a?(OpenStruct)
45
+ @options = hash
46
+ else
47
+ @options = OpenHashStruct.new(hash)
48
+ end
49
+ end
50
+
51
+ def method_missing(meth, *args, &block)
52
+ if options.respond_to?(meth)
53
+ options[meth]
54
+ elsif meth.to_s =~ /=$/ && options.has_key?(meth.to_s.gsub(/=$/, ''))
55
+ options[meth] = *args
56
+ else
57
+ super
58
+ end
59
+ end
60
+
61
+ def template_paths; self.class.template_paths end
62
+ def path; self.class.path end
63
+
64
+ def sections(*new_sections)
65
+ new_sections.compact!
66
+ if new_sections.empty?
67
+ @sections
68
+ elsif new_sections.size == 1 && new_sections.first.is_a?(Array)
69
+ @sections = new_sections.first
70
+ else
71
+ @sections = new_sections
72
+ end
73
+ end
74
+
75
+ def compile_sections(list = sections)
76
+ return unless Array === list
77
+ list.map do |section|
78
+ case section
79
+ when Array
80
+ compile_sections(section)
81
+ when String, Symbol
82
+ if respond_to?(section)
83
+ section
84
+ else
85
+ find_section_provider(section)
86
+ end
87
+ when Module
88
+ section.new(options)
89
+ else
90
+ section
91
+ end
92
+ end
93
+ end
94
+
95
+ def initialize(opts = {}, &block)
96
+ self.options = opts
97
+ @providers = {}
98
+ #self.sections(*sections)
99
+
100
+ init(&block)
101
+
102
+ if Tadpole.caching
103
+ @compiled_sections = compile_sections(sections)
104
+ end
105
+ end
106
+
107
+ def init; end
108
+
109
+ def run(opts = {}, &block)
110
+ return '' if run_before_run.is_a?(FalseClass)
111
+
112
+ old_opts = options
113
+ self.options = options.to_hash.update(opts)
114
+ out = run_sections(@compiled_sections || sections, &block)
115
+ self.options = old_opts
116
+ out
117
+ rescue => e
118
+ me = NoMethodError.new("In #{self.inspect}: #{e.message}")
119
+ me.set_backtrace(e.backtrace)
120
+ raise me
121
+ end
122
+ alias to_s run
123
+
124
+ def run_sections(sects, break_first = false, locals = {}, &block)
125
+ out = ''
126
+ sects = sects.first if sects.first.is_a?(Array)
127
+ sects.each_with_index do |section, i|
128
+ (break_first ? break : next) if section.is_a?(Array)
129
+
130
+ self.current_section = section_name(section)
131
+
132
+ next if run_before_sections.is_a?(FalseClass)
133
+
134
+ if sects[i+1].is_a?(Array)
135
+ old, self.subsections = subsections, sects[i+1]
136
+ out += run_subsections(section, sects[i+1], locals, &block)
137
+ self.subsections = old
138
+ else
139
+ out += render(section, locals, true, &block)
140
+ end
141
+
142
+ break if break_first
143
+ end
144
+ out
145
+ end
146
+
147
+ def run_subsections(section, subsections, locals = {}, &block)
148
+ list = subsections.dup
149
+
150
+ render(section, locals, true) do |*args|
151
+ if list.empty?
152
+ raise LocalJumpError, "Section `#{section}' yielded with no sub-section given."
153
+ end
154
+
155
+ ysection, locals = *parse_yield_args(*args)
156
+ if ysection
157
+ render(ysection, locals, true)
158
+ else
159
+ data = run_sections(list, true, locals, &block)
160
+ list.shift; list.shift if list.first.is_a?(Array)
161
+ list = subsections.dup if list.empty?
162
+ data
163
+ end
164
+ end
165
+ end
166
+
167
+ def all_sections(&block)
168
+ subsections.each do |s|
169
+ next if Array === s
170
+ yield section_name(s)
171
+ end
172
+ end
173
+
174
+ def yieldall(locals = {}, &block)
175
+ run_sections(subsections, false, locals, &block)
176
+ end
177
+
178
+ def render(section, locals = {}, call_method = false, &block)
179
+ case section
180
+ when String, Symbol
181
+ if call_method && respond_to?(section)
182
+ send(section, &block)
183
+ else
184
+ find_section_provider(section).render(locals, &block)
185
+ end
186
+ when Template
187
+ section.run(locals, &block)
188
+ when Module
189
+ section.new(options).run(locals, &block)
190
+ when SectionProviders::SectionProvider
191
+ section.render(locals, &block)
192
+ else
193
+ raise MissingSectionError, "missing section #{section.inspect}"
194
+ end
195
+ end
196
+
197
+ def inspect
198
+ "#<Template:0x%s path='%s' sections=%s%s>" % [object_id.to_s(16),
199
+ path, sections.inspect, @compiled_sections ? ' (compiled)' : '']
200
+ end
201
+
202
+ private
203
+
204
+ def section_name(section)
205
+ case section
206
+ when SectionProviders::SectionProvider
207
+ @providers.index(section) || section
208
+ else
209
+ section.respond_to?(:path) ? section.path : section
210
+ end.to_s
211
+ end
212
+
213
+ def parse_yield_args(*args)
214
+ sym = args.shift
215
+ if Hash === sym
216
+ [nil, sym]
217
+ elsif sym
218
+ [sym, args.first || {}]
219
+ else
220
+ [nil, {}]
221
+ end
222
+ end
223
+
224
+ def find_section_provider(section)
225
+ section = section.to_s
226
+ @providers ||= {}
227
+ return @providers[section] if @providers[section]
228
+
229
+ filename, provider = nil, nil
230
+ template_paths.each do |template_path|
231
+ SectionProviders.providers.each do |prov|
232
+ filename = prov.provides?(File.join(template_path, section))
233
+ break provider = prov if filename
234
+ end
235
+ break if provider && filename
236
+ end
237
+
238
+ raise ArgumentError, "missing section `#{section}'" if !provider
239
+ @providers[section] = provider.new(filename, self)
240
+ end
241
+
242
+ def find_template(filename)
243
+ template_paths.each do |template_path|
244
+ file = File.join(template_path, filename)
245
+ return file if File.file? file
246
+ end
247
+ nil
248
+ end
249
+
250
+ def template_contents(filename)
251
+ if file = find_template(filename)
252
+ File.read(file)
253
+ else
254
+ raise ArgumentError, "missing template file `#{filename}' in #{self.inspect}"
255
+ end
256
+ end
257
+ end
258
+ end
data/lib/tadpole.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+
3
+ module Tadpole
4
+ Version = '0.1.0'
5
+ Root = File.dirname(__FILE__)
6
+
7
+ module SectionProviders
8
+ autoload :ERBProvider, Root + '/tadpole/providers/erb'
9
+ autoload :FileProvider, Root + '/tadpole/providers/file'
10
+ autoload :HamlProvider, Root + '/tadpole/providers/haml'
11
+ autoload :MarkabyProvider, Root + '/tadpole/providers/markaby'
12
+ autoload :TemplateProvider, Root + '/tadpole/providers/template'
13
+ end
14
+
15
+ module Filters
16
+ autoload :ClassMethods, Root + '/tadpole/filters'
17
+ autoload :InstanceMethods, Root + '/tadpole/filters'
18
+ end
19
+
20
+ autoload :Template, Root + '/tadpole/template'
21
+ autoload :LocalTemplate, Root + '/tadpole/local_template'
22
+ end
23
+
24
+ ['tadpole/main', 'tadpole/providers/section_provider'].each do |path|
25
+ require File.join(Tadpole::Root, path)
26
+ end
27
+
28
+ module Tadpole::SectionProviders
29
+ register_provider TemplateProvider, ERBProvider, HamlProvider, FileProvider
30
+ end
31
+
32
+
@@ -0,0 +1,88 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'tadpole')
2
+
3
+ Tadpole.caching = false
4
+
5
+ describe 'Tadpole' do
6
+ before { Tadpole.template_paths.clear }
7
+
8
+ it "should be an alias to Tadpole.template" do
9
+ Tadpole.should_receive(:template).with(:x, :y, :z)
10
+ Tadpole(:x, :y, :z)
11
+ end
12
+ end
13
+
14
+ describe Tadpole, '.template' do
15
+ before { Tadpole.template_paths.clear }
16
+
17
+ it "should raise ArgumentError if path does not exist in template_paths" do
18
+ lambda { Tadpole(:x, :y, :z) }.should raise_error(ArgumentError)
19
+ end
20
+
21
+ it "should create the module with the path name" do
22
+ Tadpole.register_template_path ''
23
+ File.should_receive(:directory?).exactly(3).times.and_return(true)
24
+ Tadpole('default/html')
25
+ Tadpole.constants.should include("Template_default_html")
26
+ Tadpole.constants.should include("LocalTemplate_default_html")
27
+ Tadpole.constants.should include("LocalTemplate_default")
28
+ end
29
+
30
+ it "should override templates from other template paths" do
31
+ Tadpole.register_template_path 'a'
32
+ Tadpole.register_template_path 'b'
33
+ File.should_receive(:directory?).exactly(6).times.and_return(true)
34
+ Tadpole(:new, :template)
35
+ Tadpole.constants.should include("Template_new_template")
36
+ Tadpole.constants.should include("LocalTemplate_a_new_template")
37
+ Tadpole.constants.should include("LocalTemplate_a_new")
38
+ Tadpole.constants.should include("LocalTemplate_b_new_template")
39
+ Tadpole.constants.should include("LocalTemplate_b_new")
40
+ Tadpole::Template_new_template.ancestors.should == [Tadpole::Template_new_template,
41
+ Tadpole::LocalTemplate_b_new_template, Tadpole::LocalTemplate_a_new_template,
42
+ Tadpole::LocalTemplate_b_new, Tadpole::LocalTemplate_a_new, Tadpole::LocalTemplate,
43
+ Tadpole::Template]
44
+ end
45
+ end
46
+
47
+ describe Tadpole, "::Template" do
48
+ before { Tadpole.template_paths.clear; Tadpole.register_template_path '.' }
49
+
50
+ it "should act as a class (have a .new, #inspect, etc.)" do
51
+ #File.should_receive(:directory?).and_return(true)
52
+ #Tadpole.caching = false
53
+ Tadpole(:default, :html).should respond_to(:new)
54
+ Tadpole::Template.should === Tadpole(:default, :html).new
55
+ #Tadpole.caching = false
56
+ end
57
+
58
+ it "should #run with Symbol sections as methods" do
59
+ File.should_receive(:directory?).at_least(1).times.and_return(true)
60
+ obj = Tadpole(:x, :q).new
61
+ obj.stub!(:sections).and_return([:a, :b, :c])
62
+ obj.should_receive(:a).and_return('X')
63
+ obj.should_receive(:b).and_return('Y')
64
+ obj.should_receive(:c).and_return('Z')
65
+ obj.run.should == 'XYZ'
66
+ end
67
+
68
+ it "should #run with Symbol sections as templates" do
69
+ File.should_receive(:directory?).at_least(1).times.and_return(true)
70
+ qr, qs = Tadpole(:Q,:R).new, Tadpole(:Q, :S).new
71
+ Tadpole(:Q, :R).should_receive(:new).and_return(qr)
72
+ Tadpole(:Q, :S).should_receive(:new).and_return(qs)
73
+ obj = Tadpole(:Q).new
74
+ obj.stub!(:sections).and_return([:a, :R, :S])
75
+ obj.should_receive(:a).and_return('X')
76
+ qr.should_receive(:run).and_return('Y')
77
+ qs.should_receive(:run).and_return('Z')
78
+ obj.run.should == 'XYZ'
79
+ end
80
+
81
+ it "should alias .run as new.run" do
82
+ File.should_receive(:directory?).at_least(1).times.and_return(true)
83
+ obj = mock(:obj)
84
+ obj.stub!(:run)
85
+ Tadpole(:s).should_receive(:new).and_return(obj)
86
+ Tadpole(:s).run
87
+ end
88
+ end
File without changes
File without changes
@@ -0,0 +1,9 @@
1
+ before_run :test
2
+ before_section :a, :run_a
3
+ before_section :all
4
+
5
+ def test; end
6
+ def run_a; end
7
+ def all(section) end
8
+
9
+ def init; sections 'a', 'b' end
@@ -0,0 +1 @@
1
+ x
@@ -0,0 +1 @@
1
+ y
@@ -0,0 +1 @@
1
+ <%= value %>
@@ -0,0 +1,13 @@
1
+ def init
2
+ sections 'a', 'b', :c, 'd'
3
+ end
4
+
5
+ def c
6
+ 'z'
7
+ end
8
+
9
+ def d
10
+ render('d', :value => '1')
11
+ end
12
+
13
+ # Expected: xyz1
@@ -0,0 +1,9 @@
1
+ def init
2
+ sections :a, [:b, [:c]]
3
+ end
4
+
5
+ def a; '{' + yield + '}' end
6
+ def b; '(' + yield + ')' end
7
+ def c; '[]' end
8
+
9
+ # Expected: {([])}
@@ -0,0 +1,12 @@
1
+ def init
2
+ sections :a, [:b, [:c]], :x, :y, :z
3
+ end
4
+
5
+ def a; '{' + yield + '}' end
6
+ def b; '(' + yield + ')' end
7
+ def c; '[]' end
8
+ def x; 'a' end
9
+ def y; 'b' end
10
+ def z; 'c' end
11
+
12
+ # Expected: {([])}abc
@@ -0,0 +1 @@
1
+ <% if x < 4 %><%= x %><%= render 'a', :x => x + 1 %><% end %>
@@ -0,0 +1,9 @@
1
+ def init
2
+ sections 'a'
3
+ end
4
+
5
+ def a
6
+ render 'a', :x => 1
7
+ end
8
+
9
+ # Expected: 123
@@ -0,0 +1,17 @@
1
+ def init
2
+ sections 'a', ['b', 'c']
3
+ end
4
+
5
+ def a
6
+ 'x' + yield + yield + yield
7
+ end
8
+
9
+ def b
10
+ 'y'
11
+ end
12
+
13
+ def c
14
+ 'z'
15
+ end
16
+
17
+ # Expected: xyzy
@@ -0,0 +1,12 @@
1
+ def init
2
+ sections [:a, [:b, [:c, :d], :e, :f]]
3
+ end
4
+
5
+ def a; 'A' + yieldall + 'G' end
6
+ def b; 'B(' + subsections.map {|x| section_name(x).upcase }.join + ')' end
7
+ def c; 'XXX' end
8
+ def d; 'XXX' end
9
+ def e; 'E' end
10
+ def f; 'F' end
11
+
12
+ # Expected: AB(CD)EFG
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'tadpole')
2
+
3
+ describe Tadpole::Filters do
4
+ before do
5
+ Tadpole.template_paths.clear
6
+ Tadpole.register_template_path File.dirname(__FILE__) + '/examples'
7
+ end
8
+
9
+ it "should call before_run filter" do
10
+ obj = Template(:filters).new
11
+ obj.should_receive(:test)
12
+ obj.run
13
+ end
14
+
15
+ it "should call before_section filter for specific section" do
16
+ obj = Template(:filters).new
17
+ obj.should_receive(:run_a).with('a')
18
+ obj.run
19
+ end
20
+
21
+ it "should call before_section filter for all sections" do
22
+ obj = Template(:filters).new
23
+ obj.should_receive(:all).exactly(2).times
24
+ obj.run
25
+ end
26
+
27
+ it "should allow filters specified directly in LocalTemplate" do
28
+ eval "module Tadpole::LocalTemplate; before_run :xyz end"
29
+
30
+ File.should_receive(:directory?).at_least(:once).and_return(true)
31
+ obj = Template('a/b/c/d').new
32
+ obj.should_receive(:xyz)
33
+ obj.sections []
34
+ obj.run
35
+ Tadpole::LocalTemplate.before_run_filters.clear
36
+ end
37
+ end
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'tadpole')
2
+
3
+ describe Tadpole, '::Template' do
4
+ before do
5
+ Tadpole.template_paths.clear
6
+ Tadpole.register_template_path File.dirname(__FILE__) + '/examples'
7
+ end
8
+
9
+ it "should render sections in order" do
10
+ Template('render/1').new.run.should == 'xyz1'
11
+ end
12
+
13
+ it "should render heirarchical sections" do
14
+ Template('render/2').new.run.should == '{([])}'
15
+ end
16
+
17
+ it "should render heirarchical sections and then continue rendering in order" do
18
+ Template('render/3').new.run.should == '{([])}abc'
19
+ end
20
+
21
+ it "should render filename from inside template" do
22
+ Template('render/4').new.run.should == '123'
23
+ end
24
+
25
+ it "should restart subsection render loop if yield is called more times than subsections" do
26
+ Template('render/5').new.run.should == 'xyzy'
27
+ end
28
+
29
+ it "should handle subsections with subsections" do
30
+ Template('render/6').new.run.should == 'AB(CD)EFG'
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tadpole
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Loren Segal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-13 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: lsegal@soen.ca
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/tadpole
26
+ - lib/tadpole/filters.rb
27
+ - lib/tadpole/local_template.rb
28
+ - lib/tadpole/main.rb
29
+ - lib/tadpole/providers
30
+ - lib/tadpole/providers/erb.rb
31
+ - lib/tadpole/providers/file.rb
32
+ - lib/tadpole/providers/haml.rb
33
+ - lib/tadpole/providers/markaby.rb
34
+ - lib/tadpole/providers/section_provider.rb
35
+ - lib/tadpole/providers/template.rb
36
+ - lib/tadpole/template.rb
37
+ - lib/tadpole.rb
38
+ - spec/basic_spec.rb
39
+ - spec/examples
40
+ - spec/examples/filters
41
+ - spec/examples/filters/a.txt
42
+ - spec/examples/filters/b.txt
43
+ - spec/examples/filters/setup.rb
44
+ - spec/examples/render
45
+ - spec/examples/render/1
46
+ - spec/examples/render/1/a.txt
47
+ - spec/examples/render/1/b.txt
48
+ - spec/examples/render/1/d.erb
49
+ - spec/examples/render/1/setup.rb
50
+ - spec/examples/render/2
51
+ - spec/examples/render/2/setup.rb
52
+ - spec/examples/render/3
53
+ - spec/examples/render/3/setup.rb
54
+ - spec/examples/render/4
55
+ - spec/examples/render/4/a.erb
56
+ - spec/examples/render/4/setup.rb
57
+ - spec/examples/render/5
58
+ - spec/examples/render/5/setup.rb
59
+ - spec/examples/render/6
60
+ - spec/examples/render/6/setup.rb
61
+ - spec/filters_spec.rb
62
+ - spec/render_spec.rb
63
+ - benchmarks/eval-vs-non-eval.rb
64
+ - benchmarks/require-vs-none.rb
65
+ - benchmarks/run-caching.rb
66
+ - examples/example1
67
+ - examples/example1/custom
68
+ - examples/example1/custom/html
69
+ - examples/example1/custom/html/body
70
+ - examples/example1/custom/html/body/important.html
71
+ - examples/example1/custom/html/body/setup.rb
72
+ - examples/example1/custom/html/setup.rb
73
+ - examples/example1/default
74
+ - examples/example1/default/html
75
+ - examples/example1/default/html/body
76
+ - examples/example1/default/html/body/info.erb
77
+ - examples/example1/default/html/body/setup.rb
78
+ - examples/example1/default/html/main.haml
79
+ - examples/example1/default/html/setup.rb
80
+ - examples/example1/run.rb
81
+ - examples/example2
82
+ - examples/example2/run.rb
83
+ - examples/example2/tadpole
84
+ - examples/example2/tadpole/html
85
+ - examples/example2/tadpole/html/content.haml
86
+ - examples/example2/tadpole/html/main.haml
87
+ - examples/example2/tadpole/html/readme
88
+ - examples/example2/tadpole/html/readme/setup.rb
89
+ - examples/example2/tadpole/html/setup.rb
90
+ - examples/example2/tadpole/markdown
91
+ - examples/example2/tadpole/markdown/copyright.md
92
+ - examples/example2/tadpole/markdown/examples.md
93
+ - examples/example2/tadpole/markdown/quick
94
+ - examples/example2/tadpole/markdown/quick/create.md
95
+ - examples/example2/tadpole/markdown/quick/heirarchical.md
96
+ - examples/example2/tadpole/markdown/quick/override.md
97
+ - examples/example2/tadpole/markdown/quick/quick.erb
98
+ - examples/example2/tadpole/markdown/quick/setup.rb
99
+ - examples/example2/tadpole/markdown/readme
100
+ - examples/example2/tadpole/markdown/readme/readme_notice.txt
101
+ - examples/example2/tadpole/markdown/readme/setup.rb
102
+ - examples/example2/tadpole/markdown/setup.rb
103
+ - examples/example2/tadpole/markdown/title.md
104
+ - examples/example2/tadpole/markdown/what.md
105
+ - examples/example2/tadpole/markdown/why.md
106
+ - LICENSE
107
+ - README.html
108
+ - README.markdown
109
+ has_rdoc: false
110
+ homepage: http://www.soen.ca
111
+ post_install_message:
112
+ rdoc_options: []
113
+
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: "0"
121
+ version:
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: "0"
127
+ version:
128
+ requirements: []
129
+
130
+ rubyforge_project: tadpole
131
+ rubygems_version: 1.1.1
132
+ signing_key:
133
+ specification_version: 2
134
+ summary: A Small but Extensible Templating Engine for Ruby
135
+ test_files: []
136
+