Add radius helper method. Tilt supports radius for quite some time now, but it was not as easy to use as haml or erb, and not documented. Tests and documentation (English and German) included.

This commit is contained in:
Konstantin Haase 2010-09-12 15:14:45 +02:00
parent c248dbac9d
commit 7cb94f2d3f
6 changed files with 102 additions and 0 deletions

View File

@ -393,6 +393,24 @@ aufzurufen:
%h1 Hallo von Haml!
%p= rdoc(:greetings)
=== Radius-Templates
Das radius gem wird benötigt um Radius-Templates rendern zu können:
## radius muss eingebunden werden
require 'radius'
get '/' do
radius :index
end
Dieser Code rendert <tt>./views/index.radius</tt>.
Da man aus Radius-Templates heraus keine Methoden (abgesehen von +yield+)
aufrufen kann, will man nahezu in allen Fällen +locals+ übergeben:
radius :index, :locals => { :key => 'value' }
=== Inline-Templates
get '/' do

View File

@ -381,6 +381,24 @@ Note that you may also call the rdoc method from within other templates:
%h1 Hello From Haml!
%p= rdoc(:greetings)
=== Radius Templates
The radius gem/library is required to render Radius templates:
## You'll need to require radius in your app
require 'radius'
get '/' do
radius :index
end
Renders <tt>./views/index.radius</tt>.
Since you cannot call Ruby methods (except for +yield+) from a Radius
template, you almost always want to pass locals to it:
radius :index, :locals => { :key => 'value' }
=== Inline Templates
get '/' do

View File

@ -351,6 +351,10 @@ module Sinatra
render :rdoc, template, options, locals
end
def radius(template, options={}, locals={})
render :radius, template, options, locals
end
private
def render(engine, data, options={}, locals={}, &block)
# merge app-level options

59
test/radius_test.rb Normal file
View File

@ -0,0 +1,59 @@
require File.dirname(__FILE__) + '/helper'
begin
fail 'Radius broken on 1.9.' if RUBY_VERSION >= '1.9.1'
require 'radius'
class RadiusTest < Test::Unit::TestCase
def radius_app(&block)
mock_app do
set :views, File.dirname(__FILE__) + '/views'
get '/', &block
end
get '/'
end
it 'renders inline radius strings' do
radius_app { radius '<h1>Hiya</h1>' }
assert ok?
assert_equal "<h1>Hiya</h1>", body
end
it 'renders .radius files in views path' do
radius_app { radius :hello }
assert ok?
assert_equal "<h1>Hello From Radius</h1>\n", body
end
it "renders with inline layouts" do
mock_app do
layout { "<h1>THIS. IS. <r:yield /></h1>" }
get('/') { radius '<EM>SPARTA</EM>' }
end
get '/'
assert ok?
assert_equal "<h1>THIS. IS. <EM>SPARTA</EM></h1>", body
end
it "renders with file layouts" do
radius_app { radius 'Hello World', :layout => :layout2 }
assert ok?
assert_equal "<h1>Radius Layout!</h1>\n<p>Hello World</p>\n", body
end
it "raises error if template not found" do
mock_app { get('/') { radius :no_such_template } }
assert_raise(Errno::ENOENT) { get('/') }
end
it "allows passing locals" do
radius_app do
radius '<r:value />', :locals => { :value => 'foo' }
end
assert ok?
assert_equal 'foo', body
end
end
rescue
warn "#{$!.to_s}: skipping radius tests"
end

1
test/views/hello.radius Normal file
View File

@ -0,0 +1 @@
<h1>Hello From Radius</h1>

View File

@ -0,0 +1,2 @@
<h1>Radius Layout!</h1>
<p><r:yield /></p>