From 9b94ee6550dea87086f363f290fb6bf64a86c2d4 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 14 Apr 2011 14:28:59 +0200 Subject: [PATCH 01/10] depend on Tilt 1.3 --- lib/sinatra/base.rb | 2 +- sinatra.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 27135dbc90..03801531ea 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -521,7 +521,7 @@ def slim(template, options={}, locals={}) def find_template(views, name, engine) yield ::File.join(views, "#{name}.#{@preferred_extension}") Tilt.mappings.each do |ext, engines| - next unless ext != @preferred_extension and Array(engines).include? engine + next unless ext != @preferred_extension and engines.include? engine yield ::File.join(views, "#{name}.#{ext}") end end diff --git a/sinatra.gemspec b/sinatra.gemspec index 59b498866a..6491384b86 100644 --- a/sinatra.gemspec +++ b/sinatra.gemspec @@ -123,7 +123,7 @@ Gem::Specification.new do |s| s.extra_rdoc_files = %w[README.rdoc README.de.rdoc README.jp.rdoc README.fr.rdoc README.es.rdoc README.hu.rdoc README.zh.rdoc LICENSE] s.add_dependency 'rack', '~> 1.2' - s.add_dependency 'tilt', '~> 1.2', '>= 1.2.2' + s.add_dependency 'tilt', '~> 1.3' s.add_development_dependency 'shotgun', '~> 0.6' s.homepage = "http://sinatra.rubyforge.org" From 3e641dbf667a8a717b209ec70eb938ba3962a27c Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 14 Apr 2011 14:30:35 +0200 Subject: [PATCH 02/10] deprecate #erubis --- README.rdoc | 24 ----------- lib/sinatra/base.rb | 2 + sinatra.gemspec | 4 -- test/erubis_test.rb | 88 --------------------------------------- test/views/error.erubis | 3 -- test/views/hello.erubis | 1 - test/views/layout2.erubis | 2 - 7 files changed, 2 insertions(+), 122 deletions(-) delete mode 100644 test/erubis_test.rb delete mode 100644 test/views/error.erubis delete mode 100644 test/views/hello.erubis delete mode 100644 test/views/layout2.erubis diff --git a/README.rdoc b/README.rdoc index 73a9130916..42a913dfc1 100644 --- a/README.rdoc +++ b/README.rdoc @@ -256,30 +256,6 @@ and overridden on an individual basis. Renders ./views/index.erb. -=== Erubis Templates - -The erubis gem/library is required to render Erubis templates: - - # You'll need to require erubis in your app - require 'erubis' - - get '/' do - erubis :index - end - -Renders ./views/index.erubis. - -It is also possible to replace Erb with Erubis: - - require 'erubis' - Tilt.register :erb, Tilt[:erubis] - - get '/' do - erb :index - end - -Renders ./views/index.erb with Erubis. - === Builder Templates The builder gem/library is required to render builder templates: diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 03801531ea..b5e75a76fa 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -451,6 +451,8 @@ def erb(template, options={}, locals={}) end def erubis(template, options={}, locals={}) + warn "Sinatra::Templates#erubis is deprecated and will be removed, use #erb insetad.\n" \ + "If you have Erubis installed, it will be used automatically.\n\tfrom #{caller.first}" render :erubis, template, options, locals end diff --git a/sinatra.gemspec b/sinatra.gemspec index 6491384b86..42d79db1a5 100644 --- a/sinatra.gemspec +++ b/sinatra.gemspec @@ -44,7 +44,6 @@ Gem::Specification.new do |s| test/delegator_test.rb test/encoding_test.rb test/erb_test.rb - test/erubis_test.rb test/extensions_test.rb test/filter_test.rb test/haml_test.rb @@ -80,7 +79,6 @@ Gem::Specification.new do |s| test/views/calc.html.erb test/views/error.builder test/views/error.erb - test/views/error.erubis test/views/error.haml test/views/error.sass test/views/explicitly_nested.str @@ -88,7 +86,6 @@ Gem::Specification.new do |s| test/views/hello.builder test/views/hello.coffee test/views/hello.erb - test/views/hello.erubis test/views/hello.haml test/views/hello.less test/views/hello.liquid @@ -105,7 +102,6 @@ Gem::Specification.new do |s| test/views/hello.textile test/views/layout2.builder test/views/layout2.erb - test/views/layout2.erubis test/views/layout2.haml test/views/layout2.liquid test/views/layout2.mab diff --git a/test/erubis_test.rb b/test/erubis_test.rb deleted file mode 100644 index 6e2323cb72..0000000000 --- a/test/erubis_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -begin -require 'erubis' - -class ERubisTest < Test::Unit::TestCase - def erubis_app(&block) - mock_app { - set :views, File.dirname(__FILE__) + '/views' - get '/', &block - } - get '/' - end - - it 'renders inline ERubis strings' do - erubis_app { erubis '<%= 1 + 1 %>' } - assert ok? - assert_equal '2', body - end - - it 'renders .erubis files in views path' do - erubis_app { erubis :hello } - assert ok? - assert_equal "Hello World\n", body - end - - it 'takes a :locals option' do - erubis_app { - locals = {:foo => 'Bar'} - erubis '<%= foo %>', :locals => locals - } - assert ok? - assert_equal 'Bar', body - end - - it "renders with inline layouts" do - mock_app { - layout { 'THIS. IS. <%= yield.upcase %>!' } - get('/') { erubis 'Sparta' } - } - get '/' - assert ok? - assert_equal 'THIS. IS. SPARTA!', body - end - - it "renders with file layouts" do - erubis_app { - erubis 'Hello World', :layout => :layout2 - } - assert ok? - assert_equal "ERubis Layout!\nHello World\n", body - end - - it "renders erubis with blocks" do - mock_app { - def container - @_out_buf << "THIS." - yield - @_out_buf << "SPARTA!" - end - def is; "IS." end - get '/' do - erubis '<% container do %> <%= is %> <% end %>' - end - } - get '/' - assert ok? - assert_equal 'THIS. IS. SPARTA!', body - end - - it "can be used in a nested fashion for partials and whatnot" do - mock_app { - template(:inner) { "<%= 'hi' %>" } - template(:outer) { "<%= erubis :inner %>" } - get '/' do - erubis :outer - end - } - - get '/' - assert ok? - assert_equal 'hi', body - end -end - -rescue LoadError - warn "#{$!.to_s}: skipping erubis tests" -end diff --git a/test/views/error.erubis b/test/views/error.erubis deleted file mode 100644 index b48d1f060e..0000000000 --- a/test/views/error.erubis +++ /dev/null @@ -1,3 +0,0 @@ -Hello <%= 'World' %> -<% raise 'Goodbye' unless defined?(french) && french %> -<% raise 'Au revoir' if defined?(french) && french %> diff --git a/test/views/hello.erubis b/test/views/hello.erubis deleted file mode 100644 index bcbbc926f4..0000000000 --- a/test/views/hello.erubis +++ /dev/null @@ -1 +0,0 @@ -Hello <%= 'World' %> diff --git a/test/views/layout2.erubis b/test/views/layout2.erubis deleted file mode 100644 index b61db6d0e1..0000000000 --- a/test/views/layout2.erubis +++ /dev/null @@ -1,2 +0,0 @@ -ERubis Layout! -<%= yield %> From 8f76d3b49b61e8d5a4fd6588ff149ddb7fb54a90 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 15 Apr 2011 10:10:41 +0200 Subject: [PATCH 03/10] fix erb test to work with erubis --- test/erb_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/erb_test.rb b/test/erb_test.rb index cc68c5ce34..4e12eb8c5c 100644 --- a/test/erb_test.rb +++ b/test/erb_test.rb @@ -45,7 +45,7 @@ def erb_app(&block) erb 'Hello World', :layout => :layout2 } assert ok? - assert_equal "ERB Layout!\nHello World\n", body + assert_body "ERB Layout!\nHello World" end it "renders erb with blocks" do From b3e82c5293e30b238a93bbaf1d9096e7dbb05b7e Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 15 Apr 2011 10:27:00 +0200 Subject: [PATCH 04/10] test both ERB and Erubis --- test/erb_test.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/erb_test.rb b/test/erb_test.rb index 4e12eb8c5c..052f2d8a24 100644 --- a/test/erb_test.rb +++ b/test/erb_test.rb @@ -1,6 +1,15 @@ require File.dirname(__FILE__) + '/helper' class ERBTest < Test::Unit::TestCase + def engine + Tilt::ERBTemplate + end + + def setup + Tilt.prefer engine, :erb + super + end + def erb_app(&block) mock_app { set :views, File.dirname(__FILE__) + '/views' @@ -9,6 +18,10 @@ def erb_app(&block) get '/' end + it 'uses the correct engine' do + assert_equal engine, Tilt[:erb] + end + it 'renders inline ERB strings' do erb_app { erb '<%= 1 + 1 %>' } assert ok? @@ -79,3 +92,13 @@ def is; "IS." end assert_equal 'hi', body end end + + +begin + require 'erubis' + class ErubisTest < ERBTest + def engine; Tilt::ErubisTemplate end + end +rescue LoadError + warn "#{$!.to_s}: skipping erubis tests" +end From 4b8aaef0b435e4bd1e3ef4d2eee0d84e38333e9d Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 15 Apr 2011 11:00:07 +0200 Subject: [PATCH 05/10] test all mardown engines if available --- Gemfile | 3 +++ test/markdown_test.rb | 38 +++++++++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Gemfile b/Gemfile index f91abe876a..841deb3154 100644 --- a/Gemfile +++ b/Gemfile @@ -34,9 +34,12 @@ gem 'slim', :group => 'slim' gem 'RedCloth', :group => 'redcloth' gem 'coffee-script', '>= 2.0', :group => 'coffee-script' gem 'rdoc', :group => 'rdoc' +gem 'kramdown', :group => 'kramdown' +gem 'maruku', :group => 'maruku' platforms :ruby do gem 'rdiscount', :group => 'rdiscount' + gem 'bluecloth', :group => 'bluecloth' end platforms :ruby_18, :jruby do diff --git a/test/markdown_test.rb b/test/markdown_test.rb index 8e676dbf11..4553601a1c 100644 --- a/test/markdown_test.rb +++ b/test/markdown_test.rb @@ -1,10 +1,6 @@ require File.dirname(__FILE__) + '/helper' -begin -fail LoadError, "rdiscount not available" if defined? JRuby -require 'rdiscount' - -class MarkdownTest < Test::Unit::TestCase +MarkdownTest = proc do def markdown_app(&block) mock_app do set :views, File.dirname(__FILE__) + '/views' @@ -13,16 +9,32 @@ def markdown_app(&block) get '/' end + def assert_like(a,b) + pattern = /\s*\n\s*| id=['"][^"']*["']/ + assert_equal a.strip.gsub(pattern, ""), b.strip.gsub(pattern, "") + end + + def setup + Tilt.prefer engine, 'markdown', 'mkd', 'md' + super + end + + it 'uses the correct engine' do + assert_equal engine, Tilt[:md] + assert_equal engine, Tilt[:mkd] + assert_equal engine, Tilt[:markdown] + end + it 'renders inline markdown strings' do markdown_app { markdown '# Hiya' } assert ok? - assert_equal "

