deas 0.40.0 → 0.41.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/README.md +6 -4
- data/deas.gemspec +3 -4
- data/lib/deas.rb +2 -3
- data/lib/deas/router.rb +8 -2
- data/lib/deas/runner.rb +3 -6
- data/lib/deas/server.rb +137 -120
- data/lib/deas/server_data.rb +6 -6
- data/lib/deas/sinatra_app.rb +13 -6
- data/lib/deas/test_runner.rb +1 -1
- data/lib/deas/url.rb +31 -31
- data/lib/deas/version.rb +1 -1
- data/test/helper.rb +9 -0
- data/test/support/routes.rb +24 -20
- data/test/unit/logging_tests.rb +1 -1
- data/test/unit/respond_with_proxy_tests.rb +1 -1
- data/test/unit/router_tests.rb +14 -4
- data/test/unit/runner_tests.rb +5 -6
- data/test/unit/server_tests.rb +187 -135
- data/test/unit/sinatra_app_tests.rb +37 -42
- data/test/unit/template_engine_tests.rb +2 -2
- data/test/unit/template_source_tests.rb +6 -0
- data/test/unit/url_tests.rb +34 -34
- metadata +12 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e46a609344a9bab5fd5dd0aa922a7109258c2fb
|
4
|
+
data.tar.gz: 6b809e7cc1cc9c9fbfdf17115f88f00e06adbe0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a4dd5daee23f0ebd8ae06588a15330ffa0fb57ca59fcf8027c7db0b3c3d7f0aba97251ceb6b098c954cb47a56c8c0aaa72b19f612c4ebb6108dac31b4dc6585
|
7
|
+
data.tar.gz: 53ab6f0f9d22a00248a4c3e195d3e553856d3e4cdd3e44f47d04c8d4c3343b3732761640b7e870f1d9d2d01004b61631e0999d3df02defbdbcf3908ef17e24ec
|
data/README.md
CHANGED
@@ -9,10 +9,12 @@ Handler-based web framework powered by Sinatra.
|
|
9
9
|
|
10
10
|
require 'deas'
|
11
11
|
|
12
|
-
class
|
12
|
+
class MyServer
|
13
13
|
include Deas::Server
|
14
14
|
|
15
|
-
|
15
|
+
router do
|
16
|
+
get '/', 'HelloWorldHandler'
|
17
|
+
end
|
16
18
|
|
17
19
|
end
|
18
20
|
|
@@ -25,8 +27,8 @@ class HellowWorldHandler
|
|
25
27
|
|
26
28
|
end
|
27
29
|
|
28
|
-
|
29
|
-
run
|
30
|
+
server = MyServer.new
|
31
|
+
run server
|
30
32
|
```
|
31
33
|
|
32
34
|
## Installation
|
data/deas.gemspec
CHANGED
@@ -18,11 +18,10 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
20
|
|
21
|
-
gem.add_development_dependency("assert", ["~> 2.
|
22
|
-
gem.add_development_dependency("assert-rack-test", ["~> 1.0.
|
21
|
+
gem.add_development_dependency("assert", ["~> 2.16.1"])
|
22
|
+
gem.add_development_dependency("assert-rack-test", ["~> 1.0.4"])
|
23
23
|
|
24
|
-
gem.add_dependency("much-plugin", ["~> 0.
|
25
|
-
gem.add_dependency("ns-options", ["~> 1.1.6"])
|
24
|
+
gem.add_dependency("much-plugin", ["~> 0.2.0"])
|
26
25
|
gem.add_dependency("rack", ["~> 1.1"])
|
27
26
|
gem.add_dependency("sinatra", ["~> 1.2"])
|
28
27
|
|
data/lib/deas.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require 'ns-options'
|
2
1
|
require 'pathname'
|
3
|
-
|
4
2
|
require 'deas/version'
|
5
3
|
require 'deas/exceptions'
|
6
4
|
require 'deas/server'
|
@@ -9,4 +7,5 @@ require 'deas/view_handler'
|
|
9
7
|
# TODO - remove with future version of Rack (> v1.5.2)
|
10
8
|
require 'deas/rack_request_fix'
|
11
9
|
|
12
|
-
module Deas
|
10
|
+
module Deas
|
11
|
+
end
|
data/lib/deas/router.rb
CHANGED
@@ -6,7 +6,7 @@ module Deas
|
|
6
6
|
|
7
7
|
class Router
|
8
8
|
|
9
|
-
DEFAULT_REQUEST_TYPE_NAME = 'default'
|
9
|
+
DEFAULT_REQUEST_TYPE_NAME = 'default'.freeze
|
10
10
|
|
11
11
|
attr_reader :request_types, :urls, :routes, :definitions
|
12
12
|
attr_reader :escape_query_value_proc
|
@@ -53,7 +53,13 @@ module Deas
|
|
53
53
|
def url_for(name, *args)
|
54
54
|
url = self.urls[name.to_sym]
|
55
55
|
raise ArgumentError, "no route named `#{name.to_sym.inspect}`" unless url
|
56
|
-
|
56
|
+
begin
|
57
|
+
prepend_base_url(url.path_for(*args))
|
58
|
+
rescue Deas::Url::NonHashParamsError => err
|
59
|
+
raise ArgumentError, "url param values must be passed as a Hash"
|
60
|
+
rescue Deas::Url::EmptyNamedValueError => err
|
61
|
+
raise ArgumentError, err.message
|
62
|
+
end
|
57
63
|
end
|
58
64
|
|
59
65
|
def default_request_type_name(value = nil)
|
data/lib/deas/runner.rb
CHANGED
@@ -52,11 +52,8 @@ module Deas
|
|
52
52
|
|
53
53
|
def body(value = nil)
|
54
54
|
if !value.nil?
|
55
|
-
|
56
|
-
|
57
|
-
"respond to `each`."
|
58
|
-
end
|
59
|
-
@body = value
|
55
|
+
# String#each is a thing in 1.8.7, so account for it here
|
56
|
+
@body = !value.respond_to?(:each) || value.kind_of?(String) ? [*value] : value
|
60
57
|
end
|
61
58
|
@body
|
62
59
|
end
|
@@ -68,7 +65,7 @@ module Deas
|
|
68
65
|
def halt(*args)
|
69
66
|
self.status(args.shift) if args.first.instance_of?(::Fixnum)
|
70
67
|
self.headers(args.shift) if args.first.kind_of?(::Hash)
|
71
|
-
self.body(args.shift)
|
68
|
+
self.body(args.shift)
|
72
69
|
throw :halt
|
73
70
|
end
|
74
71
|
|
data/lib/deas/server.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
1
|
require 'much-plugin'
|
2
|
-
require 'ns-options'
|
3
|
-
require 'ns-options/boolean'
|
4
|
-
require 'pathname'
|
5
2
|
require 'deas/exceptions'
|
6
3
|
require 'deas/logger'
|
7
4
|
require 'deas/logging'
|
@@ -34,169 +31,197 @@ module Deas
|
|
34
31
|
# TODO: needed while Deas is powered by Sinatra
|
35
32
|
# eventually do an initialize method more like Sanford does
|
36
33
|
def new
|
37
|
-
Deas::SinatraApp.new(self.
|
34
|
+
Deas::SinatraApp.new(self.config)
|
38
35
|
end
|
39
36
|
|
40
|
-
def
|
41
|
-
@
|
37
|
+
def config
|
38
|
+
@config ||= Config.new
|
42
39
|
end
|
43
40
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
self.configuration.env *args
|
48
|
-
end
|
49
|
-
|
50
|
-
def root(*args)
|
51
|
-
self.configuration.root *args
|
41
|
+
def env(value = nil)
|
42
|
+
self.config.env = value if !value.nil?
|
43
|
+
self.config.env
|
52
44
|
end
|
53
45
|
|
54
|
-
def
|
55
|
-
self.
|
46
|
+
def root(value = nil)
|
47
|
+
self.config.root = value if !value.nil?
|
48
|
+
self.config.root
|
56
49
|
end
|
57
50
|
|
58
|
-
def
|
59
|
-
self.
|
51
|
+
def views_path(value = nil)
|
52
|
+
self.config.views_path = value if !value.nil?
|
53
|
+
self.config.views_path
|
60
54
|
end
|
61
55
|
|
62
|
-
def
|
63
|
-
self.
|
56
|
+
def views_root
|
57
|
+
self.config.views_root
|
64
58
|
end
|
65
59
|
|
66
|
-
def
|
67
|
-
self.
|
60
|
+
def public_path(value = nil)
|
61
|
+
self.config.public_path = value if !value.nil?
|
62
|
+
self.config.public_path
|
68
63
|
end
|
69
64
|
|
70
|
-
def
|
71
|
-
self.
|
65
|
+
def public_root
|
66
|
+
self.config.public_root
|
72
67
|
end
|
73
68
|
|
74
|
-
def
|
75
|
-
self.
|
69
|
+
def default_encoding(value = nil)
|
70
|
+
self.config.default_encoding = value if !value.nil?
|
71
|
+
self.config.default_encoding
|
76
72
|
end
|
77
73
|
|
78
|
-
def
|
79
|
-
self.
|
74
|
+
def set(name, value)
|
75
|
+
self.config.settings[name.to_sym] = value
|
80
76
|
end
|
81
77
|
|
82
|
-
def
|
83
|
-
self.
|
78
|
+
def settings
|
79
|
+
self.config.settings
|
84
80
|
end
|
85
81
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
self.configuration.init_procs << block
|
82
|
+
def template_helpers(*helper_modules)
|
83
|
+
helper_modules.each{ |m| self.config.template_helpers << m }
|
84
|
+
self.config.template_helpers
|
90
85
|
end
|
91
86
|
|
92
|
-
def
|
93
|
-
self.
|
87
|
+
def template_helper?(helper_module)
|
88
|
+
self.config.template_helpers.include?(helper_module)
|
94
89
|
end
|
95
90
|
|
96
|
-
def
|
97
|
-
|
98
|
-
self.configuration.template_helpers
|
91
|
+
def use(*args)
|
92
|
+
self.config.middlewares << args
|
99
93
|
end
|
100
94
|
|
101
|
-
def
|
102
|
-
self.
|
95
|
+
def middlewares
|
96
|
+
self.config.middlewares
|
103
97
|
end
|
104
98
|
|
105
|
-
def
|
106
|
-
self.
|
99
|
+
def init(&block)
|
100
|
+
self.config.init_procs << block
|
107
101
|
end
|
108
102
|
|
109
|
-
def
|
110
|
-
self.
|
103
|
+
def init_procs
|
104
|
+
self.config.init_procs
|
111
105
|
end
|
112
106
|
|
113
|
-
def
|
114
|
-
self.
|
107
|
+
def error(&block)
|
108
|
+
self.config.error_procs << block
|
115
109
|
end
|
116
110
|
|
117
|
-
def
|
118
|
-
self.
|
111
|
+
def error_procs
|
112
|
+
self.config.error_procs
|
119
113
|
end
|
120
114
|
|
121
|
-
def
|
122
|
-
self.
|
115
|
+
def template_source(value = nil)
|
116
|
+
self.config.template_source = value if !value.nil?
|
117
|
+
self.config.template_source
|
123
118
|
end
|
124
119
|
|
125
|
-
def
|
126
|
-
self.
|
120
|
+
def logger(value = nil)
|
121
|
+
self.config.logger = value if !value.nil?
|
122
|
+
self.config.logger
|
127
123
|
end
|
128
124
|
|
129
125
|
# router handling
|
130
126
|
|
131
|
-
def router(value = nil)
|
132
|
-
self.
|
133
|
-
self.
|
127
|
+
def router(value = nil, &block)
|
128
|
+
self.config.router = value if !value.nil?
|
129
|
+
self.config.router.instance_eval(&block) if block
|
130
|
+
self.config.router
|
134
131
|
end
|
135
132
|
|
136
|
-
def view_handler_ns(*args); self.router.view_handler_ns(*args); end
|
137
|
-
def base_url(*args); self.router.base_url(*args); end
|
138
|
-
|
139
|
-
def url(*args, &block); self.router.url(*args, &block); end
|
140
133
|
def url_for(*args, &block); self.router.url_for(*args, &block); end
|
141
134
|
|
142
|
-
|
143
|
-
def add_request_type(*args, &block); self.router.add_request_type(*args, &block); end
|
144
|
-
def request_type_name(*args); self.router.request_type_name(*args); end
|
135
|
+
# flags
|
145
136
|
|
146
|
-
def
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
def delete(*args, &block); self.router.delete(*args, &block); end
|
137
|
+
def dump_errors(value = nil)
|
138
|
+
self.config.dump_errors = value if !value.nil?
|
139
|
+
self.config.dump_errors
|
140
|
+
end
|
151
141
|
|
152
|
-
def
|
153
|
-
|
142
|
+
def method_override(value = nil)
|
143
|
+
self.config.method_override = value if !value.nil?
|
144
|
+
self.config.method_override
|
145
|
+
end
|
154
146
|
|
155
|
-
|
147
|
+
def reload_templates(value = nil)
|
148
|
+
self.config.reload_templates = value if !value.nil?
|
149
|
+
self.config.reload_templates
|
150
|
+
end
|
156
151
|
|
157
|
-
|
158
|
-
|
152
|
+
def sessions(value = nil)
|
153
|
+
self.config.sessions = value if !value.nil?
|
154
|
+
self.config.sessions
|
155
|
+
end
|
159
156
|
|
160
|
-
|
157
|
+
def show_exceptions(value = nil)
|
158
|
+
self.config.show_exceptions = value if !value.nil?
|
159
|
+
self.config.show_exceptions
|
160
|
+
end
|
161
161
|
|
162
|
-
|
162
|
+
def static_files(value = nil)
|
163
|
+
self.config.static_files = value if !value.nil?
|
164
|
+
self.config.static_files
|
165
|
+
end
|
163
166
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
+
def verbose_logging(value = nil)
|
168
|
+
self.config.verbose_logging = value if !value.nil?
|
169
|
+
self.config.verbose_logging
|
170
|
+
end
|
167
171
|
|
168
|
-
|
169
|
-
option :method_override, NsOptions::Boolean, :default => true
|
170
|
-
option :sessions, NsOptions::Boolean, :default => false
|
171
|
-
option :show_exceptions, NsOptions::Boolean, :default => false
|
172
|
-
option :static_files, NsOptions::Boolean, :default => true
|
173
|
-
option :reload_templates, NsOptions::Boolean, :default => false
|
174
|
-
option :default_encoding, String, :default => 'utf-8'
|
172
|
+
end
|
175
173
|
|
176
|
-
|
174
|
+
class Config
|
175
|
+
|
176
|
+
DEFAULT_ENV = 'development'.freeze
|
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
|
184
|
+
|
185
|
+
attr_accessor :dump_errors, :method_override, :reload_templates
|
186
|
+
attr_accessor :sessions, :show_exceptions, :static_files
|
187
|
+
attr_accessor :verbose_logging
|
188
|
+
|
189
|
+
def initialize
|
190
|
+
@env = DEFAULT_ENV
|
191
|
+
@root = ENV['PWD']
|
192
|
+
@views_path = DEFAULT_VIEWS_PATH
|
193
|
+
@public_path = DEFAULT_PUBLIC_PATH
|
194
|
+
@default_encoding = DEFAULT_ENCODING
|
195
|
+
@settings = {}
|
196
|
+
@template_helpers = []
|
197
|
+
@middlewares = []
|
198
|
+
@init_procs = []
|
199
|
+
@error_procs = []
|
200
|
+
@template_source = nil
|
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
|
211
|
+
|
212
|
+
@valid = nil
|
213
|
+
end
|
177
214
|
|
178
|
-
|
179
|
-
|
180
|
-
|
215
|
+
def views_root
|
216
|
+
File.expand_path(@views_path.to_s, @root.to_s)
|
217
|
+
end
|
181
218
|
|
182
|
-
|
183
|
-
|
219
|
+
def public_root
|
220
|
+
File.expand_path(@public_path.to_s, @root.to_s)
|
221
|
+
end
|
184
222
|
|
185
|
-
def
|
186
|
-
|
187
|
-
# instance `root`. If we define a proc above, we will be using the
|
188
|
-
# Configuration class `root`, which will not update these options as
|
189
|
-
# expected.
|
190
|
-
super((values || {}).merge({
|
191
|
-
:public_root => proc{ self.root.join('public') },
|
192
|
-
:views_root => proc{ self.root.join('views') },
|
193
|
-
:logger => proc{ Deas::NullLogger.new },
|
194
|
-
:template_source => proc{ Deas::NullTemplateSource.new(self.root) }
|
195
|
-
}))
|
196
|
-
@settings = {}
|
197
|
-
@init_procs, @error_procs, @template_helpers, @middlewares = [], [], [], []
|
198
|
-
@router = Deas::Router.new
|
199
|
-
@valid = nil
|
223
|
+
def template_source
|
224
|
+
@template_source ||= Deas::NullTemplateSource.new(self.root)
|
200
225
|
end
|
201
226
|
|
202
227
|
def urls
|
@@ -207,25 +232,18 @@ module Deas
|
|
207
232
|
self.router.routes
|
208
233
|
end
|
209
234
|
|
210
|
-
def to_hash
|
211
|
-
super.merge({
|
212
|
-
:error_procs => self.error_procs,
|
213
|
-
:router => self.router
|
214
|
-
})
|
215
|
-
end
|
216
|
-
|
217
235
|
def valid?
|
218
236
|
!!@valid
|
219
237
|
end
|
220
238
|
|
221
|
-
# for the config to be considered "valid", a few things need to happen.
|
222
|
-
# key here is that this only needs to be done _once_ for each config.
|
239
|
+
# for the config to be considered "valid", a few things need to happen.
|
240
|
+
# The key here is that this only needs to be done _once_ for each config.
|
223
241
|
|
224
242
|
def validate!
|
225
243
|
return @valid if !@valid.nil? # only need to run this once per config
|
226
244
|
|
227
245
|
# ensure all user and plugin configs/settings are applied
|
228
|
-
self.init_procs.each
|
246
|
+
self.init_procs.each(&:call)
|
229
247
|
raise Deas::ServerRootError if self.root.nil?
|
230
248
|
|
231
249
|
# validate the router
|
@@ -235,11 +253,10 @@ module Deas
|
|
235
253
|
# that the logging and exception showing happens just before the app gets
|
236
254
|
# the request and just after the app sends a response.
|
237
255
|
self.middlewares << [Deas::ShowExceptions] if self.show_exceptions
|
238
|
-
[*Deas::Logging.middleware(self.verbose_logging)]
|
239
|
-
|
240
|
-
end
|
256
|
+
logging_mw_args = [*Deas::Logging.middleware(self.verbose_logging)]
|
257
|
+
self.middlewares << logging_mw_args
|
241
258
|
|
242
|
-
@valid = true
|
259
|
+
@valid = true # if it made it this far, its valid!
|
243
260
|
end
|
244
261
|
|
245
262
|
end
|