tilt 0.3 → 0.4
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/README.md +1 -0
- data/Rakefile +6 -9
- data/TEMPLATES.md +369 -8
- data/lib/tilt.rb +156 -96
- data/test/tilt_buildertemplate_test.rb +44 -0
- data/test/tilt_cache_test.rb +33 -0
- data/test/tilt_erbtemplate_test.rb +93 -0
- data/test/tilt_erubistemplate_test.rb +85 -0
- data/test/{spec_tilt_hamltemplate.rb → tilt_hamltemplate_test.rb} +20 -20
- data/test/tilt_liquidtemplate_test.rb +73 -0
- data/test/{spec_tilt_mustachetemplate.rb → tilt_mustachetemplate_test.rb} +23 -23
- data/test/tilt_rdiscounttemplate_test.rb +40 -0
- data/test/tilt_rdoctemplate_test.rb +19 -0
- data/test/tilt_redclothtemplate_test.rb +20 -0
- data/test/tilt_sasstemplate_test.rb +21 -0
- data/test/{spec_tilt_stringtemplate.rb → tilt_stringtemplate_test.rb} +24 -24
- data/test/tilt_template_test.rb +136 -0
- data/test/tilt_test.rb +57 -0
- data/tilt.gemspec +23 -14
- metadata +90 -29
- data/test/.bacon +0 -0
- data/test/spec_tilt.rb +0 -53
- data/test/spec_tilt_buildertemplate.rb +0 -41
- data/test/spec_tilt_erbtemplate.rb +0 -93
- data/test/spec_tilt_erubistemplate.rb +0 -78
- data/test/spec_tilt_liquid_template.rb +0 -25
- data/test/spec_tilt_rdiscount.rb +0 -19
- data/test/spec_tilt_sasstemplate.rb +0 -21
- data/test/spec_tilt_template.rb +0 -110
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rdiscount'
|
6
|
+
|
7
|
+
class RDiscountTemplateTest < Test::Unit::TestCase
|
8
|
+
test "registered for '.markdown' files" do
|
9
|
+
assert_equal Tilt::RDiscountTemplate, Tilt['test.markdown']
|
10
|
+
end
|
11
|
+
|
12
|
+
test "registered for '.md' files" do
|
13
|
+
assert_equal Tilt::RDiscountTemplate, Tilt['test.md']
|
14
|
+
end
|
15
|
+
|
16
|
+
test "registered for '.mkd' files" do
|
17
|
+
assert_equal Tilt::RDiscountTemplate, Tilt['test.mkd']
|
18
|
+
end
|
19
|
+
|
20
|
+
test "compiling and evaluating templates on #render" do
|
21
|
+
template = Tilt::RDiscountTemplate.new { |t| "# Hello World!" }
|
22
|
+
assert_equal "<h1>Hello World!</h1>\n", template.render
|
23
|
+
end
|
24
|
+
|
25
|
+
test "smartypants when :smart is set" do
|
26
|
+
template = Tilt::RDiscountTemplate.new(nil, :smart => true) { |t|
|
27
|
+
"OKAY -- 'Smarty Pants'" }
|
28
|
+
assert_equal "<p>OKAY — ‘Smarty Pants’</p>\n",
|
29
|
+
template.render
|
30
|
+
end
|
31
|
+
|
32
|
+
test "stripping HTML when :filter_html is set" do
|
33
|
+
template = Tilt::RDiscountTemplate.new(nil, :filter_html => true) { |t|
|
34
|
+
"HELLO <blink>WORLD</blink>" }
|
35
|
+
assert_equal "<p>HELLO <blink>WORLD</blink></p>\n", template.render
|
36
|
+
end
|
37
|
+
end
|
38
|
+
rescue LoadError => boom
|
39
|
+
warn "Tilt::RDiscountTemplate (disabled)\n"
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rdoc/markup'
|
6
|
+
require 'rdoc/markup/to_html'
|
7
|
+
class RDocTemplateTest < Test::Unit::TestCase
|
8
|
+
test "is registered for '.rdoc' files" do
|
9
|
+
assert_equal Tilt::RDocTemplate, Tilt['test.rdoc']
|
10
|
+
end
|
11
|
+
|
12
|
+
test "compiling and evaluating the template with #render" do
|
13
|
+
template = Tilt::RDocTemplate.new { |t| "= Hello World!" }
|
14
|
+
assert_equal "<h1>Hello World!</h1>\n", template.render
|
15
|
+
end
|
16
|
+
end
|
17
|
+
rescue LoadError => boom
|
18
|
+
warn "Tilt::RDocTemplate (disabled)\n"
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'redcloth'
|
6
|
+
|
7
|
+
class RedClothTemplateTest < Test::Unit::TestCase
|
8
|
+
test "is registered for '.textile' files" do
|
9
|
+
assert_equal Tilt::RedClothTemplate, Tilt['test.textile']
|
10
|
+
end
|
11
|
+
|
12
|
+
test "compiles and evaluates the template on #render" do
|
13
|
+
template = Tilt::RedClothTemplate.new { |t| "h1. Hello World!" }
|
14
|
+
assert_equal "<h1>Hello World!</h1>", template.render
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
rescue LoadError => boom
|
19
|
+
warn "Tilt::RedClothTemplate (disabled)\n"
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'haml'
|
6
|
+
require 'sass'
|
7
|
+
|
8
|
+
class SassTemplateTest < Test::Unit::TestCase
|
9
|
+
test "is registered for '.sass' files" do
|
10
|
+
assert_equal Tilt::SassTemplate, Tilt['test.sass']
|
11
|
+
end
|
12
|
+
|
13
|
+
test "compiles and evaluates the template on #render" do
|
14
|
+
template = Tilt::SassTemplate.new { |t| "#main\n :background-color #0000ff" }
|
15
|
+
assert_equal "#main {\n background-color: #0000ff; }\n", template.render
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
rescue LoadError => boom
|
20
|
+
warn "Tilt::SassTemplate (disabled)\n"
|
21
|
+
end
|
@@ -1,67 +1,67 @@
|
|
1
|
-
require '
|
1
|
+
require 'contest'
|
2
2
|
require 'tilt'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
Tilt['test.str']
|
4
|
+
class StringTemplateTest < Test::Unit::TestCase
|
5
|
+
test "registered for '.str' files" do
|
6
|
+
assert_equal Tilt::StringTemplate, Tilt['test.str']
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
test "compiling and evaluating templates on #render" do
|
10
10
|
template = Tilt::StringTemplate.new { |t| "Hello World!" }
|
11
|
-
|
11
|
+
assert_equal "Hello World!", template.render
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
test "passing locals" do
|
15
15
|
template = Tilt::StringTemplate.new { 'Hey #{name}!' }
|
16
|
-
template.render(Object.new, :name => 'Joe')
|
16
|
+
assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
test "evaluating in an object scope" do
|
20
20
|
template = Tilt::StringTemplate.new { 'Hey #{@name}!' }
|
21
21
|
scope = Object.new
|
22
22
|
scope.instance_variable_set :@name, 'Joe'
|
23
|
-
|
23
|
+
assert_equal "Hey Joe!", template.render(scope)
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
test "passing a block for yield" do
|
27
27
|
template = Tilt::StringTemplate.new { 'Hey #{yield}!' }
|
28
|
-
template.render { 'Joe' }
|
28
|
+
assert_equal "Hey Joe!", template.render { 'Joe' }
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
test "multiline templates" do
|
32
32
|
template = Tilt::StringTemplate.new { "Hello\nWorld!\n" }
|
33
|
-
|
33
|
+
assert_equal "Hello\nWorld!\n", template.render
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
test "backtrace file and line reporting without locals" do
|
37
37
|
data = File.read(__FILE__).split("\n__END__\n").last
|
38
38
|
fail unless data[0] == ?<
|
39
39
|
template = Tilt::StringTemplate.new('test.str', 11) { data }
|
40
40
|
begin
|
41
41
|
template.render
|
42
|
-
|
42
|
+
fail 'should have raised an exception'
|
43
43
|
rescue => boom
|
44
|
-
|
44
|
+
assert_kind_of NameError, boom
|
45
45
|
line = boom.backtrace.first
|
46
46
|
file, line, meth = line.split(":")
|
47
|
-
|
48
|
-
|
47
|
+
assert_equal 'test.str', file
|
48
|
+
assert_equal '13', line
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
test "backtrace file and line reporting with locals" do
|
53
53
|
data = File.read(__FILE__).split("\n__END__\n").last
|
54
54
|
fail unless data[0] == ?<
|
55
55
|
template = Tilt::StringTemplate.new('test.str', 1) { data }
|
56
56
|
begin
|
57
57
|
template.render(nil, :name => 'Joe', :foo => 'bar')
|
58
|
-
|
58
|
+
fail 'should have raised an exception'
|
59
59
|
rescue => boom
|
60
|
-
|
60
|
+
assert_kind_of RuntimeError, boom
|
61
61
|
line = boom.backtrace.first
|
62
62
|
file, line, meth = line.split(":")
|
63
|
-
|
64
|
-
|
63
|
+
assert_equal 'test.str', file
|
64
|
+
assert_equal '6', line
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
class TiltTemplateTest < Test::Unit::TestCase
|
5
|
+
test "needs a file or block" do
|
6
|
+
assert_raise(ArgumentError) { Tilt::Template.new }
|
7
|
+
end
|
8
|
+
|
9
|
+
test "initializing with a file" do
|
10
|
+
inst = Tilt::Template.new('foo.erb')
|
11
|
+
assert_equal 'foo.erb', inst.file
|
12
|
+
end
|
13
|
+
|
14
|
+
test "initializing with a file and line" do
|
15
|
+
inst = Tilt::Template.new('foo.erb', 55)
|
16
|
+
assert_equal 'foo.erb', inst.file
|
17
|
+
assert_equal 55, inst.line
|
18
|
+
end
|
19
|
+
|
20
|
+
test "uses correct eval_file" do
|
21
|
+
inst = Tilt::Template.new('foo.erb', 55)
|
22
|
+
assert_equal 'foo.erb', inst.eval_file
|
23
|
+
end
|
24
|
+
|
25
|
+
test "uses a default filename for #eval_file when no file provided" do
|
26
|
+
inst = Tilt::Template.new { 'Hi' }
|
27
|
+
assert_not_nil inst.eval_file
|
28
|
+
assert !inst.eval_file.include?("\n")
|
29
|
+
end
|
30
|
+
|
31
|
+
test "calculating template's #basename" do
|
32
|
+
inst = Tilt::Template.new('/tmp/templates/foo.html.erb')
|
33
|
+
assert_equal 'foo.html.erb', inst.basename
|
34
|
+
end
|
35
|
+
|
36
|
+
test "calculating the template's #name" do
|
37
|
+
inst = Tilt::Template.new('/tmp/templates/foo.html.erb')
|
38
|
+
assert_equal 'foo', inst.name
|
39
|
+
end
|
40
|
+
|
41
|
+
test "initializing with a data loading block" do
|
42
|
+
Tilt::Template.new { |template| "Hello World!" }
|
43
|
+
end
|
44
|
+
|
45
|
+
class InitializingMockTemplate < Tilt::Template
|
46
|
+
@@initialized_count = 0
|
47
|
+
def self.initialized_count
|
48
|
+
@@initialized_count
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize_engine
|
52
|
+
@@initialized_count += 1
|
53
|
+
end
|
54
|
+
|
55
|
+
def compile!
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
test "one-time template engine initialization" do
|
60
|
+
assert_nil InitializingMockTemplate.engine_initialized
|
61
|
+
assert_equal 0, InitializingMockTemplate.initialized_count
|
62
|
+
|
63
|
+
InitializingMockTemplate.new { "Hello World!" }
|
64
|
+
assert InitializingMockTemplate.engine_initialized
|
65
|
+
assert_equal 1, InitializingMockTemplate.initialized_count
|
66
|
+
|
67
|
+
InitializingMockTemplate.new { "Hello World!" }
|
68
|
+
assert_equal 1, InitializingMockTemplate.initialized_count
|
69
|
+
end
|
70
|
+
|
71
|
+
class CompilingMockTemplate < Tilt::Template
|
72
|
+
include Test::Unit::Assertions
|
73
|
+
def compile!
|
74
|
+
assert !data.nil?
|
75
|
+
@compiled = true
|
76
|
+
end
|
77
|
+
def compiled? ; @compiled ; end
|
78
|
+
end
|
79
|
+
|
80
|
+
test "raises NotImplementedError when #compile! not defined" do
|
81
|
+
inst = Tilt::Template.new { |template| "Hello World!" }
|
82
|
+
assert_raise(NotImplementedError) { inst.render }
|
83
|
+
end
|
84
|
+
|
85
|
+
test "raises NotImplementedError when #evaluate or #template_source not defined" do
|
86
|
+
inst = CompilingMockTemplate.new { |t| "Hello World!" }
|
87
|
+
assert_raise(NotImplementedError) { inst.render }
|
88
|
+
assert inst.compiled?
|
89
|
+
end
|
90
|
+
|
91
|
+
class SimpleMockTemplate < CompilingMockTemplate
|
92
|
+
include Test::Unit::Assertions
|
93
|
+
def evaluate(scope, locals, &block)
|
94
|
+
assert compiled?
|
95
|
+
assert !scope.nil?
|
96
|
+
assert !locals.nil?
|
97
|
+
"<em>#{@data}</em>"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
test "compiles and evaluates the template on #render" do
|
102
|
+
inst = SimpleMockTemplate.new { |t| "Hello World!" }
|
103
|
+
assert_equal "<em>Hello World!</em>", inst.render
|
104
|
+
assert inst.compiled?
|
105
|
+
end
|
106
|
+
|
107
|
+
class SourceGeneratingMockTemplate < CompilingMockTemplate
|
108
|
+
def template_source
|
109
|
+
"foo = [] ; foo << %Q{#{data}} ; foo.join"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
test "template_source with locals" do
|
114
|
+
inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{name}!' }
|
115
|
+
assert_equal "Hey Joe!", inst.render(Object.new, :name => 'Joe')
|
116
|
+
assert inst.compiled?
|
117
|
+
end
|
118
|
+
|
119
|
+
class Person
|
120
|
+
attr_accessor :name
|
121
|
+
def initialize(name)
|
122
|
+
@name = name
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
test "template_source with an object scope" do
|
127
|
+
inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{@name}!' }
|
128
|
+
scope = Person.new('Joe')
|
129
|
+
assert_equal "Hey Joe!", inst.render(scope)
|
130
|
+
end
|
131
|
+
|
132
|
+
test "template_source with a block for yield" do
|
133
|
+
inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{yield}!' }
|
134
|
+
assert_equal "Hey Joe!", inst.render(Object.new){ 'Joe' }
|
135
|
+
end
|
136
|
+
end
|
data/test/tilt_test.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
class TiltTest < Test::Unit::TestCase
|
5
|
+
class MockTemplate
|
6
|
+
attr_reader :args, :block
|
7
|
+
def initialize(*args, &block)
|
8
|
+
@args = args
|
9
|
+
@block = block
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
test "registering template implementation classes by file extension" do
|
14
|
+
Tilt.register('mock', MockTemplate)
|
15
|
+
end
|
16
|
+
|
17
|
+
test "registering template classes by symbol file extension" do
|
18
|
+
Tilt.register(:mock, MockTemplate)
|
19
|
+
end
|
20
|
+
|
21
|
+
test "looking up template classes by file extension" do
|
22
|
+
Tilt.register('mock', MockTemplate)
|
23
|
+
impl = Tilt['mock']
|
24
|
+
assert_equal MockTemplate, impl
|
25
|
+
|
26
|
+
impl = Tilt['.mock']
|
27
|
+
assert_equal MockTemplate, impl
|
28
|
+
end
|
29
|
+
|
30
|
+
test "looking up template classes with multiple file extensions" do
|
31
|
+
Tilt.register('mock', MockTemplate)
|
32
|
+
impl = Tilt['index.html.mock']
|
33
|
+
assert_equal MockTemplate, impl
|
34
|
+
end
|
35
|
+
|
36
|
+
test "looking up template classes by file name" do
|
37
|
+
Tilt.register('mock', MockTemplate)
|
38
|
+
impl = Tilt['templates/test.mock']
|
39
|
+
assert_equal MockTemplate, impl
|
40
|
+
end
|
41
|
+
|
42
|
+
test "looking up non-existant template class" do
|
43
|
+
assert_nil Tilt['none']
|
44
|
+
end
|
45
|
+
|
46
|
+
test "accessing template class mappings at Tilt::mappings" do
|
47
|
+
assert Tilt.respond_to?(:mappings)
|
48
|
+
assert Tilt.mappings.respond_to?(:[])
|
49
|
+
end
|
50
|
+
|
51
|
+
test "creating new template instance with a filename" do
|
52
|
+
Tilt.register('mock', MockTemplate)
|
53
|
+
template = Tilt.new('foo.mock', 1, :key => 'val') { 'Hello World!' }
|
54
|
+
assert_equal ['foo.mock', 1, {:key => 'val'}], template.args
|
55
|
+
assert_equal 'Hello World!', template.block.call
|
56
|
+
end
|
57
|
+
end
|
data/tilt.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'tilt'
|
6
|
-
s.version = '0.
|
7
|
-
s.date = '2009-
|
6
|
+
s.version = '0.4'
|
7
|
+
s.date = '2009-12-13'
|
8
8
|
|
9
9
|
s.description = "Generic interface to multiple Ruby template engines"
|
10
10
|
s.summary = s.description
|
@@ -20,23 +20,32 @@ Gem::Specification.new do |s|
|
|
20
20
|
TEMPLATES.md
|
21
21
|
bin/tilt
|
22
22
|
lib/tilt.rb
|
23
|
-
test
|
24
|
-
test/
|
25
|
-
test/
|
26
|
-
test/
|
27
|
-
test/
|
28
|
-
test/
|
29
|
-
test/
|
30
|
-
test/
|
31
|
-
test/
|
32
|
-
test/
|
33
|
-
test/
|
34
|
-
test/
|
23
|
+
test/tilt_buildertemplate_test.rb
|
24
|
+
test/tilt_cache_test.rb
|
25
|
+
test/tilt_erbtemplate_test.rb
|
26
|
+
test/tilt_erubistemplate_test.rb
|
27
|
+
test/tilt_hamltemplate_test.rb
|
28
|
+
test/tilt_liquidtemplate_test.rb
|
29
|
+
test/tilt_mustachetemplate_test.rb
|
30
|
+
test/tilt_rdiscounttemplate_test.rb
|
31
|
+
test/tilt_rdoctemplate_test.rb
|
32
|
+
test/tilt_redclothtemplate_test.rb
|
33
|
+
test/tilt_sasstemplate_test.rb
|
34
|
+
test/tilt_stringtemplate_test.rb
|
35
|
+
test/tilt_template_test.rb
|
36
|
+
test/tilt_test.rb
|
35
37
|
tilt.gemspec
|
36
38
|
]
|
37
39
|
# = MANIFEST =
|
38
40
|
|
39
41
|
s.test_files = s.files.select {|path| path =~ /^test\/spec_.*.rb/}
|
42
|
+
s.add_development_dependency 'contest'
|
43
|
+
s.add_development_dependency 'builder'
|
44
|
+
s.add_development_dependency 'erubis'
|
45
|
+
s.add_development_dependency 'haml'
|
46
|
+
s.add_development_dependency 'mustache'
|
47
|
+
s.add_development_dependency 'rdiscount'
|
48
|
+
s.add_development_dependency 'liquid'
|
40
49
|
|
41
50
|
s.extra_rdoc_files = %w[COPYING]
|
42
51
|
|