Hiya

\n", body + assert_like "

Hiya

\n", body end it 'renders .markdown files in views path' do markdown_app { markdown :hello } assert ok? - assert_equal "

Hello From Markdown

\n", body + assert_like "

Hello From Markdown

", body end it "raises error if template not found" do @@ -31,6 +43,14 @@ def markdown_app(&block) end end -rescue LoadError - warn "#{$!.to_s}: skipping markdown tests" +# Will generate RDiscountTest, KramdownTest, etc. +Tilt.mappings['md'].each do |t| + begin + t.new { "" } + klass = Class.new(Test::Unit::TestCase) { define_method(:engine) { t }} + klass.class_eval(&MarkdownTest) + Object.const_set t.name[/[^:]+(?=Template$)/] << "Test", klass + rescue LoadError + warn "#{$!}: skipping markdown tests with #{t}" + end end From 1725633080bc3ced8d33c155aacc31b549c5a3a0 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 15 Apr 2011 11:05:54 +0200 Subject: [PATCH 06/10] indentation --- test/helpers_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/helpers_test.rb b/test/helpers_test.rb index c39a0d29a6..642c7f6f31 100644 --- a/test/helpers_test.rb +++ b/test/helpers_test.rb @@ -323,8 +323,8 @@ def test_default end end - get '/' - assert_body 'ok' + get '/' + assert_body 'ok' end it 'accepts an options hash' do From a9d89d28a515d68cd7c6db91dca49bbae7e21b05 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 15 Apr 2011 11:14:23 +0200 Subject: [PATCH 07/10] add markdown, rdoc and textile nesting tests --- test/helper.rb | 7 +++++++ test/markdown_test.rb | 35 ++++++++++++++++++++++++++++++----- test/rdoc_test.rb | 30 ++++++++++++++++++++++++++++++ test/textile_test.rb | 30 ++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 5 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index 99ec82454a..fb6a4388e8 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -65,6 +65,11 @@ def assert_body(value) assert_equal value.lstrip.gsub(/\s*\n\s*/, ""), body.lstrip.gsub(/\s*\n\s*/, "") end + def assert_like(a,b) + pattern = /\s*\n\s*| id=['"][^"']*["']/ + assert_equal a.strip.gsub(pattern, ""), b.strip.gsub(pattern, "") + end + def assert_include(str, substr) assert str.include?(substr), "expected #{str.inspect} to include #{substr.inspect}" end @@ -76,6 +81,8 @@ def method_missing(name, *args, &block) else super end + rescue Rack::Test::Error + super end # Also check response since we delegate there. diff --git a/test/markdown_test.rb b/test/markdown_test.rb index 4553601a1c..0223fa0e54 100644 --- a/test/markdown_test.rb +++ b/test/markdown_test.rb @@ -9,11 +9,6 @@ def markdown_app(&block) get '/' end - def assert_like(a,b) - pattern = /\s*\n\s*| id=['"][^"']*["']/ - assert_equal a.strip.gsub(pattern, ""), b.strip.gsub(pattern, "") - end - def setup Tilt.prefer engine, 'markdown', 'mkd', 'md' super @@ -41,6 +36,36 @@ def setup mock_app { get('/') { markdown :no_such_template } } assert_raise(Errno::ENOENT) { get('/') } end + + it "renders with inline layouts" do + mock_app do + layout { 'THIS. IS. #{yield.upcase}!' } + get('/') { markdown 'Sparta', :layout_engine => :str } + end + get '/' + assert ok? + assert_like 'THIS. IS.

