roda-cj 0.9.4 → 0.9.5

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: 0381614904fadaf43af33f351a4edfc17d054c4d
4
- data.tar.gz: a1f3866849f764552a2de2f987c636d20cf33099
3
+ metadata.gz: 4b2651937ad6d2d3c5d87389b03fd9e0f1e3cef2
4
+ data.tar.gz: e231917660219dd780e2adaacd5fd8fbbd42afd3
5
5
  SHA512:
6
- metadata.gz: d2930467e112ec168fd41c4f9005e21984b028ff45aa8fb58d843e4343bb098f888774c94b989b70ce0aea4f6f69e8eae2b2a62fc5c6626816f78eea9257fd58
7
- data.tar.gz: 1f506448329172d622492c22167f39b8690ca812c50f734c3dec306fd537855b0d4767a8507c555471963a4f053e4b65874d277cc9d53e44fabe2471c3e9374e
6
+ metadata.gz: 8ebb628c78058e1e9c61acf148a1e791f3036cf01290461c9ebf01b220b997ab62b78bb2f2429b87b378d1ea0d64134d4a0101ee8dcef5a8794cfe2b6d4effb5
7
+ data.tar.gz: db3d4837c8af107e4f3ee6224a15ebadeb5afd0d4122a77f359aa1b9ccb9a263153e5e1628ce77456738f9b76c68fb7cc59a3e5e228dd3c3ba7dd1a84dcc90d6
data/CHANGELOG CHANGED
@@ -1,5 +1,9 @@
1
1
  = HEAD
2
2
 
3
+ * Add r.multi_route method to multi_route plugin, for dispatching to named route based on first segment in path (jeremyevans)
4
+
5
+ * Allow non-GET requests to use r.redirect with no argument, redirecting to current path (jeremyevans)
6
+
3
7
  * Add head plugin, for handling HEAD requests like GET requests with an empty body (jeremyevans)
4
8
 
5
9
  * Optimize consuming patterns by using a positive lookahead assertion (jeremyevans)
data/lib/roda.rb CHANGED
@@ -429,7 +429,7 @@ class Roda
429
429
  end
430
430
 
431
431
  # Immediately redirect to the given path.
432
- def redirect(path, status=302)
432
+ def redirect(path=default_redirect_path, status=302)
433
433
  response.redirect(path, status)
434
434
  throw :halt, response.finish
435
435
  end
@@ -535,6 +535,19 @@ class Roda
535
535
  captures.concat(vars)
536
536
  end
537
537
 
538
+ # The default path to use for redirects when a path is not given.
539
+ # For non-GET requests, redirects to the current path, which will
540
+ # trigger a GET request. This is to make the common case where
541
+ # a POST request will redirect to a GET request at the same location
542
+ # will work fine.
543
+ #
544
+ # If the current request is a GET request, raise an error, as otherwise
545
+ # it is easy to create an infinite redirect.
546
+ def default_redirect_path
547
+ raise RodaError, "must provide path argument to redirect for get requests" if is_get?
548
+ full_path_info
549
+ end
550
+
538
551
  # If all of the arguments match, yields to the match block and
539
552
  # returns the rack response when the block returns. If any of
540
553
  # the match arguments doesn't match, does nothing.
@@ -1,39 +1,56 @@
1
1
  class Roda
2
2
  module RodaPlugins
3
3
  # The multi_route plugin allows for multiple named routes, which the
4
- # main route block can dispatch to by name at any point. If the named
5
- # route doesn't handle the request, execution will continue, and if the
6
- # named route does handle the request, the response by the named route
7
- # will be returned.
4
+ # main route block can dispatch to by name at any point by calling +route+.
5
+ # If the named route doesn't handle the request, execution will continue,
6
+ # and if the named route does handle the request, the response returned by
7
+ # the named route will be returned.
8
+ #
9
+ # In addition, this also adds the +r.multi_route+ method, which will assume
10
+ # check if the first segment in the path matches a named route, and dispatch
11
+ # to that named route.
8
12
  #
9
13
  # Example:
10
14
  #
11
15
  # plugin :multi_route
12
16
  #
13
- # route(:foo) do |r|
17
+ # route('foo') do |r|
14
18
  # r.is 'bar' do
15
19
  # '/foo/bar'
16
20
  # end
17
21
  # end
18
22
  #
19
- # route(:bar) do |r|
23
+ # route('bar') do |r|
20
24
  # r.is 'foo' do
21
25
  # '/bar/foo'
22
26
  # end
23
27
  # end
24
28
  #
25
29
  # route do |r|
30
+ # r.multi_route
31
+ #
32
+ # # or
33
+ #
26
34
  # r.on "foo" do
27
- # route :foo
35
+ # route 'foo'
28
36
  # end
29
37
  #
30
38
  # r.on "bar" do
31
- # route :bar
39
+ # route 'bar'
32
40
  # end
33
41
  # end
34
42
  #
35
43
  # Note that in multi-threaded code, you should not attempt to add a
36
44
  # named route after accepting requests.
45
+ #
46
+ # If you want to use the +r.multi_route+ method, use string names for the
47
+ # named routes. Also, you can provide a block to +r.multi_route+ that is
48
+ # called if the route matches but the named route did not handle the
49
+ # request:
50
+ #
51
+ # r.multi_route do
52
+ # "default body"
53
+ # end
37
54
  module MultiRoute
38
55
  # Initialize storage for the named routes.
