angelo 0.1.22 → 0.1.23

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e0c3ba39f8e1f28399b3302508e5607e184306c
4
- data.tar.gz: 80a96668a3b52d38d10128f849115f5a9ffc639c
3
+ metadata.gz: a3c4a56a27bb63eaf52526379dbc8424c6f194af
4
+ data.tar.gz: 4ab664e1d95cb17bd9d3617565d5e4005327fd37
5
5
  SHA512:
6
- metadata.gz: 8692b30501f977877aca3f79246f66dcf046e9d40100577ff79afe8235e5212081c6cda1545e9dc8a78272cc1a98e9a16ce436891bc2735713f4aaac1227b068
7
- data.tar.gz: 1a0a3c79e9bb12a5c49bc3af8913c4099c7b281dbd429ba2fcdbc9f32c5a606b4fcf21fd5925d25d6a678b783fcaa2152c71251c77141556553510e0bbea1430
6
+ metadata.gz: 4a1f2d26c2a74f064f9c35efe1f9c923849f51d48b7a4366f7ba28cbbfd808ee984a6a703d113d5cd50673121f7956bb7ed3bb3fa44173e2b23a46d2ec5e76f8
7
+ data.tar.gz: d4a1f1487a0f56ce0cad5da17cf5322c537752d8eb2bae6d1f4bed3999fe946310eb0184f30ee1f2d0cf9d8905598d5da0f6077876891352823a7633f44c6873
data/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  changelog
2
2
  =========
3
3
 
