rack-app 0.12.1 → 0.13.0
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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/rack/app.rb +22 -4
- data/lib/rack/app/endpoint.rb +4 -7
- data/lib/rack/app/endpoint/not_found.rb +2 -1
- data/lib/rack/app/error_handler.rb +35 -0
- data/lib/rack/app/serializer.rb +15 -0
- data/lib/rack/app/test.rb +23 -8
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58f26a39292b8d52e2bfeabf12e5bdeb865cd9e4
|
4
|
+
data.tar.gz: f1fa441f35fe56d10ede7e4731281210f8b5d352
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fa94365b0a18d26dc3f666a38bafe6686227d68599dce43a1d941aaac736ec678831537ed5dd00f404c44f166c9eff17a43bb36633f79ea95ac70d39ee46980
|
7
|
+
data.tar.gz: 462d5fca3c4429ccdc942159666539500850801cc571e6ad75db1ff73790952d20e46f42b9e2f1e0beecef5f6bb96e41e332f47797da1f88390a01fa386a40e9
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.13.0
|
data/lib/rack/app.rb
CHANGED
@@ -7,12 +7,14 @@ class Rack::App
|
|
7
7
|
require 'rack/app/constants'
|
8
8
|
|
9
9
|
require 'rack/app/params'
|
10
|
-
require 'rack/app/utils'
|
11
10
|
require 'rack/app/router'
|
12
11
|
require 'rack/app/endpoint'
|
12
|
+
require 'rack/app/serializer'
|
13
|
+
require 'rack/app/error_handler'
|
13
14
|
require 'rack/app/endpoint/not_found'
|
14
15
|
require 'rack/app/request_configurator'
|
15
16
|
|
17
|
+
require 'rack/app/utils'
|
16
18
|
require 'rack/app/file'
|
17
19
|
|
18
20
|
class << self
|
@@ -70,6 +72,15 @@ class Rack::App
|
|
70
72
|
end
|
71
73
|
end
|
72
74
|
|
75
|
+
def error(*exception_classes,&block)
|
76
|
+
@error_handler ||= Rack::App::ErrorHandler.new
|
77
|
+
unless block.nil?
|
78
|
+
@error_handler.register_handler(exception_classes,block)
|
79
|
+
end
|
80
|
+
|
81
|
+
return @error_handler
|
82
|
+
end
|
83
|
+
|
73
84
|
def router
|
74
85
|
@router ||= Rack::App::Router.new
|
75
86
|
end
|
@@ -81,7 +92,8 @@ class Rack::App
|
|
81
92
|
:request_method => request_method,
|
82
93
|
:request_path => request_path,
|
83
94
|
:description => @last_description,
|
84
|
-
:serializer =>
|
95
|
+
:serializer => serializer,
|
96
|
+
:error_handler => error,
|
85
97
|
:app_class => self
|
86
98
|
}
|
87
99
|
|
@@ -104,8 +116,14 @@ class Rack::App
|
|
104
116
|
return nil
|
105
117
|
end
|
106
118
|
|
107
|
-
def serializer(&
|
108
|
-
@serializer
|
119
|
+
def serializer(&definition_how_to_serialize)
|
120
|
+
@serializer ||= Rack::App::Serializer.new
|
121
|
+
|
122
|
+
unless definition_how_to_serialize.nil?
|
123
|
+
@serializer.set_serialization_logic(definition_how_to_serialize)
|
124
|
+
end
|
125
|
+
|
126
|
+
return @serializer
|
109
127
|
end
|
110
128
|
|
111
129
|
end
|
data/lib/rack/app/endpoint.rb
CHANGED
@@ -5,8 +5,9 @@ class Rack::App::Endpoint
|
|
5
5
|
def initialize(properties)
|
6
6
|
@properties = properties
|
7
7
|
@logic_block = properties[:user_defined_logic]
|
8
|
-
@serializer = properties[:serializer]
|
8
|
+
@serializer = properties[:serializer]
|
9
9
|
@api_class = properties[:app_class]
|
10
|
+
@error_handler = properties[:error_handler]
|
10
11
|
|
11
12
|
@path_params_matcher = {}
|
12
13
|
end
|
@@ -23,7 +24,7 @@ class Rack::App::Endpoint
|
|
23
24
|
request_handler.response = response
|
24
25
|
request.env['rack.app.path_params_matcher']= @path_params_matcher.dup
|
25
26
|
|
26
|
-
call_return = request_handler.instance_exec(&@logic_block)
|
27
|
+
call_return = @error_handler.execute_with_error_handling { request_handler.instance_exec(&@logic_block) }
|
27
28
|
|
28
29
|
return call_return if is_a_rack_response_finish?(call_return)
|
29
30
|
add_response_body_if_missing(call_return, response)
|
@@ -39,7 +40,7 @@ class Rack::App::Endpoint
|
|
39
40
|
protected
|
40
41
|
|
41
42
|
def add_response_body_if_missing(call_return, response)
|
42
|
-
response.write(String(@serializer.
|
43
|
+
response.write(String(@serializer.serialize(call_return))) if response.body.empty?
|
43
44
|
end
|
44
45
|
|
45
46
|
def is_a_rack_response_finish?(call_return)
|
@@ -49,8 +50,4 @@ class Rack::App::Endpoint
|
|
49
50
|
call_return[1].is_a?(Hash)
|
50
51
|
end
|
51
52
|
|
52
|
-
def default_serializer
|
53
|
-
lambda { |o| o.to_s }
|
54
|
-
end
|
55
|
-
|
56
53
|
end
|
@@ -8,7 +8,8 @@ not_found_properties = {
|
|
8
8
|
:request_method => 'GET',
|
9
9
|
:request_path => '\404',
|
10
10
|
:description => 'page not found',
|
11
|
-
:serializer =>
|
11
|
+
:serializer => Rack::App::Serializer.new,
|
12
|
+
:error_handler => Rack::App::ErrorHandler.new,
|
12
13
|
:app_class => app_class
|
13
14
|
}
|
14
15
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Rack::App::ErrorHandler
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
@handlers = {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def register_handler(exception_classes, handler_block)
|
8
|
+
exception_classes.each do |exception_class|
|
9
|
+
@handlers[exception_class]= handler_block
|
10
|
+
end
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute_with_error_handling
|
15
|
+
yield
|
16
|
+
rescue *[Exception, @handlers.keys].flatten => ex
|
17
|
+
get_handler(ex).call(ex)
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def get_handler(ex)
|
23
|
+
explicit(ex) || parent(ex) || raise(ex)
|
24
|
+
end
|
25
|
+
|
26
|
+
def explicit(ex)
|
27
|
+
@handlers[ex.class]
|
28
|
+
end
|
29
|
+
|
30
|
+
def parent(ex)
|
31
|
+
handler = @handlers.find { |exception_class, handler| ex.class <= exception_class }
|
32
|
+
return handler.nil? ? nil : handler.last
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/lib/rack/app/test.rb
CHANGED
@@ -2,23 +2,38 @@ require 'uri'
|
|
2
2
|
require 'rack/app'
|
3
3
|
module Rack::App::Test
|
4
4
|
|
5
|
-
# magic ;)
|
6
5
|
def self.included(klass)
|
7
|
-
|
6
|
+
klass.__send__(:extend,SpecHelpers)
|
7
|
+
end
|
8
8
|
|
9
|
-
|
9
|
+
module SpecHelpers
|
10
10
|
|
11
|
-
|
12
|
-
subject_app = rack_app_class.is_a?(Class) ? rack_app_class : Class.new(Rack::App)
|
13
|
-
subject_app.class_eval(&constructor) unless constructor.nil?
|
11
|
+
def rack_app(*args,&constructor)
|
14
12
|
|
13
|
+
begin
|
14
|
+
let(:rack_app){ rack_app_by(*args,&constructor) }
|
15
|
+
rescue NoMethodError
|
15
16
|
define_method(:rack_app) do
|
16
|
-
|
17
|
+
rack_app_by(*args,&constructor)
|
17
18
|
end
|
18
|
-
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def rack_app_by(*args,&constructor)
|
26
|
+
subject_app = nil
|
27
|
+
rack_app_class = args.shift
|
28
|
+
|
29
|
+
if constructor.nil?
|
30
|
+
subject_app = rack_app_class
|
31
|
+
else
|
32
|
+
subject_app = Class.new(rack_app_class || Rack::App)
|
33
|
+
subject_app.class_eval(&constructor)
|
34
|
+
end
|
35
|
+
|
36
|
+
subject_app
|
22
37
|
end
|
23
38
|
|
24
39
|
[:get, :post, :put, :delete, :options, :patch].each do |request_method|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Luzsi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-02-
|
12
|
+
date: 2016-02-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/rack/app/constants.rb
|
92
92
|
- lib/rack/app/endpoint.rb
|
93
93
|
- lib/rack/app/endpoint/not_found.rb
|
94
|
+
- lib/rack/app/error_handler.rb
|
94
95
|
- lib/rack/app/file.rb
|
95
96
|
- lib/rack/app/file/server.rb
|
96
97
|
- lib/rack/app/file/streamer.rb
|
@@ -100,6 +101,7 @@ files:
|
|
100
101
|
- lib/rack/app/router.rb
|
101
102
|
- lib/rack/app/router/dynamic.rb
|
102
103
|
- lib/rack/app/router/static.rb
|
104
|
+
- lib/rack/app/serializer.rb
|
103
105
|
- lib/rack/app/test.rb
|
104
106
|
- lib/rack/app/utils.rb
|
105
107
|
- lib/rack/app/version.rb
|