rescue-dog 0.0.2 → 0.0.3
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/README.md +16 -6
- data/app/views/errors/400.html.erb +2 -0
- data/app/views/errors/401.html.erb +2 -0
- data/app/views/errors/404.html.erb +2 -0
- data/app/views/errors/500.html.erb +2 -0
- data/app/views/layouts/application.html.erb +15 -0
- data/deploy_gem.sh +4 -0
- data/lib/rescue/controller/dynamic.rb +32 -0
- data/lib/rescue/controller/static.rb +23 -0
- data/lib/rescue/controller.rb +9 -24
- data/lib/rescue/version.rb +1 -1
- data/lib/rescue-dog.rb +9 -0
- data/public/400.html +11 -0
- data/public/400.json +1 -0
- data/public/401.html +11 -0
- data/public/401.json +1 -0
- data/spec/rails_spec_app.rb +35 -8
- data/spec/rescue/controller/dynamic_spec.rb +33 -0
- data/spec/rescue/controller/static_spec.rb +32 -0
- data/spec/rescue/controller_spec.rb +14 -0
- data/spec/rescue_spec.rb +36 -0
- data/spec/test_case.rb +1 -1
- metadata +21 -4
- data/spec/controller_spec.rb +0 -50
data/README.md
CHANGED
@@ -18,17 +18,27 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
+
### Render Static Files
|
21
22
|
$ vim app/controllers/application_controller.rb
|
22
23
|
class ApplicationController
|
23
24
|
|
24
|
-
include Rescue::Controller
|
25
|
+
include Rescue::Controller::Static
|
25
26
|
define_errors ServerError: 500, NotFound: 404
|
27
|
+
|
28
|
+
### Render Template
|
29
|
+
$ vim app/controllers/application_controller.rb
|
30
|
+
class ApplicationController
|
26
31
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
include Rescue::Controller::Dynamic
|
33
|
+
define_errors ServerError: 500, NotFound: 404
|
34
|
+
|
35
|
+
### Associated with the exceptions
|
36
|
+
Call the response method when raise an exception
|
37
|
+
|
38
|
+
#### for ActiveRecord
|
39
|
+
rescue_from ActiveRecord::RecordNotFound, with: lambda {|e| respond_status 404 }
|
40
|
+
#### for Mongoid
|
41
|
+
rescue_from Mongoid::Errors::DocumentNotFound, BSON::InvalidObjectId, with: lambda {|e| respond_status 404 }
|
32
42
|
|
33
43
|
## Contributing
|
34
44
|
|
data/deploy_gem.sh
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
module Rescue
|
4
|
+
module Controller
|
5
|
+
module Dynamic
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
base.extend Rescue::Controller::ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
|
13
|
+
def define_respond_method name
|
14
|
+
return if method_defined?(name)
|
15
|
+
define_method name do |code, exception = nil|
|
16
|
+
e = {}
|
17
|
+
e[:code] = code
|
18
|
+
e[:status] = Rack::Utils::HTTP_STATUS_CODES[code]
|
19
|
+
e[:message] = exception.message if exception
|
20
|
+
|
21
|
+
respond_to do |format|
|
22
|
+
format.html { render status: code, template: "/errors/#{code}" }
|
23
|
+
format.json { render status: code, json: { errors: [e] } }
|
24
|
+
format.xml { render status: code, xml: { errors: [e] } }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
module Rescue
|
4
|
+
module Controller
|
5
|
+
module Static
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
base.extend Rescue::Controller::ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
|
13
|
+
def define_respond_method name
|
14
|
+
return if method_defined?(name)
|
15
|
+
define_method name do |code, exception = nil|
|
16
|
+
render status: code, file: "#{Rails.root}/public/#{code}", layout: false and return
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/rescue/controller.rb
CHANGED
@@ -1,34 +1,19 @@
|
|
1
1
|
# coding: UTF-8
|
2
|
+
require File.join(File.dirname(__FILE__), "controller/static.rb")
|
3
|
+
require File.join(File.dirname(__FILE__), "controller/dynamic.rb")
|
4
|
+
|
2
5
|
module Rescue
|
3
6
|
module Controller
|
4
7
|
|
5
|
-
def self.included(base)
|
6
|
-
base.extend ClassMethods
|
7
|
-
end
|
8
|
-
|
9
8
|
module ClassMethods
|
10
|
-
def define_errors statuses, superclass = StandardError
|
11
|
-
statuses.each do |class_name, code|
|
12
|
-
respond = :"respond_#{code}"
|
13
|
-
|
14
|
-
define_error_class class_name, superclass
|
15
|
-
define_respond_method respond, code
|
16
9
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
def define_error_class class_name, superclass = StandardError
|
23
|
-
return if Object.const_defined?(class_name)
|
24
|
-
Object.const_set(class_name, Class.new(superclass))
|
25
|
-
end
|
10
|
+
def define_errors statuses, superclass = StandardError
|
11
|
+
respond = :respond_status
|
12
|
+
define_respond_method respond
|
26
13
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
define_method name do |e = nil|
|
31
|
-
render status: code, file: "#{Rails.root}/public/#{code}.#{request.format.to_sym}", layout: false and return
|
14
|
+
statuses.each do |class_name, code|
|
15
|
+
Rescue::Bind.define_error_class class_name, superclass
|
16
|
+
rescue_from "#{class_name}".constantize, with: lambda {|e| send(respond, code, e) }
|
32
17
|
end
|
33
18
|
end
|
34
19
|
end
|
data/lib/rescue/version.rb
CHANGED
data/lib/rescue-dog.rb
CHANGED
@@ -2,4 +2,13 @@ require "rescue/version"
|
|
2
2
|
|
3
3
|
require File.join(File.dirname(__FILE__),'rescue/controller.rb')
|
4
4
|
module Rescue
|
5
|
+
|
6
|
+
class Bind
|
7
|
+
class << self
|
8
|
+
def define_error_class class_name, superclass = nil
|
9
|
+
return if Object.const_defined?(class_name)
|
10
|
+
Object.const_set(class_name, Class.new(superclass||StandardError))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
5
14
|
end
|
data/public/400.html
ADDED
data/public/400.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"errors":[{"code":400,"status":"Bad Request"}]}
|
data/public/401.html
ADDED
data/public/401.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"errors":[{"code":401,"status":"Unauthorized"}]}
|
data/spec/rails_spec_app.rb
CHANGED
@@ -1,29 +1,56 @@
|
|
1
1
|
require 'action_controller/railtie'
|
2
2
|
require 'action_view/railtie'
|
3
3
|
|
4
|
+
# const
|
5
|
+
STATUSES = {
|
6
|
+
:bad_request => 400,
|
7
|
+
:unauthorized => 401,
|
8
|
+
:not_found => 404,
|
9
|
+
:server_error => 500,
|
10
|
+
}
|
11
|
+
|
4
12
|
# config
|
5
13
|
app = Class.new Rails::Application
|
6
14
|
app.config.active_support.deprecation = :log
|
7
15
|
app.config.secret_token = 'ccedfce890492dd9fe2908a69a8732104ae133f1e2488bf6a1e96685b05a96d7e11aeaa3da5ade27604a50c3b2c7cc8323dd03ad11bb2e52e95256fb67ef9c8a'
|
16
|
+
app.config.generators do |g|
|
17
|
+
g.template_engine :haml
|
18
|
+
end
|
8
19
|
app.initialize!
|
9
20
|
|
10
21
|
# routing
|
11
22
|
app.routes.draw do
|
12
|
-
|
13
|
-
get "/#{
|
23
|
+
STATUSES.each do |name, code|
|
24
|
+
get "/static/#{name}" =>"static##{name}" ,as: name
|
25
|
+
get "/dynamic/#{name}" =>"dynamic##{name}" ,as: name
|
14
26
|
end
|
15
27
|
end
|
16
28
|
|
17
29
|
# controllers
|
18
|
-
class ApplicationController < ActionController::Base;
|
19
|
-
|
20
|
-
|
30
|
+
class ApplicationController < ActionController::Base ; end
|
31
|
+
|
32
|
+
class StaticController < ApplicationController
|
33
|
+
include Rescue::Controller::Static
|
34
|
+
define_errors BadRequest: 400, Unauthorized: 401, NotFound: 404, ServerError: 500
|
35
|
+
|
36
|
+
STATUSES.each do |name, code|
|
37
|
+
class_name = "#{name}".classify
|
38
|
+
define_method name do
|
39
|
+
raise class_name.constantize
|
40
|
+
end
|
41
|
+
end
|
21
42
|
end
|
22
|
-
class ErrorsController < ApplicationController
|
23
43
|
|
24
|
-
|
25
|
-
|
44
|
+
class DynamicController < ApplicationController
|
45
|
+
include Rescue::Controller::Dynamic
|
46
|
+
define_errors BadRequest: 400, Unauthorized: 401, NotFound: 404, ServerError: 500
|
26
47
|
|
48
|
+
STATUSES.each do |name, code|
|
49
|
+
class_name = "#{name}".classify
|
50
|
+
define_method name do
|
51
|
+
raise class_name.constantize.new "This is an explanation of what caused the error."
|
52
|
+
end
|
53
|
+
end
|
27
54
|
end
|
28
55
|
|
29
56
|
Object.const_set(:ApplicationHelper,Module.new)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Rescue::Controller::Dynamic do
|
5
|
+
|
6
|
+
let(:object) { DynamicController.new }
|
7
|
+
|
8
|
+
describe "respond method" do
|
9
|
+
subject { object.methods.include?(:respond_status) }
|
10
|
+
it "should be called in a subclass of ApplicationController" do
|
11
|
+
should be_true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
TestCase::Controller::ERRORS.each do |name, code|
|
16
|
+
|
17
|
+
describe "response when raise #{name}" do
|
18
|
+
TestCase::Controller::FORMATS.each do |format|
|
19
|
+
context "request format => #{format}" do
|
20
|
+
before do
|
21
|
+
visit "/dynamic/#{name.to_s.underscore}.#{format.to_sym}"
|
22
|
+
end
|
23
|
+
|
24
|
+
subject { page }
|
25
|
+
it { should have_content name.to_s.gsub(/([A-Z]+)([A-Z][a-z])/,'\1 \2').gsub(/([a-z\d])([A-Z])/,'\1 \2') }
|
26
|
+
it { should have_content "This is an explanation of what caused the error." } unless format.to_sym == :html
|
27
|
+
it { response_headers["Content-Type"].should include(format.to_s) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end ## end each
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Rescue::Controller::Static do
|
5
|
+
|
6
|
+
let(:object) { StaticController.new }
|
7
|
+
|
8
|
+
describe "respond method" do
|
9
|
+
subject { object.methods.include?(:respond_status) }
|
10
|
+
it "should be called in a subclass of ApplicationController" do
|
11
|
+
should be_true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
TestCase::Controller::ERRORS.each do |name, code|
|
16
|
+
|
17
|
+
describe "response when raise #{name}" do
|
18
|
+
TestCase::Controller::FORMATS.each do |format|
|
19
|
+
context "request format => #{format}" do
|
20
|
+
before do
|
21
|
+
visit "/static/#{name.to_s.underscore}.#{format.to_sym}"
|
22
|
+
end
|
23
|
+
|
24
|
+
subject { page }
|
25
|
+
it { should have_content name.to_s.gsub(/([A-Z]+)([A-Z][a-z])/,'\1 \2').gsub(/([a-z\d])([A-Z])/,'\1 \2') }
|
26
|
+
it { response_headers["Content-Type"].should include(format.to_s) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end ## end each
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Rescue::Controller do
|
5
|
+
|
6
|
+
let(:dynamic) do
|
7
|
+
clazz = Class.new ApplicatoinController do
|
8
|
+
include Rescue::Controller
|
9
|
+
define_errors :dynamic, BadRequest: 400, Unauthorized: 401, NotFound: 404, ServerError: 500
|
10
|
+
end
|
11
|
+
clazz.new
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/spec/rescue_spec.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Rescue do
|
5
|
+
|
6
|
+
describe "define_error_class :RescueStandardError" do
|
7
|
+
let(:name) { :RescueStandardError }
|
8
|
+
before { Rescue::Bind.define_error_class name }
|
9
|
+
|
10
|
+
subject { Object.const_defined? name }
|
11
|
+
it "should define an exception class" do
|
12
|
+
should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
subject { Object.const_get(name).new }
|
16
|
+
it "should define an exception class that is a kind of StandardError" do
|
17
|
+
should be_a_kind_of StandardError
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "define_error_class :RescueScriptError, ScriptError" do
|
22
|
+
let(:name) { :RescueScriptError }
|
23
|
+
before { Rescue::Bind.define_error_class name, ScriptError }
|
24
|
+
|
25
|
+
subject { Object.const_defined? name }
|
26
|
+
it "should define an exception class" do
|
27
|
+
should be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
subject { Object.const_get(name).new }
|
31
|
+
it "should define an exception class that is a kind of StandardError" do
|
32
|
+
should be_a_kind_of ScriptError
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/spec/test_case.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rescue-dog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -40,17 +40,31 @@ files:
|
|
40
40
|
- LICENSE.txt
|
41
41
|
- README.md
|
42
42
|
- Rakefile
|
43
|
+
- app/views/errors/400.html.erb
|
44
|
+
- app/views/errors/401.html.erb
|
45
|
+
- app/views/errors/404.html.erb
|
46
|
+
- app/views/errors/500.html.erb
|
47
|
+
- app/views/layouts/application.html.erb
|
43
48
|
- deploy_gem.sh
|
44
49
|
- lib/rescue-dog.rb
|
45
50
|
- lib/rescue/controller.rb
|
51
|
+
- lib/rescue/controller/dynamic.rb
|
52
|
+
- lib/rescue/controller/static.rb
|
46
53
|
- lib/rescue/version.rb
|
54
|
+
- public/400.html
|
55
|
+
- public/400.json
|
56
|
+
- public/401.html
|
57
|
+
- public/401.json
|
47
58
|
- public/404.html
|
48
59
|
- public/404.json
|
49
60
|
- public/500.html
|
50
61
|
- public/500.json
|
51
62
|
- rescue-dog.gemspec
|
52
|
-
- spec/controller_spec.rb
|
53
63
|
- spec/rails_spec_app.rb
|
64
|
+
- spec/rescue/controller/dynamic_spec.rb
|
65
|
+
- spec/rescue/controller/static_spec.rb
|
66
|
+
- spec/rescue/controller_spec.rb
|
67
|
+
- spec/rescue_spec.rb
|
54
68
|
- spec/spec_helper.rb
|
55
69
|
- spec/test_case.rb
|
56
70
|
homepage: https://github.com/yulii/rescue-dog
|
@@ -78,7 +92,10 @@ signing_key:
|
|
78
92
|
specification_version: 3
|
79
93
|
summary: define respond methods
|
80
94
|
test_files:
|
81
|
-
- spec/controller_spec.rb
|
82
95
|
- spec/rails_spec_app.rb
|
96
|
+
- spec/rescue/controller/dynamic_spec.rb
|
97
|
+
- spec/rescue/controller/static_spec.rb
|
98
|
+
- spec/rescue/controller_spec.rb
|
99
|
+
- spec/rescue_spec.rb
|
83
100
|
- spec/spec_helper.rb
|
84
101
|
- spec/test_case.rb
|
data/spec/controller_spec.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
# coding: UTF-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe Rescue::Controller do
|
5
|
-
|
6
|
-
before do
|
7
|
-
@r = ErrorsController.new
|
8
|
-
end
|
9
|
-
|
10
|
-
TestCase::Controller::ERRORS.each do |name, code|
|
11
|
-
describe "#{name} exception class" do
|
12
|
-
subject { Object.const_defined? name }
|
13
|
-
it "should define '#{name}' class" do
|
14
|
-
should be_true
|
15
|
-
end
|
16
|
-
|
17
|
-
subject { Object.const_get(name).new }
|
18
|
-
it "should be a kind of StandardError" do
|
19
|
-
should be_a_kind_of StandardError
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "respond_#{code} method" do
|
24
|
-
subject { ApplicationController.method_defined? :"respond_#{code}" }
|
25
|
-
it "should be defined in ApplicationController" do
|
26
|
-
should be_true
|
27
|
-
end
|
28
|
-
|
29
|
-
subject { @r.methods.include?(:"respond_#{code}") }
|
30
|
-
it "should be called in a subclass of ApplicationController" do
|
31
|
-
should be_true
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "raise #{name}" do
|
36
|
-
TestCase::Controller::FORMATS.each do |format|
|
37
|
-
context "request format => #{format}" do
|
38
|
-
before do
|
39
|
-
visit "/#{name.to_s.underscore}.#{format.to_sym}"
|
40
|
-
end
|
41
|
-
|
42
|
-
subject { page }
|
43
|
-
it { should have_content name.to_s.gsub(/([A-Z]+)([A-Z][a-z])/,'\1 \2').gsub(/([a-z\d])([A-Z])/,'\1 \2') }
|
44
|
-
it { response_headers["Content-Type"].should include(format.to_s) }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end ## end each
|
49
|
-
|
50
|
-
end
|