roda 2.5.1 → 2.6.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: 7a139a3dab3d487524df22c5c49bb8a197bfa007
4
- data.tar.gz: cc37453529b96bceb43bae2228175cfcd5249195
3
+ metadata.gz: 81b5d148505b95423a029a85acb7ab453ad50518
4
+ data.tar.gz: 825e0915b23389bb468b335fcadd2c102362f6ab
5
5
  SHA512:
6
- metadata.gz: 465573ac1586a9f64028c73d922593c5e631818e3b82ec6e0e916290ed52d4a90de69418d57ab536e3714882dacfb7a6a66499649744b3c752cfdb44caa05a82
7
- data.tar.gz: 32e20c99866c50db2010091e785569e3aa68bb303ce6471be3e2057d37b80d6114bb3d5f889859554f96d3a18b53e24c77e83297301c529083acee2093dec581
6
+ metadata.gz: c2c7ba330521161433166bd7ca685619366459800a28fa06b4a2328232cfced10a796ddd67aa16927a1be44ee3b31c1c8848847b987dd87d506ae501e3acf78c
7
+ data.tar.gz: c35370d775528f676f4ad1be2c9cc277f4d0d1082a7750a62418c28ebadc85b6e01056ad4699ea866e55941a8747323f8d3c666faa2b58c265027343685f6ae8
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ = 2.6.0 (2015-09-14)
2
+
3
+ * Add :params and :params! matchers to param_matchers plugin (jeremyevans)
4
+
5
+ * Merge options when loading csrf plugin multiple times (jeremyevans)
6
+
7
+ * Allow request.halt to work in before hooks in the hooks plugin (celsworth) (#38)
8
+
1
9
  = 2.5.1 (2015-08-13)
2
10
 
3
11
  * Allow multi_route and middleware plugins to work together (janko-m) (#36)
@@ -0,0 +1,21 @@
1
+ = New Features
2
+
3
+ * :params and :params! matchers have been added to the param_matchers
4
+ plugin, allowing you to match multiple params at the same time:
5
+
6
+ r.on :params=>%w'foo bar' do |foo, bar| end
7
+ # instead of
8
+ r.on({:param=>'foo'}, :param=>'bar') do |foo, bar| end
9
+
10
+ = Other Improvements
11
+
12
+ * When loading the csrf plugin multiple times, instead of loading the
13
+ middleware multiple times with different settings, merge options
14
+ in later plugin calls into a single middleware option hash, and
15
+ only load the middleware once.
16
+
17
+ This allows plugins to depend on the csrf plugin, while also
18
+ allowing the application to use the csrf plugin with options.
19
+
20
+ * request.halt now works correctly when used inside a before hook when
21
+ using the hooks plugin.
@@ -5,7 +5,7 @@ class Roda
5
5
  # For proper caching, you should use either the +last_modified+ or
6
6
  # +etag+ request methods.
7
7
  #
8
- # r.get '/albums/:d' do |album_id|
8
+ # r.get 'albums/:d' do |album_id|
9
9
  # @album = Album[album_id]
10
10
  # r.last_modified @album.updated_at
11
11
  # view('album')
@@ -13,7 +13,7 @@ class Roda
13
13
  #
14
14
  # # or
15
15
  #
16
- # r.get '/albums/:d' do |album_id|
16
+ # r.get 'albums/:d' do |album_id|
17
17
  # @album = Album[album_id]
18
18
  # r.etag @album.sha1
19
19
  # view('album')
@@ -24,7 +24,16 @@ class Roda
24
24
 
25
25
  # Load the Rack::Csrf middleware into the app with the given options.
26
26
  def self.configure(app, opts={})
27
- app.use CSRF, opts
27
+ app.instance_exec do
28
+ @middleware.each do |(mid, *rest), _|
29
+ if mid.equal?(CSRF)
30
+ rest[0].merge!(opts)
31
+ build_rack_app
32
+ return
33
+ end
34
+ end
35
+ use CSRF, opts
36
+ end
28
37
  end
29
38
 
30
39
  module InstanceMethods
@@ -69,12 +69,14 @@ class Roda
69
69
  module InstanceMethods
70
70
  # Before routing, execute the before hooks, and
71
71
  # execute the after hooks before returning.
72
- def call
73
- if b = opts[:before_hook]
74
- instance_exec(&b)
75
- end
72
+ def call(&block)
73
+ res = super do |r|
74
+ if b = opts[:before_hook]
75
+ instance_exec(&b)
76
+ end
76
77
 
77
- res = super
78
+ instance_exec(r, &block)
79
+ end
78
80
  ensure
79
81
  if b = opts[:after_hook]
80
82
  instance_exec(res, &b)
@@ -4,7 +4,7 @@ class Roda
4
4
  # on the request's params.
5
5
  #
6
6
  # It adds a :param matcher for matching on any param with the
7
- # same name, yielding the value of the param.
7
+ # same name, yielding the value of the param:
8
8
  #
9
9
  # r.on :param => 'foo' do |value|
10
10
  # # Matches '?foo=bar', '?foo='
@@ -12,16 +12,30 @@ class Roda
12
12
  # end
13
13
  #
14
14
  # It adds a :param! matcher for matching on any non-empty param
15
- # with the same name, yielding the value of the param.
15
+ # with the same name, yielding the value of the param:
16
16
  #
17
17
  # r.on(:param! => 'foo') do |value|
18
18
  # # Matches '?foo=bar'
19
19
  # # Doesn't match '?foo=', '?bar=foo'
20
20
  # end
21
+ #
22
+ # It also adds :params and :params! matchers, for matching multiple
23
+ # params at the same time:
24
+ #
25
+ # r.on :params => ['foo', 'baz'] do |value|
26
+ # # Matches '?foo=bar&baz=quuz', '?foo=&baz='
27
+ # # Doesn't match '?foo=bar', '?baz='
28
+ # end
29
+ #
30
+ # r.on :params! => ['foo', 'baz'] do |value|
31
+ # # Matches '?foo=bar&baz=quuz'
32
+ # # Doesn't match '?foo=bar', '?baz=', '?foo=&baz=', '?foo=bar&baz='
33
+ # end
34
+ #
21
35
  module ParamMatchers
22
36
  module RequestMethods
23
37
  # Match the given parameter if present, even if the parameter is empty.
24
- # Adds any match to the captures.
38
+ # Adds match to the captures.
25
39
  def match_param(key)
26
40
  if v = self[key]
27
41
  @captures << v
@@ -29,12 +43,28 @@ class Roda
29
43
  end
30
44
 
31
45
  # Match the given parameter if present and not empty.
32
- # Adds any match to the captures.
46
+ # Adds match to the captures.
33
47
  def match_param!(key)
34
48
  if (v = self[key]) && !v.empty?
35
49
  @captures << v
36
50
  end
37
51
  end
52
+
53
+ # Match all given parameters if present, even if any/all parameters is empty.
54
+ # Adds all matches to the captures.
55
+ def match_params(keys)
56
+ keys.each do |key|
57
+ return false unless match_param(key)
58
+ end
59
+ end
60
+
61
+ # Match all given parameters if present and not empty.
62
+ # Adds all matches to the captures.
63
+ def match_params!(keys)
64
+ keys.each do |key|
65
+ return false unless match_param!(key)
66
+ end
67
+ end
38
68
  end
39
69
  end
40
70
 
@@ -36,7 +36,7 @@ class Roda
36
36
  # <tt><%== %></tt> not escape output, and handles postfix conditions inside
37
37
  # <tt><%= %></tt> tags.
38
38
  # :escape_safe_classes :: String subclasses that should not be HTML escaped when used in
39
- # <tt><%= %></tt> tags, when :escape is used. Can be an array for multiple classes.
39
+ # <tt><%= %></tt> tags, when :escape is used. Can be an array for multiple classes.
40
40
  # :escaper :: Object used for escaping output of <tt><%= %></tt>, when :escape is used,
41
41
  # overriding the default. If given, object should respond to +escape_xml+ with
42
42
  # a single argument and return an output string.
@@ -44,7 +44,7 @@ class Roda
44
44
  # :layout_opts :: The options to use when rendering the layout, if different
45
45
  # from the default options.
46
46
  # :template_opts :: The tilt options used when rendering all templates. defaults to:
47
- # <tt>{:outvar=>'@_out_buf', :default_encoding=>Encoding.default_external}</tt>.
47
+ # <tt>{:outvar=>'@_out_buf', :default_encoding=>Encoding.default_external}</tt>.
48
48
  # :engine_opts :: The tilt options to use per template engine. Keys are
49
49
  # engine strings, values are hashes of template options.
50
50
  # :views :: The directory holding the view files, defaults to the 'views' subdirectory of the
data/lib/roda/version.rb CHANGED
@@ -4,11 +4,11 @@ class Roda
4
4
  RodaMajorVersion = 2
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 5
7
+ RodaMinorVersion = 6
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
11
- RodaPatchVersion = 1
11
+ RodaPatchVersion = 0
12
12
 
13
13
  # The full version of Roda as a string.
14
14
  RodaVersion = "#{RodaMajorVersion}.#{RodaMinorVersion}.#{RodaPatchVersion}".freeze
@@ -44,6 +44,9 @@ describe "csrf plugin" do
44
44
  s, _, b = req('/', env[h].merge('REQUEST_METHOD'=>'POST', 'rack.input'=>io, "HTTP_#{h['HEADER']}"=>h['TOKEN']))
45
45
  s.must_equal 200
46
46
  b.must_equal ['p']
47
+
48
+ app.plugin :csrf
49
+ body('/foo', 'REQUEST_METHOD'=>'POST', 'rack.input'=>io).must_equal 'bar'
47
50
  end
48
51
  end
49
52
  end
@@ -92,4 +92,12 @@ describe "hooks plugin" do
92
92
  b.join.must_equal 'foo'
93
93
  @a.must_equal [[200, 'bar', ['foo']]]
94
94
  end
95
+
96
+ it "handles halt in before blocks" do
97
+ app.before do
98
+ response.status = 200
99
+ request.halt
100
+ end
101
+ status.must_equal 201
102
+ end
95
103
  end
@@ -7,9 +7,7 @@ describe "param_matchers plugin" do
7
7
  email
8
8
  end
9
9
 
10
- r.on do
11
- "No email"
12
- end
10
+ "No email"
13
11
  end
14
12
 
15
13
  io = StringIO.new
@@ -18,15 +16,13 @@ describe "param_matchers plugin" do
18
16
  body("/signup", "rack.input" => io, "QUERY_STRING" => "email=").must_equal 'No email'
19
17
  end
20
18
 
21
- it "param matcheshould yield a param only if given" do
19
+ it "param matcher should yield a param only if given" do
22
20
  app(:param_matchers) do |r|
23
21
  r.get "signup", :param=>"email" do |email|
24
22
  email
25
23
  end
26
24
 
27
- r.on do
28
- "No email"
29
- end
25
+ "No email"
30
26
  end
31
27
 
32
28
  io = StringIO.new
@@ -34,4 +30,40 @@ describe "param_matchers plugin" do
34
30
  body("/signup", "rack.input" => io, "QUERY_STRING" => "").must_equal 'No email'
35
31
  body("/signup", "rack.input" => io, "QUERY_STRING" => "email=").must_equal ''
36
32
  end
33
+
34
+ it "params! matcher should yield the params only if all are given and not empty" do
35
+ app(:param_matchers) do |r|
36
+ r.get "signup", :params! => %w"em ail" do |em, ail|
37
+ em + ail
38
+ end
39
+
40
+ "No email"
41
+ end
42
+
43
+ io = StringIO.new
44
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=foo&ail=john@doe.com").must_equal 'foojohn@doe.com'
45
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=&ail=john@doe.com").must_equal 'No email'
46
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=foo&ail=").must_equal 'No email'
47
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=&ail=").must_equal 'No email'
48
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=foo").must_equal 'No email'
49
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "ail=john@doe.com").must_equal 'No email'
50
+ end
51
+
52
+ it "params matcher should yield the params only if all are given" do
53
+ app(:param_matchers) do |r|
54
+ r.get "signup", :params=>%w"em ail" do |em, ail|
55
+ em + ail
56
+ end
57
+
58
+ "No email"
59
+ end
60
+
61
+ io = StringIO.new
62
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=foo&ail=john@doe.com").must_equal 'foojohn@doe.com'
63
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=&ail=john@doe.com").must_equal 'john@doe.com'
64
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=foo&ail=").must_equal 'foo'
65
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=&ail=").must_equal ''
66
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "em=foo").must_equal 'No email'
67
+ body("/signup", "rack.input" => io, "QUERY_STRING" => "ail=john@doe.com").must_equal 'No email'
68
+ end
37
69
  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.5.1
4
+ version: 2.6.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: 2015-08-13 00:00:00.000000000 Z
11
+ date: 2015-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -143,6 +143,7 @@ extra_rdoc_files:
143
143
  - doc/release_notes/2.4.0.txt
144
144
  - doc/release_notes/2.5.0.txt
145
145
  - doc/release_notes/2.5.1.txt
146
+ - doc/release_notes/2.6.0.txt
146
147
  files:
147
148
  - CHANGELOG
148
149
  - MIT-LICENSE
@@ -160,6 +161,7 @@ files:
160
161
  - doc/release_notes/2.4.0.txt
161
162
  - doc/release_notes/2.5.0.txt
162
163
  - doc/release_notes/2.5.1.txt
164
+ - doc/release_notes/2.6.0.txt
163
165
  - lib/roda.rb
164
166
  - lib/roda/plugins/_erubis_escaping.rb
165
167
  - lib/roda/plugins/all_verbs.rb
@@ -334,7 +336,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
334
336
  version: '0'
335
337
  requirements: []
336
338
  rubyforge_project:
337
- rubygems_version: 2.4.5
339
+ rubygems_version: 2.4.5.1
338
340
  signing_key:
339
341
  specification_version: 4
340
342
  summary: Routing tree web framework toolkit