SPARTA

!', body + end + + it "renders with file layouts" do + markdown_app { markdown 'Hello World', :layout => :layout2, :layout_engine => :erb } + assert ok? + assert_body "ERB Layout!\n

Hello World

" + end + + it "can be used in a nested fashion for partials and whatnot" do + mock_app do + template(:inner) { "hi" } + template(:outer) { "<%= markdown :inner %>" } + get '/' do + erb :outer + end + end + + get '/' + assert ok? + assert_like '

hi

', body + end end # Will generate RDiscountTest, KramdownTest, etc. diff --git a/test/rdoc_test.rb b/test/rdoc_test.rb index 7407b0e798..243a8b7e05 100644 --- a/test/rdoc_test.rb +++ b/test/rdoc_test.rb @@ -28,6 +28,36 @@ def rdoc_app(&block) mock_app { get('/') { rdoc :no_such_template } } assert_raise(Errno::ENOENT) { get('/') } end + + it "renders with inline layouts" do + mock_app do + layout { 'THIS. IS. #{yield.upcase}!' } + get('/') { rdoc 'Sparta', :layout_engine => :str } + end + get '/' + assert ok? + assert_like 'THIS. IS.

SPARTA

!', body + end + + it "renders with file layouts" do + rdoc_app { rdoc 'Hello World', :layout => :layout2, :layout_engine => :erb } + assert ok? + assert_body "ERB Layout!\n

