deas 0.42.0 → 0.43.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 +5 -5
- data/deas.gemspec +1 -1
- data/lib/deas/error_handler.rb +17 -12
- data/lib/deas/handler_proxy.rb +18 -18
- data/lib/deas/logging.rb +4 -3
- data/lib/deas/request_data.rb +33 -0
- data/lib/deas/route.rb +5 -7
- data/lib/deas/router.rb +15 -5
- data/lib/deas/runner.rb +49 -6
- data/lib/deas/server.rb +41 -115
- data/lib/deas/server_data.rb +12 -1
- data/lib/deas/sinatra_app.rb +69 -43
- data/lib/deas/test_runner.rb +3 -2
- data/lib/deas/url.rb +11 -7
- data/lib/deas/version.rb +1 -1
- data/lib/deas/view_handler.rb +0 -2
- data/test/support/factory.rb +16 -0
- data/test/support/fake_request.rb +1 -0
- data/test/support/fake_response.rb +12 -0
- data/test/support/fake_sinatra_call.rb +1 -11
- data/test/support/routes.rb +8 -7
- data/test/system/deas_tests.rb +3 -11
- data/test/unit/error_handler_tests.rb +19 -5
- data/test/unit/handler_proxy_tests.rb +28 -33
- data/test/unit/logging_tests.rb +12 -5
- data/test/unit/request_data_tests.rb +57 -0
- data/test/unit/route_tests.rb +15 -15
- data/test/unit/router_tests.rb +38 -24
- data/test/unit/runner_tests.rb +66 -12
- data/test/unit/server_data_tests.rb +14 -1
- data/test/unit/server_tests.rb +41 -106
- data/test/unit/sinatra_app_tests.rb +38 -24
- data/test/unit/test_runner_tests.rb +7 -4
- data/test/unit/url_tests.rb +13 -2
- data/test/unit/view_handler_tests.rb +1 -7
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 1105d3943d8f80cbcfd722a4fd5796b015fb7e0c
|
4
|
-
data.tar.gz: 4847313602ffd9942d2b287f36052c0946e03c06
|
5
2
|
SHA512:
|
6
|
-
|
7
|
-
|
3
|
+
data.tar.gz: 3520f4645edbc6b6b89e470cc2025f436e6031989c7c7ebf60f9b2c50ec4ec9e68b938fd0149603c8addd798ccd9fc895a0a68e58b89b12c51e2aad0e6f84f1d
|
4
|
+
metadata.gz: ba28b9b16f9011f958849afdb5a774a1f559d5c258447b6f0e3ba551328ebbad70d36d84f462af46cce1fcd9f9fec2ebc5fc57d3da01d86aa9f7d778bc181a7f
|
5
|
+
SHA1:
|
6
|
+
data.tar.gz: 91a77987b3fb3b6d87a728643150a787b620c04a
|
7
|
+
metadata.gz: 69eab40552eaaf3cb49bf1d9dd1bc3f4cadb8533
|
data/deas.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_development_dependency("assert-rack-test", ["~> 1.0.4"])
|
23
23
|
|
24
24
|
gem.add_dependency("much-plugin", ["~> 0.2.0"])
|
25
|
-
gem.add_dependency("rack", ["~> 1.
|
25
|
+
gem.add_dependency("rack", ["~> 1.6.4"])
|
26
26
|
gem.add_dependency("sinatra", ["~> 1.2"])
|
27
27
|
|
28
28
|
end
|
data/lib/deas/error_handler.rb
CHANGED
@@ -35,25 +35,30 @@ module Deas
|
|
35
35
|
class Context
|
36
36
|
|
37
37
|
attr_reader :server_data
|
38
|
-
attr_reader :request, :response, :handler_class, :handler
|
38
|
+
attr_reader :request, :response, :handler_class, :handler
|
39
|
+
attr_reader :params, :splat, :route_path
|
39
40
|
|
40
41
|
def initialize(args)
|
41
|
-
@server_data = args
|
42
|
-
@request = args
|
43
|
-
@response = args
|
44
|
-
@handler_class = args
|
45
|
-
@handler = args
|
46
|
-
@params = args
|
42
|
+
@server_data = args.fetch(:server_data)
|
43
|
+
@request = args.fetch(:request)
|
44
|
+
@response = args.fetch(:response)
|
45
|
+
@handler_class = args.fetch(:handler_class)
|
46
|
+
@handler = args.fetch(:handler)
|
47
|
+
@params = args.fetch(:params)
|
48
|
+
@splat = args.fetch(:splat)
|
49
|
+
@route_path = args.fetch(:route_path)
|
47
50
|
end
|
48
51
|
|
49
52
|
def ==(other)
|
50
53
|
if other.kind_of?(self.class)
|
51
|
-
self.server_data == other.server_data
|
54
|
+
self.server_data == other.server_data &&
|
52
55
|
self.handler_class == other.handler_class &&
|
53
|
-
self.request == other.request
|
54
|
-
self.response == other.response
|
55
|
-
self.handler == other.handler
|
56
|
-
self.params == other.params
|
56
|
+
self.request == other.request &&
|
57
|
+
self.response == other.response &&
|
58
|
+
self.handler == other.handler &&
|
59
|
+
self.params == other.params &&
|
60
|
+
self.splat == other.splat &&
|
61
|
+
self.route_path == other.route_path
|
57
62
|
else
|
58
63
|
super
|
59
64
|
end
|
data/lib/deas/handler_proxy.rb
CHANGED
@@ -15,29 +15,26 @@ module Deas
|
|
15
15
|
raise NotImplementedError
|
16
16
|
end
|
17
17
|
|
18
|
-
def run(server_data,
|
19
|
-
# captures are not part of Deas' intended behavior and route matching
|
20
|
-
# they are a side-
|
21
|
-
# be relied upon in Deas apps.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
splat_string_param = sinatra_call.params.delete('splat')
|
31
|
-
splat_value = (splat_sym_param || splat_string_param || []).last
|
18
|
+
def run(server_data, request_data)
|
19
|
+
# captures are not part of Deas' intended behavior and route matching -
|
20
|
+
# they are a side-effect of using Sinatra. remove them so they won't
|
21
|
+
# be relied upon in Deas apps. Remove all of this when Sinatra is removed.
|
22
|
+
request_data.params.delete(:captures)
|
23
|
+
request_data.params.delete('captures')
|
24
|
+
|
25
|
+
# splats that Sinatra provides aren't used by Deas - they are a
|
26
|
+
# side-effect of using Sinatra. remove them so they won't be relied upon
|
27
|
+
# in Deas apps. Remove all of this when Sinatra is removed.
|
28
|
+
request_data.params.delete(:splat)
|
29
|
+
request_data.params.delete('splat')
|
32
30
|
|
33
31
|
runner = DeasRunner.new(self.handler_class, {
|
34
32
|
:logger => server_data.logger,
|
35
33
|
:router => server_data.router,
|
36
34
|
:template_source => server_data.template_source,
|
37
|
-
:request =>
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:splat => splat_value
|
35
|
+
:request => request_data.request,
|
36
|
+
:params => request_data.params,
|
37
|
+
:route_path => request_data.route_path
|
41
38
|
})
|
42
39
|
|
43
40
|
runner.request.env.tap do |env|
|
@@ -48,11 +45,14 @@ module Deas
|
|
48
45
|
env['deas.handler_class'] = self.handler_class
|
49
46
|
env['deas.handler'] = runner.handler
|
50
47
|
env['deas.params'] = runner.params
|
48
|
+
env['deas.splat'] = runner.splat
|
49
|
+
env['deas.route_path'] = runner.route_path
|
51
50
|
|
52
51
|
# this handles the verbose logging (it is a no-op if summary logging)
|
53
52
|
env['deas.logging'].call " Handler: #{self.handler_class.name}"
|
54
53
|
env['deas.logging'].call " Params: #{runner.params.inspect}"
|
55
54
|
env['deas.logging'].call " Splat: #{runner.splat.inspect}" if !runner.splat.nil?
|
55
|
+
env['deas.logging'].call " Route: #{runner.route_path.inspect}"
|
56
56
|
end
|
57
57
|
|
58
58
|
runner.run
|
data/lib/deas/logging.rb
CHANGED
@@ -4,8 +4,8 @@ require 'sinatra/base'
|
|
4
4
|
module Deas
|
5
5
|
|
6
6
|
module Logging
|
7
|
-
def self.
|
8
|
-
verbose ? VerboseLogging : SummaryLogging
|
7
|
+
def self.middleware_args(verbose)
|
8
|
+
verbose ? [VerboseLogging] : [SummaryLogging]
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -102,6 +102,7 @@ module Deas
|
|
102
102
|
'method' => request.request_method,
|
103
103
|
'path' => request.path,
|
104
104
|
'params' => env['deas.params'],
|
105
|
+
'splat' => env['deas.splat'],
|
105
106
|
'time' => env['deas.time_taken'],
|
106
107
|
'status' => status
|
107
108
|
}
|
@@ -119,7 +120,7 @@ module Deas
|
|
119
120
|
|
120
121
|
module SummaryLine
|
121
122
|
def self.keys
|
122
|
-
%w{time status method path handler params redir}
|
123
|
+
%w{time status method path handler params splat redir}
|
123
124
|
end
|
124
125
|
def self.new(line_attrs)
|
125
126
|
self.keys.select{ |k| line_attrs.key?(k) }.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Deas
|
2
|
+
|
3
|
+
class RequestData
|
4
|
+
|
5
|
+
# The rack app uses this to "compile" the request-related data. The goal
|
6
|
+
# here is to wrap up these (and any future) request objects into a struct
|
7
|
+
# object to make them available to the runner/handler. This is also to
|
8
|
+
# decouple the rack app from the handlers (we can use any rack app as long
|
9
|
+
# as they provide this data).
|
10
|
+
|
11
|
+
attr_reader :request, :response, :params, :route_path
|
12
|
+
|
13
|
+
def initialize(args)
|
14
|
+
@request = args[:request]
|
15
|
+
@response = args[:response]
|
16
|
+
@params = args[:params]
|
17
|
+
@route_path = args[:route_path]
|
18
|
+
end
|
19
|
+
|
20
|
+
def ==(other_request_data)
|
21
|
+
if other_request_data.kind_of?(RequestData)
|
22
|
+
self.request == other_request_data.request &&
|
23
|
+
self.response == other_request_data.response &&
|
24
|
+
self.params == other_request_data.params &&
|
25
|
+
self.route_path == other_request_data.route_path
|
26
|
+
else
|
27
|
+
super
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/deas/route.rb
CHANGED
@@ -16,15 +16,13 @@ module Deas
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
def run(server_data,
|
20
|
-
|
21
|
-
|
22
|
-
@handler_proxies[
|
19
|
+
def run(server_data, request_data)
|
20
|
+
request_type_name = server_data.router.request_type_name(request_data.request)
|
21
|
+
begin
|
22
|
+
@handler_proxies[request_type_name].run(server_data, request_data)
|
23
23
|
rescue HandlerProxyNotFound
|
24
|
-
|
24
|
+
[404, Rack::Utils::HeaderHash.new, []]
|
25
25
|
end
|
26
|
-
# TODO: eventually stop sending sinatra call (part of phasing out Sinatra)
|
27
|
-
proxy.run(server_data, sinatra_call)
|
28
26
|
end
|
29
27
|
|
30
28
|
end
|
data/lib/deas/router.rb
CHANGED
@@ -43,15 +43,15 @@ module Deas
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def url(name, path, options = nil)
|
46
|
+
if !name.kind_of?(::Symbol)
|
47
|
+
raise ArgumentError, "invalid name `#{name.inspect}` - "\
|
48
|
+
"named urls must be defined with Symbol names"
|
49
|
+
end
|
46
50
|
if !path.kind_of?(::String)
|
47
51
|
raise ArgumentError, "invalid path `#{path.inspect}` - "\
|
48
52
|
"named urls must be defined with String paths"
|
49
53
|
end
|
50
|
-
|
51
|
-
raise ArgumentError, "invalid path `#{path.inspect}` - "\
|
52
|
-
"named urls can only have a single splat at the end of the path"
|
53
|
-
end
|
54
|
-
add_url(name.to_sym, path, options || {})
|
54
|
+
add_url(name, path, options || {})
|
55
55
|
end
|
56
56
|
|
57
57
|
def url_for(name, *args)
|
@@ -179,11 +179,21 @@ module Deas
|
|
179
179
|
end
|
180
180
|
|
181
181
|
def add_route(http_method, path, proxies)
|
182
|
+
# splat not at end of path OR
|
183
|
+
# at end of path without preceding forward slash
|
184
|
+
if path =~ /\*(?!$)|[^\/]\*/
|
185
|
+
raise InvalidSplatError, "invalid path `#{path.inspect}` - "\
|
186
|
+
"routes can only have a single splat and " \
|
187
|
+
"it must be the last path segment " \
|
188
|
+
"(ie '/something/*')"
|
189
|
+
end
|
182
190
|
proxies = HandlerProxies.new(proxies, self.default_request_type_name)
|
183
191
|
require 'deas/route'
|
184
192
|
Deas::Route.new(http_method, path, proxies).tap{ |r| self.routes.push(r) }
|
185
193
|
end
|
186
194
|
|
195
|
+
InvalidSplatError = Class.new(ArgumentError)
|
196
|
+
|
187
197
|
class HandlerProxies
|
188
198
|
|
189
199
|
attr_reader :default_type
|
data/lib/deas/runner.rb
CHANGED
@@ -15,24 +15,27 @@ module Deas
|
|
15
15
|
|
16
16
|
attr_reader :handler_class, :handler
|
17
17
|
attr_reader :logger, :router, :template_source
|
18
|
-
attr_reader :request, :
|
18
|
+
attr_reader :request, :params, :route_path
|
19
19
|
|
20
20
|
def initialize(handler_class, args = nil)
|
21
21
|
@status, @headers, @body = nil, Rack::Utils::HeaderHash.new, nil
|
22
22
|
|
23
23
|
args ||= {}
|
24
|
-
@logger = args[:logger]
|
25
|
-
@router = args[:router]
|
24
|
+
@logger = args[:logger] || Deas::NullLogger.new
|
25
|
+
@router = args[:router] || Deas::Router.new
|
26
26
|
@template_source = args[:template_source] || Deas::NullTemplateSource.new
|
27
27
|
@request = args[:request]
|
28
|
-
@
|
29
|
-
@
|
30
|
-
@splat = args[:splat]
|
28
|
+
@params = args[:params] || {}
|
29
|
+
@route_path = args[:route_path].to_s
|
31
30
|
|
32
31
|
@handler_class = handler_class
|
33
32
|
@handler = @handler_class.new(self)
|
34
33
|
end
|
35
34
|
|
35
|
+
def splat
|
36
|
+
@splat ||= parse_splat_value
|
37
|
+
end
|
38
|
+
|
36
39
|
def run
|
37
40
|
raise NotImplementedError
|
38
41
|
end
|
@@ -138,6 +141,46 @@ module Deas
|
|
138
141
|
File.join("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}", url)
|
139
142
|
end
|
140
143
|
|
144
|
+
def parse_splat_value
|
145
|
+
return nil if request.nil? || (path_info = request.env['PATH_INFO']).nil?
|
146
|
+
|
147
|
+
regex = splat_value_parse_regex
|
148
|
+
match = regex.match(path_info)
|
149
|
+
if match.nil?
|
150
|
+
raise SplatParseError, "could not parse the splat value: " \
|
151
|
+
"the PATH_INFO, `#{path_info.inspect}`, " \
|
152
|
+
"doesn't match " \
|
153
|
+
"the route, `#{self.route_path.inspect}`, " \
|
154
|
+
"using the route regex, `#{regex.inspect}`"
|
155
|
+
end
|
156
|
+
match.captures.first
|
157
|
+
end
|
158
|
+
|
159
|
+
SplatParseError = Class.new(RuntimeError)
|
160
|
+
|
161
|
+
def splat_value_parse_regex
|
162
|
+
# `sub` should suffice as only a single trailing splat is allowed. Replace
|
163
|
+
# any splat with a capture placholder so we can extract the splat value.
|
164
|
+
/^#{route_path_with_regex_placeholders.sub('*', '(.+?)')}$/
|
165
|
+
end
|
166
|
+
|
167
|
+
def route_path_with_regex_placeholders
|
168
|
+
# Replace param values with regex placeholders b/c we don't care what
|
169
|
+
# the values are just that "a param value goes here". Use gsub in the odd
|
170
|
+
# case a placeholder is used more than once in a route. This is to help
|
171
|
+
# ensure matching and capturing splats even on nonsense paths.
|
172
|
+
sorted_param_names.inject(self.route_path) do |path, name|
|
173
|
+
path.gsub(":#{name}", '.+?')
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def sorted_param_names
|
178
|
+
# Sort longer key names first so they will be processed first. This
|
179
|
+
# ensures that shorter param names that compose longer param names won't
|
180
|
+
# be subbed in the longer param name's place.
|
181
|
+
self.params.keys.sort{ |a, b| b.size <=> a.size }
|
182
|
+
end
|
183
|
+
|
141
184
|
class NormalizedParams
|
142
185
|
|
143
186
|
attr_reader :value
|
data/lib/deas/server.rb
CHANGED
@@ -31,7 +31,12 @@ module Deas
|
|
31
31
|
# TODO: needed while Deas is powered by Sinatra
|
32
32
|
# eventually do an initialize method more like Sanford does
|
33
33
|
def new
|
34
|
-
|
34
|
+
begin
|
35
|
+
Deas::SinatraApp.new(self.config)
|
36
|
+
rescue Router::InvalidSplatError => e
|
37
|
+
# reset the exception backtrace to hide Deas internals
|
38
|
+
raise e.class, e.message, caller
|
39
|
+
end
|
35
40
|
end
|
36
41
|
|
37
42
|
def config
|
@@ -48,44 +53,19 @@ module Deas
|
|
48
53
|
self.config.root
|
49
54
|
end
|
50
55
|
|
51
|
-
def
|
52
|
-
self.config.
|
53
|
-
self.config.
|
54
|
-
end
|
55
|
-
|
56
|
-
def views_root
|
57
|
-
self.config.views_root
|
58
|
-
end
|
59
|
-
|
60
|
-
def public_path(value = nil)
|
61
|
-
self.config.public_path = value if !value.nil?
|
62
|
-
self.config.public_path
|
63
|
-
end
|
64
|
-
|
65
|
-
def public_root
|
66
|
-
self.config.public_root
|
67
|
-
end
|
68
|
-
|
69
|
-
def default_encoding(value = nil)
|
70
|
-
self.config.default_encoding = value if !value.nil?
|
71
|
-
self.config.default_encoding
|
72
|
-
end
|
73
|
-
|
74
|
-
def set(name, value)
|
75
|
-
self.config.settings[name.to_sym] = value
|
76
|
-
end
|
77
|
-
|
78
|
-
def settings
|
79
|
-
self.config.settings
|
56
|
+
def method_override(value = nil)
|
57
|
+
self.config.method_override = value if !value.nil?
|
58
|
+
self.config.method_override
|
80
59
|
end
|
81
60
|
|
82
|
-
def
|
83
|
-
|
84
|
-
self.config.
|
61
|
+
def show_exceptions(value = nil)
|
62
|
+
self.config.show_exceptions = value if !value.nil?
|
63
|
+
self.config.show_exceptions
|
85
64
|
end
|
86
65
|
|
87
|
-
def
|
88
|
-
self.config.
|
66
|
+
def verbose_logging(value = nil)
|
67
|
+
self.config.verbose_logging = value if !value.nil?
|
68
|
+
self.config.verbose_logging
|
89
69
|
end
|
90
70
|
|
91
71
|
def use(*args)
|
@@ -132,94 +112,33 @@ module Deas
|
|
132
112
|
|
133
113
|
def url_for(*args, &block); self.router.url_for(*args, &block); end
|
134
114
|
|
135
|
-
# flags
|
136
|
-
|
137
|
-
def dump_errors(value = nil)
|
138
|
-
self.config.dump_errors = value if !value.nil?
|
139
|
-
self.config.dump_errors
|
140
|
-
end
|
141
|
-
|
142
|
-
def method_override(value = nil)
|
143
|
-
self.config.method_override = value if !value.nil?
|
144
|
-
self.config.method_override
|
145
|
-
end
|
146
|
-
|
147
|
-
def reload_templates(value = nil)
|
148
|
-
self.config.reload_templates = value if !value.nil?
|
149
|
-
self.config.reload_templates
|
150
|
-
end
|
151
|
-
|
152
|
-
def sessions(value = nil)
|
153
|
-
self.config.sessions = value if !value.nil?
|
154
|
-
self.config.sessions
|
155
|
-
end
|
156
|
-
|
157
|
-
def show_exceptions(value = nil)
|
158
|
-
self.config.show_exceptions = value if !value.nil?
|
159
|
-
self.config.show_exceptions
|
160
|
-
end
|
161
|
-
|
162
|
-
def static_files(value = nil)
|
163
|
-
self.config.static_files = value if !value.nil?
|
164
|
-
self.config.static_files
|
165
|
-
end
|
166
|
-
|
167
|
-
def verbose_logging(value = nil)
|
168
|
-
self.config.verbose_logging = value if !value.nil?
|
169
|
-
self.config.verbose_logging
|
170
|
-
end
|
171
|
-
|
172
115
|
end
|
173
116
|
|
174
117
|
class Config
|
175
118
|
|
176
|
-
DEFAULT_ENV
|
177
|
-
DEFAULT_VIEWS_PATH = 'views'.freeze
|
178
|
-
DEFAULT_PUBLIC_PATH = 'public'.freeze
|
179
|
-
DEFAULT_ENCODING = 'utf-8'.freeze
|
180
|
-
|
181
|
-
attr_accessor :env, :root, :views_path, :public_path, :default_encoding
|
182
|
-
attr_accessor :settings, :template_helpers, :middlewares
|
183
|
-
attr_accessor :init_procs, :error_procs, :template_source, :logger, :router
|
119
|
+
DEFAULT_ENV = 'development'.freeze
|
184
120
|
|
185
|
-
attr_accessor :
|
186
|
-
attr_accessor :
|
187
|
-
attr_accessor :
|
121
|
+
attr_accessor :env, :root
|
122
|
+
attr_accessor :method_override, :show_exceptions, :verbose_logging
|
123
|
+
attr_accessor :middlewares, :init_procs, :error_procs
|
124
|
+
attr_accessor :template_source, :logger, :router
|
188
125
|
|
189
126
|
def initialize
|
190
|
-
@env
|
191
|
-
@root
|
192
|
-
@
|
193
|
-
@
|
194
|
-
@
|
195
|
-
@
|
196
|
-
@
|
197
|
-
@
|
198
|
-
@
|
199
|
-
@
|
200
|
-
@
|
201
|
-
@logger = Deas::NullLogger.new
|
202
|
-
@router = Deas::Router.new
|
203
|
-
|
204
|
-
@dump_errors = false
|
205
|
-
@method_override = true
|
206
|
-
@reload_templates = false
|
207
|
-
@sessions = false
|
208
|
-
@show_exceptions = false
|
209
|
-
@static_files = true
|
210
|
-
@verbose_logging = true
|
127
|
+
@env = DEFAULT_ENV
|
128
|
+
@root = ENV['PWD']
|
129
|
+
@method_override = true
|
130
|
+
@show_exceptions = false
|
131
|
+
@verbose_logging = true
|
132
|
+
@middlewares = []
|
133
|
+
@init_procs = []
|
134
|
+
@error_procs = []
|
135
|
+
@template_source = nil
|
136
|
+
@logger = Deas::NullLogger.new
|
137
|
+
@router = Deas::Router.new
|
211
138
|
|
212
139
|
@valid = nil
|
213
140
|
end
|
214
141
|
|
215
|
-
def views_root
|
216
|
-
File.expand_path(@views_path.to_s, @root.to_s)
|
217
|
-
end
|
218
|
-
|
219
|
-
def public_root
|
220
|
-
File.expand_path(@public_path.to_s, @root.to_s)
|
221
|
-
end
|
222
|
-
|
223
142
|
def template_source
|
224
143
|
@template_source ||= Deas::NullTemplateSource.new(self.root)
|
225
144
|
end
|
@@ -242,19 +161,26 @@ module Deas
|
|
242
161
|
def validate!
|
243
162
|
return @valid if !@valid.nil? # only need to run this once per config
|
244
163
|
|
245
|
-
# ensure all user and plugin configs
|
164
|
+
# ensure all user and plugin configs are applied
|
246
165
|
self.init_procs.each(&:call)
|
247
166
|
raise Deas::ServerRootError if self.root.nil?
|
248
167
|
|
249
168
|
# validate the router
|
250
169
|
self.router.validate!
|
251
170
|
|
171
|
+
# TODO: build final middleware stack when building the rack app, not here
|
172
|
+
# (once Sinatra is removed)
|
173
|
+
|
174
|
+
# prepend the method override middleware first. This ensures that the
|
175
|
+
# it is run before any other middleware
|
176
|
+
self.middlewares.unshift([Rack::MethodOverride]) if self.method_override
|
177
|
+
|
252
178
|
# append the show exceptions and logging middlewares last. This ensures
|
253
179
|
# that the logging and exception showing happens just before the app gets
|
254
180
|
# the request and just after the app sends a response.
|
255
181
|
self.middlewares << [Deas::ShowExceptions] if self.show_exceptions
|
256
|
-
|
257
|
-
self.middlewares
|
182
|
+
self.middlewares << Deas::Logging.middleware_args(self.verbose_logging)
|
183
|
+
self.middlewares.freeze
|
258
184
|
|
259
185
|
@valid = true # if it made it this far, its valid!
|
260
186
|
end
|