roda 2.13.0 → 2.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f3983563024d2c3f03d3a9edcf291f9a6f128ee
4
- data.tar.gz: 4ac86dfd93b62b8e4f79f19788cf9dbd110df8f2
3
+ metadata.gz: cde8be71334a4d1be45b77656f9314fbac254bd1
4
+ data.tar.gz: 6c100351e8af6103d141f64967971c3e56dec13d
5
5
  SHA512:
6
- metadata.gz: 807d5d4fcc03d18823d045b18cb8cf6ce532ea8501254c2f0ce7f245742e4ea6495e399c0e33ae1f7939726b0cb511bc7cc0d9620ec5d19099df86523d9c9847
7
- data.tar.gz: cc40d28a3152b29755e7949304a4b3bd3a83147ce3975fe0fba829c332641651134727157726425da90feec610f8acfa6b1efd6ba5e8362c14ba97fb2dfe93a9
6
+ metadata.gz: 9084568d409627ac84c60d16049a6d2c545bdd9ac6cd6ba4dc312720474ccebc4e859dcc559d7e82390b66e04f31b06ee63ba32a288df57a832ea36ed18fd2ef
7
+ data.tar.gz: 74b8305898e306b49179ccb05349d4cf25a8fd4f7d481baec071728626a6c1eec99f40fd04faa6d85321e256154db6bf9a74717dbee50a50edad22f552152086
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 2.14.0 (2016-05-13)
2
+
3
+ * Add symbol_status plugin for using symbols as status codes (Papierkorb) (#65)
4
+
5
+ * Make middleware plugin also run the application's middleware (jeremyevans)
6
+
1
7
  = 2.13.0 (2016-04-14)
2
8
 
3
9
  * Add :check_paths and :allowed_paths to render plugin options to avoid security issues with template rendering (jeremyevans)
@@ -0,0 +1,44 @@
1
+ = New Features
2
+
3
+ * A symbol_status plugin has been added for using symbolic status names
4
+ in response.status=:
5
+
6
+ class App < Roda
7
+ plugin :symbol_status
8
+
9
+ route do |r|
10
+ r.is "needs_authorization"
11
+ response.status = :unauthorized
12
+ end
13
+ end
14
+
15
+ = Other Improvements
16
+
17
+ * The middleware plugin will now also run the application's middleware
18
+ when the application is used as middleware. For example, if you
19
+ have the following code in your config.ru file:
20
+
21
+ class App < Roda
22
+ plugin :csrf
23
+ plugin :middleware
24
+ route{}
25
+ end
26
+
27
+ use App
28
+
29
+ previously, the csrf protection would not be enforced, as it uses a
30
+ middleware instead of being part of the application. Now, csrf
31
+ protection will be enforced. This change makes it so the Roda
32
+ application operates the same way regardless of whether it is run
33
+ as the rack application or used as rack middleware.
34
+
35
+ Because of this change, if you are nesting roda applications using
36
+ the middleware plugin, you may need to use the middleware plugin's
37
+ :env_var option to specify the environment variable used to
38
+ indicate to the Roda application that it is being run as middleware.
39
+
40
+ = Backwards Compatibility
41
+
42
+ * See above changes to the middleware plugin if you are using
43
+ middleware inside a Roda application that uses the middleware
44
+ plugin.
@@ -36,6 +36,16 @@ class Roda
36
36
  # It is possible to use the Roda app as a regular app even when using
37
37
  # the middleware plugin.
38
38
  module Middleware
39
+ # Configure the middleware plugin. Options:
40
+ # :env_var :: Set the environment variable to use to indicate to the roda
41
+ # application that the current request is a middleware request.
42
+ # You should only need to override this if you are using multiple
43
+ # roda middleware in the same application.
44
+ def self.configure(app, opts={})
45
+ app.opts[:middleware_env_var] = opts[:env_var] if opts.has_key?(:env_var)
46
+ app.opts[:middleware_env_var] ||= 'roda.forward_next'
47
+ end
48
+
39
49
  # Forward instances are what is actually used as middleware.
40
50
  class Forwarder
41
51
  # Store the current middleware and the next middleware to call.
@@ -51,9 +61,8 @@ class Roda
51
61
  res = nil
52
62
 
53
63
  call_next = catch(:next) do
54
- scope = @mid.new(env)
55
- scope.request.forward_next = true
56
- res = scope.call(&@mid.route_block)
64
+ env[@mid.opts[:middleware_env_var]] = true
65
+ res = @mid.call(env)
57
66
  false
58
67
  end
59
68
 
@@ -89,7 +98,9 @@ class Roda
89
98
  module RequestMethods
90
99
  # Whether to forward the request to the next application. Set only if
91
100
  # this request is being performed for middleware.
92
- attr_accessor :forward_next
101
+ def forward_next
102
+ env[roda_class.opts[:middleware_env_var]]
103
+ end
93
104
  end
94
105
  end
95
106
 
@@ -0,0 +1,30 @@
1
+ # frozen-string-literal: true
2
+
3
+ class Roda
4
+ module RodaPlugins
5
+ # The symbol_status plugin patches the +status=+ response method to
6
+ # accept the status name as a symbol. If given an integer value,
7
+ # the default behaviour is used.
8
+ #
9
+ # Examples:
10
+ # r.is "needs_authorization"
11
+ # response.status = :unauthorized
12
+ # end
13
+ # r.is "nothing"
14
+ # response.status = :no_content
15
+ # end
16
+ #
17
+ # The conversion is done through <tt>Rack::Utils.status_code</tt>.
18
+ module SymbolStatus
19
+ module ResponseMethods
20
+ # Sets the response status code by fixnum or symbol name
21
+ def status=(code)
22
+ code = Rack::Utils.status_code(code) if code.is_a?(Symbol)
23
+ super(code)
24
+ end
25
+ end
26
+ end
27
+
28
+ register_plugin(:symbol_status, SymbolStatus)
29
+ end
30
+ end
@@ -4,7 +4,7 @@ class Roda
4
4
  RodaMajorVersion = 2
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 13
7
+ RodaMinorVersion = 14
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
@@ -75,4 +75,24 @@ describe "middleware plugin" do
75
75
 
76
76
  body('/a/b').must_equal 'ab'
77
77
  end
78
+
79
+ it "uses the app's middleware if :include_middleware option is given" do
80
+ mid = Struct.new(:app) do
81
+ def call(env)
82
+ env['foo'] = 'bar'
83
+ app.call(env)
84
+ end
85
+ end
86
+ app(:bare) do
87
+ plugin :middleware, :include_middleware=>true
88
+ use mid
89
+ route{}
90
+ end
91
+ mid2 = app
92
+ app(:bare) do
93
+ use mid2
94
+ route{env['foo']}
95
+ end
96
+ body.must_equal 'bar'
97
+ end
78
98
  end
@@ -27,6 +27,10 @@ describe "symbol_matchers plugin" do
27
27
  "thing#{d}"
28
28
  end
29
29
 
30
+ r.is "thing2", :thing do |d|
31
+ "thing2#{d}"
32
+ end
33
+
30
34
  r.is :f do |f|
31
35
  "f#{f}"
32
36
  end
@@ -69,5 +73,6 @@ describe "symbol_matchers plugin" do
69
73
  body("/qa/b/c/d//f/g").must_equal 'resta/b/c/d//f/g'
70
74
  body('/q').must_equal 'rest'
71
75
  body('/thing/q').must_equal 'thingq'
76
+ body('/thing2/q').must_equal 'thing2q'
72
77
  end
73
78
  end
@@ -0,0 +1,23 @@
1
+ require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
2
+
3
+ describe "symbol_status plugin" do
4
+ it "accepts a symbol" do
5
+ app(:symbol_status) do |r|
6
+ r.on do
7
+ response.status = :unauthorized
8
+ end
9
+ end
10
+
11
+ status.must_equal 401
12
+ end
13
+
14
+ it "accepts a fixnum" do
15
+ app(:symbol_status) do |r|
16
+ r.on do
17
+ response.status = 204
18
+ end
19
+ end
20
+
21
+ status.must_equal 204
22
+ end
23
+ end
@@ -61,21 +61,23 @@ describe "websockets plugin" do
61
61
  it "supports websocket requests" do
62
62
  ws = Faye::WebSocket::Client.new("ws://localhost:#{@port}")
63
63
  msg = nil
64
+ sleep_for = 0.01
65
+ wait_for = 10
64
66
  ws.on(:open){|event| msg = true}
65
67
  t = Time.now
66
- sleep 0.01 until msg || Time.now - t > 5
68
+ sleep sleep_for until msg || Time.now - t > wait_for
67
69
  msg.must_equal true
68
70
 
69
71
  msg = nil
70
72
  ws.on(:message){|event| msg = event.data}
71
73
  ws.send("hello")
72
74
  t = Time.now
73
- sleep 0.01 until msg || Time.now - t > 5
75
+ sleep sleep_for until msg || Time.now - t > wait_for
74
76
  msg.must_equal 'olleh'
75
77
 
76
78
  ws.close
77
79
  t = Time.now
78
- sleep 0.01 until @events == %w'open hello close' || Time.now - t > 5
80
+ sleep sleep_for until @events == %w'open hello close' || Time.now - t > wait_for
79
81
  @events.must_equal %w'open hello close'
80
82
  end
81
83
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roda
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.0
4
+ version: 2.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-14 00:00:00.000000000 Z
11
+ date: 2016-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -179,6 +179,7 @@ extra_rdoc_files:
179
179
  - doc/release_notes/2.11.0.txt
180
180
  - doc/release_notes/2.12.0.txt
181
181
  - doc/release_notes/2.13.0.txt
182
+ - doc/release_notes/2.14.0.txt
182
183
  files:
183
184
  - CHANGELOG
184
185
  - MIT-LICENSE
@@ -195,6 +196,7 @@ files:
195
196
  - doc/release_notes/2.11.0.txt
196
197
  - doc/release_notes/2.12.0.txt
197
198
  - doc/release_notes/2.13.0.txt
199
+ - doc/release_notes/2.14.0.txt
198
200
  - doc/release_notes/2.2.0.txt
199
201
  - doc/release_notes/2.3.0.txt
200
202
  - doc/release_notes/2.4.0.txt
@@ -269,6 +271,7 @@ files:
269
271
  - lib/roda/plugins/status_handler.rb
270
272
  - lib/roda/plugins/streaming.rb
271
273
  - lib/roda/plugins/symbol_matchers.rb
274
+ - lib/roda/plugins/symbol_status.rb
272
275
  - lib/roda/plugins/symbol_views.rb
273
276
  - lib/roda/plugins/view_options.rb
274
277
  - lib/roda/plugins/view_subdirs.rb
@@ -347,6 +350,7 @@ files:
347
350
  - spec/plugin/status_handler_spec.rb
348
351
  - spec/plugin/streaming_spec.rb
349
352
  - spec/plugin/symbol_matchers_spec.rb
353
+ - spec/plugin/symbol_status_spec.rb
350
354
  - spec/plugin/symbol_views_spec.rb
351
355
  - spec/plugin/view_options_spec.rb
352
356
  - spec/plugin/websockets_spec.rb