Hello World

" + end + + it "can be used in a nested fashion for partials and whatnot" do + mock_app do + template(:inner) { "hi" } + template(:outer) { "<%= rdoc :inner %>" } + get '/' do + erb :outer + end + end + + get '/' + assert ok? + assert_like '

hi

', body + end end rescue LoadError diff --git a/test/textile_test.rb b/test/textile_test.rb index f9535b438e..8d54ce09be 100644 --- a/test/textile_test.rb +++ b/test/textile_test.rb @@ -28,6 +28,36 @@ def textile_app(&block) mock_app { get('/') { textile :no_such_template } } assert_raise(Errno::ENOENT) { get('/') } end + + it "renders with inline layouts" do + mock_app do + layout { 'THIS. IS. #{yield.upcase}!' } + get('/') { textile 'Sparta', :layout_engine => :str } + end + get '/' + assert ok? + assert_like 'THIS. IS.

SPARTA

!', body + end + + it "renders with file layouts" do + textile_app { textile 'Hello World', :layout => :layout2, :layout_engine => :erb } + assert ok? + assert_body "ERB Layout!\n

Hello World

" + end + + it "can be used in a nested fashion for partials and whatnot" do + mock_app do + template(:inner) { "hi" } + template(:outer) { "<%= textile :inner %>" } + get '/' do + erb :outer + end + end + + get '/' + assert ok? + assert_like '

