gaffe 0.1.2 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/README.md +29 -4
- data/Rakefile +11 -1
- data/gaffe.gemspec +1 -0
- data/gemfiles/Gemfile.rails-3.2.x +5 -0
- data/gemfiles/Gemfile.rails-4.0 +5 -0
- data/lib/gaffe.rb +15 -6
- data/lib/gaffe/version.rb +1 -1
- data/spec/gaffe/errors_spec.rb +17 -0
- data/spec/gaffe/gaffe_spec.rb +66 -0
- data/spec/spec_helper.rb +18 -0
- metadata +31 -5
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# Gaffe
|
2
2
|
|
3
|
-
|
3
|
+
[](https://rubygems.org/gems/gaffe)
|
4
|
+
[](https://travis-ci.org/mirego/gaffe)
|
5
|
+
|
6
|
+
Gaffe handles Rails error pages in a clean, simple way. The default error page looks like this:
|
7
|
+
|
8
|
+

|
9
|
+
|
10
|
+
You should overwrite it though, it’s very easy to do so.
|
4
11
|
|
5
12
|
## Installation
|
6
13
|
|
@@ -32,6 +39,22 @@ end
|
|
32
39
|
Gaffe.enable!
|
33
40
|
```
|
34
41
|
|
42
|
+
It’s also possible to use a custom controller based on the URL in which the error has occured. This is especially
|
43
|
+
useful if you have an application that also serves API requests via JSON. You would probably want to serve API errors
|
44
|
+
through JSON and regular errors through HTML pages.
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
# config/initializers/gaffe.rb
|
48
|
+
Gaffe.configure do |config|
|
49
|
+
config.errors_controller = {
|
50
|
+
%r[^/api/] => Api::ErrorsController,
|
51
|
+
%r[^/] => ErrorsController
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
Gaffe.enable!
|
56
|
+
```
|
57
|
+
|
35
58
|
The only required thing to do in your custom controller is to include the `Gaffe::Errors` module.
|
36
59
|
|
37
60
|
Only `show` will be called so you might want to overwrite it. You might also want to get rid of filters and other stuff.
|
@@ -54,7 +77,7 @@ end
|
|
54
77
|
|
55
78
|
You can (and should!) also use your own views. You just have to create a layout:
|
56
79
|
|
57
|
-
```
|
80
|
+
```erb
|
58
81
|
<!-- app/views/layouts/error.html.erb -->
|
59
82
|
<h1>Error!</h1>
|
60
83
|
<%= yield %>
|
@@ -62,7 +85,7 @@ You can (and should!) also use your own views. You just have to create a layout:
|
|
62
85
|
|
63
86
|
And create a different view for [each possible error rescue response](https://github.com/rails/rails/blob/f9ceefd3b9c3cea2460a89799156f2c532c4491c/actionpack/lib/action_dispatch/middleware/exception_wrapper.rb). For example, for `404` errors:
|
64
87
|
|
65
|
-
```
|
88
|
+
```erb
|
66
89
|
<!-- app/views/errors/not_found.html.erb -->
|
67
90
|
<p>This page does not exist.</p>
|
68
91
|
```
|
@@ -85,4 +108,6 @@ config.action_dispatch.rescue_responses.merge!('MyCustomException' => :not_accep
|
|
85
108
|
|
86
109
|
## About Mirego
|
87
110
|
|
88
|
-
Mirego is a team of passionate people who believe that work is a place where you can innovate and have fun. We proudly
|
111
|
+
Mirego is a team of passionate people who believe that work is a place where you can innovate and have fun. We proudly build mobile applications for [iPhone](http://mirego.com/en/iphone-app-development/ "iPhone application development"), [iPad](http://mirego.com/en/ipad-app-development/ "iPad application development"), [Android](http://mirego.com/en/android-app-development/ "Android application development"), [Blackberry](http://mirego.com/en/blackberry-app-development/ "Blackberry application development"), [Windows Phone](http://mirego.com/en/windows-phone-app-development/ "Windows Phone application development") and [Windows 8](http://mirego.com/en/windows-8-app-development/ "Windows 8 application development") in beautiful Quebec City.
|
112
|
+
|
113
|
+
We also love [open-source software](http://open.mirego.com/) and we try to extract as much code as possible from our projects to give back to the community.
|
data/Rakefile
CHANGED
@@ -1 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler'
|
2
|
+
require 'rake'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
task default: :spec
|
7
|
+
|
8
|
+
desc 'Run all specs'
|
9
|
+
RSpec::Core::RakeTask.new(:spec) do |task|
|
10
|
+
task.pattern = 'spec/**/*_spec.rb'
|
11
|
+
end
|
data/gaffe.gemspec
CHANGED
data/lib/gaffe.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'gaffe/version'
|
2
|
+
|
3
|
+
require 'ostruct'
|
2
4
|
require 'gaffe/errors'
|
3
5
|
|
4
6
|
module Gaffe
|
@@ -12,11 +14,6 @@ module Gaffe
|
|
12
14
|
@configuration ||= OpenStruct.new
|
13
15
|
end
|
14
16
|
|
15
|
-
# Return either the user-defined controller or our default controller
|
16
|
-
def self.errors_controller
|
17
|
-
@errors_controller ||= (configuration.errors_controller || builtin_errors_controller)
|
18
|
-
end
|
19
|
-
|
20
17
|
# Return our default controller
|
21
18
|
def self.builtin_errors_controller
|
22
19
|
require 'gaffe/errors_controller'
|
@@ -26,8 +23,20 @@ module Gaffe
|
|
26
23
|
# Configure Rails to use our code when encountering exceptions
|
27
24
|
def self.enable!
|
28
25
|
Rails.application.config.exceptions_app = lambda do |env|
|
29
|
-
Gaffe.
|
26
|
+
Gaffe.errors_controller_for_request(env).action(:show).call(env)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return the right errors controller to use for the request that
|
31
|
+
# triggered the error
|
32
|
+
def self.errors_controller_for_request(env)
|
33
|
+
controller = configuration.errors_controller
|
34
|
+
|
35
|
+
if controller.is_a?(Hash)
|
36
|
+
controller = controller.detect { |pattern, _| env["REQUEST_URI"] =~ pattern }.try(:last)
|
30
37
|
end
|
38
|
+
|
39
|
+
controller || builtin_errors_controller
|
31
40
|
end
|
32
41
|
|
33
42
|
# Return the root path of the gem
|
data/lib/gaffe/version.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Gaffe::Errors do
|
4
|
+
describe :Actions do
|
5
|
+
describe :show do
|
6
|
+
let(:request) { ActionDispatch::TestRequest.new }
|
7
|
+
let(:env) { request.env.merge 'action_dispatch.exception' => exception }
|
8
|
+
let(:exception) { ActionController::RoutingError.new(:foo) }
|
9
|
+
|
10
|
+
let(:response) { Gaffe.errors_controller_for_request(env).action(:show).call(env) }
|
11
|
+
subject { response.last }
|
12
|
+
|
13
|
+
its(:status) { should eql 404 }
|
14
|
+
its(:body) { should match /Not Found/ }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Gaffe do
|
4
|
+
describe :ClassMethods do
|
5
|
+
before do
|
6
|
+
# Make sure we clear memoized variables before each test
|
7
|
+
[:@configuration].each do |variable|
|
8
|
+
Gaffe.send :remove_instance_variable, variable if Gaffe.instance_variable_defined?(variable)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe :configure do
|
13
|
+
subject { Gaffe.configuration }
|
14
|
+
before do
|
15
|
+
Gaffe.configure do |config|
|
16
|
+
config.foo = :bar
|
17
|
+
config.bar = :foo
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
its(:foo) { should eql :bar }
|
22
|
+
its(:bar) { should eql :foo }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe :errors_controller_for_request do
|
26
|
+
let(:controller) { Gaffe.errors_controller_for_request(env) }
|
27
|
+
let(:request) { ActionDispatch::TestRequest.new }
|
28
|
+
let(:env) { request.env }
|
29
|
+
|
30
|
+
context 'with custom-defined controller' do
|
31
|
+
before do
|
32
|
+
Gaffe.configure do |config|
|
33
|
+
config.errors_controller = :foo
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it { expect(controller).to eql :foo }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with multiple custom-defined controllers' do
|
41
|
+
before do
|
42
|
+
Gaffe.configure do |config|
|
43
|
+
config.errors_controller = {
|
44
|
+
%r[^/web/] => :web_controller,
|
45
|
+
%r[^/api/] => :api_controller
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with error coming from matching URL' do
|
51
|
+
let(:env) { request.env.merge 'REQUEST_URI' => '/api/users' }
|
52
|
+
it { expect(controller).to eql :api_controller }
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'with errors coming from non-matching URL' do
|
56
|
+
let(:env) { request.env.merge 'REQUEST_URI' => '/what' }
|
57
|
+
it { expect(controller).to eql Gaffe::ErrorsController }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'without custom-defined controller' do
|
62
|
+
it { expect(controller).to eql Gaffe::ErrorsController }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'rspec'
|
4
|
+
require "action_controller/railtie"
|
5
|
+
require 'gaffe'
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.before(:each) do
|
9
|
+
Rails.stub(:root).and_return(RAILS_ROOT)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# We need a fake "ApplicationController" because Gaffe's default controller inherits from it
|
14
|
+
class ApplicationController < ActionController::Base
|
15
|
+
end
|
16
|
+
|
17
|
+
# We need Rails.root
|
18
|
+
RAILS_ROOT = Pathname.new(File.expand_path('../../', __FILE__))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gaffe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-08-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -44,6 +44,22 @@ dependencies:
|
|
44
44
|
- - ! '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.14'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '2.14'
|
47
63
|
- !ruby/object:Gem::Dependency
|
48
64
|
name: rails
|
49
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -69,6 +85,8 @@ extensions: []
|
|
69
85
|
extra_rdoc_files: []
|
70
86
|
files:
|
71
87
|
- .gitignore
|
88
|
+
- .rspec
|
89
|
+
- .travis.yml
|
72
90
|
- Gemfile
|
73
91
|
- LICENSE.md
|
74
92
|
- README.md
|
@@ -80,10 +98,15 @@ files:
|
|
80
98
|
- app/views/errors/unauthorized.html.erb
|
81
99
|
- app/views/layouts/error.html.erb
|
82
100
|
- gaffe.gemspec
|
101
|
+
- gemfiles/Gemfile.rails-3.2.x
|
102
|
+
- gemfiles/Gemfile.rails-4.0
|
83
103
|
- lib/gaffe.rb
|
84
104
|
- lib/gaffe/errors.rb
|
85
105
|
- lib/gaffe/errors_controller.rb
|
86
106
|
- lib/gaffe/version.rb
|
107
|
+
- spec/gaffe/errors_spec.rb
|
108
|
+
- spec/gaffe/gaffe_spec.rb
|
109
|
+
- spec/spec_helper.rb
|
87
110
|
homepage: https://github.com/mirego/gaffe
|
88
111
|
licenses:
|
89
112
|
- BSD 3-Clause
|
@@ -99,7 +122,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
122
|
version: '0'
|
100
123
|
segments:
|
101
124
|
- 0
|
102
|
-
hash: -
|
125
|
+
hash: -2535410059027227615
|
103
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
127
|
none: false
|
105
128
|
requirements:
|
@@ -108,11 +131,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
131
|
version: '0'
|
109
132
|
segments:
|
110
133
|
- 0
|
111
|
-
hash: -
|
134
|
+
hash: -2535410059027227615
|
112
135
|
requirements: []
|
113
136
|
rubyforge_project:
|
114
137
|
rubygems_version: 1.8.23
|
115
138
|
signing_key:
|
116
139
|
specification_version: 3
|
117
140
|
summary: Gaffe handles Rails error pages in a clean, simple way.
|
118
|
-
test_files:
|
141
|
+
test_files:
|
142
|
+
- spec/gaffe/errors_spec.rb
|
143
|
+
- spec/gaffe/gaffe_spec.rb
|
144
|
+
- spec/spec_helper.rb
|