39
56
  def self.configure(app)
@@ -47,6 +64,11 @@ class Roda
47
64
  subclass.instance_variable_set(:@named_routes, @named_routes.dup)
48
65
  end
49
66
 
67
+ # An names for the currently stored named routes
68
+ def named_routes
69
+ @named_routes.keys
70
+ end
71
+
50
72
  # Return the named route with the given name.
51
73
  def named_route(name)
52
74
  @named_routes[name]
@@ -70,6 +92,26 @@ class Roda
70
92
  instance_exec(request, &self.class.named_route(name))
71
93
  end
72
94
  end
95
+
96
+ module RequestClassMethods
97
+ # A regexp matching any of the current named routes.
98
+ def named_route_regexp
99
+ @named_route_regexp ||= /(#{Regexp.union(roda_class.named_routes)})/
100
+ end
101
+ end
102
+
103
+ module RequestMethods
104
+ # Check if the first segment in the path matches any of the current
105
+ # named routes. If so, call that named route. If not, do nothing.
106
+ # If the named route does not handle the request, and a block
107
+ # is given, yield to the block.
108
+ def multi_route
109
+ on self.class.named_route_regexp do |section|
110
+ scope.route(section)
111
+ yield if block_given?
112
+ end
113
+ end
114
+ end
73
115
  end
74
116
 
75
117
  register_plugin(:multi_route, MultiRoute)
data/lib/roda/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Roda
2
- RodaVersion = '0.9.4'.freeze
2
+ RodaVersion = '0.9.5'.freeze
3
3
  end
@@ -5,7 +5,7 @@ describe "multi_route plugin" do
5
5
  app(:bare) do
6
6
  plugin :multi_route
7
7
 
8
- route(:get) do |r|
8
+ route("get") do |r|
9
9
  r.is "" do
10
10
  "get"
11
11
  end
@@ -15,7 +15,7 @@ describe "multi_route plugin" do
15
15
  end
16
16
  end
17
17
 
18
- route(:post) do |r|
18
+ route("post") do |r|
19
19
  r.is "" do
20
20
  "post"
21
21
  end
@@ -26,15 +26,22 @@ describe "multi_route plugin" do
26
26
  end
27
27
 
28
28
  route do |r|
29
+ r.on 'foo' do
30
+ r.multi_route do
31
+ "foo"
32
+ end
33
+ end
34
+
29
35
  r.get do
30
- route(:get)
36
+ route("get")
31
37
 
32
38
  r.is "b" do
33
39
  "getb"
34
40
  end
35
41
  end
42
+
36
43
  r.post do
37
- route(:post)
44
+ route("post")
38
45
 
39
46
  r.is "b" do
40
47
  "postb"
@@ -55,6 +62,15 @@ describe "multi_route plugin" do
55
62
  status('/c', 'REQUEST_METHOD'=>'POST').should == 404
56
63
  end
57
64
 
65
+ it "uses multi_route to dispatch to any named route" do
66
+ status('/foo').should == 404
67
+ body('/foo/get/').should == 'get'
68
+ body('/foo/get/a').should == 'geta'
69
+ body('/foo/post/').should == 'post'
70
+ body('/foo/post/a').should == 'posta'
71
+ body('/foo/post/b').should == 'foo'
72
+ end
73
+
58
74
  it "handles loading the plugin multiple times correctly" do
59
75
  app.plugin :multi_route
60
76
  body.should == 'get'
@@ -71,14 +87,14 @@ describe "multi_route plugin" do
71
87
  @app = Class.new(@app)
72
88
  @app.route do |r|
73
89
  r.get do
74
- route(:post)
90
+ route("post")
75
91
 
76
92
  r.is "b" do
77
93
  "1b"
78
94
  end
79
95
  end
80
96
  r.post do
81
- route(:get)
97
+ route("get")
82
98
 
83
99
  r.is "b" do
84
100
  "2b"
@@ -3,14 +3,25 @@ require File.expand_path("spec_helper", File.dirname(__FILE__))
3
3
  describe "redirects" do
4
4
  it "should be immediately processed" do
5
5
  app do |r|
6
- r.on "about" do
7
- r.redirect "/hello", 301
6
+ r.root do
7
+ r.redirect "/hello"
8
8
  "Foo"
9
9
  end
10
- r.on do
11
- r.redirect "/hello"
10
+
11
+ r.is "about" do
12
+ r.redirect "/hello", 301
12
13
  "Foo"
13
14
  end
15
+
16
+ r.is 'foo' do
17
+ r.get do
18
+ r.redirect
19
+ end
20
+
21
+ r.post do
22
+ r.redirect
23
+ end
24
+ end
14
25
  end
15
26
 
16
27
  status.should == 302
@@ -20,5 +31,11 @@ describe "redirects" do
20
31
  status("/about").should == 301
21
32
  header('Location', "/about").should == '/hello'
22
33
  body("/about").should == ''
34
+
35
+ status("/foo", 'REQUEST_METHOD'=>'POST').should == 302
36
+ header('Location', "/foo", 'REQUEST_METHOD'=>'POST').should == '/foo'
37
+ body("/foo", 'REQUEST_METHOD'=>'POST').should == ''
38
+
39
+ proc{req('/foo')}.should raise_error(Roda::RodaError)
23
40
  end
24
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roda-cj
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-15 00:00:00.000000000 Z
11
+ date: 2014-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack