roda 2.25.0 → 2.26.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: 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