tilt 1.3.3 → 1.4.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 (53) hide show
  1. data/CHANGELOG.md +40 -0
  2. data/COPYING +1 -1
  3. data/Gemfile +31 -1
  4. data/HACKING +16 -0
  5. data/README.md +26 -2
  6. data/Rakefile +25 -1
  7. data/TEMPLATES.md +13 -13
  8. data/bin/tilt +8 -6
  9. data/lib/tilt/asciidoc.rb +34 -0
  10. data/lib/tilt/coffee.rb +4 -0
  11. data/lib/tilt/css.rb +10 -2
  12. data/lib/tilt/csv.rb +71 -0
  13. data/lib/tilt/erb.rb +2 -2
  14. data/lib/tilt/etanni.rb +27 -0
  15. data/lib/tilt/liquid.rb +4 -0
  16. data/lib/tilt/markdown.rb +35 -11
  17. data/lib/tilt/nokogiri.rb +4 -4
  18. data/lib/tilt/plain.rb +20 -0
  19. data/lib/tilt/radius.rb +4 -0
  20. data/lib/tilt/rdoc.rb +20 -5
  21. data/lib/tilt/template.rb +96 -92
  22. data/lib/tilt/textile.rb +5 -0
  23. data/lib/tilt/wiki.rb +8 -0
  24. data/lib/tilt.rb +15 -1
  25. data/test/tilt_asciidoctor_test.rb +44 -0
  26. data/test/tilt_blueclothtemplate_test.rb +1 -1
  27. data/test/tilt_coffeescripttemplate_test.rb +64 -11
  28. data/test/tilt_creoletemplate_test.rb +1 -1
  29. data/test/tilt_csv_test.rb +69 -0
  30. data/test/tilt_erbtemplate_test.rb +5 -0
  31. data/test/tilt_erubistemplate_test.rb +1 -1
  32. data/test/tilt_etannitemplate_test.rb +173 -0
  33. data/test/tilt_fallback_test.rb +6 -6
  34. data/test/tilt_hamltemplate_test.rb +1 -1
  35. data/test/tilt_kramdown_test.rb +1 -1
  36. data/test/tilt_lesstemplate_test.less +1 -0
  37. data/test/tilt_lesstemplate_test.rb +19 -3
  38. data/test/tilt_liquidtemplate_test.rb +1 -1
  39. data/test/tilt_markaby_test.rb +1 -1
  40. data/test/tilt_markdown_test.rb +16 -5
  41. data/test/tilt_marukutemplate_test.rb +1 -1
  42. data/test/tilt_radiustemplate_test.rb +1 -1
  43. data/test/tilt_rdiscounttemplate_test.rb +1 -1
  44. data/test/tilt_rdoctemplate_test.rb +10 -3
  45. data/test/tilt_redcarpettemplate_test.rb +15 -3
  46. data/test/tilt_redclothtemplate_test.rb +13 -1
  47. data/test/tilt_sasstemplate_test.rb +1 -1
  48. data/test/tilt_stringtemplate_test.rb +1 -1
  49. data/test/tilt_template_test.rb +122 -0
  50. data/test/tilt_wikiclothtemplate_test.rb +1 -1
  51. data/test/tilt_yajltemplate_test.rb +13 -4
  52. data/tilt.gemspec +28 -17
  53. metadata +204 -75
@@ -1,5 +1,7 @@
1
+ # coding: utf-8
1
2
  require 'contest'
2
3
  require 'tilt'
4
+ require 'tempfile'
3
5
 
4
6
  class TiltTemplateTest < Test::Unit::TestCase
5
7
 
@@ -23,6 +25,23 @@ class TiltTemplateTest < Test::Unit::TestCase
23
25
  assert_equal 55, inst.line
24
26
  end
25
27
 
28
+ test "initializing with a tempfile" do
29
+ tempfile = Tempfile.new('tilt_template_test')
30
+ inst = MockTemplate.new(tempfile)
31
+ assert_equal File.basename(tempfile.path), inst.basename
32
+ end
33
+
34
+ class SillyHash < Hash
35
+ def path(arg)
36
+ end
37
+ end
38
+
39
+ test "initialize with hash that implements #path" do
40
+ options = SillyHash[:key => :value]
41
+ inst = MockTemplate.new(options) {}
42
+ assert_equal :value, inst.options[:key]
43
+ end
44
+
26
45
  test "uses correct eval_file" do
