Skip to content

Commit

Permalink
Added renderer
Browse files Browse the repository at this point in the history
- contains logic for custom views
- has a modular engine that will do the rendering
- allows rendering in background
  • Loading branch information
adamhunter committed May 28, 2013
1 parent 0bfb7aa commit 060a0ae
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 54 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -1,4 +1,6 @@
.rvmrc
.ruby-version
.ruby-gemset
.bundle/
Gemfile.lock
log/*.log
Expand Down
42 changes: 22 additions & 20 deletions lib/dossier/renderer.rb
@@ -1,14 +1,7 @@
module Dossier
class Renderer

attr_reader :report
attr_accessor :template

def self._helpers
Module.new do
include Dossier::ApplicationHelper
end
end
attr_accessor :template, :engine

def initialize(report)
@report = report
Expand All @@ -22,20 +15,10 @@ def render
default_render
end

def view_context_class
@view_context_class ||= ActionView::Base.prepare(nil, nil)
end

def view_context
view_context_class.new(view_renderer)
end

def view_renderer

end
private

def default_render
render_to_string template: template, locals: {report: report}
engine.render template: template, locals: {report: report}
end

def default_template!
Expand All @@ -49,5 +32,24 @@ def custom_template!
def template=(value)
@template = "dossier/reports/#{value}"
end

def engine
@engine ||= Engine.new
end

class Engine < AbstractController::Base
include AbstractController::Rendering

def self._helpers
Module.new do
include Rails.application.helpers
include Rails.application.routes_url_helpers
end
end

def self._view_paths
ActionController::Base.view_paths
end
end
end
end
10 changes: 2 additions & 8 deletions lib/dossier/responder.rb
Expand Up @@ -5,14 +5,8 @@ class Responder < ::ActionController::Responder
alias :report :resource

def to_html
set_report_view_context!
report.render

custom_template!
default_render
rescue ActionView::MissingTemplate => e
default_template!
default_render
report.renderer.engine = controller
controller.response_body = report.render
end

def to_json
Expand Down
34 changes: 14 additions & 20 deletions spec/dossier/renderer_spec.rb
Expand Up @@ -4,6 +4,7 @@

let(:report) { EmployeeReport.new }
let(:renderer) { described_class.new(report) }
let(:engine) { renderer.send(:engine) }

describe "rendering" do
let(:options) { {template: "dossier/reports/#{template}", locals: {report: report}} }
Expand All @@ -13,41 +14,34 @@
let(:template) { report.class.report_name }

it "renders the custom view" do
renderer.should_receive(:render_to_string).with(options)
engine.should_receive(:render).with(options)
end
end

describe "without custom view" do
let(:template) { 'show' }

it "renders show" do
renderer.should_receive(:render_to_string).with(options.merge(template: 'dossier/reports/employee')).and_call_original
renderer.should_receive(:render_to_string).with(options)
engine.should_receive(:render).with(options.merge(template: 'dossier/reports/employee')).and_call_original
engine.should_receive(:render).with(options)
end
end

after(:each) { renderer.render }
end

describe "view_context" do
it "will lazy load the view context" do
renderer.view_context = mock('view_context')
renderer.class.view_context_class.should_not_receive(:new)
renderer.view_context
end

it "will create a new view context if necessary" do
expect(renderer.view_context).to be_a(ActionView::Base)
end

it "mixes in the dossier/application_helper to that view context" do
expect(renderer.view_context.ancestors).to include(Dossier::ApplicationHelper)
describe "engine" do
describe "view_context" do
it "mixes in the dossier/application_helper to that view context" do
expect(engine.view_context.class.ancestors).to include(Dossier::ApplicationHelper)
end
end
end

describe "view path" do
it "has the same view paths the application would have" do
expect(renderer.view_paths).to eq(Rails.application.view_paths)
describe "view path" do
it "has the same view paths the application would have" do
extractor = ->(vp) { vp.paths }
expect(extractor.call engine.view_paths).to eq(extractor.call ActionController::Base.view_paths)
end
end
end
end
5 changes: 0 additions & 5 deletions spec/dossier/responder_spec.rb
Expand Up @@ -18,11 +18,6 @@ def stub_out_report_results(report)
let(:responder) { described_class.new(controller, reports, {}) }

describe "to_html" do
it "sets the controller's view context on the report renderer" do
responder.to_html
expect(report.renderer.view).to eq(controller.view)
end

it "calls render on the report" do
report.should_receive(:render)
responder.to_html
Expand Down
2 changes: 2 additions & 0 deletions spec/dummy/config/application.rb
Expand Up @@ -51,6 +51,8 @@ class Application < Rails::Application

# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'

Dir["#{File.dirname(__FILE__)}/../../support/reports/**/*.rb"].each { |f| require f }
end
end

2 changes: 1 addition & 1 deletion spec/features/combination_report_spec.rb
Expand Up @@ -9,7 +9,7 @@
it "displays the correct html" do
visit '/multi/reports/combination'
expect(page).to have_content('Employee Report')
expect(page).to have_content('Employee With Custom View Report')
expect(page).to have_content('Did you get that memo?')
end

end
Expand Down

0 comments on commit 060a0ae

Please sign in to comment.