roda 2.13.0 → 2.14.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 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