27
46
  inst = MockTemplate.new('foo.erb', 55) {}
28
47
  assert_equal 'foo.erb', inst.eval_file
@@ -127,6 +146,13 @@ class TiltTemplateTest < Test::Unit::TestCase
127
146
  assert inst.prepared?
128
147
  end
129
148
 
149
+ test "template_source with locals having non-variable keys raises error" do
150
+ inst = SourceGeneratingMockTemplate.new { |t| '1 + 2 = #{_answer}' }
151
+ err = assert_raise(RuntimeError) { inst.render(Object.new, 'ANSWER' => 3) }
152
+ assert_equal "invalid locals key: \"ANSWER\" (keys must be variable names)", err.message
153
+ assert_equal "1 + 2 = 3", inst.render(Object.new, '_answer' => 3)
154
+ end
155
+
130
156
  class Person
131
157
  CONSTANT = "Bob"
132
158
 
@@ -151,4 +177,100 @@ class TiltTemplateTest < Test::Unit::TestCase
151
177
  inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{CONSTANT}!' }
152
178
  assert_equal "Hey Bob!", inst.render(Person.new("Joe"))
153
179
  end
180
+
181
+ ##
182
+ # Encodings
183
+
184
+ class DynamicMockTemplate < MockTemplate
185
+ def precompiled_template(locals)
186
+ options[:code]
187
+ end
188
+ end
189
+
190
+ class UTF8Template < MockTemplate
191
+ def default_encoding
192
+ Encoding::UTF_8
193
+ end
194
+ end
195
+
196
+ if ''.respond_to?(:encoding)
197
+ original_encoding = Encoding.default_external
198
+
199
+ setup do
200
+ @file = Tempfile.open('template')
201
+ @file.puts "stuff"
202
+ @file.close
203
+ @template = @file.path
204
+ end
205
+
206
+ teardown do
207
+ Encoding.default_external = original_encoding
208
+ Encoding.default_internal = nil
209
+ @file.delete
210
+ end
211
+
212
+ test "reading from file assumes default external encoding" do
213
+ Encoding.default_external = 'Big5'
214
+ inst = MockTemplate.new(@template)
215
+ assert_equal 'Big5', inst.data.encoding.to_s
216
+ end
217
+
218
+ test "reading from file with a :default_encoding overrides default external" do
219
+ Encoding.default_external = 'Big5'
220
+ inst = MockTemplate.new(@template, :default_encoding => 'GBK')
221
+ assert_equal 'GBK', inst.data.encoding.to_s
222
+ end
223
+
224
+ test "reading from file with default_internal set does no transcoding" do
225
+ Encoding.default_internal = 'utf-8'
226
+ Encoding.default_external = 'Big5'
227
+ inst = MockTemplate.new(@template)
228
+ assert_equal 'Big5', inst.data.encoding.to_s
229
+ end
230
+
231
+ test "using provided template data verbatim when given as string" do
232
+ Encoding.default_internal = 'Big5'
233
+ inst = MockTemplate.new(@template) { "blah".force_encoding('GBK') }
234
+ assert_equal 'GBK', inst.data.encoding.to_s
235
+ end
236
+
237
+ test "uses the template from the generated source code" do
238
+ tmpl = "ふが"
239
+ code = tmpl.inspect.encode('Shift_JIS')
240
+ inst = DynamicMockTemplate.new(:code => code) { '' }
241
+ res = inst.render
242
+ assert_equal 'Shift_JIS', res.encoding.to_s
243
+ assert_equal tmpl, res.encode(tmpl.encoding)
244
+ end
245
+
246
+ test "uses the magic comment from the generated source code" do
247
+ tmpl = "ふが"
248
+ code = ("# coding: Shift_JIS\n" + tmpl.inspect).encode('Shift_JIS')
249
+ # Set it to an incorrect encoding
250
+ code.force_encoding('UTF-8')
251
+
252
+ inst = DynamicMockTemplate.new(:code => code) { '' }
253
+ res = inst.render
254
+ assert_equal 'Shift_JIS', res.encoding.to_s
255
+ assert_equal tmpl, res.encode(tmpl.encoding)
256
+ end
257
+
258
+ test "uses #default_encoding instead of default_external" do
259
+ Encoding.default_external = 'Big5'
260
+ inst = UTF8Template.new(@template)
261
+ assert_equal 'UTF-8', inst.data.encoding.to_s
262
+ end
263
+
264
+ test "uses #default_encoding instead of current encoding" do
265
+ tmpl = "".force_encoding('Big5')
266
+ inst = UTF8Template.new(@template) { tmpl }
267
+ assert_equal 'UTF-8', inst.data.encoding.to_s
268
+ end
269
+
270
+ test "raises error if the encoding is not valid" do
271
+ assert_raises(Encoding::InvalidByteSequenceError) do
272
+ UTF8Template.new(@template) { "\xe4" }
273
+ end
274
+ end
275
+ end
154
276
  end
