tilt 0.9 → 0.10

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 CHANGED
@@ -33,6 +33,8 @@ Support for these template engines is included with the package:
33
33
  Mustache .mustache mustache
34
34
  RDiscount .markdown rdiscount
35
35
  RedCloth .textile redcloth
36
+ RDoc .rdoc rdoc
37
+ Radius .radius radius
36
38
 
37
39
  See [TEMPLATES.md][t] for detailed information on template engine
38
40
  options and supported features.
data/TEMPLATES.md CHANGED
@@ -432,3 +432,56 @@ engine in a threaded environment.
432
432
  ### See also
433
433
 
434
434
  * [RDoc](http://rdoc.sourceforge.net/doc/index.html)
435
+
436
+
437
+ <a name='radius'></a>
438
+ Radius (`radius`)
439
+ -----------------
440
+
441
+ Radius is the template language used by Radiant CMS. It is a tag
442
+ language designed to be valid XML/HTML.
443
+
444
+ ### Example
445
+
446
+ <html>
447
+ <body>
448
+ <h1><r:title /></h1>
449
+ <ul class="<r:type />">
450
+ <r:repeat times="3">
451
+ <li><r:hello />!</li>
452
+ </r:repeat>
453
+ </ul>
454
+ <r:yield />
455
+ </body>
456
+ </html>
457
+
458
+ ### Usage
459
+
460
+ To render a template such as the one above.
461
+
462
+ scope = OpenStruct.new
463
+ scope.title = "Radius Example"
464
+ scope.hello = "Hello, World!"
465
+
466
+ require 'radius'
467
+ template = Tilt::RadiusTemplate.new('example.radius', :tag_prefix=>'r')
468
+ template.render(scope, :type=>'hlist'){ "Jackpot!" }
469
+
470
+ The result will be:
471
+
472
+ <html>
473
+ <body>
474
+ <h1>Radius Example</h1>
475
+ <ul class="hlist">
476
+ <li>Hello, World!</li>
477
+ <li>Hello, World!</li>
478
+ <li>Hello, World!</li>
479
+ </ul>
480
+ Jackpot!
481
+ </body>
482
+ </html>
483
+
484
+ ### See also
485
+
486
+ * [Radius](http://radius.rubyforge.org/)
487
+ * [Radiant](http://radiantcms.org/)
data/lib/tilt.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'digest/md5'
2
2
 
3
3
  module Tilt
4
- VERSION = '0.9'
4
+ VERSION = '0.10'
5
5
 
6
6
  @template_mappings = {}
7
7
 
@@ -350,18 +350,29 @@ module Tilt
350
350
  # ERB template implementation. See:
351
351
  # http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html
352
352
  class ERBTemplate < Template
353
+ @@default_output_variable = '_erbout'
354
+
355
+ def self.default_output_variable
356
+ @@default_output_variable
357
+ end
358
+
359
+ def self.default_output_variable=(name)
360
+ @@default_output_variable = name
361
+ end
362
+
353
363
  def initialize_engine
354
364
  return if defined? ::ERB
355
365
  require_template_library 'erb'
356
366
  end
357
367
 
358
368
  def prepare
359
- @outvar = (options[:outvar] || '_erbout').to_s
369
+ @outvar = options[:outvar] || self.class.default_output_variable
360
370
  @engine = ::ERB.new(data, options[:safe], options[:trim], @outvar)
361
371
  end
362
372
 
363
373
  def precompiled_template(locals)
364
- @engine.src
374
+ source = @engine.src
375
+ source
365
376
  end
366
377
 
367
378
  def precompiled_preamble(locals)
@@ -414,7 +425,7 @@ module Tilt
414
425
 
415
426
  def prepare
416
427
  @options.merge!(:preamble => false, :postamble => false)
417
- @outvar = (options.delete(:outvar) || '_erbout').to_s
428
+ @outvar = options.delete(:outvar) || self.class.default_output_variable
418
429
  engine_class = options.delete(:engine_class)
419
430
  engine_class = ::Erubis::EscapedEruby if options.delete(:escape_html)
420
431
  @engine = (engine_class || ::Erubis::Eruby).new(data, options)
@@ -752,4 +763,40 @@ module Tilt
752
763
  end
753
764
  end
754
765
  register 'coffee', CoffeeTemplate
766
+
767
+
768
+ # Radius Template
769
+ # http://github.com/jlong/radius/
770
+ class RadiusTemplate < Template
771
+ def initialize_engine
772
+ return if defined? ::Radius
773
+ require_template_library 'radius'
774
+ end
775
+
776
+ def prepare
777
+ end
778
+
779
+ def evaluate(scope, locals, &block)
780
+ context = Class.new(Radius::Context).new
781
+ context.define_tag("yield") do
782
+ block.call
783
+ end
784
+ locals.each do |tag, value|
785
+ context.define_tag(tag) do
786
+ value
787
+ end
788
+ end
789
+ (class << context; self; end).class_eval do
790
+ define_method :tag_missing do |tag, attr, &block|
791
+ scope.__send__(tag) # any way to support attr as args?
792
+ end
793
+ end
794
+ options = {:tag_prefix => 'r'}.merge(@options)
795
+ parser = Radius::Parser.new(context, options)
796
+ parser.parse(data)
797
+ end
798
+ end
799
+ register 'radius', RadiusTemplate
800
+
755
801
  end
802
+
@@ -29,6 +29,23 @@ class ERBTemplateTest < Test::Unit::TestCase
29
29
  assert_equal "Hey Joe!", template.render(scope)
30
30
  end
31
31
 
32
+ class MockOutputVariableScope
33
+ attr_accessor :exposed_buffer
34
+ end
35
+
36
+ test "exposing the buffer to the template by default" do
37
+ begin
38
+ Tilt::ERBTemplate.default_output_variable = '@_out_buf'
39
+ template = Tilt::ERBTemplate.new { '<% self.exposed_buffer = @_out_buf %>hey' }
40
+ scope = MockOutputVariableScope.new
41
+ template.render(scope)
42
+ assert_not_nil scope.exposed_buffer
43
+ assert_equal scope.exposed_buffer, 'hey'
44
+ ensure
45
+ Tilt::ERBTemplate.default_output_variable = '_erbout'
46
+ end
47
+ end
48
+
32
49
  test "passing a block for yield" do
33
50
  template = Tilt::ERBTemplate.new { 'Hey <%= yield %>!' }
34
51
  assert_equal "Hey Joe!", template.render { 'Joe' }
@@ -26,6 +26,23 @@ begin
26
26
  assert_equal "Hey Joe!", template.render(scope)
27
27
  end
28
28
 
29
+ class MockOutputVariableScope
30
+ attr_accessor :exposed_buffer
31
+ end
32
+
33
+ test "exposing the buffer to the template by default" do
34
+ begin
35
+ Tilt::ErubisTemplate.default_output_variable = '@_out_buf'
36
+ template = Tilt::ErubisTemplate.new { '<% self.exposed_buffer = @_out_buf %>hey' }
37
+ scope = MockOutputVariableScope.new
38
+ template.render(scope)
39
+ assert_not_nil scope.exposed_buffer
40
+ assert_equal scope.exposed_buffer, 'hey'
41
+ ensure
42
+ Tilt::ErubisTemplate.default_output_variable = '_erbout'
43
+ end
44
+ end
45
+
29
46
  test "passing a block for yield" do
30
47
  template = Tilt::ErubisTemplate.new { 'Hey <%= yield %>!' }
31
48
  assert_equal "Hey Joe!", template.render { 'Joe' }
@@ -1,9 +1,14 @@
1
- require 'mustache'
1
+ begin
2
+ require 'mustache'
2
3
 
3
- module Views
4
- class External < Mustache
5
- def hello
6
- "Stached"
4
+ module Views
5
+ class External < Mustache
6
+ def hello
7
+ "Stached"
8
+ end
7
9
  end
8
10
  end
11
+
12
+ rescue LoadError => boom
13
+ # silently fail, disabled message already displayed
9
14
  end
@@ -0,0 +1,66 @@
1
+ require 'contest'
2
+ require 'tilt'
3
+
4
+ begin
5
+ require 'radius'
6
+
7
+ class RadiusTemplateTest < Test::Unit::TestCase
8
+ test "registered for '.radius' files" do
9
+ assert_equal Tilt::RadiusTemplate, Tilt['test.radius']
10
+ end
11
+
12
+ test "preparing and evaluating templates on #render" do
13
+ template = Tilt::RadiusTemplate.new { |t| "Hello World!" }
14
+ assert_equal "Hello World!", template.render
15
+ end
16
+
17
+ test "passing locals" do
18
+ template = Tilt::RadiusTemplate.new { "Hey <r:name />!" }
19
+ assert_equal "Hey Joe!", template.render(nil, :name => 'Joe')
20
+ end
21
+
22
+ class ExampleRadiusScope
23
+ def beer; 'wet'; end
24
+ def whisky; 'wetter'; end
25
+ end
26
+
27
+ test "combining scope and locals when scope responds" do
28
+ template = Tilt::RadiusTemplate.new {
29
+ 'Beer is <r:beer /> but Whisky is <r:whisky />.'
30
+ }
31
+ scope = ExampleRadiusScope.new
32
+ assert_equal "Beer is wet but Whisky is wetter.", template.render(scope)
33
+ end
34
+
35
+ test "precedence when locals and scope define same variables" do
36
+ template = Tilt::RadiusTemplate.new {
37
+ 'Beer is <r:beer /> but Whisky is <r:whisky />.'
38
+ }
39
+ scope = ExampleRadiusScope.new
40
+ assert_equal "Beer is great but Whisky is greater.",
41
+ template.render(scope, :beer => 'great', :whisky => 'greater')
42
+ end
43
+
44
+ #test "handles local scope" do
45
+ # beer = 'wet'
46
+ # whisky = 'wetter'
47
+ #
48
+ # template = Tilt::RadiusTemplate.new {
49
+ # 'Beer is <r:beer /> but Whisky is <r:whisky />.'
50
+ # }
51
+ # assert_equal "Beer is wet but Whisky is wetter.", template.render(self)
52
+ #end
53
+
54
+ test "passing a block for yield" do
55
+ template = Tilt::RadiusTemplate.new {
56
+ 'Beer is <r:yield /> but Whisky is <r:yield />ter.'
57
+ }
58
+ assert_equal "Beer is wet but Whisky is wetter.",
59
+ template.render({}) { 'wet' }
60
+ end
61
+ end
62
+
63
+ rescue LoadError => boom
64
+ warn "Tilt::RadiusTemplate (disabled)\n"
65
+ end
66
+
@@ -11,8 +11,8 @@ begin
11
11
  end
12
12
 
13
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
14
+ template = Tilt::SassTemplate.new { |t| "#main\n :background-color #0000f1" }
15
+ assert_equal "#main {\n background-color: #0000f1; }\n", template.render
16
16
  end
17
17
  end
18
18
 
@@ -122,6 +122,8 @@ class TiltTemplateTest < Test::Unit::TestCase
122
122
  end
123
123
 
124
124
  class Person
125
+ CONSTANT = "Bob"
126
+
125
127
  attr_accessor :name
126
128
  def initialize(name)
127
129
  @name = name
@@ -138,4 +140,18 @@ class TiltTemplateTest < Test::Unit::TestCase
138
140
  inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{yield}!' }
139
141
  assert_equal "Hey Joe!", inst.render(Object.new){ 'Joe' }
140
142
  end
143
+
144
+ test "template which accesses a constant" do
145
+ inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{CONSTANT}!' }
146
+ assert_equal "Hey Bob!", inst.render(Person.new("Joe"))
147
+ end
148
+
149
+ class FastPerson < Person
150
+ include Tilt::CompileSite
151
+ end
152
+
153
+ test "template which accesses a constant with Tilt::CompileSite" do
154
+ inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{CONSTANT}!' }
155
+ assert_equal "Hey Bob!", inst.render(FastPerson.new("Joe"))
156
+ end
141
157
  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.9'
7
- s.date = '2010-04-11'
6
+ s.version = '0.10'
7
+ s.date = '2010-05-27'
8
8
 
9
9
  s.description = "Generic interface to multiple Ruby template engines"
10
10
  s.summary = s.description
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
  test/tilt_liquidtemplate_test.rb
32
32
  test/tilt_mustache_views/external.rb
33
33
  test/tilt_mustachetemplate_test.rb
34
+ test/tilt_radiustemplate_test.rb
34
35
  test/tilt_rdiscounttemplate_test.rb
35
36
  test/tilt_rdoctemplate_test.rb
36
37
  test/tilt_redclothtemplate_test.rb
@@ -42,6 +43,9 @@ Gem::Specification.new do |s|
42
43
  ]
43
44
  # = MANIFEST =
44
45
 
46
+ s.default_executable = 'tilt'
47
+ s.executables = ['tilt']
48
+
45
49
  s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
46
50
  s.add_development_dependency 'contest'
47
51
  s.add_development_dependency 'builder'
@@ -52,6 +56,7 @@ Gem::Specification.new do |s|
52
56
  s.add_development_dependency 'liquid'
53
57
  s.add_development_dependency 'less'
54
58
  s.add_development_dependency 'coffee-script'
59
+ s.add_development_dependency 'radius'
55
60
 
56
61
  s.extra_rdoc_files = %w[COPYING]
57
62
 
metadata CHANGED
@@ -4,8 +4,8 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 9
8
- version: "0.9"
7
+ - 10
8
+ version: "0.10"
9
9
  platform: ruby
10
10
  authors:
11
11
  - Ryan Tomayko
@@ -13,8 +13,8 @@ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
15
 
16
- date: 2010-04-11 00:00:00 -07:00
17
- default_executable:
16
+ date: 2010-05-27 00:00:00 -07:00
17
+ default_executable: tilt
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: contest
@@ -126,10 +126,22 @@ dependencies:
126
126
  version: "0"
127
127
  type: :development
128
128
  version_requirements: *id009
129
+ - !ruby/object:Gem::Dependency
130
+ name: radius
131
+ prerelease: false
132
+ requirement: &id010 !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ segments:
137
+ - 0
138
+ version: "0"
139
+ type: :development
140
+ version_requirements: *id010
129
141
  description: Generic interface to multiple Ruby template engines
130
142
  email: r@tomayko.com
131
- executables: []
132
-
143
+ executables:
144
+ - tilt
133
145
  extensions: []
134
146
 
135
147
  extra_rdoc_files:
@@ -152,6 +164,7 @@ files:
152
164
  - test/tilt_liquidtemplate_test.rb
153
165
  - test/tilt_mustache_views/external.rb
154
166
  - test/tilt_mustachetemplate_test.rb
167
+ - test/tilt_radiustemplate_test.rb
155
168
  - test/tilt_rdiscounttemplate_test.rb
156
169
  - test/tilt_rdoctemplate_test.rb
157
170
  - test/tilt_redclothtemplate_test.rb
@@ -206,6 +219,7 @@ test_files:
206
219
  - test/tilt_lesstemplate_test.rb
207
220
  - test/tilt_liquidtemplate_test.rb
208
221
  - test/tilt_mustachetemplate_test.rb
222
+ - test/tilt_radiustemplate_test.rb
209
223
  - test/tilt_rdiscounttemplate_test.rb
210
224
  - test/tilt_rdoctemplate_test.rb
211
225
  - test/tilt_redclothtemplate_test.rb