Skip to content

Commit

Permalink
Created a Raw handler for templates.
Browse files Browse the repository at this point in the history
  • Loading branch information
steveklabnik committed May 17, 2012
1 parent 1839ecd commit 8bea607
Show file tree
Hide file tree
Showing 9 changed files with 36 additions and 6 deletions.
2 changes: 2 additions & 0 deletions actionpack/lib/action_view/template/handlers.rb
Expand Up @@ -4,10 +4,12 @@ class Template
module Handlers #:nodoc: module Handlers #:nodoc:
autoload :ERB, 'action_view/template/handlers/erb' autoload :ERB, 'action_view/template/handlers/erb'
autoload :Builder, 'action_view/template/handlers/builder' autoload :Builder, 'action_view/template/handlers/builder'
autoload :Raw, 'action_view/template/handlers/raw'


def self.extended(base) def self.extended(base)
base.register_default_template_handler :erb, ERB.new base.register_default_template_handler :erb, ERB.new
base.register_template_handler :builder, Builder.new base.register_template_handler :builder, Builder.new
base.register_template_handler :raw, Raw.new
end end


@@template_handlers = {} @@template_handlers = {}
Expand Down
11 changes: 11 additions & 0 deletions actionpack/lib/action_view/template/handlers/raw.rb
@@ -0,0 +1,11 @@
module ActionView
module Template::Handlers
class Raw
def call(template)
escaped = template.source.gsub(':', '\:')

'%q:' + escaped + ':;'
end
end
end
end
4 changes: 3 additions & 1 deletion actionpack/lib/action_view/template/resolver.rb
Expand Up @@ -171,7 +171,9 @@ def mtime(p)
def extract_handler_and_format(path, default_formats) def extract_handler_and_format(path, default_formats)
pieces = File.basename(path).split(".") pieces = File.basename(path).split(".")
pieces.shift pieces.shift
handler = Template.handler_for_extension(pieces.pop) extension = pieces.pop
ActiveSupport::Deprecation.warn "The file #{path} did not specify a template handler. The default is currently ERB, but will change to RAW in the future." unless extension
handler = Template.handler_for_extension(extension)
format = pieces.last && Mime[pieces.last] format = pieces.last && Mime[pieces.last]
[handler, format] [handler, format]
end end
Expand Down
1 change: 1 addition & 0 deletions actionpack/test/fixtures/plain_text.raw
@@ -0,0 +1 @@
<%= hello_world %>
1 change: 1 addition & 0 deletions actionpack/test/fixtures/plain_text_with_characters.raw
@@ -0,0 +1 @@
Here are some characters: !@#$%^&*()-="'}{`
8 changes: 8 additions & 0 deletions actionpack/test/template/render_test.rb
Expand Up @@ -79,6 +79,14 @@ def test_render_template_with_handlers
assert_equal "<h1>No Comment</h1>\n", @view.render(:template => "comments/empty", :handlers => [:builder]) assert_equal "<h1>No Comment</h1>\n", @view.render(:template => "comments/empty", :handlers => [:builder])
end end


def test_render_raw_template_with_handlers
assert_equal "<%= hello_world %>\n", @view.render(:template => "plain_text")
end

def test_render_raw_template_with_quotes
assert_equal %q;Here are some characters: !@#$%^&*()-="'}{`; + "\n", @view.render(:template => "plain_text_with_characters")
end

def test_render_file_with_localization_on_context_level def test_render_file_with_localization_on_context_level
old_locale, @view.locale = @view.locale, :da old_locale, @view.locale = @view.locale, :da
assert_equal "Hey verden", @view.render(:file => "test/hello_world") assert_equal "Hey verden", @view.render(:file => "test/hello_world")
Expand Down
7 changes: 6 additions & 1 deletion actionpack/test/template/template_test.rb
Expand Up @@ -48,7 +48,7 @@ def my_buffer
end end


def new_template(body = "<%= hello %>", details = {}) def new_template(body = "<%= hello %>", details = {})
ActionView::Template.new(body, "hello template", ERBHandler, {:virtual_path => "hello"}.merge!(details)) ActionView::Template.new(body, "hello template", details.fetch(:handler) { ERBHandler }, {:virtual_path => "hello"}.merge!(details))
end end


def render(locals = {}) def render(locals = {})
Expand All @@ -64,6 +64,11 @@ def test_basic_template
assert_equal "Hello", render assert_equal "Hello", render
end end


def test_raw_template
@template = new_template("<%= hello %>", :handler => ActionView::Template::Handlers::Raw.new)
assert_equal "<%= hello %>", render
end

def test_template_loses_its_source_after_rendering def test_template_loses_its_source_after_rendering
@template = new_template @template = new_template
render render
Expand Down
4 changes: 2 additions & 2 deletions actionpack/test/template/testing/fixture_resolver_test.rb
Expand Up @@ -8,8 +8,8 @@ def test_should_return_empty_list_for_unknown_path
end end


def test_should_return_template_for_declared_path def test_should_return_template_for_declared_path
resolver = ActionView::FixtureResolver.new("arbitrary/path" => "this text") resolver = ActionView::FixtureResolver.new("arbitrary/path.erb" => "this text")
templates = resolver.find_all("path", "arbitrary", false, {:locale => [], :formats => [:html], :handlers => []}) templates = resolver.find_all("path", "arbitrary", false, {:locale => [], :formats => [:html], :handlers => [:erb]})
assert_equal 1, templates.size, "expected one template" assert_equal 1, templates.size, "expected one template"
assert_equal "this text", templates.first.source assert_equal "this text", templates.first.source
assert_equal "arbitrary/path", templates.first.virtual_path assert_equal "arbitrary/path", templates.first.virtual_path
Expand Down
4 changes: 2 additions & 2 deletions actionpack/test/template/testing/null_resolver_test.rb
Expand Up @@ -3,10 +3,10 @@
class NullResolverTest < ActiveSupport::TestCase class NullResolverTest < ActiveSupport::TestCase
def test_should_return_template_for_any_path def test_should_return_template_for_any_path
resolver = ActionView::NullResolver.new() resolver = ActionView::NullResolver.new()
templates = resolver.find_all("path", "arbitrary", false, {:locale => [], :formats => [:html], :handlers => []}) templates = resolver.find_all("path.erb", "arbitrary", false, {:locale => [], :formats => [:html], :handlers => []})
assert_equal 1, templates.size, "expected one template" assert_equal 1, templates.size, "expected one template"
assert_equal "Template generated by Null Resolver", templates.first.source assert_equal "Template generated by Null Resolver", templates.first.source
assert_equal "arbitrary/path", templates.first.virtual_path assert_equal "arbitrary/path.erb", templates.first.virtual_path
assert_equal [:html], templates.first.formats assert_equal [:html], templates.first.formats
end end
end end

0 comments on commit 8bea607

Please sign in to comment.