@@ -28,5 +28,5 @@ begin
28
28
  end
29
29
  end
30
30
  rescue LoadError => boom
31
- warn "Tilt::WikiClothTemplate (disabled)\n"
31
+ warn "Tilt::WikiClothTemplate (disabled)"
32
32
  end
@@ -11,12 +11,20 @@ begin
11
11
 
12
12
  test "compiles and evaluates the template on #render" do
13
13
  template = Tilt::YajlTemplate.new { "json = { :integer => 3, :string => 'hello' }" }
14
- assert_equal '{"integer":3,"string":"hello"}', template.render
14
+ output = template.render
15
+ result = Yajl::Parser.parse(output)
16
+ expect = {"integer" => 3,"string" => "hello"}
17
+ assert_equal expect, result
15
18
  end
16
19
 
17
20
  test "can be rendered more than once" do
18
21
  template = Tilt::YajlTemplate.new { "json = { :integer => 3, :string => 'hello' }" }
19
- 3.times { assert_equal '{"integer":3,"string":"hello"}', template.render }
22
+ expect = {"integer" => 3,"string" => "hello"}
23
+ 3.times do
24
+ output = template.render
25
+ result = Yajl::Parser.parse(output)
26
+ assert_equal expect, result
27
+ end
20
28
  end
21
29
 
22
30
  test "evaluating ruby code" do
@@ -65,7 +73,8 @@ begin
65
73
  json[:integer] = four
66
74
  nil
67
75
  } }
68
- assert_equal '{"string":"hello","integer":4}', template.render
76
+ result = template.render
77
+ assert( (result == '{"string":"hello","integer":4}') || (result == '{"integer":4,"string":"hello"}') )
69
78
  end
70
79
 
71
80
  test "option callback" do
@@ -88,5 +97,5 @@ begin
88
97
 
89
98
  end
90
99
  rescue LoadError
91
- warn "Tilt::YajlTemplateTest (disabled)\n"
100
+ warn "Tilt::YajlTemplateTest (disabled)"
92
101
  end
data/tilt.gemspec CHANGED
@@ -3,33 +3,40 @@ 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 = '1.3.3'
7
- s.date = '2011-08-25'
6
+ s.version = '1.4.0'
7
+ s.date = '2013-05-01'
8
8
 
9
9
  s.description = "Generic interface to multiple Ruby template engines"
10
10
  s.summary = s.description
11
+ s.license = "MIT"
11
12
 
12
13
  s.authors = ["Ryan Tomayko"]
13
14
  s.email = "r@tomayko.com"
14
15
 
15
16
  # = MANIFEST =
