deas 0.26.0 → 0.27.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.
- 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
|