roda 2.5.1 → 2.6.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: 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