roda 2.25.0 → 2.26.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: 8a70fe0e0ab208cb5ca42d42d60633e1c03ec77a
4
- data.tar.gz: 5aedc804b0e884c1a05d87d325bf4c28e4798c6c
3
+ metadata.gz: 4ac08181ea0c35fe056de0d73654c46acd01a541
4
+ data.tar.gz: bafe66a0feb7e5b3e4d461f8eb05fd3762ccf730
5
5
  SHA512:
6
- metadata.gz: c9ea6a8f1ea687572e874af5d6ff92a06617bc7881d1337a307b64f63c125912e836a577944f156da1c340a8b11eecf78cf780bcef42be122d29fe3887f8f457
7
- data.tar.gz: 6ef1c484659735450a053f3f3d5dddf7bc4f65c78bfe52e54d1930529938f3a99c8810c2b0ea69846fc11cb757727f9dbe2df43ae90aae60af1c5d0bac75a893
6
+ metadata.gz: '01974a864d4ba36f2173c6a166405f77359a8329e8ae8a7eba65ad1b28549377c52ca50fc4e61f61a828c2323fb5bb1d2dc80bcdb555449117c227144f8d3160'
7
+ data.tar.gz: bfec42253904890e2ba6104f9d07b47eae8a3ade1cb45e43f36f5def8280219bce70baec7322545e4040195d5d946ec8038002e6e73edfe15e18c48151d261bb
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 2.26.0 (2017-05-16)
2
+
3
+ * Support :skip_middleware option to csrf plugin to add only the methods and not add the middleware (luciusgone) (#118)
4
+
5
+ * Handle multiple types with matching suffixes in the type_routing plugin (e.g. tar.gz and gz) (tomdalling) (#117)
6
+
1
7
  = 2.25.0 (2017-04-18)
2
8
 
3
9
  * Add error_mail plugin, similar to error_email but using mail instead of net/smtp directly (jeremyevans)
@@ -0,0 +1,13 @@
1
+ = New Features
2
+
3
+ * The csrf plugin now supports a :skip_middleware option, which adds
4
+ the methods without adding the middleware. This is designed for
5
+ cases where you are using multiple rack apps, where the rack_csrf
6
+ middleware is loaded in an earlier rack app, and you want to avoid
7
+ the duplicate CSRF checks.
8
+
9
+ = Other Improvements
10
+
11
+ * The type_routing plugin now supports using multiple extensions
12
+ where one extension is a suffix of another extension, such as
13
+ using gz and tar.gz.
@@ -10,6 +10,11 @@ class Roda
10
10
  #
11
11
  # plugin :csrf, :raise=>true
12
12
  #
13
+ # Optionally you can choose not to setup rack_csrf middleware on the
14
+ # roda app if you already have one configured:
15
+ #
16
+ # plugin :csrf, :skip_middleware=>true
17
+ #
13
18
  # This adds the following instance methods:
14
19
  #
15
20
  # csrf_field :: The field name to use for the hidden/meta csrf tag.
@@ -26,6 +31,7 @@ class Roda
26
31
 
27
32
  # Load the Rack::Csrf middleware into the app with the given options.
28
33
  def self.configure(app, opts={})
34
+ return if opts[:skip_middleware]
29
35
  app.instance_exec do
30
36
  @middleware.each do |(mid, *rest), _|
31
37
  if mid.equal?(CSRF)
@@ -240,7 +240,7 @@ class Roda
240
240
 
241
241
  # Delay adding a file to the message until after the message body has been set.
242
242
  # If a block is given, the block is called after the file has been added, and you
243
- # can access the attachment via <tt>response.mail.attachments.last</tt>.
243
+ # can access the attachment via <tt>response.mail_attachments.last</tt>.
244
244
  def add_file(*a, &block)
245
245
  response.mail_attachments << [a, block]
246
246
  nil
@@ -130,7 +130,7 @@ class Roda
130
130
  mimes.freeze
131
131
 
132
132
  type_keys = config[:types].keys
133
- config[:extension_regexp] = /(.+)\.(#{Regexp.union(type_keys.map(&:to_s))})\z/
133
+ config[:extension_regexp] = /(.+?)\.(#{Regexp.union(type_keys.map(&:to_s))})\z/
134
134
 
135
135
  type_keys.each do |type|
136
136
  app::RodaRequest.send(:define_method, type) do |&block|
@@ -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 = 25
7
+ RodaMinorVersion = 26
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
@@ -87,8 +87,8 @@ describe "content_for plugin with haml" do
87
87
  end
88
88
 
89
89
  it "should work with alternate rendering engines" do
90
- body.strip.must_equal "bar\nfoo"
91
- body('/a').strip.must_equal "bar\nfoo"
90
+ body.strip.sub(/\n+/, "\n").must_equal "bar\nfoo"
91
+ body('/a').strip.sub(/\n+/, "\n").must_equal "bar\nfoo"
92
92
  end
93
93
  end
94
94
 
@@ -48,5 +48,64 @@ describe "csrf plugin" do
48
48
  app.plugin :csrf
49
49
  body('/foo', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'bar'
50
50
  end
51
+
52
+ it "can optionally skip setting up the middleware" do
53
+ sub_app = Class.new(Roda)
54
+ sub_app.class_eval do
55
+ plugin :csrf, :skip_middleware=>true
56
+
57
+ route do |r|
58
+ r.get do
59
+ response['TAG'] = csrf_tag
60
+ response['METATAG'] = csrf_metatag
61
+ response['TOKEN'] = csrf_token
62
+ response['FIELD'] = csrf_field
63
+ response['HEADER'] = csrf_header
64
+ 'g'
65
+ end
66
+ r.post 'bar' do
67
+ 'foobar'
68
+ end
69
+ r.post do
70
+ 'p'
71
+ end
72
+ end
73
+ end
74
+
75
+ app(:bare) do
76
+ use Rack::Session::Cookie, :secret=>'1'
77
+ plugin :csrf, :skip=>['POST:/foo/bar']
78
+
79
+ route do |r|
80
+ r.on 'foo' do
81
+ r.run sub_app
82
+ end
83
+ end
84
+ end
85
+
86
+ io = StringIO.new
87
+ status('/foo', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 403
88
+ body('/foo/bar', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'foobar'
89
+
90
+ env = proc{|h| h['Set-Cookie'] ? {'HTTP_COOKIE'=>h['Set-Cookie'].sub("; path=/; HttpOnly", '')} : {}}
91
+ s, h, b = req('/foo')
92
+ s.must_equal 200
93
+ field = h['FIELD']
94
+ token = Regexp.escape(h['TOKEN'])
95
+ h['TAG'].must_match(/\A<input type="hidden" name="#{field}" value="#{token}" \/>\z/)
96
+ h['METATAG'].must_match(/\A<meta name="#{field}" content="#{token}" \/>\z/)
97
+ b.must_equal ['g']
98
+ s, _, b = req('/foo', env[h].merge('REQUEST_METHOD'=>'POST', 'rack.input'=>io, "HTTP_#{h['HEADER']}"=>h['TOKEN']))
99
+ s.must_equal 200
100
+ b.must_equal ['p']
101
+
102
+ sub_app.plugin :csrf, :skip_middleware=>true
103
+ body('/foo/bar', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'foobar'
104
+
105
+ @app = sub_app
106
+ s, _, b = req('/bar', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io)
107
+ s.must_equal 200
108
+ b.must_equal ['foobar']
109
+ end
51
110
  end
52
111
  end
@@ -292,4 +292,25 @@ describe "type_routing plugin" do
292
292
 
293
293
  body('/a.html').must_equal '.html'
294
294
  end
295
+
296
+ it "takes the longest file extension first, when ambiguous" do
297
+ app(:bare) do
298
+ plugin :type_routing, :types => {
299
+ :gz => 'application/octet-stream',
300
+ :'tar.gz' => 'application/octet-stream',
301
+ }
302
+
303
+ route do |r|
304
+ r.is 'a' do
305
+ r.on_type(:gz) { 'GZ' }
306
+ r.on_type(:'tar.gz') { 'TAR.GZ' }
307
+ "NO"
308
+ end
309
+ end
310
+ end
311
+
312
+ body('/a').must_equal "NO"
313
+ body('/a.gz').must_equal 'GZ'
314
+ body('/a.tar.gz').must_equal 'TAR.GZ'
315
+ end
295
316
  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.25.0
4
+ version: 2.26.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: 2017-04-18 00:00:00.000000000 Z
11
+ date: 2017-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -205,6 +205,7 @@ extra_rdoc_files:
205
205
  - doc/release_notes/2.23.0.txt
206
206
  - doc/release_notes/2.24.0.txt
207
207
  - doc/release_notes/2.25.0.txt
208
+ - doc/release_notes/2.26.0.txt
208
209
  files:
209
210
  - CHANGELOG
210
211
  - MIT-LICENSE
@@ -234,6 +235,7 @@ files:
234
235
  - doc/release_notes/2.23.0.txt
235
236
  - doc/release_notes/2.24.0.txt
236
237
  - doc/release_notes/2.25.0.txt
238
+ - doc/release_notes/2.26.0.txt
237
239
  - doc/release_notes/2.3.0.txt
238
240
  - doc/release_notes/2.4.0.txt
239
241
  - doc/release_notes/2.5.0.txt