rasti-web 1.1.0 → 1.2.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/.ruby-version +1 -1
- data/.travis.yml +12 -1
- data/README.md +32 -0
- data/Rakefile +2 -1
- data/lib/rasti/web/controller.rb +45 -9
- data/lib/rasti/web/render.rb +1 -1
- data/lib/rasti/web/version.rb +1 -1
- data/spec/controller_spec.rb +46 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5b7da3fc4edfaad86b1d790a3c003196931296d
|
4
|
+
data.tar.gz: c5609146785dc24b28067ed485becd91f46b613d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df8e6c78eca2b2dcfd8ff4cddcb80dbb3263fe3c3282e93fb8e1a091b6c3315bac8ced0777357d55067c839749e9b220b11f295efe8d0474202e258afff1e4bd
|
7
|
+
data.tar.gz: 5146ccb76aadf74162fc60e270dd21aed3d8bff3c10cccc23cffacf8dac3f2ab8764562dea8c7927bba5bb536c38ef94506097c8b818a995eb924dd3b1fc70b2
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.4.0
|
data/.travis.yml
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
language: ruby
|
2
|
+
|
2
3
|
rvm:
|
3
4
|
- 1.9.3
|
4
5
|
- 2.0
|
@@ -6,6 +7,16 @@ rvm:
|
|
6
7
|
- 2.2
|
7
8
|
- 2.3.0
|
8
9
|
- 2.4.0
|
9
|
-
- jruby
|
10
|
+
- jruby-1.7.25
|
11
|
+
- jruby-9.1.7.0
|
12
|
+
- ruby-head
|
13
|
+
- jruby-head
|
14
|
+
|
15
|
+
matrix:
|
16
|
+
fast_finish: true
|
17
|
+
allow_failures:
|
18
|
+
- rvm: ruby-head
|
19
|
+
- rvm: jruby-head
|
20
|
+
|
10
21
|
before_install:
|
11
22
|
- gem install bundler
|
data/README.md
CHANGED
@@ -62,6 +62,38 @@ class UsersController < Rasti::Web::Controller
|
|
62
62
|
end
|
63
63
|
```
|
64
64
|
|
65
|
+
### Hooks
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
class UsersController < Rasti::Web::Controller
|
69
|
+
|
70
|
+
before_action do |action_name|
|
71
|
+
end
|
72
|
+
|
73
|
+
before_action :action_name do
|
74
|
+
end
|
75
|
+
|
76
|
+
after_action do |action_name|
|
77
|
+
end
|
78
|
+
|
79
|
+
after_action :action_name do
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
### Error handling
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
class UsersController < Rasti::Web::Controller
|
89
|
+
|
90
|
+
rescue_from StandardError do |ex|
|
91
|
+
render.status 500, 'Unexpected error'
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
```
|
96
|
+
|
65
97
|
## Contributing
|
66
98
|
|
67
99
|
1. Fork it ( https://github.com/gabynaiman/rasti-web/fork )
|
data/Rakefile
CHANGED
@@ -3,7 +3,8 @@ require 'rake/testtask'
|
|
3
3
|
|
4
4
|
Rake::TestTask.new(:spec) do |t|
|
5
5
|
t.libs << 'spec'
|
6
|
-
t.
|
6
|
+
t.libs << 'lib'
|
7
|
+
t.pattern = ENV['DIR'] ? File.join(ENV['DIR'], '**', '*_spec.rb') : 'spec/**/*_spec.rb'
|
7
8
|
t.verbose = false
|
8
9
|
t.warning = false
|
9
10
|
t.loader = nil if ENV['TEST']
|
data/lib/rasti/web/controller.rb
CHANGED
@@ -16,26 +16,65 @@ module Rasti
|
|
16
16
|
end
|
17
17
|
|
18
18
|
class << self
|
19
|
+
|
19
20
|
def action(action_name)
|
20
21
|
raise "Undefined action '#{action_name}' in #{name}" unless instance_methods.include? action_name.to_sym
|
21
22
|
|
22
23
|
Endpoint.new do |req, res, render|
|
23
24
|
controller = new req, res, render
|
24
25
|
begin
|
26
|
+
call_before_action controller, action_name
|
25
27
|
controller.public_send action_name
|
26
28
|
rescue => ex
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
else
|
31
|
-
raise ex
|
32
|
-
end
|
29
|
+
call_exception_handler controller, ex
|
30
|
+
ensure
|
31
|
+
call_after_action controller, action_name
|
33
32
|
end
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
37
36
|
alias_method :>>, :action
|
38
37
|
|
38
|
+
def before_action(action_name=nil, &block)
|
39
|
+
before_action_hooks[action_name] = block
|
40
|
+
end
|
41
|
+
|
42
|
+
def after_action(action_name=nil, &block)
|
43
|
+
after_action_hooks[action_name] = block
|
44
|
+
end
|
45
|
+
|
46
|
+
def rescue_from(exception_class, &block)
|
47
|
+
exception_handlers[exception_class] = block
|
48
|
+
end
|
49
|
+
|
50
|
+
def call_before_action(controller, action_name)
|
51
|
+
hook = before_action_hooks[action_name] || before_action_hooks[nil]
|
52
|
+
controller.instance_exec action_name, &hook if hook
|
53
|
+
end
|
54
|
+
|
55
|
+
def call_after_action(controller, action_name)
|
56
|
+
hook = after_action_hooks[action_name] || after_action_hooks[nil]
|
57
|
+
controller.instance_exec action_name, &hook if hook
|
58
|
+
end
|
59
|
+
|
60
|
+
def call_exception_handler(controller, exception)
|
61
|
+
exception_class = handled_exceptions.detect { |klass| exception.is_a? klass }
|
62
|
+
exception_handler = exception_handlers[exception_class]
|
63
|
+
if exception_handler
|
64
|
+
controller.instance_exec exception, &exception_handler
|
65
|
+
else
|
66
|
+
raise exception
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def before_action_hooks
|
71
|
+
@before_action_hooks ||= superclass.respond_to?(:before_action_hooks) ? superclass.before_action_hooks : {}
|
72
|
+
end
|
73
|
+
|
74
|
+
def after_action_hooks
|
75
|
+
@after_action_hooks ||= superclass.respond_to?(:after_action_hooks) ? superclass.after_action_hooks : {}
|
76
|
+
end
|
77
|
+
|
39
78
|
def exception_handlers
|
40
79
|
@exception_handlers ||= superclass.respond_to?(:exception_handlers) ? superclass.exception_handlers : {}
|
41
80
|
end
|
@@ -44,9 +83,6 @@ module Rasti
|
|
44
83
|
@handled_exceptions ||= ClassAncestrySort.desc exception_handlers.keys
|
45
84
|
end
|
46
85
|
|
47
|
-
def rescue_from(exception_class, &block)
|
48
|
-
exception_handlers[exception_class] = block
|
49
|
-
end
|
50
86
|
end
|
51
87
|
|
52
88
|
end
|
data/lib/rasti/web/render.rb
CHANGED
data/lib/rasti/web/version.rb
CHANGED
data/spec/controller_spec.rb
CHANGED
@@ -1,7 +1,28 @@
|
|
1
1
|
require 'minitest_helper'
|
2
2
|
|
3
3
|
class TestController < Rasti::Web::Controller
|
4
|
+
|
4
5
|
CustomError = Class.new StandardError
|
6
|
+
|
7
|
+
def self.hooks_log
|
8
|
+
@hooks_log ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
before_action do |action_name|
|
12
|
+
self.class.hooks_log << "Before all: #{action_name}"
|
13
|
+
end
|
14
|
+
|
15
|
+
after_action do |action_name|
|
16
|
+
self.class.hooks_log << "After all: #{action_name}"
|
17
|
+
end
|
18
|
+
|
19
|
+
before_action :test do
|
20
|
+
self.class.hooks_log << 'Before single: test'
|
21
|
+
end
|
22
|
+
|
23
|
+
after_action :test do
|
24
|
+
self.class.hooks_log << 'After single: test'
|
25
|
+
end
|
5
26
|
|
6
27
|
def test
|
7
28
|
render.html 'Test HTML'
|
@@ -30,6 +51,10 @@ class TestController < Rasti::Web::Controller
|
|
30
51
|
end
|
31
52
|
|
32
53
|
describe Rasti::Web::Controller do
|
54
|
+
|
55
|
+
before do
|
56
|
+
TestController.hooks_log.clear
|
57
|
+
end
|
33
58
|
|
34
59
|
it 'Action endpoint' do
|
35
60
|
action = TestController.action :test
|
@@ -40,11 +65,17 @@ describe Rasti::Web::Controller do
|
|
40
65
|
status.must_equal 200
|
41
66
|
headers['Content-Type'].must_equal 'text/html; charset=utf-8'
|
42
67
|
response.body.must_equal ['Test HTML']
|
68
|
+
|
69
|
+
TestController.hooks_log.must_equal [
|
70
|
+
'Before single: test',
|
71
|
+
'After single: test'
|
72
|
+
]
|
43
73
|
end
|
44
74
|
|
45
75
|
it 'Invalid action' do
|
46
76
|
error = proc { TestController.action :invalid }.must_raise RuntimeError
|
47
77
|
error.message.must_equal "Undefined action 'invalid' in TestController"
|
78
|
+
TestController.hooks_log.must_be_empty
|
48
79
|
end
|
49
80
|
|
50
81
|
it 'Rescue explicit exception' do
|
@@ -54,6 +85,11 @@ describe Rasti::Web::Controller do
|
|
54
85
|
|
55
86
|
status.must_equal 500
|
56
87
|
response.body.must_equal ['Explicit error']
|
88
|
+
|
89
|
+
TestController.hooks_log.must_equal [
|
90
|
+
'Before all: explicit_fail',
|
91
|
+
'After all: explicit_fail'
|
92
|
+
]
|
57
93
|
end
|
58
94
|
|
59
95
|
it 'Rescue implicit exception' do
|
@@ -63,6 +99,11 @@ describe Rasti::Web::Controller do
|
|
63
99
|
|
64
100
|
status.must_equal 500
|
65
101
|
response.body.must_equal ['Implicit error']
|
102
|
+
|
103
|
+
TestController.hooks_log.must_equal [
|
104
|
+
'Before all: implicit_fail',
|
105
|
+
'After all: implicit_fail'
|
106
|
+
]
|
66
107
|
end
|
67
108
|
|
68
109
|
it 'Unexpected exception' do
|
@@ -71,6 +112,11 @@ describe Rasti::Web::Controller do
|
|
71
112
|
|
72
113
|
error = proc { action.call env }.must_raise RuntimeError
|
73
114
|
error.message.must_equal 'Unexpected error'
|
115
|
+
|
116
|
+
TestController.hooks_log.must_equal [
|
117
|
+
'Before all: exception',
|
118
|
+
'After all: exception'
|
119
|
+
]
|
74
120
|
end
|
75
121
|
|
76
122
|
end
|
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.
|
4
|
+
version: 1.2.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-
|
11
|
+
date: 2017-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -300,7 +300,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
300
300
|
version: '0'
|
301
301
|
requirements: []
|
302
302
|
rubyforge_project:
|
303
|
-
rubygems_version: 2.
|
303
|
+
rubygems_version: 2.6.8
|
304
304
|
signing_key:
|
305
305
|
specification_version: 4
|
306
306
|
summary: Web blocks to build robust applications
|