hi

', body + end end rescue LoadError From f65082df46f98215e59afb9e1e763d884fedb1b1 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 15 Apr 2011 11:15:46 +0200 Subject: [PATCH 08/10] remove guard for radius tests --- test/radius_test.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/radius_test.rb b/test/radius_test.rb index b1107bfc04..c944961739 100644 --- a/test/radius_test.rb +++ b/test/radius_test.rb @@ -1,7 +1,6 @@ require File.dirname(__FILE__) + '/helper' begin -fail LoadError, 'Radius broken on 1.9.' if RUBY_VERSION >= '1.9.1' require 'radius' class RadiusTest < Test::Unit::TestCase From 9ce9e543e03e5e56e1b9d12a3adb98dc1f31a963 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 15 Apr 2011 11:51:35 +0200 Subject: [PATCH 09/10] add support for creole templates --- CHANGES | 3 ++ Gemfile | 1 + README.de.rdoc | 13 +++++++++ README.es.rdoc | 13 +++++++++ README.fr.rdoc | 14 +++++++++ README.jp.rdoc | 13 +++++++++ README.rdoc | 13 +++++++++ README.ru.rdoc | 13 +++++++++ README.zh.rdoc | 13 +++++++++ lib/sinatra/base.rb | 4 +++ test/creole_test.rb | 65 +++++++++++++++++++++++++++++++++++++++++ test/views/hello.creole | 1 + 12 files changed, 166 insertions(+) create mode 100644 test/creole_test.rb create mode 100644 test/views/hello.creole diff --git a/CHANGES b/CHANGES index 8e62585eaf..fefb17493f 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ * Added support for HTTP PATCH requests. (Konstantin Haase) + * Support for Creole templates, Creole is a standardized wiki markup, + supported by many wiki implementations. (Konstanin Haase) + * Set up `Rack::Logger` or `Rack::NullLogger` depending on whether logging was enabled or not. Also, expose that logger with the `logger` helper method. (Konstantin Haase) diff --git a/Gemfile b/Gemfile index 841deb3154..4348bf3efa 100644 --- a/Gemfile +++ b/Gemfile @@ -36,6 +36,7 @@ gem 'coffee-script', '>= 2.0', :group => 'coffee-script' gem 'rdoc', :group => 'rdoc' gem 'kramdown', :group => 'kramdown' gem 'maruku', :group => 'maruku' +gem 'creole', :group => 'creole' platforms :ruby do gem 'rdiscount', :group => 'rdiscount' diff --git a/README.de.rdoc b/README.de.rdoc index f4cb092948..58b586b4f6 100644 --- a/README.de.rdoc +++ b/README.de.rdoc @@ -613,6 +613,19 @@ Das +slim+-Gem wird benötigt, um Slim-Templates rendern zu können: Dieser Code rendert ./views/index.slim. +=== Creole-Templates + +Das +creole+-Gem wird benötigt, um Creole-Templates rendern zu können: + + # creole muss eingebunden werden + require 'creole' + + get '/' do + creole :index + end + +Dieser Code rendert ./views/index.creole. + === CoffeeScript-Templates diff --git a/README.es.rdoc b/README.es.rdoc index b2a9bae943..6b131d612d 100644 --- a/README.es.rdoc +++ b/README.es.rdoc @@ -597,6 +597,19 @@ La gem/librería slim es necesaria para renderizar plantillas Slim: Renderiza ./views/index.slim. +=== Plantillas Creole + +La gem/librería creole es necesaria para renderizar plantillas Creole: + + # Vas a necesitar requerir creole en tu app + require 'creole' + + get '/' do + creole :index + end + +Renderiza ./views/index.creole. + === Plantillas CoffeeScript La gem/librería coffee-script y al menos una de las siguientes diff --git a/README.fr.rdoc b/README.fr.rdoc index 0c03be39a6..1bb05e3976 100644 --- a/README.fr.rdoc +++ b/README.fr.rdoc @@ -618,6 +618,20 @@ Le gem slim est nécessaire pour utiliser la fonction de rendu Slim: Utilisera ./views/index.slim. +=== Templates Creole + +Le gem creole est nécessaire pour utiliser la fonction de rendu +Creole: + + # Chargez la bibliothèque creole dans votre application + require 'creole' + + get '/' do + creole :index + end + +Utilisera ./views/index.creole. + === Templates CoffeeScript Le gem coffee-script est nécessaire ainsi que l'une des diff --git a/README.jp.rdoc b/README.jp.rdoc index c4797068a7..6fa2007d61 100644 --- a/README.jp.rdoc +++ b/README.jp.rdoc @@ -432,6 +432,19 @@ Slimテンプレートを使うにはslimライブラリが必要です: ./views/index.slimを表示します。 +=== Creole テンプレート + +Creoleテンプレートを使うにはcreoleライブラリが必要です: + + # creoleを読み込みます + require 'creole' + + get '/' do + creole :index + end + +./views/index.creoleを表示します。 + === CoffeeScript テンプレート CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリと`coffee`バイナリが必要です: diff --git a/README.rdoc b/README.rdoc index 42a913dfc1..c8ceac6e78 100644 --- a/README.rdoc +++ b/README.rdoc @@ -562,6 +562,19 @@ The slim gem/library is required to render Slim templates: Renders ./views/index.slim. +=== Creole Templates + +The creole gem/library is required to render Creole templates: + + # You'll need to require creole in your app + require 'creole' + + get '/' do + creole :index + end + +Renders ./views/index.creole. + === CoffeeScript Templates The coffee-script gem/library and at least one of the diff --git a/README.ru.rdoc b/README.ru.rdoc index a2330887da..e91b509ac3 100644 --- a/README.ru.rdoc +++ b/README.ru.rdoc @@ -584,6 +584,19 @@ Thin - это более производительный и функциона Отобразит ./views/index.slim. +=== Creole шаблоны + +creole gem/библиотека необходима для рендеринга creole шаблонов: + + # Вам нужно будет подключить creole в приложении + require 'creole' + + get '/' do + creole :index + end + +Отобразит ./views/index.creole. + === CoffeeScript шаблоны Вам понадобится coffee-script gem/библиотека и что-то одно из следующего списка, diff --git a/README.zh.rdoc b/README.zh.rdoc index 53c92270bd..6f13d2407d 100644 --- a/README.zh.rdoc +++ b/README.zh.rdoc @@ -582,6 +582,19 @@ Rack body对象或者HTTP状态码: 渲染 ./views/index.slim。 +=== Creole 模板 + +需要引入 creole gem/library 来渲染 Creole 模板: + + # 需要在你的应用中引入 creole + require 'creole' + + get '/' do + creole :index + end + +渲染 ./views/index.creole。 + === CoffeeScript 模板 需要引入 coffee-script gem/library 并至少满足下面条件一项 diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index b5e75a76fa..bded4ded14 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -518,6 +518,10 @@ def slim(template, options={}, locals={}) render :slim, template, options, locals end + def creole(template, options={}, locals={}) + render :creole, template, options, locals + end + # Calls the given block for every possible template file in views, # named name.ext, where ext is registered on engine. def find_template(views, name, engine) diff --git a/test/creole_test.rb b/test/creole_test.rb new file mode 100644 index 0000000000..0396855079 --- /dev/null +++ b/test/creole_test.rb @@ -0,0 +1,65 @@ +require File.dirname(__FILE__) + '/helper' + +begin +require 'creole' + +class CreoleTest < Test::Unit::TestCase + def creole_app(&block) + mock_app do + set :views, File.dirname(__FILE__) + '/views' + get '/', &block + end + get '/' + end + + it 'renders inline creole strings' do + creole_app { creole '= Hiya' } + assert ok? + assert_body "

Hiya

" + end + + it 'renders .creole files in views path' do + creole_app { creole :hello } + assert ok? + assert_body "

Hello From Creole

" + end + + it "raises error if template not found" do + mock_app { get('/') { creole :no_such_template } } + assert_raise(Errno::ENOENT) { get('/') } + end + + it "renders with inline layouts" do + mock_app do + layout { 'THIS. IS. #{yield.upcase}!' } + get('/') { creole 'Sparta', :layout_engine => :str } + end + get '/' + assert ok? + assert_like 'THIS. IS.

SPARTA

!', body + end + + it "renders with file layouts" do + creole_app { creole 'Hello World', :layout => :layout2, :layout_engine => :erb } + assert ok? + assert_body "ERB Layout!\n

Hello World

" + end + + it "can be used in a nested fashion for partials and whatnot" do + mock_app do + template(:inner) { "hi" } + template(:outer) { "<%= creole :inner %>" } + get '/' do + erb :outer + end + end + + get '/' + assert ok? + assert_like '

hi

', body + end +end + +rescue LoadError + warn "#{$!.to_s}: skipping creole tests" +end diff --git a/test/views/hello.creole b/test/views/hello.creole new file mode 100644 index 0000000000..50db5f85a8 --- /dev/null +++ b/test/views/hello.creole @@ -0,0 +1 @@ += Hello From Creole From 397708b197b455d709680bac19237b0d4e72d72c Mon Sep 17 00:00:00 2001 From: "F. Zhang" Date: Sun, 17 Apr 2011 13:02:08 +0200 Subject: [PATCH 10/10] fix typo Signed-off-by: Konstantin Haase --- lib/sinatra/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index bded4ded14..9af8aad81c 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -451,7 +451,7 @@ def erb(template, options={}, locals={}) end def erubis(template, options={}, locals={}) - warn "Sinatra::Templates#erubis is deprecated and will be removed, use #erb insetad.\n" \ + warn "Sinatra::Templates#erubis is deprecated and will be removed, use #erb instead.\n" \ "If you have Erubis installed, it will be used automatically.\n\tfrom #{caller.first}" render :erubis, template, options, locals end