16
17
  s.files = %w[
18
+ CHANGELOG.md
17
19
  COPYING
18
20
  Gemfile
21
+ HACKING
19
22
  README.md
20
23
  Rakefile
21
24
  TEMPLATES.md
22
25
  bin/tilt
23
26
  lib/tilt.rb
27
+ lib/tilt/asciidoc.rb
24
28
  lib/tilt/builder.rb
25
29
  lib/tilt/coffee.rb
26
30
  lib/tilt/css.rb
31
+ lib/tilt/csv.rb
27
32
  lib/tilt/erb.rb
33
+ lib/tilt/etanni.rb
28
34
  lib/tilt/haml.rb
29
35
  lib/tilt/liquid.rb
30
36
  lib/tilt/markaby.rb
31
37
  lib/tilt/markdown.rb
32
38
  lib/tilt/nokogiri.rb
39
+ lib/tilt/plain.rb
33
40
  lib/tilt/radius.rb
34
41
  lib/tilt/rdoc.rb
35
42
  lib/tilt/string.rb
@@ -44,17 +51,21 @@ Gem::Specification.new do |s|
44
51
  test/markaby/render_twice.mab
45
52
  test/markaby/scope.mab
46
53
  test/markaby/yielding.mab
54
+ test/tilt_asciidoctor_test.rb
47
55
  test/tilt_blueclothtemplate_test.rb
48
56
  test/tilt_buildertemplate_test.rb
49
57
  test/tilt_cache_test.rb
50
58
  test/tilt_coffeescripttemplate_test.rb
51
59
  test/tilt_compilesite_test.rb
52
60
  test/tilt_creoletemplate_test.rb
61
+ test/tilt_csv_test.rb
53
62
  test/tilt_erbtemplate_test.rb
54
63
  test/tilt_erubistemplate_test.rb
64
+ test/tilt_etannitemplate_test.rb
55
65
  test/tilt_fallback_test.rb
56
66
  test/tilt_hamltemplate_test.rb
57
67
  test/tilt_kramdown_test.rb
68
+ test/tilt_lesstemplate_test.less
58
69
  test/tilt_lesstemplate_test.rb
59
70
  test/tilt_liquidtemplate_test.rb
60
71
  test/tilt_markaby_test.rb
@@ -78,29 +89,29 @@ Gem::Specification.new do |s|
78
89
 
79
90
  s.executables = ['tilt']
80
91
  s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
81
- s.add_development_dependency 'contest'
92
+ s.add_development_dependency 'asciidoctor', '>= 0.1.0'
93
+ s.add_development_dependency 'RedCloth'
94
+ s.add_development_dependency 'bluecloth'
82
95
  s.add_development_dependency 'builder'
96
+ s.add_development_dependency 'coffee-script'
97
+ s.add_development_dependency 'contest'
98
+ s.add_development_dependency 'creole'
83
99
  s.add_development_dependency 'erubis'
84
100
  s.add_development_dependency 'haml', '>= 2.2.11'
85
- s.add_development_dependency 'sass'
86
- s.add_development_dependency 'rdiscount'
87
- s.add_development_dependency 'liquid'
101
+ s.add_development_dependency 'kramdown'
88
102
  s.add_development_dependency 'less'
89
- s.add_development_dependency 'radius'
90
- s.add_development_dependency 'nokogiri'
103
+ s.add_development_dependency 'liquid'
91
104
  s.add_development_dependency 'markaby'
92
- s.add_development_dependency 'coffee-script'
93
- s.add_development_dependency 'bluecloth'
94
- s.add_development_dependency 'RedCloth'
95
105
  s.add_development_dependency 'maruku'
96
- s.add_development_dependency 'creole'
97
- s.add_development_dependency 'kramdown'
106
+ s.add_development_dependency 'nokogiri'
107
+ s.add_development_dependency 'radius'
108
+ s.add_development_dependency 'rdiscount'
109
+ s.add_development_dependency 'rdoc'
98
110
  s.add_development_dependency 'redcarpet'
99
- s.add_development_dependency 'creole'
100
- s.add_development_dependency 'yajl-ruby'
111
+ s.add_development_dependency 'sass'
101
112
  s.add_development_dependency 'wikicloth'
102
- s.add_development_dependency 'redcarpet'
103
- s.add_development_dependency 'kramdown'
113
+ s.add_development_dependency 'yajl-ruby'
114
+ s.add_development_dependency 'rdoc'
104
115
 
105
116
  s.homepage = "http://github.com/rtomayko/tilt/"
106
117
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tilt", "--main", "Tilt"]