Skip to content

Commit

Permalink
Changed signature of Lotus::View.render: it now accepts only a contex…
Browse files Browse the repository at this point in the history
…t for the view
  • Loading branch information
jodosha committed Mar 22, 2014
1 parent 9d5de63 commit 320f322
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 27 deletions.
13 changes: 6 additions & 7 deletions lib/lotus/view/rendering.rb
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,7 @@ def method_missing(m)
# to the requested format.
#
# @param context [Hash] the context for the rendering process
# @param locals [Hash] a set of objects available during the rendering
# process
# @option context [Symbol] :format the requested format
#
# @return [String] the output of the rendering process
#
Expand Down Expand Up @@ -222,16 +221,16 @@ def method_missing(m)
# Lotus::View.root = '/path/to/templates'
# Lotus::View.load!
#
# Articles::Show.render({ format: :html }, { article: article })
# Articles::Show.render(format: :html, article: article)
# # => renders `articles/show.html.erb`
#
# Articles::Show.render({ format: :json }, { article: article })
# Articles::Show.render(format: :json, article: article)
# # => renders `articles/show.json.erb`
#
# Articles::Show.render({ format: :xml }, { article: article })
# Articles::Show.render(format: :xml, article: article)
# # => raises Lotus::View::MissingTemplateError
def render(context, locals)
registry.resolve(context, locals).render
def render(context)
registry.resolve(context).render
end

protected
Expand Down
4 changes: 2 additions & 2 deletions lib/lotus/view/rendering/registry.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ class Registry < LayoutRegistry
# @since 0.1.0
#
# @see Lotus::View::Rendering#render
def resolve(context, locals)
def resolve(context)
view, template = fetch(context[:format]) { self[DEFAULT_FORMAT] }
view.new(template, locals.merge(context))
view.new(template, context)
end

private
Expand Down
2 changes: 1 addition & 1 deletion test/layout_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
describe Lotus::Layout do
describe 'rendering from layout' do
it 'renders partial' do
rendered = IndexView.render({format: :html}, {})
rendered = IndexView.render(format: :html)
rendered.must_match %(<div id="sidebar"></div>)
end
end
Expand Down
34 changes: 17 additions & 17 deletions test/rendering_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,69 +4,69 @@
describe Lotus::View do
describe 'rendering' do
it 'renders a template' do
HelloWorldView.render({format: :html}, {}).must_include %(<h1>Hello, World!</h1>)
HelloWorldView.render(format: :html).must_include %(<h1>Hello, World!</h1>)
end

it 'renders a template with context binding' do
RenderView.render({format: :html}, {planet: 'Mars'}).must_include %(<h1>Hello, Mars!</h1>)
RenderView.render(format: :html, planet: 'Mars').must_include %(<h1>Hello, Mars!</h1>)
end

it 'renders a template according to the declared format' do
JsonRenderView.render({format: :json}, {planet: 'Moon'}).must_include %("greet":"Hello, Moon!")
JsonRenderView.render(format: :json, planet: 'Moon').must_include %("greet":"Hello, Moon!")
end

it 'renders a template according to the requested format' do
articles = [ OpenStruct.new(title: 'Man on the Moon!') ]

rendered = Articles::Index.render({format: :json}, {articles: articles})
rendered = Articles::Index.render(format: :json, articles: articles)
rendered.must_match %("title":"Man on the Moon!")

rendered = Articles::Index.render({format: :html}, {articles: articles})
rendered = Articles::Index.render(format: :html, articles: articles)
rendered.must_match %(<h1>Man on the Moon!</h1>)
end

it 'binds given locals to the rendering context' do
article = OpenStruct.new(title: 'Hello')

rendered = Articles::Show.render({format: :html}, {article: article})
rendered = Articles::Show.render(format: :html, article: article)
rendered.must_match %(<h1>HELLO</h1>)
end

it 'renders a template from a subclass, if it is able to handle the requested format' do
article = OpenStruct.new(title: 'Hello')

rendered = Articles::Show.render({format: :json}, {article: article})
rendered = Articles::Show.render(format: :json, article: article)
rendered.must_match %("title":"olleh")
end

it 'raises an error when the template is missing' do
article = OpenStruct.new(title: 'Ciao')

-> {
Articles::Show.render({format: :png}, {article: article})
Articles::Show.render(format: :png, article: article)
}.must_raise(Lotus::View::MissingTemplateError)
end

it 'renders different template, as specified by DSL' do
article = OpenStruct.new(title: 'Bonjour')

rendered = Articles::Create.render({format: :html}, {article: article})
rendered = Articles::Create.render(format: :html, article: article)
rendered.must_match %(<h1>New Article</h1>)
rendered.must_match %(<h2>Errors</h2>)
end

it 'decorates locals' do
map = Map.new(['Rome', 'Cambridge'])

rendered = Dashboard::Index.render({format: :html}, {map: map})
rendered = Dashboard::Index.render(format: :html, map: map)
rendered.must_match %(<h1>Map</h1>)
rendered.must_match %(<h2>2 locations</h2>)
end

it 'renders a partial' do
article = OpenStruct.new(title: nil)

rendered = Articles::New.render({format: :html}, {article: article})
rendered = Articles::New.render(format: :html, article: article)

rendered.must_match %(<h1>New Article</h1>)
rendered.must_match %(<input type="hidden" name="secret" value="23" />)
Expand All @@ -75,7 +75,7 @@
it 'renders a template within another template' do
article = OpenStruct.new(title: nil)

rendered = Articles::AlternativeNew.render({format: :html}, {article: article})
rendered = Articles::AlternativeNew.render(format: :html, article: article)

rendered.must_match %(<h1>New Article</h1>)
rendered.must_match %(<input type="hidden" name="secret" value="23" />)
Expand All @@ -84,23 +84,23 @@
it 'uses HAML engine' do
person = OpenStruct.new(name: 'Luca')

rendered = Contacts::Show.render({format: :html}, {person: person})
rendered = Contacts::Show.render(format: :html, person: person)
rendered.must_match %(<h1>Luca</h1>)
end

describe 'when without a template' do
it 'renders from the custom rendering method' do
song = OpenStruct.new(title: 'Song Two', url: '/song2.mp3')

rendered = Songs::Show.render({format: :html}, {song: song})
rendered = Songs::Show.render(format: :html, song: song)
rendered.must_equal %(<audio src="/song2.mp3">Song Two</audio>)
end

it 'respond to all the formats' do
rendered = Metrics::Index.render({format: :html}, {})
rendered = Metrics::Index.render(format: :html)
rendered.must_equal %(metrics)

rendered = Metrics::Index.render({format: :json}, {})
rendered = Metrics::Index.render(format: :json)
rendered.must_equal %(metrics)
end
end
Expand All @@ -109,7 +109,7 @@
it 'renders contents from layout' do
articles = [ OpenStruct.new(title: 'A Wonderful Day!') ]

rendered = Articles::Index.render({format: :html}, {articles: articles})
rendered = Articles::Index.render(format: :html, articles: articles)
rendered.must_match %(<h1>A Wonderful Day!</h1>)
rendered.must_match %(<html>)
rendered.must_match %(<title>Title: articles</title>)
Expand Down

0 comments on commit 320f322

Please sign in to comment.