deas 0.26.0 → 0.27.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/deas/deas_runner.rb +34 -0
- data/lib/deas/redirect_proxy.rb +4 -0
- data/lib/deas/route.rb +16 -6
- data/lib/deas/route_proxy.rb +3 -3
- data/lib/deas/runner.rb +10 -2
- data/lib/deas/sinatra_runner.rb +15 -45
- data/lib/deas/template.rb +3 -3
- data/lib/deas/test_runner.rb +13 -20
- data/lib/deas/version.rb +1 -1
- data/lib/deas/view_handler.rb +0 -2
- data/test/support/fake_sinatra_call.rb +17 -3
- data/test/support/routes.rb +0 -9
- data/test/support/view_handlers.rb +15 -46
- data/test/system/rack_tests.rb +0 -8
- data/test/unit/deas_runner_tests.rb +97 -0
- data/test/unit/redirect_proxy_tests.rb +3 -1
- data/test/unit/route_proxy_tests.rb +12 -8
- data/test/unit/route_tests.rb +92 -8
- data/test/unit/router_tests.rb +9 -9
- data/test/unit/runner_tests.rb +22 -8
- data/test/unit/server_configuration_tests.rb +2 -2
- data/test/unit/sinatra_app_tests.rb +1 -1
- data/test/unit/sinatra_runner_tests.rb +21 -82
- data/test/unit/template_tests.rb +5 -0
- data/test/unit/test_runner_tests.rb +22 -32
- data/test/unit/view_handler_tests.rb +74 -54
- metadata +7 -4
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'deas/runner'
|
2
|
+
|
3
|
+
module Deas
|
4
|
+
|
5
|
+
class DeasRunner < Runner
|
6
|
+
|
7
|
+
def initialize(handler_class, args = nil)
|
8
|
+
a = args || {}
|
9
|
+
runner_args = a.merge(:params => NormalizedParams.new(a[:params]).value)
|
10
|
+
super(handler_class, runner_args)
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
run_callbacks self.handler_class.before_callbacks
|
15
|
+
self.handler.init
|
16
|
+
response_data = self.handler.run
|
17
|
+
run_callbacks self.handler_class.after_callbacks
|
18
|
+
response_data
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def run_callbacks(callbacks)
|
24
|
+
callbacks.each{|proc| self.handler.instance_eval(&proc) }
|
25
|
+
end
|
26
|
+
|
27
|
+
class NormalizedParams < Deas::Runner::NormalizedParams
|
28
|
+
def file_type?(value)
|
29
|
+
value.kind_of?(::Tempfile)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/lib/deas/redirect_proxy.rb
CHANGED
@@ -2,6 +2,7 @@ require 'deas/view_handler'
|
|
2
2
|
require 'deas/url'
|
3
3
|
|
4
4
|
module Deas
|
5
|
+
|
5
6
|
class RedirectProxy
|
6
7
|
|
7
8
|
attr_reader :handler_class_name, :handler_class
|
@@ -39,5 +40,8 @@ module Deas
|
|
39
40
|
@handler_class_name = @handler_class.name
|
40
41
|
end
|
41
42
|
|
43
|
+
def validate!; end
|
44
|
+
|
42
45
|
end
|
46
|
+
|
43
47
|
end
|
data/lib/deas/route.rb
CHANGED
@@ -4,19 +4,29 @@ module Deas
|
|
4
4
|
|
5
5
|
class Route
|
6
6
|
|
7
|
-
attr_reader :method, :path, :
|
7
|
+
attr_reader :method, :path, :route_proxy, :handler_class
|
8
8
|
|
9
|
-
def initialize(method, path,
|
10
|
-
@method, @path, @
|
9
|
+
def initialize(method, path, route_proxy)
|
10
|
+
@method, @path, @route_proxy = method, path, route_proxy
|
11
11
|
end
|
12
12
|
|
13
13
|
def validate!
|
14
|
-
@
|
14
|
+
@route_proxy.validate!
|
15
|
+
@handler_class = @route_proxy.handler_class
|
15
16
|
end
|
16
17
|
|
17
|
-
# TODO: unit test this??
|
18
18
|
def run(sinatra_call)
|
19
|
-
|
19
|
+
args = {
|
20
|
+
:sinatra_call => sinatra_call,
|
21
|
+
:request => sinatra_call.request,
|
22
|
+
:response => sinatra_call.response,
|
23
|
+
:params => sinatra_call.params,
|
24
|
+
:logger => sinatra_call.settings.logger,
|
25
|
+
:router => sinatra_call.settings.router,
|
26
|
+
:session => sinatra_call.session
|
27
|
+
}
|
28
|
+
runner = Deas::SinatraRunner.new(self.handler_class, args)
|
29
|
+
|
20
30
|
sinatra_call.request.env.tap do |env|
|
21
31
|
env['deas.params'] = runner.params
|
22
32
|
env['deas.handler_class_name'] = self.handler_class.name
|
data/lib/deas/route_proxy.rb
CHANGED
@@ -4,14 +4,14 @@ require 'deas/exceptions'
|
|
4
4
|
module Deas
|
5
5
|
class RouteProxy
|
6
6
|
|
7
|
-
attr_reader :handler_class_name
|
7
|
+
attr_reader :handler_class_name, :handler_class
|
8
8
|
|
9
9
|
def initialize(handler_class_name)
|
10
10
|
@handler_class_name = handler_class_name
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
constantize(@handler_class_name).tap do |handler_class|
|
13
|
+
def validate!
|
14
|
+
@handler_class = constantize(@handler_class_name).tap do |handler_class|
|
15
15
|
raise(NoHandlerClassError.new(@handler_class_name)) if !handler_class
|
16
16
|
end
|
17
17
|
end
|
data/lib/deas/runner.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'rack/utils'
|
2
|
+
require 'deas/router'
|
2
3
|
|
3
4
|
module Deas
|
4
5
|
|
@@ -8,9 +9,17 @@ module Deas
|
|
8
9
|
attr_reader :request, :response, :params
|
9
10
|
attr_reader :logger, :router, :session
|
10
11
|
|
11
|
-
def initialize(handler_class)
|
12
|
+
def initialize(handler_class, args = nil)
|
12
13
|
@handler_class = handler_class
|
13
14
|
@handler = @handler_class.new(self)
|
15
|
+
|
16
|
+
a = args || {}
|
17
|
+
@request = a[:request]
|
18
|
+
@response = a[:response]
|
19
|
+
@params = a[:params] || {}
|
20
|
+
@logger = a[:logger] || Deas::NullLogger.new
|
21
|
+
@router = a[:router] || Deas::Router.new
|
22
|
+
@session = a[:session]
|
14
23
|
end
|
15
24
|
|
16
25
|
def halt(*args); raise NotImplementedError; end
|
@@ -19,7 +28,6 @@ module Deas
|
|
19
28
|
def status(*args); raise NotImplementedError; end
|
20
29
|
def headers(*args); raise NotImplementedError; end
|
21
30
|
def render(*args); raise NotImplementedError; end
|
22
|
-
def partial(*args); raise NotImplementedError; end
|
23
31
|
def send_file(*args); raise NotImplementedError; end
|
24
32
|
|
25
33
|
class NormalizedParams
|
data/lib/deas/sinatra_runner.rb
CHANGED
@@ -1,32 +1,13 @@
|
|
1
|
-
require 'deas/
|
1
|
+
require 'deas/deas_runner'
|
2
2
|
require 'deas/template'
|
3
3
|
|
4
4
|
module Deas
|
5
5
|
|
6
|
-
class SinatraRunner <
|
6
|
+
class SinatraRunner < DeasRunner
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
@sinatra_call = sinatra_call
|
12
|
-
@app_settings = @sinatra_call.settings
|
13
|
-
|
14
|
-
@request = @sinatra_call.request
|
15
|
-
@response = @sinatra_call.response
|
16
|
-
@params = NormalizedParams.new(@sinatra_call.params).value
|
17
|
-
@logger = @sinatra_call.settings.logger
|
18
|
-
@router = @sinatra_call.settings.router
|
19
|
-
@session = @sinatra_call.session
|
20
|
-
|
21
|
-
super(handler_class)
|
22
|
-
end
|
23
|
-
|
24
|
-
def run
|
25
|
-
run_callbacks @handler_class.before_callbacks
|
26
|
-
@handler.init
|
27
|
-
response_data = @handler.run
|
28
|
-
run_callbacks @handler_class.after_callbacks
|
29
|
-
response_data
|
8
|
+
def initialize(handler_class, args = nil)
|
9
|
+
@sinatra_call = (args || {})[:sinatra_call]
|
10
|
+
super(handler_class, args)
|
30
11
|
end
|
31
12
|
|
32
13
|
# Helpers
|
@@ -59,41 +40,30 @@ module Deas
|
|
59
40
|
@sinatra_call.headers(*args)
|
60
41
|
end
|
61
42
|
|
62
|
-
def render(template_name,
|
63
|
-
|
43
|
+
def render(template_name, opts = nil, &block)
|
44
|
+
self.content_type(get_content_type(template_name)) if self.content_type.nil?
|
45
|
+
|
46
|
+
# TODO: move to DeasRunner, don't pass sinatra call to create template
|
47
|
+
# def render(template_name, *args, &block)
|
48
|
+
# super(template_name, *args, &block)
|
49
|
+
options = opts || {}
|
64
50
|
options[:locals] = {
|
65
|
-
:view =>
|
66
|
-
:logger =>
|
51
|
+
:view => self.handler,
|
52
|
+
:logger => self.logger
|
67
53
|
}.merge(options[:locals] || {})
|
68
|
-
options[:layout]
|
69
|
-
|
70
|
-
self.content_type(get_content_type(template_name)) if self.content_type.nil?
|
54
|
+
options[:layout] = self.handler_class.layouts if !options.key?(:layout)
|
71
55
|
Deas::Template.new(@sinatra_call, template_name, options).render(&block)
|
72
56
|
end
|
73
57
|
|
74
|
-
def partial(partial_name, locals = nil)
|
75
|
-
Deas::Template::Partial.new(@sinatra_call, partial_name, locals).render
|
76
|
-
end
|
77
|
-
|
78
58
|
def send_file(*args, &block)
|
79
59
|
@sinatra_call.send_file(*args, &block)
|
80
60
|
end
|
81
61
|
|
82
62
|
private
|
83
63
|
|
84
|
-
def run_callbacks(callbacks)
|
85
|
-
callbacks.each{|proc| @handler.instance_eval(&proc) }
|
86
|
-
end
|
87
|
-
|
88
64
|
def get_content_type(template_name)
|
89
65
|
File.extname(template_name)[1..-1] || 'html'
|
90
66
|
end
|
91
67
|
|
92
|
-
class NormalizedParams < Deas::Runner::NormalizedParams
|
93
|
-
def file_type?(value)
|
94
|
-
value.kind_of?(::Tempfile)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
68
|
end
|
99
69
|
end
|
data/lib/deas/template.rb
CHANGED
@@ -76,9 +76,9 @@ module Deas
|
|
76
76
|
|
77
77
|
def initialize(sinatra_call, name, locals = nil)
|
78
78
|
options = { :locals => (locals || {}) }
|
79
|
-
name =
|
80
|
-
basename = File.basename(
|
81
|
-
|
79
|
+
name = name.to_s.tap do |n|
|
80
|
+
basename = File.basename(n)
|
81
|
+
n.sub!(/#{basename}\Z/, "_#{basename}") unless basename[0] == '_'[0]
|
82
82
|
end
|
83
83
|
super sinatra_call, name, options
|
84
84
|
end
|
data/lib/deas/test_runner.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'ostruct'
|
2
1
|
require 'rack/multipart'
|
3
2
|
require 'deas/router'
|
4
3
|
require 'deas/runner'
|
@@ -7,27 +6,26 @@ module Deas
|
|
7
6
|
|
8
7
|
class TestRunner < Runner
|
9
8
|
|
10
|
-
attr_reader :
|
9
|
+
attr_reader :return_value
|
11
10
|
|
12
11
|
def initialize(handler_class, args = nil)
|
13
12
|
args = (args || {}).dup
|
14
|
-
@app_settings = OpenStruct.new(args.delete(:app_settings))
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
args.each{|key, value|
|
25
|
-
|
26
|
-
@return_value = catch(:halt){
|
14
|
+
super(handler_class, {
|
15
|
+
:request => args.delete(:request),
|
16
|
+
:response => args.delete(:response),
|
17
|
+
:params => NormalizedParams.new(args.delete(:params) || {}).value,
|
18
|
+
:logger => args.delete(:logger),
|
19
|
+
:router => args.delete(:router),
|
20
|
+
:session => args.delete(:session)
|
21
|
+
})
|
22
|
+
args.each{|key, value| self.handler.send("#{key}=", value) }
|
23
|
+
|
24
|
+
@return_value = catch(:halt){ self.handler.init; nil }
|
27
25
|
end
|
28
26
|
|
29
27
|
def run
|
30
|
-
@return_value ||= catch(:halt){
|
28
|
+
@return_value ||= catch(:halt){ self.handler.run }
|
31
29
|
end
|
32
30
|
|
33
31
|
# Helpers
|
@@ -74,11 +72,6 @@ module Deas
|
|
74
72
|
end
|
75
73
|
RenderArgs = Struct.new(:template_name, :options, :block)
|
76
74
|
|
77
|
-
def partial(partial_name, locals = nil)
|
78
|
-
PartialArgs.new(partial_name, locals)
|
79
|
-
end
|
80
|
-
PartialArgs = Struct.new(:partial_name, :locals)
|
81
|
-
|
82
75
|
def send_file(file_path, options = nil, &block)
|
83
76
|
SendFileArgs.new(file_path, options, block)
|
84
77
|
end
|
data/lib/deas/version.rb
CHANGED
data/lib/deas/view_handler.rb
CHANGED
@@ -54,10 +54,8 @@ module Deas
|
|
54
54
|
def headers(*args); @deas_runner.headers(*args); end
|
55
55
|
|
56
56
|
def render(*args, &block); @deas_runner.render(*args, &block); end
|
57
|
-
def partial(*args, &block); @deas_runner.partial(*args, &block); end
|
58
57
|
def send_file(*args, &block); @deas_runner.send_file(*args, &block); end
|
59
58
|
|
60
|
-
def app_settings; @deas_runner.app_settings; end
|
61
59
|
def logger; @deas_runner.logger; end
|
62
60
|
def router; @deas_runner.router; end
|
63
61
|
def request; @deas_runner.request; end
|
@@ -1,18 +1,21 @@
|
|
1
|
-
require 'deas'
|
2
1
|
require 'ostruct'
|
2
|
+
require 'deas'
|
3
|
+
require 'deas/router'
|
3
4
|
|
4
5
|
class FakeSinatraCall
|
5
6
|
|
6
7
|
# Mimic's the context that is accessible in a Sinatra' route. Should provide
|
7
8
|
# any methods needed to replace using an actual Sinatra app.
|
8
9
|
|
9
|
-
attr_accessor :request, :response, :params, :
|
10
|
+
attr_accessor :request, :response, :params, :logger, :router, :session
|
11
|
+
attr_accessor :settings
|
10
12
|
|
11
13
|
def initialize(settings={})
|
12
|
-
@request
|
14
|
+
@request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
|
13
15
|
@response = FakeResponse.new
|
14
16
|
@params = @request.params
|
15
17
|
@logger = Deas::NullLogger.new
|
18
|
+
@router = Deas::Router.new
|
16
19
|
@session = @request.session
|
17
20
|
|
18
21
|
@settings = OpenStruct.new({
|
@@ -58,5 +61,16 @@ end
|
|
58
61
|
|
59
62
|
class FakeRequest < Struct.new(:http_method, :path, :params, :session)
|
60
63
|
alias :request_method :http_method
|
64
|
+
|
65
|
+
attr_reader :logging_msgs
|
66
|
+
|
67
|
+
def env
|
68
|
+
@env ||= {
|
69
|
+
'deas.logging' => Proc.new do |msg|
|
70
|
+
@logging_msgs ||= []
|
71
|
+
@logging_msgs.push(msg)
|
72
|
+
end
|
73
|
+
}
|
74
|
+
end
|
61
75
|
end
|
62
76
|
FakeResponse = Struct.new(:status, :headers, :body)
|
data/test/support/routes.rb
CHANGED
@@ -37,7 +37,6 @@ class DeasTestServer
|
|
37
37
|
get '/haml_with_layout', 'HamlWithLayoutHandler'
|
38
38
|
get '/with_haml_layout', 'WithHamlLayoutHandler'
|
39
39
|
get '/haml_with_haml_layout', 'HamlWithHamlLayoutHandler'
|
40
|
-
get '/partial.html', 'PartialHandler'
|
41
40
|
|
42
41
|
get '/handler/tests.json', 'HandlerTestsHandler'
|
43
42
|
|
@@ -195,13 +194,6 @@ class HamlWithHamlLayoutHandler
|
|
195
194
|
|
196
195
|
end
|
197
196
|
|
198
|
-
class PartialHandler
|
199
|
-
include Deas::ViewHandler
|
200
|
-
|
201
|
-
def run!; partial 'info', :info => 'some-info'; end
|
202
|
-
|
203
|
-
end
|
204
|
-
|
205
197
|
class RedirectHandler
|
206
198
|
include Deas::ViewHandler
|
207
199
|
|
@@ -235,7 +227,6 @@ class HandlerTestsHandler
|
|
235
227
|
|
236
228
|
def init!
|
237
229
|
@data = {}
|
238
|
-
set_data('app_settings_a_setting'){ self.app_settings.a_setting }
|
239
230
|
set_data('logger_class_name'){ self.logger.class.name }
|
240
231
|
set_data('request_method'){ self.request.request_method.to_s }
|
241
232
|
set_data('response_firstheaderval'){ self.response.headers.sort.first.to_s }
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'deas/view_handler'
|
2
2
|
|
3
|
-
class
|
3
|
+
class EmptyViewHandler
|
4
4
|
include Deas::ViewHandler
|
5
5
|
|
6
6
|
end
|
@@ -16,67 +16,36 @@ class TestRunnerViewHandler
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
-
class
|
19
|
+
class DeasRunnerViewHandler
|
20
20
|
include Deas::ViewHandler
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
22
|
+
attr_reader :before_called, :after_called
|
23
|
+
attr_reader :init_bang_called, :run_bang_called
|
26
24
|
|
27
|
-
|
28
|
-
|
25
|
+
layout 'web'
|
26
|
+
|
27
|
+
before{ @before_called = true }
|
28
|
+
after{ @after_called = true }
|
29
|
+
|
30
|
+
def init!; @init_bang_called = true; end
|
31
|
+
def run!; @run_bang_called = true; end
|
29
32
|
|
30
|
-
def run!
|
31
|
-
partial "my_partial", :some => 'locals'
|
32
|
-
end
|
33
33
|
end
|
34
34
|
|
35
|
-
class
|
35
|
+
class RenderViewHandler
|
36
36
|
include Deas::ViewHandler
|
37
37
|
|
38
38
|
def run!
|
39
|
-
|
39
|
+
render "my_template", :some => :option
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
class
|
43
|
+
class SendFileViewHandler
|
44
44
|
include Deas::ViewHandler
|
45
|
-
before{ @before_hook_called = true }
|
46
|
-
after{ @after_hook_called = true }
|
47
|
-
layout 'web'
|
48
|
-
|
49
|
-
attr_reader :before_init_called, :init_bang_called, :after_init_called
|
50
|
-
attr_reader :before_run_called, :run_bang_called, :after_run_called
|
51
|
-
attr_reader :before_hook_called, :after_hook_called, :second_before_init_called
|
52
|
-
|
53
|
-
before_init do
|
54
|
-
@before_init_called = true
|
55
|
-
end
|
56
|
-
before_init do
|
57
|
-
@second_before_init_called = true
|
58
|
-
end
|
59
|
-
|
60
|
-
def init!
|
61
|
-
@init_bang_called = true
|
62
|
-
end
|
63
|
-
|
64
|
-
after_init do
|
65
|
-
@after_init_called = true
|
66
|
-
end
|
67
|
-
|
68
|
-
before_run do
|
69
|
-
@before_run_called = true
|
70
|
-
end
|
71
45
|
|
72
46
|
def run!
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
after_run do
|
77
|
-
@after_run_called = true
|
47
|
+
send_file "my_file.txt", :some => :option
|
78
48
|
end
|
79
|
-
|
80
49
|
end
|
81
50
|
|
82
51
|
class HaltViewHandler
|