deas 0.41.0 → 0.42.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/deas/handler_proxy.rb +13 -5
- data/lib/deas/router.rb +5 -1
- data/lib/deas/runner.rb +2 -1
- data/lib/deas/test_runner.rb +2 -1
- data/lib/deas/url.rb +3 -5
- data/lib/deas/version.rb +1 -1
- data/lib/deas/view_handler.rb +1 -0
- data/test/unit/handler_proxy_tests.rb +22 -7
- data/test/unit/router_tests.rb +21 -0
- data/test/unit/runner_tests.rb +4 -2
- data/test/unit/test_runner_tests.rb +2 -0
- data/test/unit/url_tests.rb +27 -36
- data/test/unit/view_handler_tests.rb +5 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1105d3943d8f80cbcfd722a4fd5796b015fb7e0c
|
4
|
+
data.tar.gz: 4847313602ffd9942d2b287f36052c0946e03c06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 431fac2fe7deafdf9523882813e5caf34b57035b5077cf8152270503e6a0c914fa501015a47c5ead7d5c221d788e216389449a087c16167915ed82d769f9deab
|
7
|
+
data.tar.gz: 45cc5441925322a35fd7ad112ecf5b297113782ff14afb9d621b50735c6ee492ea163ec915e8b8cdef3d0b5da1d9653f0513f35a18aa8564855a6a9cf133b7a7
|
data/README.md
CHANGED
data/lib/deas/handler_proxy.rb
CHANGED
@@ -16,21 +16,28 @@ module Deas
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def run(server_data, sinatra_call)
|
19
|
-
#
|
20
|
-
# they are side-effects of using Sinatra. remove them so they won't
|
19
|
+
# captures are not part of Deas' intended behavior and route matching
|
20
|
+
# they are a side-effects of using Sinatra. remove them so they won't
|
21
21
|
# be relied upon in Deas apps.
|
22
|
-
sinatra_call.params.delete(:splat)
|
23
|
-
sinatra_call.params.delete('splat')
|
24
22
|
sinatra_call.params.delete(:captures)
|
25
23
|
sinatra_call.params.delete('captures')
|
26
24
|
|
25
|
+
# splat will be provided to the handlers via a special `splat` helper.
|
26
|
+
# only single splat values are allowed (see router `url` method). this
|
27
|
+
# takes the last splat value from Sinatra and provides it standalone to
|
28
|
+
# the runner.
|
29
|
+
splat_sym_param = sinatra_call.params.delete(:splat)
|
30
|
+
splat_string_param = sinatra_call.params.delete('splat')
|
31
|
+
splat_value = (splat_sym_param || splat_string_param || []).last
|
32
|
+
|
27
33
|
runner = DeasRunner.new(self.handler_class, {
|
28
34
|
:logger => server_data.logger,
|
29
35
|
:router => server_data.router,
|
30
36
|
:template_source => server_data.template_source,
|
31
37
|
:request => sinatra_call.request,
|
32
38
|
:session => sinatra_call.session,
|
33
|
-
:params => sinatra_call.params
|
39
|
+
:params => sinatra_call.params,
|
40
|
+
:splat => splat_value
|
34
41
|
})
|
35
42
|
|
36
43
|
runner.request.env.tap do |env|
|
@@ -45,6 +52,7 @@ module Deas
|
|
45
52
|
# this handles the verbose logging (it is a no-op if summary logging)
|
46
53
|
env['deas.logging'].call " Handler: #{self.handler_class.name}"
|
47
54
|
env['deas.logging'].call " Params: #{runner.params.inspect}"
|
55
|
+
env['deas.logging'].call " Splat: #{runner.splat.inspect}" if !runner.splat.nil?
|
48
56
|
end
|
49
57
|
|
50
58
|
runner.run
|
data/lib/deas/router.rb
CHANGED
@@ -45,7 +45,11 @@ module Deas
|
|
45
45
|
def url(name, path, options = nil)
|
46
46
|
if !path.kind_of?(::String)
|
47
47
|
raise ArgumentError, "invalid path `#{path.inspect}` - "\
|
48
|
-
"
|
48
|
+
"named urls must be defined with String paths"
|
49
|
+
end
|
50
|
+
if path =~ /\*(?!$)/ # splat not at end of path
|
51
|
+
raise ArgumentError, "invalid path `#{path.inspect}` - "\
|
52
|
+
"named urls can only have a single splat at the end of the path"
|
49
53
|
end
|
50
54
|
add_url(name.to_sym, path, options || {})
|
51
55
|
end
|
data/lib/deas/runner.rb
CHANGED
@@ -15,7 +15,7 @@ module Deas
|
|
15
15
|
|
16
16
|
attr_reader :handler_class, :handler
|
17
17
|
attr_reader :logger, :router, :template_source
|
18
|
-
attr_reader :request, :session, :params
|
18
|
+
attr_reader :request, :session, :params, :splat
|
19
19
|
|
20
20
|
def initialize(handler_class, args = nil)
|
21
21
|
@status, @headers, @body = nil, Rack::Utils::HeaderHash.new, nil
|
@@ -27,6 +27,7 @@ module Deas
|
|
27
27
|
@request = args[:request]
|
28
28
|
@session = args[:session]
|
29
29
|
@params = args[:params] || {}
|
30
|
+
@splat = args[:splat]
|
30
31
|
|
31
32
|
@handler_class = handler_class
|
32
33
|
@handler = @handler_class.new(self)
|
data/lib/deas/test_runner.rb
CHANGED
@@ -28,7 +28,8 @@ module Deas
|
|
28
28
|
:template_source => a.delete(:template_source),
|
29
29
|
:request => a.delete(:request),
|
30
30
|
:session => a.delete(:session),
|
31
|
-
:params => NormalizedParams.new(a.delete(:params) || {}).value
|
31
|
+
:params => NormalizedParams.new(a.delete(:params) || {}).value,
|
32
|
+
:splat => a.delete(:splat)
|
32
33
|
})
|
33
34
|
a.each{|key, value| self.handler.send("#{key}=", value) }
|
34
35
|
|
data/lib/deas/url.rb
CHANGED
@@ -23,7 +23,7 @@ module Deas
|
|
23
23
|
|
24
24
|
h = params.dup # don't alter the given params
|
25
25
|
c = h.delete(:captures) || h.delete('captures') || []
|
26
|
-
s = h.delete(:splat) || h.delete('splat') ||
|
26
|
+
s = h.delete(:splat) || h.delete('splat') || nil
|
27
27
|
a = h.delete(:'#') || h.delete('#') || nil
|
28
28
|
|
29
29
|
# ignore captures when setting params
|
@@ -33,10 +33,8 @@ module Deas
|
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
-
def set_splat(path,
|
37
|
-
|
38
|
-
path_string.sub(/\*+/, value.to_s)
|
39
|
-
end
|
36
|
+
def set_splat(path, value)
|
37
|
+
path.sub(/\*+/, value.to_s)
|
40
38
|
end
|
41
39
|
|
42
40
|
def set_named(path, params)
|
data/lib/deas/version.rb
CHANGED
data/lib/deas/view_handler.rb
CHANGED
@@ -38,11 +38,13 @@ class Deas::HandlerProxy
|
|
38
38
|
|
39
39
|
Assert.stub(@proxy, :handler_class){ EmptyViewHandler }
|
40
40
|
|
41
|
-
@server_data
|
42
|
-
@fake_sinatra_call
|
41
|
+
@server_data = Factory.server_data
|
42
|
+
@fake_sinatra_call = Factory.sinatra_call
|
43
|
+
@splat_sym_param = Factory.string
|
44
|
+
@splat_string_param = Factory.string
|
43
45
|
@fake_sinatra_call.params = {
|
44
|
-
:splat =>
|
45
|
-
'splat' =>
|
46
|
+
:splat => [@splat_sym_param],
|
47
|
+
'splat' => [@splat_string_param],
|
46
48
|
:captures => [Factory.string],
|
47
49
|
'captures' => [Factory.string]
|
48
50
|
}
|
@@ -65,13 +67,24 @@ class Deas::HandlerProxy
|
|
65
67
|
:template_source => @server_data.template_source,
|
66
68
|
:request => @fake_sinatra_call.request,
|
67
69
|
:session => @fake_sinatra_call.session,
|
68
|
-
:params => @fake_sinatra_call.params
|
70
|
+
:params => @fake_sinatra_call.params,
|
71
|
+
:splat => @splat_sym_param
|
69
72
|
}
|
70
73
|
assert_equal exp_args, @runner_spy.args
|
71
74
|
|
72
75
|
assert_true @runner_spy.run_called
|
73
76
|
end
|
74
77
|
|
78
|
+
should "prefer splat sym params over splat string params" do
|
79
|
+
assert_equal @splat_sym_param, @runner_spy.args[:splat]
|
80
|
+
|
81
|
+
@fake_sinatra_call.params['splat'] = [@splat_string_param]
|
82
|
+
proxy = Deas::HandlerProxy.new('EmptyViewHandler')
|
83
|
+
Assert.stub(proxy, :handler_class){ EmptyViewHandler }
|
84
|
+
proxy.run(@server_data, @fake_sinatra_call)
|
85
|
+
assert_equal @splat_string_param, @runner_spy.args[:splat]
|
86
|
+
end
|
87
|
+
|
75
88
|
should "add data to the request env to make it available to Rack" do
|
76
89
|
exp = subject.handler_class
|
77
90
|
assert_equal exp, @fake_sinatra_call.request.env['deas.handler_class']
|
@@ -86,7 +99,8 @@ class Deas::HandlerProxy
|
|
86
99
|
should "log the handler class name and the params" do
|
87
100
|
exp_msgs = [
|
88
101
|
" Handler: #{subject.handler_class.name}",
|
89
|
-
" Params: #{@runner_spy.params.inspect}"
|
102
|
+
" Params: #{@runner_spy.params.inspect}",
|
103
|
+
" Splat: #{@runner_spy.splat.inspect}"
|
90
104
|
]
|
91
105
|
assert_equal exp_msgs, @fake_sinatra_call.request.logging_msgs
|
92
106
|
end
|
@@ -98,7 +112,7 @@ class Deas::HandlerProxy
|
|
98
112
|
attr_reader :run_called
|
99
113
|
attr_reader :handler_class, :handler, :args
|
100
114
|
attr_reader :logger, :router, :template_source
|
101
|
-
attr_reader :request, :session, :params
|
115
|
+
attr_reader :request, :session, :params, :splat
|
102
116
|
|
103
117
|
def initialize
|
104
118
|
@run_called = false
|
@@ -115,6 +129,7 @@ class Deas::HandlerProxy
|
|
115
129
|
@request = args[:request]
|
116
130
|
@session = args[:session]
|
117
131
|
@params = args[:params]
|
132
|
+
@splat = args[:splat]
|
118
133
|
end
|
119
134
|
|
120
135
|
def run
|
data/test/unit/router_tests.rb
CHANGED
@@ -402,6 +402,27 @@ class Deas::Router
|
|
402
402
|
end
|
403
403
|
end
|
404
404
|
|
405
|
+
should "complain if defining a url with invalid splats" do
|
406
|
+
assert_raises ArgumentError do
|
407
|
+
subject.url(:get_info, "/something/*/other/*")
|
408
|
+
end
|
409
|
+
assert_raises ArgumentError do
|
410
|
+
subject.url(:get_info, "/something/*/other")
|
411
|
+
end
|
412
|
+
assert_raises ArgumentError do
|
413
|
+
subject.url(:get_info, "/something/*/")
|
414
|
+
end
|
415
|
+
assert_raises ArgumentError do
|
416
|
+
subject.url(:get_info, "/*/something")
|
417
|
+
end
|
418
|
+
assert_nothing_raised do
|
419
|
+
subject.url(:get_info, "/something/*")
|
420
|
+
end
|
421
|
+
assert_nothing_raised do
|
422
|
+
subject.url(:get_info, "/*")
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
405
426
|
should "build a path for a url given params" do
|
406
427
|
exp_path = subject.prepend_base_url("/info/now")
|
407
428
|
assert_equal exp_path, subject.url_for(:get_info, :for => 'now')
|
data/test/unit/runner_tests.rb
CHANGED
@@ -45,7 +45,7 @@ class Deas::Runner
|
|
45
45
|
|
46
46
|
should have_readers :handler_class, :handler
|
47
47
|
should have_readers :logger, :router, :template_source
|
48
|
-
should have_readers :request, :session, :params
|
48
|
+
should have_readers :request, :session, :params, :splat
|
49
49
|
should have_imeths :run, :to_rack
|
50
50
|
should have_imeths :status, :headers, :body, :content_type
|
51
51
|
should have_imeths :halt, :redirect, :send_file
|
@@ -75,7 +75,8 @@ class Deas::Runner
|
|
75
75
|
:template_source => 'a-source',
|
76
76
|
:request => 'a-request',
|
77
77
|
:session => 'a-session',
|
78
|
-
:params => {}
|
78
|
+
:params => {},
|
79
|
+
:splat => 'a-splat'
|
79
80
|
}
|
80
81
|
|
81
82
|
runner = @runner_class.new(@handler_class, args)
|
@@ -86,6 +87,7 @@ class Deas::Runner
|
|
86
87
|
assert_equal args[:request], runner.request
|
87
88
|
assert_equal args[:session], runner.session
|
88
89
|
assert_equal args[:params], runner.params
|
90
|
+
assert_equal args[:splat], runner.splat
|
89
91
|
end
|
90
92
|
|
91
93
|
should "not implement its run method" do
|
@@ -35,6 +35,7 @@ class Deas::TestRunner
|
|
35
35
|
:request => @request,
|
36
36
|
:session => Factory.string,
|
37
37
|
:params => @params,
|
38
|
+
:splat => Factory.path,
|
38
39
|
:custom_value => Factory.integer
|
39
40
|
}
|
40
41
|
|
@@ -63,6 +64,7 @@ class Deas::TestRunner
|
|
63
64
|
assert_equal @args[:request], subject.request
|
64
65
|
assert_equal @args[:session], subject.session
|
65
66
|
assert_equal @args[:params], subject.params
|
67
|
+
assert_equal @args[:splat], subject.splat
|
66
68
|
end
|
67
69
|
|
68
70
|
should "call to normalize its params" do
|
data/test/unit/url_tests.rb
CHANGED
@@ -59,31 +59,31 @@ class Deas::Url
|
|
59
59
|
class PathForTests < InitTests
|
60
60
|
desc "when generating paths"
|
61
61
|
setup do
|
62
|
-
@url = Deas::Url.new(:some_thing, '/:some/:thing
|
63
|
-
@url_with_escape = Deas::Url.new(:some_thing, '/:some/:thing
|
62
|
+
@url = Deas::Url.new(:some_thing, '/:some/:thing/*')
|
63
|
+
@url_with_escape = Deas::Url.new(:some_thing, '/:some/:thing/*', {
|
64
64
|
:escape_query_value => proc{ |v| Rack::Utils.escape(v) }
|
65
65
|
})
|
66
66
|
end
|
67
67
|
|
68
68
|
should "generate given named params only" do
|
69
|
-
exp_path =
|
69
|
+
exp_path = '/a/goose/'
|
70
70
|
assert_equal exp_path, subject.path_for({
|
71
71
|
'some' => 'a',
|
72
72
|
:thing => 'goose'
|
73
73
|
})
|
74
74
|
|
75
|
-
exp_path =
|
75
|
+
exp_path = '/a/goose/cooked'
|
76
76
|
assert_equal exp_path, subject.path_for({
|
77
77
|
'some' => 'a',
|
78
78
|
:thing => 'goose',
|
79
|
-
:splat =>
|
79
|
+
:splat => 'cooked'
|
80
80
|
})
|
81
81
|
|
82
|
-
exp_path =
|
82
|
+
exp_path = '/a/goose/cooked'
|
83
83
|
assert_equal exp_path, subject.path_for({
|
84
84
|
'some' => 'a',
|
85
85
|
:thing => 'goose',
|
86
|
-
'splat' =>
|
86
|
+
'splat' => 'cooked'
|
87
87
|
})
|
88
88
|
end
|
89
89
|
|
@@ -105,95 +105,86 @@ class Deas::Url
|
|
105
105
|
end
|
106
106
|
|
107
107
|
should "not complain if given empty splat param values" do
|
108
|
-
exp_path =
|
108
|
+
exp_path = '/a/goose/'
|
109
109
|
assert_equal exp_path, subject.path_for({
|
110
110
|
'some' => 'a',
|
111
111
|
:thing => 'goose',
|
112
|
-
'splat' => [nil, '']
|
112
|
+
'splat' => [nil, ''].sample
|
113
113
|
})
|
114
114
|
end
|
115
115
|
|
116
116
|
should "append other (additional) params as query params" do
|
117
|
-
exp_path =
|
117
|
+
exp_path = '/a/goose/cooked?aye=a&bee=b'
|
118
118
|
assert_equal exp_path, subject.path_for({
|
119
119
|
'some' => 'a',
|
120
120
|
:thing => 'goose',
|
121
|
-
'splat' =>
|
121
|
+
'splat' => 'cooked',
|
122
122
|
'bee' => 'b',
|
123
123
|
:aye => 'a'
|
124
124
|
})
|
125
125
|
end
|
126
126
|
|
127
127
|
should "escape query values when built with an escape query value proc" do
|
128
|
-
exp_path =
|
128
|
+
exp_path = '/a/goose/cooked?aye=a?a&a'
|
129
129
|
assert_equal exp_path, subject.path_for({
|
130
130
|
'some' => 'a',
|
131
131
|
:thing => 'goose',
|
132
|
-
'splat' =>
|
132
|
+
'splat' => 'cooked',
|
133
133
|
:aye => 'a?a&a'
|
134
134
|
})
|
135
135
|
|
136
|
-
exp_path = "/a/goose/cooked
|
136
|
+
exp_path = "/a/goose/cooked?aye=a%3Fa%26a"
|
137
137
|
assert_equal exp_path, @url_with_escape.path_for({
|
138
138
|
'some' => 'a',
|
139
139
|
:thing => 'goose',
|
140
|
-
'splat' =>
|
140
|
+
'splat' => 'cooked',
|
141
141
|
:aye => 'a?a&a'
|
142
142
|
})
|
143
143
|
end
|
144
144
|
|
145
145
|
should "ignore any 'captures'" do
|
146
|
-
exp_path =
|
146
|
+
exp_path = '/a/goose/cooked'
|
147
147
|
assert_equal exp_path, subject.path_for({
|
148
|
-
'some'
|
149
|
-
:thing
|
150
|
-
'splat'
|
148
|
+
'some' => 'a',
|
149
|
+
:thing => 'goose',
|
150
|
+
'splat' => 'cooked',
|
151
151
|
'captures' => 'some-captures'
|
152
152
|
})
|
153
153
|
end
|
154
154
|
|
155
155
|
should "append anchors" do
|
156
|
-
exp_path =
|
156
|
+
exp_path = '/a/goose/cooked#an-anchor'
|
157
157
|
assert_equal exp_path, subject.path_for({
|
158
158
|
'some' => 'a',
|
159
159
|
:thing => 'goose',
|
160
|
-
'splat' =>
|
160
|
+
'splat' => 'cooked',
|
161
161
|
'#' => 'an-anchor'
|
162
162
|
})
|
163
163
|
end
|
164
164
|
|
165
165
|
should "ignore empty anchors" do
|
166
|
-
exp_path =
|
167
|
-
assert_equal exp_path, subject.path_for({
|
168
|
-
'some' => 'a',
|
169
|
-
:thing => 'goose',
|
170
|
-
'splat' => ['cooked', 'well'],
|
171
|
-
'#' => nil
|
172
|
-
})
|
173
|
-
|
174
|
-
exp_path = "/a/goose/cooked/well"
|
166
|
+
exp_path = '/a/goose/cooked'
|
175
167
|
assert_equal exp_path, subject.path_for({
|
176
168
|
'some' => 'a',
|
177
169
|
:thing => 'goose',
|
178
|
-
'splat' =>
|
179
|
-
'#' => ''
|
170
|
+
'splat' => 'cooked',
|
171
|
+
'#' => [nil, ''].sample
|
180
172
|
})
|
181
173
|
end
|
182
174
|
|
183
175
|
should "'squash' duplicate forward-slashes" do
|
184
|
-
exp_path =
|
176
|
+
exp_path = '/a/goose/cooked'
|
185
177
|
assert_equal exp_path, subject.path_for({
|
186
178
|
'some' => '/a',
|
187
179
|
:thing => '/goose',
|
188
|
-
'splat' =>
|
180
|
+
'splat' => '///cooked'
|
189
181
|
})
|
190
182
|
end
|
191
183
|
|
192
184
|
should "not alter the given params" do
|
193
185
|
params = {
|
194
186
|
'some' => 'thing',
|
195
|
-
:
|
196
|
-
:splat => ['splat'],
|
187
|
+
:splat => 'splat',
|
197
188
|
'#' => 'anchor'
|
198
189
|
}
|
199
190
|
exp_params = params.dup
|
@@ -242,6 +242,11 @@ module Deas::ViewHandler
|
|
242
242
|
assert_equal @runner.params, subject.instance_eval{ params }
|
243
243
|
end
|
244
244
|
|
245
|
+
should "call to the runner for its splat" do
|
246
|
+
stub_runner_with_something_for(:splat)
|
247
|
+
assert_equal @runner.splat, subject.instance_eval{ splat }
|
248
|
+
end
|
249
|
+
|
245
250
|
should "call to the runner for its status helper" do
|
246
251
|
capture_runner_meth_args_for(:status)
|
247
252
|
exp_args = @args
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.42.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kelly Redding
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2016-
|
13
|
+
date: 2016-09-01 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: assert
|