4
+ ### 0.1.23 18 sep 2014 (thanks @chewi, @samjohnduke)
5
+
6
+ * multiple before/after filters with mustermann support (#3)
7
+ * accept extra headers in eventsource route builder (#6)
8
+ * handle errors in before blocks for eventsource-built routes (#6)
9
+ * let DELETE and OPTIONS routes see query params (#8)
10
+
4
11
  ### 0.1.22 9 sep 2014
5
12
 
6
13
  * handle bad/malformed requests better
data/Gemfile.lock CHANGED
@@ -16,7 +16,8 @@ GEM
16
16
  method_source (0.8.2)
17
17
  mime-types (2.3)
18
18
  minitest (5.4.0)
19
- mustermann (0.2.0)
19
+ mustermann (0.3.1)
20
+ tool (~> 0.2)
20
21
  nio4r (1.0.0)
21
22
  nio4r (1.0.0-java)
22
23
  pry (0.9.12.6)
@@ -42,6 +43,7 @@ GEM
42
43
  ffi
43
44
  tilt (2.0.1)
44
45
  timers (1.1.0)
46
+ tool (0.2.2)
45
47
  websocket-driver (0.3.4)
46
48
  websocket-driver (0.3.4-java)
47
49
  websocket_parser (0.1.6)
data/lib/angelo/base.rb CHANGED
@@ -75,12 +75,35 @@ module Angelo
75
75
  @routes
76
76
  end
77
77
 
78
+ def filters
79
+ @filters ||= {before: {default: []}, after: {default: []}}
80
+ end
81
+
82
+ def filter which, opts = {}, &block
83
+ f = compile! :filter, &block
84
+ case opts
85
+ when String
86
+ filter_by which, opts, f
87
+ when Hash
88
+ if opts[:path]
89
+ filter_by which, opts[:path], f
90
+ else
91
+ filters[which][:default] << f
92
+ end
93
+ end
94
+ end
95
+
96
+ def filter_by which, path, meth
97
+ filters[which][path] ||= []
98
+ filters[which][path] << meth
99
+ end
100
+
78
101
  def before opts = {}, &block
79
- define_method :before, &block
102
+ filter :before, opts, &block
80
103
  end
81
104
 
82
105
  def after opts = {}, &block
83
- define_method :after, &block
106
+ filter :after, opts, &block
84
107
  end
85
108
 
86
109
  HTTPABLE.each do |m|
@@ -93,8 +116,8 @@ module Angelo
93
116
  routes[:websocket][path] = Responder::Websocket.new &block
94
117
  end
95
118
 
96
- def eventsource path, &block
97
- routes[:get][path] = Responder::Eventsource.new &block
119
+ def eventsource path, headers = nil, &block
120
+ routes[:get][path] = Responder::Eventsource.new headers, &block
98
121
  end
99
122
 
100
123
  def on_pong &block
@@ -166,9 +189,10 @@ module Angelo
166
189
 
167
190
  def params
168
191
  @params ||= case request.method
169
- when GET; parse_query_string
170
- when POST; parse_post_body
171
- when PUT; parse_post_body
192
+ when GET, DELETE, OPTIONS
193
+ parse_query_string
194
+ when POST, PUT
195
+ parse_post_body
172
196
  end
173
197
  end
174
198
 
@@ -275,6 +299,12 @@ module Angelo
275
299
  Celluloid.sleep time
276
300
  end
277
301
 
302
+ def filter which
303
+ fs = self.class.filters[which][:default]
304
+ fs += self.class.filters[which][request.path] if self.class.filters[which][request.path]
305
+ fs.each {|f| f.bind(self).call}
306
+ end
307
+
278
308
  end
279
309
 
280
310
  end
@@ -33,9 +33,9 @@ module Angelo
33
33
  super path, &block
34
34
  end
35
35
 
36
- def eventsource path, &block
36
+ def eventsource path, headers = nil, &block
37
37
  path = ::Mustermann.new path
38
- super path, &block
38
+ super path, headers, &block
39
39
  end
40
40
 
41
41
  def routes
@@ -46,12 +46,38 @@ module Angelo
46
46
  @routes
47
47
  end
48
48
 
49
+ def filter_by which, path, meth
50
+ pattern = ::Mustermann.new path
51
+ filters[which][pattern] ||= []
52
+ filters[which][pattern] << meth
53
+ end
54
+
49
55
  end
50
56
 
51
57
  def params
52
58
  @params ||= super.merge mustermann.params(request.path)
53
59
  end
54
60
 
61
+ def filter which
62
+ fs = self.class.filters[which][:default].dup
63
+ self.class.filters[which].each do |pattern, f|
64
+ if ::Mustermann === pattern and pattern.match request.path
65
+ fs << [f, pattern]
66
+ end
67
+ end
68
+ fs.each do |f|
69
+ case f
70
+ when UnboundMethod
71
+ f.bind(self).call
72
+ when Array
73
+ @pre_filter_params = params
74
+ @params = @pre_filter_params.merge f[1].params(request.path)
75
+ f[0].each {|filter| filter.bind(self).call}
76
+ @params = @pre_filter_params
77
+ end
78
+ end
79
+ end
80
+
55
81
  class RouteMap
56
82
 
57
83
  def initialize
@@ -2,6 +2,11 @@ module Angelo
2
2
  class Responder
3
3
  class Eventsource < Responder
4
4
 
5
+ def initialize _headers = nil, &block
6
+ headers _headers if _headers
7
+ super &block
8
+ end
9
+
5
10
  def request= request
6
11
  @params = nil
7
12
  @request = request
@@ -11,14 +16,14 @@ module Angelo
11
16
  def handle_request
12
17
  begin
13
18
  if @response_handler
14
- @base.before if @base.respond_to? :before
19
+ @base.filter :before
15
20
  @body = catch(:halt) { @base.eventsource &@response_handler.bind(@base) }
16
21
  if HALT_STRUCT === @body
17
22
  raise RequestError.new 'unknown sse error' unless @body.body == :sse
18
23
  end
19
24
 
20
25
  # TODO any real reason not to run afters with SSE?
21
- # @base.after if @base.respond_to? :after
26
+ # @base.filter :after
22
27
 
23
28
  respond
24
29
  else
@@ -26,15 +31,8 @@ module Angelo
26
31
  end
27
32
  rescue IOError => ioe
28
33
  warn "#{ioe.class} - #{ioe.message}"
29
- close_websocket
30
34
  rescue => e
31
- error e.message
32
- ::STDERR.puts e.backtrace
33
- begin
34
- @connection.close
35
- rescue Reel::StateError => rcse
36
- close_websocket
37
- end
35
+ handle_error e
38
36
  end
39
37
  end
40
38
 
@@ -25,9 +25,9 @@ module Angelo
25
25
  Angelo.log @connection, @request, @websocket, :switching_protocols
26
26
  @bound_response_handler ||= @response_handler.bind @base
27
27
  @websocket.on_pong &Responder::Websocket.on_pong
28
- @base.before if @base.respond_to? :before
28
+ @base.filter :before
29
29
  @bound_response_handler[@websocket]
30
- @base.after if @base.respond_to? :after
30
+ @base.filter :after
31
31
  else
32
32
  raise NotImplementedError
33
33
  end
@@ -1,5 +1,3 @@
1
- require 'date'
2
-
3
1
  module Angelo
4
2
 
5
3
  class Responder
@@ -50,17 +48,15 @@ module Angelo
50
48
 
51
49
  def handle_request
52
50
  if @response_handler
53
- @base.before if @base.respond_to? :before
51
+ @base.filter :before
54
52
  @body = catch(:halt) { @response_handler.bind(@base).call || EMPTY_STRING }
55
53
 
56
54
  # TODO any real reason not to run afters with SSE?
57
55
  case @body
58
56
  when HALT_STRUCT
59
- if @body.body != :sse and @base.respond_to? :after
60
- @base.after
61
- end
57
+ @base.filter :after if @body.body != :sse
62
58
  else
63
- @base.after if @base.respond_to? :after
59
+ @base.filter :after
64
60
  end
65
61
 
66
62
  respond
@@ -1,3 +1,3 @@
1
1
  module Angelo
2
- VERSION = '0.1.22'
2
+ VERSION = '0.1.23'
3
3
  end
@@ -4,30 +4,70 @@ describe Angelo::Responder::Eventsource do
4
4
 
5
5
  describe 'route builder' do
6
6
 
7
- define_app do
7
+ describe 'basics' do
8
+
9
+ define_app do
10
+
11
+ eventsource '/msg' do |c|
12
+ c.write sse_message 'hi'
13
+ c.close
14
+ end
15
+
16
+ eventsource '/event' do |c|
17
+ c.write sse_event :sse, 'bye'
18
+ c.close
19
+ end
20
+
21
+ eventsource '/headers', foo: 'bar' do |c|
22
+ c.write sse_event :sse, 'headers'
23
+ c.close
24
+ end
8
25
 
9
- eventsource '/msg' do |c|
10
- c.write sse_message 'hi'
11
- c.close
12
26
  end
13
27
 
14
- eventsource '/event' do |c|
15
- c.write sse_event :sse, 'bye'
16
- c.close
28
+ it 'sends messages' do
29
+ get_sse '/msg' do |msg|
30
+ msg.must_equal "data: hi\n\n"
31
+ end
17
32
  end
18
33
 
19
- end
34
+ it 'sends events' do
35
+ get_sse '/event' do |msg|
36
+ msg.must_equal "event: sse\ndata: bye\n\n"
37
+ end
38
+ end
20
39
 
21
- it 'sends messages' do
22
- get_sse '/msg' do |msg|
23
- msg.must_equal "data: hi\n\n"
40
+ it 'accepts extra headers hash as second optional parameter' do
41
+ get_sse '/headers' do |msg|
42
+ msg.must_equal "event: sse\ndata: headers\n\n"
43
+ end
44
+ last_response.headers['Foo'].must_equal 'bar'
24
45
  end
46
+
25
47
  end
26
48
 
27
- it 'sends events' do
28
- get_sse '/event' do |msg|
29
- msg.must_equal "event: sse\ndata: bye\n\n"
49
+ describe 'error handling' do
50
+
51
+ define_app do
52
+
53
+ before do
54
+ raise 'wrong'
55
+ end
56
+
57
+ eventsource '/msg' do |c|
58
+ c.write sse_message 'hi'
59
+ c.close
60
+ end
61
+
62
+ end
63
+
64
+ it 'handles exceptions in before blocks' do
65
+ get_sse '/msg' do |msg|
66
+ msg.must_equal "wrong"
67
+ end
68
+ last_response.status.must_equal 500
30
69
  end
70
+
31
71
  end
32
72
 
33
73
  end
@@ -52,6 +92,14 @@ describe 'eventsource helper' do
52
92
  end
53
93
  end
54
94
 
95
+ get '/headers' do
96
+ headers foo: 'bar'
97
+ eventsource do |c|
98
+ c.write sse_event :sse, 'headers'
99
+ c.close
100
+ end
101
+ end
102
+
55
103
  end
56
104
 
57
105
  it 'sends messages' do
@@ -66,4 +114,11 @@ describe 'eventsource helper' do
66
114
  end
67
115
  end
68
116
 
117
+ it 'allows headers to be set outside block' do
118
+ get_sse '/headers' do |msg|
119
+ msg.must_equal "event: sse\ndata: headers\n\n"
120
+ end
121
+ last_response.headers['Foo'].must_equal 'bar'
122
+ end
123
+
69
124
  end
@@ -0,0 +1,294 @@
1
+ require_relative '../spec_helper.rb'
2
+
3
+ describe Angelo::Base do
4
+
5
+ describe 'before filter' do
6
+
7
+ describe 'single default' do
8
+
9
+ define_app do
10
+
11
+ before do
12
+ @set_by_before = params
13
+ end
14
+
15
+ [:get, :post, :put].each do |m|
16
+ __send__ m, '/before' do
17
+ content_type :json
18
+ @set_by_before
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ it 'runs before filters before routes' do
25
+
26
+ get '/before', obj
27
+ last_response_must_be_json obj_s
28
+
29
+ [:post, :put].each do |m|
30
+ __send__ m, '/before', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
31
+ last_response_must_be_json obj
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ describe 'multiple default' do
39
+
40
+ define_app do
41
+
42
+ before do
43
+ @foo = params[:foo]
44
+ end
45
+
46
+ before do
47
+ @bar = params[:bar] if @foo
48
+ end
49
+
50
+ before do
51
+ @bat = params[:bat] if @bar
52
+ end
53
+
54
+ [:get, :post, :put].each do |m|
55
+ __send__ m, '/before' do
56
+ content_type :json
57
+ { foo: @foo, bar: @bar, bat: @bat }
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ it 'runs before filters in order' do
64
+
65
+ get '/before', obj
66
+ last_response_must_be_json obj_s
67
+
68
+ [:post, :put].each do |m|
69
+ __send__ m, '/before', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
70
+ last_response_must_be_json obj
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+
77
+ describe 'pathed' do
78
+
79
+ define_app do
80
+
81
+ before do
82
+ @foo = params[:foo]
83
+ end
84
+
85
+ before '/before_bar' do
86
+ @bar = params[:bar] if @foo
87
+ end
88
+
89
+ before path: '/before_bat' do
90
+ @bat = params[:bat] if @foo
91
+ end
92
+
93
+ [:get, :post, :put].each do |m|
94
+
95
+ __send__ m, '/before' do
96
+ content_type :json
97
+ { foo: @foo, bar: @bar, bat: @bat }.select! {|k,v| !v.nil?}
98
+ end
99
+
100
+ __send__ m, '/before_bar' do
101
+ content_type :json
102
+ { foo: @foo, bar: @bar, bat: @bat }.select! {|k,v| !v.nil?}
103
+ end
104
+
105
+ __send__ m, '/before_bat' do
106
+ content_type :json
107
+ { foo: @foo, bar: @bar, bat: @bat }.select! {|k,v| !v.nil?}
108
+ end
109
+ end
110
+
111
+ end
112
+
113
+ it 'runs default before filter for all paths' do
114
+
115
+ get '/before', obj
116
+ last_response_must_be_json obj_s.select {|k,v| k == 'foo'}
117
+
118
+ [:post, :put].each do |m|
119
+ __send__ m, '/before', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
120
+ last_response_must_be_json obj.select {|k,v| k == 'foo'}
121
+ end
122
+
123
+ end
124
+
125
+ it 'runs default and specific before filters' do
126
+
127
+ get '/before_bar', obj
128
+ last_response_must_be_json obj_s.select {|k,v| ['foo','bar'].include? k}
129
+
130
+ [:post, :put].each do |m|
131
+ __send__ m, '/before_bar', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
132
+ last_response_must_be_json obj.select {|k,v| ['foo','bar'].include? k}
133
+ end
134
+
135
+ get '/before_bat', obj
136
+ last_response_must_be_json obj_s.select {|k,v| ['foo','bat'].include? k}
137
+
138
+ [:post, :put].each do |m|
139
+ __send__ m, '/before_bat', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
140
+ last_response_must_be_json obj.select {|k,v| ['foo','bat'].include? k}
141
+ end
142
+
143
+ end
144
+
145
+ end
146
+
147
+ end
148
+
149
+ describe 'after filter' do
150
+
151
+ describe 'single default' do
152
+
153
+ invoked = 0
154
+
155
+ define_app do
156
+
157
+ before do
158
+ invoked += 2
159
+ end
160
+
161
+ after do
162
+ invoked *= 2
163
+ end
164
+
165
+ Angelo::HTTPABLE.each do |m|
166
+ __send__ m, '/after' do
167
+ invoked.to_s
168
+ end
169
+ end
170
+
171
+ end
172
+
173
+ it 'runs after filters after routes' do
174
+ a = %w[2 6 14 30 62]
175
+ b = [4, 12, 28, 60, 124]
176
+
177
+ Angelo::HTTPABLE.each_with_index do |m,i|
178
+ __send__ m, '/after', obj
179
+ last_response_must_be_html a[i]
180
+ invoked.must_equal b[i]
181
+ end
182
+ end
183
+
184
+ end
185
+
186
+ describe 'multiple default' do
187
+
188
+ invoked = 0
189
+
190
+ define_app do
191
+
192
+ after do
193
+ invoked += 2
194
+ end
195
+
196
+ after do
197
+ invoked *= 2
198
+ end
199
+
200
+ after do
201
+ invoked -= 2
202
+ end
203
+
204
+ Angelo::HTTPABLE.each do |m|
205
+ __send__ m, '/after' do
206
+ invoked.to_s
207
+ end
208
+ end
209
+
210
+ end
211
+
212
+ it 'runs after filters in order' do
213
+ a = %w[0 2 6 14 30]
214
+ b = [2, 6, 14, 30, 62]
215
+
216
+ Angelo::HTTPABLE.each_with_index do |m,i|
217
+ __send__ m, '/after', obj
218
+ last_response_must_be_html a[i]
219
+ invoked.must_equal b[i]
220
+ end
221
+ end
222
+
223
+ end
224
+
225
+ describe 'pathed' do
226
+
227
+ invoked = 0
228
+
229
+ define_app do
230
+
231
+ after do
232
+ invoked += 2
233
+ end
234
+
235
+ after '/after_bar' do
236
+ invoked *= 2
237
+ end
238
+
239
+ after '/after_bat' do
240
+ invoked -= 4
241
+ end
242
+
243
+ Angelo::HTTPABLE.each do |m|
244
+ __send__ m, '/after' do
245
+ invoked.to_s
246
+ end
247
+
248
+ __send__ m, '/after_bar' do
249
+ invoked.to_s
250
+ end
251
+
252
+ __send__ m, '/after_bat' do
253
+ invoked.to_s
254
+ end
255
+ end
256
+
257
+ end
258
+
259
+ it 'runs default and specific after filters' do
260
+
261
+ a = %w[0 2 4 6 8]
262
+ b = [2, 4, 6, 8, 10]
263
+
264
+ Angelo::HTTPABLE.each_with_index do |m,i|
265
+ __send__ m, '/after', obj
266
+ last_response_must_be_html a[i]
267
+ invoked.must_equal b[i]
268
+ end
269
+
270
+ c = %w[10 24 52 108 220]
271
+ d = [24, 52, 108, 220, 444]
272
+
273
+ Angelo::HTTPABLE.each_with_index do |m,i|
274
+ __send__ m, '/after_bar', obj
275
+ last_response_must_be_html c[i]
276
+ invoked.must_equal d[i]
277
+ end
278
+
279
+ e = %w[444 442 440 438 436]
280
+ f = [442, 440, 438, 436, 434]
281
+
282
+ Angelo::HTTPABLE.each_with_index do |m,i|
283
+ __send__ m, '/after_bat', obj
284
+ last_response_must_be_html e[i]
285
+ invoked.must_equal f[i]
286
+ end
287
+
288
+ end
289
+
290
+ end
291
+
292
+ end
293
+
294
+ end
@@ -94,4 +94,92 @@ HTML
94
94
 
95
95
  end
96
96
 
97
+ describe 'filters' do
98
+
99
+ describe 'params in route blocks' do
100
+
101
+ define_app do
102
+ include Angelo::Mustermann
103
+
104
+ before '/before/:foo' do
105
+ @foo = params[:foo]
106
+ end
107
+
108
+ content_type :json
109
+
110
+ [:get, :post, :put].each do |m|
111
+ __send__ m, '/before/:bar' do
112
+ { bar: params[:bar], foo: params[:foo], foo_from_before: @foo }
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+ it 'does not infect route block params with filter pattern params' do
119
+ [:get, :post, :put].each do |m|
120
+ __send__ m, '/before/hi'
121
+ last_response_must_be_json 'bar' => 'hi', 'foo' => nil, 'foo_from_before' => 'hi'
122
+ end
123
+ end
124
+
125
+ end
126
+
127
+ describe 'wildcard' do
128
+
129
+ define_app do
130
+ include Angelo::Mustermann
131
+
132
+ before do
133
+ @foo = params[:foo]
134
+ end
135
+
136
+ before path: '/before*' do
137
+ @bar = params[:bar] if @foo
138
+ @bat = params[:bat] if @foo
139
+ end
140
+
141
+ [:get, :post, :put].each do |m|
142
+
143
+ __send__ m, '/before' do
144
+ content_type :json
145
+ { foo: @foo, bar: @bar, bat: @bat }.select {|k,v| !v.nil?}
146
+ end
147
+
148
+ __send__ m, '/before_bar' do
149
+ content_type :json
150
+ { foo: @foo, bar: @bar, bat: @bat }.select {|k,v| !v.nil?}
151
+ end
152
+
153
+ __send__ m, '/before_bat' do
154
+ content_type :json
155
+ { foo: @foo, bar: @bar, bat: @bat }.select {|k,v| !v.nil?}
156
+ end
157
+ end
158
+
159
+ end
160
+
161
+ it 'runs wildcarded before filters' do
162
+
163
+ get '/before_bar', obj
164
+ last_response_must_be_json obj_s
165
+
166
+ [:post, :put].each do |m|
167
+ __send__ m, '/before_bar', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
168
+ last_response_must_be_json obj
169
+ end
170
+
171
+ get '/before_bat', obj
172
+ last_response_must_be_json obj_s
173
+
174
+ [:post, :put].each do |m|
175
+ __send__ m, '/before_bat', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
176
+ last_response_must_be_json obj
177
+ end
178
+
179
+ end
180
+
181
+ end
182
+
183
+ end
184
+
97
185
  end
@@ -194,7 +194,7 @@ describe Angelo::Responder::Websocket do
194
194
  Angelo::HTTPABLE.each do |m|
195
195
  __send__ m, '/concur' do
196
196
  websockets.each do |ws|
197
- msg = "from #{params ? params[:foo] : 'http'} #{m.to_s}"
197
+ msg = "from #{params[:foo]} #{m.to_s}"
198
198
  ws.write msg
199
199
  end
200
200
  ''
@@ -216,7 +216,7 @@ describe Angelo::Responder::Websocket do
216
216
  }
217
217
 
218
218
  websocket_wait_for '/concur', latch, expectation do
219
- Angelo::HTTPABLE.each {|m| __send__ m, '/concur', foo: 'http'}
219
+ Angelo::HTTPABLE.each {|m| __send__ m, '/concur?foo=http'}
220
220
  latch.wait
221
221
  end
222
222
 
data/test/angelo_spec.rb CHANGED
@@ -2,14 +2,6 @@ require_relative './spec_helper'
2
2
 
3
3
  describe Angelo::Base do
4
4
 
5
- def obj
6
- {'foo' => 'bar', 'bar' => 123.4567890123456, 'bat' => true}
7
- end
8
-
9
- def obj_s
10
- obj.keys.reduce({}){|h,k| h[k] = obj[k].to_s; h}
11
- end
12
-
13
5
  describe 'the basics' do
14
6
 
15
7
  define_app do
@@ -108,72 +100,6 @@ describe Angelo::Base do
108
100
 
109
101
  end
110
102
 
111
- describe 'before filter' do
112
-
113
- define_app do
114
-
115
- before do
116
- @set_by_before = params
117
- end
118
-
119
- [:get, :post, :put].each do |m|
120
- __send__ m, '/before' do
121
- content_type :json
122
- @set_by_before
123
- end
124
- end
125
-
126
- end
127
-
128
- it 'runs before filters before routes' do
129
-
130
- get '/before', obj
131
- last_response_must_be_json obj_s
132
-
133
- [:post, :put].each do |m|
134
- __send__ m, '/before', obj.to_json, {Angelo::CONTENT_TYPE_HEADER_KEY => Angelo::JSON_TYPE}
135
- last_response_must_be_json obj
136
- end
137
-
138
- end
139
-
140
- end
141
-
142
- describe 'after filter' do
143
-
144
- invoked = 0
145
-
146
- define_app do
147
-
148
- before do
149
- invoked += 2
150
- end
151
-
152
- after do
153
- invoked *= 2
154
- end
155
-
156
- Angelo::HTTPABLE.each do |m|
157
- __send__ m, '/after' do
158
- invoked.to_s
159
- end
160
- end
161
-
162
- end
163
-
164
- it 'runs after filters after routes' do
165
- a = %w[2 6 14 30 62]
166
- b = [4, 12, 28, 60, 124]
167
-
168
- Angelo::HTTPABLE.each_with_index do |m,i|
169
- __send__ m, '/after', obj
170
- last_response_must_be_html a[i]
171
- invoked.must_equal b[i]
172
- end
173
- end
174
-
175
- end
176
-
177
103
  describe 'headers helper' do
178
104
 
179
105
  headers_count = 0
@@ -385,7 +311,7 @@ describe Angelo::Base do
385
311
 
386
312
  define_app do
387
313
 
388
- [:get, :post].each do |m|
314
+ Angelo::HTTPABLE.each do |m|
389
315
  __send__ m, '/json' do
390
316
  content_type :json
391
317
  params
@@ -409,6 +335,13 @@ describe Angelo::Base do
409
335
  last_response_must_be_json({})
410
336
  end
411
337
 
338
+ (Angelo::HTTPABLE - [:post, :put]).each do |m|
339
+ it "returns a populated hash for #{m.to_s.upcase} requests" do
340
+ send m, '/json?foo=bar'
341
+ last_response_must_be_json('foo' => 'bar')
342
+ end
343
+ end
344
+
412
345
  end
413
346
 
414
347
  describe 'request_headers helper' do
data/test/spec_helper.rb CHANGED
@@ -84,3 +84,11 @@ class ActorPool
84
84
  end
85
85
 
86
86
  $pool = ActorPool.pool size: CONCURRENCY
87
+
88
+ def obj
89
+ {'foo' => 'bar', 'bar' => 123.4567890123456, 'bat' => true}
90
+ end
91
+
92
+ def obj_s
93
+ obj.keys.reduce({}){|h,k| h[k] = obj[k].to_s; h}
94
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: angelo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.22
4
+ version: 0.1.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenichi Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-09 00:00:00.000000000 Z
11
+ date: 2014-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: reel
@@ -69,6 +69,7 @@ files:
69
69
  - test/angelo/erb_spec.rb
70
70
  - test/angelo/error_spec.rb
71
71
  - test/angelo/eventsource_spec.rb
72
+ - test/angelo/filter_spec.rb
72
73
  - test/angelo/mustermann_spec.rb
73
74
  - test/angelo/params_spec.rb
74
75
  - test/angelo/static_spec.rb