Skip to content

Commit

Permalink
Added support for custom renderers.
Browse files Browse the repository at this point in the history
  • Loading branch information
Anthony Smith committed Nov 21, 2013
1 parent cb933ac commit 6a723ed
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 31 deletions.
11 changes: 10 additions & 1 deletion lib/errawr/rails.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,22 @@
require 'errawr/http'

require 'errawr/rails/renderable'
require 'errawr/rails/json'
require 'errawr/rails/renderers/json'
require 'errawr/rails/version'

module Errawr
module Rails
def self.included(base)
base.send(:include, Errawr::ClassMethods)
end

def self.with_renderer(renderer)
mod = Module.new
mod.define_singleton_method :included do |object|
object.send(:include, Errawr::Rails)
object.send(:include, Errawr::Rails::Renderable.render_with(renderer))
end
mod
end
end
end
18 changes: 0 additions & 18 deletions lib/errawr/rails/json.rb

This file was deleted.

24 changes: 15 additions & 9 deletions lib/errawr/rails/renderable.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
module Errawr
module Rails
module Renderable
def self.included(base)
base.send(:include, Errawr::Rails) unless base.ancestors.include?(Errawr::Rails)
base.send(:include, ActiveSupport::Rescuable)
base.class_eval do
rescue_from Errawr::Error, with: :render_errawr
def self.render_with(handler)
mod = Module.new
mod.define_singleton_method :included do |object|
object.class_eval do
object.const_set(:ERRAWR_HANDLER, handler)
rescue_from Errawr::Error, with: :render_errawr

private
def render_errawr(error)
handler = self.class.const_get(:ERRAWR_HANDLER)
self.status = error.context[:http_status] || 500
render handler.new.call(error)
end
end
end
end

def render_errawr
raise 'Method render_errawr not defined...'
mod
end
end
end
Expand Down
16 changes: 16 additions & 0 deletions lib/errawr/rails/renderers/json.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module Errawr
module Rails
module Renderers
class JSON
def call(error)
{
json: {
error: error.context[:name] || error.key,
description: error.message
}.merge(error.metadata)
}
end
end
end
end
end
2 changes: 1 addition & 1 deletion spec/dummy/app/controllers/metadata_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
class MetadataController < ApplicationController
include Errawr::Rails::JSON
include Errawr::Rails.with_renderer(Errawr::Rails::Renderers::JSON)

def index
register!(:dummy_error, message: 'Dummy Message', metadata: { developer: 'Anthony' })
Expand Down
2 changes: 1 addition & 1 deletion spec/dummy/app/controllers/renderable_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
class RenderableController < ApplicationController
include Errawr::Rails::JSON
include Errawr::Rails.with_renderer(Errawr::Rails::Renderers::JSON)

def index
error!(:bad_request)
Expand Down
2 changes: 1 addition & 1 deletion spec/json_spec.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'spec_helper'

describe Errawr::Rails::JSON do
describe Errawr::Rails::Renderers::JSON do
context 'RenderableController', type: :controller do
controller(RenderableController) do
extend RSpec::Rails::ControllerExampleGroup::BypassRescue
Expand Down

0 comments on commit 6a723ed

Please sign in to comment.