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.
- data/LICENSE +22 -0
- data/README.html +222 -0
- data/README.markdown +259 -0
- data/benchmarks/eval-vs-non-eval.rb +13 -0
- data/benchmarks/require-vs-none.rb +10 -0
- data/benchmarks/run-caching.rb +20 -0
- data/examples/example1/custom/html/body/important.html +4 -0
- data/examples/example1/custom/html/body/setup.rb +6 -0
- data/examples/example1/custom/html/setup.rb +3 -0
- data/examples/example1/default/html/body/info.erb +3 -0
- data/examples/example1/default/html/body/setup.rb +11 -0
- data/examples/example1/default/html/main.haml +6 -0
- data/examples/example1/default/html/setup.rb +3 -0
- data/examples/example1/run.rb +6 -0
- data/examples/example2/run.rb +5 -0
- data/examples/example2/tadpole/html/content.haml +5 -0
- data/examples/example2/tadpole/html/main.haml +17 -0
- data/examples/example2/tadpole/html/readme/setup.rb +6 -0
- data/examples/example2/tadpole/html/setup.rb +6 -0
- data/examples/example2/tadpole/markdown/copyright.md +5 -0
- data/examples/example2/tadpole/markdown/examples.md +76 -0
- data/examples/example2/tadpole/markdown/quick/create.md +34 -0
- data/examples/example2/tadpole/markdown/quick/heirarchical.md +34 -0
- data/examples/example2/tadpole/markdown/quick/override.md +28 -0
- data/examples/example2/tadpole/markdown/quick/quick.erb +5 -0
- data/examples/example2/tadpole/markdown/quick/setup.rb +4 -0
- data/examples/example2/tadpole/markdown/readme/readme_notice.txt +7 -0
- data/examples/example2/tadpole/markdown/readme/setup.rb +4 -0
- data/examples/example2/tadpole/markdown/setup.rb +3 -0
- data/examples/example2/tadpole/markdown/title.md +5 -0
- data/examples/example2/tadpole/markdown/what.md +25 -0
- data/examples/example2/tadpole/markdown/why.md +41 -0
- data/lib/tadpole/filters.rb +50 -0
- data/lib/tadpole/local_template.rb +32 -0
- data/lib/tadpole/main.rb +125 -0
- data/lib/tadpole/providers/erb.rb +26 -0
- data/lib/tadpole/providers/file.rb +9 -0
- data/lib/tadpole/providers/haml.rb +21 -0
- data/lib/tadpole/providers/markaby.rb +7 -0
- data/lib/tadpole/providers/section_provider.rb +62 -0
- data/lib/tadpole/providers/template.rb +24 -0
- data/lib/tadpole/template.rb +258 -0
- data/lib/tadpole.rb +32 -0
- data/spec/basic_spec.rb +88 -0
- data/spec/examples/filters/a.txt +0 -0
- data/spec/examples/filters/b.txt +0 -0
- data/spec/examples/filters/setup.rb +9 -0
- data/spec/examples/render/1/a.txt +1 -0
- data/spec/examples/render/1/b.txt +1 -0
- data/spec/examples/render/1/d.erb +1 -0
- data/spec/examples/render/1/setup.rb +13 -0
- data/spec/examples/render/2/setup.rb +9 -0
- data/spec/examples/render/3/setup.rb +12 -0
- data/spec/examples/render/4/a.erb +1 -0
- data/spec/examples/render/4/setup.rb +9 -0
- data/spec/examples/render/5/setup.rb +17 -0
- data/spec/examples/render/6/setup.rb +12 -0
- data/spec/filters_spec.rb +37 -0
- data/spec/render_spec.rb +32 -0
- 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
|
+
|
data/spec/basic_spec.rb
ADDED
@@ -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 @@
|
|
1
|
+
x
|
@@ -0,0 +1 @@
|
|
1
|
+
y
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= value %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<% if x < 4 %><%= x %><%= render 'a', :x => x + 1 %><% end %>
|
@@ -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
|
data/spec/render_spec.rb
ADDED
@@ -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
|
+
|