rasti-web 1.0.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 50a62a6c007c11424a97fd9eb207ca0cb1641bb0
4
- data.tar.gz: 04bf7b2fe637a40625b401227d8c1ffe61088b6c
3
+ metadata.gz: 8be22c6b9730ecebfc6deb7449fc33fc580eedfa
4
+ data.tar.gz: 260d7b82a6a975f7872c0e6d5a2cff49f526272f
5
5
  SHA512:
6
- metadata.gz: 22684f3a9e873bdf5e3a30e468013ebe310d33c555e7b37068f016e765eecfbd0d89e9109d2434305ba2b90afd21e6b4fc972fd1e00e5a0967848b9da90bdb95
7
- data.tar.gz: f8ec4a69517f0c2c8eec1d130b0b70bb3ae34ac7752cdff43da466fa49b439dd072df5ed243ff303adcce1090a9b5fa28ceefa53f6c3dd12b6f223cd3ec0fda1
6
+ metadata.gz: 2255e469c1232c3f66a83e17aea842e34f55d51e7c23656be60f30b90785c864e08aed79dd6f6a6f7ebc72256ab95bfc218c6a077418ec0c09c3821e16fdc119
7
+ data.tar.gz: ee292a32f9ec7142d1bb0ab386d635fb128bcc277e44bda50430761b183d361d699bdce02e531766bf5513a4ae08011081ddda445c1258146387e95af144a4c8
data/lib/rasti/web.rb CHANGED
@@ -7,6 +7,7 @@ require 'class_config'
7
7
  require 'forwardable'
8
8
  require 'logger'
9
9
  require 'hash_ext'
10
+ require 'class_ancestry_sort'
10
11
 
11
12
  require_relative 'web/route'
12
13
  require_relative 'web/router'
@@ -24,8 +24,9 @@ module Rasti
24
24
  begin
25
25
  controller.public_send action_name
26
26
  rescue => ex
27
- if controller.respond_to? ex.class.name
28
- controller.public_send ex.class.name, ex
27
+ exception_class = handled_exceptions.detect { |klass| ex.is_a? klass }
28
+ if exception_class
29
+ controller.instance_exec ex, &exception_handlers[exception_class]
29
30
  else
30
31
  raise ex
31
32
  end
@@ -35,10 +36,16 @@ module Rasti
35
36
 
36
37
  alias_method :>>, :action
37
38
 
39
+ def exception_handlers
40
+ @exception_handlers ||= superclass.respond_to?(:exception_handlers) ? superclass.exception_handlers : {}
41
+ end
42
+
43
+ def handled_exceptions
44
+ @handled_exceptions ||= ClassAncestrySort.desc exception_handlers.keys
45
+ end
46
+
38
47
  def rescue_from(exception_class, &block)
39
- define_method exception_class.name do |ex|
40
- instance_exec ex, &block
41
- end
48
+ exception_handlers[exception_class] = block
42
49
  end
43
50
  end
44
51
 
@@ -1,5 +1,5 @@
1
1
  module Rasti
2
2
  module Web
3
- VERSION = '1.0.0'
3
+ VERSION = '1.1.0'
4
4
  end
5
5
  end
data/rasti-web.gemspec CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency 'class_config', '~> 0.0.2'
25
25
  spec.add_dependency 'hash_ext', '~> 0.1'
26
26
  spec.add_dependency 'content-type', '~> 0.0'
27
+ spec.add_dependency 'class_ancestry_sort', '~> 0.1'
27
28
 
28
29
  spec.add_development_dependency 'bundler', '~> 1.12'
29
30
  spec.add_development_dependency 'rake', '~> 11.0'
@@ -39,5 +40,6 @@ Gem::Specification.new do |spec|
39
40
  spec.add_development_dependency 'term-ansicolor', '~> 1.3.0'
40
41
  spec.add_development_dependency 'tins', '~> 1.6.0'
41
42
  spec.add_development_dependency 'json', '~> 1.8'
43
+ spec.add_development_dependency 'parslet', '~> 1.7.0'
42
44
  end
43
45
  end
@@ -11,13 +11,22 @@ class TestController < Rasti::Web::Controller
11
11
  raise 'Unexpected error'
12
12
  end
13
13
 
14
- def fail
15
- raise CustomError, 'Expected error'
14
+ def explicit_fail
15
+ raise CustomError, 'Explicit error'
16
+ end
17
+
18
+ def implicit_fail
19
+ raise EOFError, 'Implicit error'
16
20
  end
17
21
 
18
22
  rescue_from CustomError do |ex|
19
23
  render.status 500, ex.message
20
24
  end
25
+
26
+ rescue_from IOError do |ex|
27
+ render.status 500, ex.message
28
+ end
29
+
21
30
  end
22
31
 
23
32
  describe Rasti::Web::Controller do
@@ -38,13 +47,22 @@ describe Rasti::Web::Controller do
38
47
  error.message.must_equal "Undefined action 'invalid' in TestController"
39
48
  end
40
49
 
41
- it 'Rescue exception' do
42
- action = TestController.action :fail
43
- env = Rack::MockRequest.env_for '/fail'
50
+ it 'Rescue explicit exception' do
51
+ action = TestController.action :explicit_fail
52
+ env = Rack::MockRequest.env_for '/explicit_fail'
53
+ status, headers, response = action.call env
54
+
55
+ status.must_equal 500
56
+ response.body.must_equal ['Explicit error']
57
+ end
58
+
59
+ it 'Rescue implicit exception' do
60
+ action = TestController.action :implicit_fail
61
+ env = Rack::MockRequest.env_for '/implicit_fail'
44
62
  status, headers, response = action.call env
45
63
 
46
64
  status.must_equal 500
47
- response.body.must_equal ['Expected error']
65
+ response.body.must_equal ['Implicit error']
48
66
  end
49
67
 
50
68
  it 'Unexpected exception' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rasti-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Naiman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-13 00:00:00.000000000 Z
11
+ date: 2017-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: class_ancestry_sort
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.1'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement