lotus-router 0.0.0 → 0.1.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 +4 -4
- data/.coveralls.yml +2 -0
- data/.gitignore +5 -13
- data/.travis.yml +5 -0
- data/.yardopts +3 -0
- data/Gemfile +10 -3
- data/README.md +470 -6
- data/Rakefile +10 -1
- data/benchmarks/callable +23 -0
- data/benchmarks/named_routes +72 -0
- data/benchmarks/resource +44 -0
- data/benchmarks/resources +58 -0
- data/benchmarks/routes +67 -0
- data/benchmarks/run.sh +11 -0
- data/benchmarks/utils.rb +56 -0
- data/lib/lotus-router.rb +1 -0
- data/lib/lotus/router.rb +752 -3
- data/lib/lotus/router/version.rb +2 -2
- data/lib/lotus/routing/endpoint.rb +114 -0
- data/lib/lotus/routing/endpoint_resolver.rb +251 -0
- data/lib/lotus/routing/http_router.rb +130 -0
- data/lib/lotus/routing/namespace.rb +86 -0
- data/lib/lotus/routing/resource.rb +73 -0
- data/lib/lotus/routing/resource/action.rb +340 -0
- data/lib/lotus/routing/resource/options.rb +48 -0
- data/lib/lotus/routing/resources.rb +40 -0
- data/lib/lotus/routing/resources/action.rb +123 -0
- data/lib/lotus/routing/route.rb +53 -0
- data/lotus-router.gemspec +16 -12
- data/test/fixtures.rb +193 -0
- data/test/integration/client_error_test.rb +16 -0
- data/test/integration/pass_on_response_test.rb +13 -0
- data/test/named_routes_test.rb +123 -0
- data/test/namespace_test.rb +289 -0
- data/test/new_test.rb +67 -0
- data/test/redirect_test.rb +33 -0
- data/test/resource_test.rb +128 -0
- data/test/resources_test.rb +136 -0
- data/test/routing/endpoint_resolver_test.rb +110 -0
- data/test/routing/resource/options_test.rb +36 -0
- data/test/routing_test.rb +99 -0
- data/test/test_helper.rb +32 -0
- data/test/version_test.rb +7 -0
- metadata +102 -10
data/Rakefile
CHANGED
data/benchmarks/callable
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby -W0
|
2
|
+
load File.dirname(__FILE__) + '/utils.rb'
|
3
|
+
|
4
|
+
Benchmark.bm(50) do |b|
|
5
|
+
##
|
6
|
+
# Callable
|
7
|
+
#
|
8
|
+
router = Lotus::Router.new
|
9
|
+
app = Rack::MockRequest.new(router)
|
10
|
+
|
11
|
+
b.report 'generating from callable endpoints' do
|
12
|
+
$callable.each do |route|
|
13
|
+
router.get route, &$endpoint
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
b.report 'recognizing from callable endpoints' do
|
18
|
+
TIMES.times do
|
19
|
+
app.get($callable.sample)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env ruby -W0
|
2
|
+
load File.dirname(__FILE__) + '/utils.rb'
|
3
|
+
|
4
|
+
Benchmark.bm(50) do |b|
|
5
|
+
|
6
|
+
##
|
7
|
+
# Callable
|
8
|
+
#
|
9
|
+
router = Lotus::Router.new
|
10
|
+
app = Rack::MockRequest.new(router)
|
11
|
+
|
12
|
+
b.report 'generating named routes' do
|
13
|
+
$named_routes.each do |(name, as)|
|
14
|
+
router.get name, to: $endpoint, as: as
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
b.report 'recognizing named routes' do
|
19
|
+
TIMES.times do
|
20
|
+
app.get($named_routes.sample.first)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Class
|
26
|
+
#
|
27
|
+
router = Lotus::Router.new
|
28
|
+
app = Rack::MockRequest.new(router)
|
29
|
+
|
30
|
+
$named_routes.each do |(name, _)|
|
31
|
+
eval "#{ Lotus::Utils::String.new(name).classify } = Class.new($controller)"
|
32
|
+
end
|
33
|
+
|
34
|
+
b.report 'generating named routes (class endpoints)' do
|
35
|
+
$named_routes.each do |(name, as)|
|
36
|
+
router.get name, to: $endpoint, as: as
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
b.report 'recognizing named routes (class endpoints)' do
|
41
|
+
TIMES.times do
|
42
|
+
app.get($named_routes.sample.first)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# Lazy
|
48
|
+
#
|
49
|
+
router = Lotus::Router.new
|
50
|
+
app = Rack::MockRequest.new(router)
|
51
|
+
|
52
|
+
$lazy = $lazy.map do |r|
|
53
|
+
[r, r.to_sym]
|
54
|
+
end
|
55
|
+
|
56
|
+
b.report 'generating routes (lazy endpoints)' do
|
57
|
+
$lazy.each do |(name, as)|
|
58
|
+
router.get name, to: name, as: as
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
$lazy.each do |(name, _)|
|
63
|
+
eval "#{ Lotus::Utils::String.new(name).classify } = Class.new($controller)"
|
64
|
+
end
|
65
|
+
|
66
|
+
b.report 'recognizing routes (lazy endpoints)' do
|
67
|
+
TIMES.times do
|
68
|
+
app.get($lazy.sample.first)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
data/benchmarks/resource
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby -W0
|
2
|
+
load File.dirname(__FILE__) + '/utils.rb'
|
3
|
+
|
4
|
+
Benchmark.bm(50) do |b|
|
5
|
+
##
|
6
|
+
# Class
|
7
|
+
#
|
8
|
+
router = Lotus::Router.new
|
9
|
+
app = Rack::MockRequest.new(router)
|
10
|
+
|
11
|
+
b.report 'generating resource (class endpoints)' do
|
12
|
+
$resource.each do |r|
|
13
|
+
router.resource r
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
b.report 'recognizing resource (class endpoints)' do
|
18
|
+
TIMES.times do
|
19
|
+
app.get($resource.sample)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Lazy
|
25
|
+
#
|
26
|
+
router = Lotus::Router.new
|
27
|
+
app = Rack::MockRequest.new(router)
|
28
|
+
|
29
|
+
b.report 'generating resource (lazy endpoints)' do
|
30
|
+
$lazy.each do |route|
|
31
|
+
router.resource route
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
$lazy.each do |w|
|
36
|
+
eval "#{ Lotus::Utils::String.new(w).classify }Controller = Class.new($resource_controller)"
|
37
|
+
end
|
38
|
+
|
39
|
+
b.report 'recognizing routes (lazy endpoints)' do
|
40
|
+
TIMES.times do
|
41
|
+
app.get($lazy.sample)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby -W0
|
2
|
+
load File.dirname(__FILE__) + '/utils.rb'
|
3
|
+
|
4
|
+
Benchmark.bm(50) do |b|
|
5
|
+
##
|
6
|
+
# Class
|
7
|
+
#
|
8
|
+
router = Lotus::Router.new
|
9
|
+
app = Rack::MockRequest.new(router)
|
10
|
+
|
11
|
+
b.report 'generating resources (class endpoints)' do
|
12
|
+
$resources.each do |r|
|
13
|
+
router.resources r
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
b.report 'recognizing resources (class endpoints)' do
|
18
|
+
TIMES.times do
|
19
|
+
app.get($resources.sample)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
b.report 'recognizing resources with param (class endpoints)' do
|
24
|
+
param = '/23'
|
25
|
+
TIMES.times do
|
26
|
+
app.get($resources.sample + param)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Lazy
|
32
|
+
#
|
33
|
+
router = Lotus::Router.new
|
34
|
+
app = Rack::MockRequest.new(router)
|
35
|
+
|
36
|
+
b.report 'generating resources (lazy endpoints)' do
|
37
|
+
$lazy.each do |r|
|
38
|
+
router.resources r
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
$lazy.each do |w|
|
43
|
+
eval "#{ Lotus::Utils::String.new(w).classify }Controller = Class.new($resources_controller)"
|
44
|
+
end
|
45
|
+
|
46
|
+
b.report 'recognizing resources (lazy endpoints)' do
|
47
|
+
TIMES.times do
|
48
|
+
app.get($lazy.sample)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
b.report 'recognizing resources with param (lazy endpoints)' do
|
53
|
+
param = '/23'
|
54
|
+
TIMES.times do
|
55
|
+
app.get($lazy.sample + param)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/benchmarks/routes
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env ruby -W0
|
2
|
+
load File.dirname(__FILE__) + '/utils.rb'
|
3
|
+
|
4
|
+
Benchmark.bm(50) do |b|
|
5
|
+
|
6
|
+
##
|
7
|
+
# Callable
|
8
|
+
#
|
9
|
+
router = Lotus::Router.new
|
10
|
+
app = Rack::MockRequest.new(router)
|
11
|
+
|
12
|
+
b.report 'generating routes' do
|
13
|
+
$routes.each do |route|
|
14
|
+
router.get route, to: $endpoint
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
b.report 'recognizing routes' do
|
19
|
+
TIMES.times do
|
20
|
+
app.get($routes.sample)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Class
|
26
|
+
#
|
27
|
+
router = Lotus::Router.new
|
28
|
+
app = Rack::MockRequest.new(router)
|
29
|
+
|
30
|
+
$routes.each do |route|
|
31
|
+
eval "#{ Lotus::Utils::String.new(route).classify } = Class.new($controller)"
|
32
|
+
end
|
33
|
+
|
34
|
+
b.report 'generating routes (class endpoints)' do
|
35
|
+
$routes.each do |route|
|
36
|
+
router.get route, to: route
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
b.report 'recognizing routes (class endpoints)' do
|
41
|
+
TIMES.times do
|
42
|
+
app.get($routes.sample)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# Lazy
|
48
|
+
#
|
49
|
+
router = Lotus::Router.new
|
50
|
+
app = Rack::MockRequest.new(router)
|
51
|
+
|
52
|
+
b.report 'generating routes (lazy endpoints)' do
|
53
|
+
$lazy.each do |route|
|
54
|
+
router.get route, to: route
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
$lazy.each do |route|
|
59
|
+
eval "#{ Lotus::Utils::String.new(route).classify } = Class.new($controller)"
|
60
|
+
end
|
61
|
+
|
62
|
+
b.report 'recognizing routes (lazy endpoints)' do
|
63
|
+
TIMES.times do
|
64
|
+
app.get($lazy.sample)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/benchmarks/run.sh
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
benchmarks=$(pwd)/$( dirname "${BASH_SOURCE[0]}" )/*
|
3
|
+
|
4
|
+
for benchmark in $benchmarks
|
5
|
+
do
|
6
|
+
if ! [[ "${benchmark#*.}" =~ (rb|sh)$ ]]; then
|
7
|
+
$benchmark
|
8
|
+
echo "================================================================================================"
|
9
|
+
echo ""
|
10
|
+
fi
|
11
|
+
done
|
data/benchmarks/utils.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
$:.unshift 'lib'
|
2
|
+
require 'benchmark'
|
3
|
+
require 'lotus/router'
|
4
|
+
|
5
|
+
# head -$((${RANDOM} % `wc -l < /usr/share/dict/words` + 1)) /usr/share/dict/words | tail -1
|
6
|
+
|
7
|
+
BATCH_SIZE = (ENV['BATCH_SIZE'] || 1000 ).to_i
|
8
|
+
TIMES = (ENV['TIMES'] || 100000).to_i
|
9
|
+
|
10
|
+
dict = File.readlines('/usr/share/dict/words').each {|l| l.chomp! }.uniq
|
11
|
+
$routes, $named_routes, $callable, $resource, $resources, $lazy, _ = *dict.each_slice(BATCH_SIZE).to_a
|
12
|
+
|
13
|
+
puts "Loading #{ BATCH_SIZE } routes, calling for #{ TIMES } times...\n"
|
14
|
+
|
15
|
+
class Controller
|
16
|
+
def call(env)
|
17
|
+
[200, {}, ['']]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class ResourceController
|
22
|
+
class Action
|
23
|
+
def call(env)
|
24
|
+
[200, {}, ['']]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
class New < Action; end
|
28
|
+
class Create < Action; end
|
29
|
+
class Show < Action; end
|
30
|
+
class Edit < Action; end
|
31
|
+
class Update < Action; end
|
32
|
+
class Destroy < Action; end
|
33
|
+
end
|
34
|
+
|
35
|
+
class ResourcesController < ResourceController
|
36
|
+
class Index < Action; end
|
37
|
+
end
|
38
|
+
|
39
|
+
$endpoint = ->(env) { [200, {}, ['']] }
|
40
|
+
$controller = Controller
|
41
|
+
$resource_controller = ResourceController
|
42
|
+
$resources_controller = ResourcesController
|
43
|
+
|
44
|
+
$named_routes = $named_routes.map do |r|
|
45
|
+
[r, r.to_sym]
|
46
|
+
end
|
47
|
+
|
48
|
+
$resource.each do |w|
|
49
|
+
eval "#{ Lotus::Utils::String.new(w).classify }Controller = Class.new($resource_controller)"
|
50
|
+
end
|
51
|
+
|
52
|
+
$resources.each do |w|
|
53
|
+
eval "#{ Lotus::Utils::String.new(w).classify }Controller = Class.new($resources_controller)"
|
54
|
+
end
|
55
|
+
|
56
|
+
GC.start
|
data/lib/lotus-router.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'lotus/router'
|
data/lib/lotus/router.rb
CHANGED
@@ -1,7 +1,756 @@
|
|
1
|
-
require
|
1
|
+
require 'lotus/routing/http_router'
|
2
|
+
require 'lotus/routing/namespace'
|
3
|
+
require 'lotus/routing/resource'
|
4
|
+
require 'lotus/routing/resources'
|
2
5
|
|
3
6
|
module Lotus
|
4
|
-
|
5
|
-
|
7
|
+
# Rack compatible, lightweight and fast HTTP Router.
|
8
|
+
#
|
9
|
+
# @since 0.1.0
|
10
|
+
#
|
11
|
+
# @example It offers an intuitive DSL, that supports most of the HTTP verbs:
|
12
|
+
# require 'lotus/router'
|
13
|
+
#
|
14
|
+
# endpoint = ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
|
15
|
+
# router = Lotus::Router.new do
|
16
|
+
# get '/', to: endpoint
|
17
|
+
# post '/', to: endpoint
|
18
|
+
# put '/', to: endpoint
|
19
|
+
# patch '/', to: endpoint
|
20
|
+
# delete '/', to: endpoint
|
21
|
+
# head '/', to: endpoint
|
22
|
+
# options '/', to: endpoint
|
23
|
+
# trace '/', to: endpoint
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
#
|
27
|
+
#
|
28
|
+
# @example Specify an endpoint with `:to` (Rack compatible object)
|
29
|
+
# require 'lotus/router'
|
30
|
+
#
|
31
|
+
# endpoint = ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
|
32
|
+
# router = Lotus::Router.new do
|
33
|
+
# get '/', to: endpoint
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# # :to is mandatory for the default resolver (`Lotus::Routing::EndpointResolver.new`),
|
37
|
+
# # This behavior can be changed by passing a custom resolver to `Lotus::Router#initialize`
|
38
|
+
#
|
39
|
+
#
|
40
|
+
#
|
41
|
+
# @example Specify an endpoint with `:to` (controller and action string)
|
42
|
+
# require 'lotus/router'
|
43
|
+
#
|
44
|
+
# router = Lotus::Router.new do
|
45
|
+
# get '/', to: 'articles#show' # => ArticlesController::Show
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# # This is a builtin feature for a Lotus::Controller convention.
|
49
|
+
#
|
50
|
+
#
|
51
|
+
#
|
52
|
+
# @example Specify a prefix with `:prefix`
|
53
|
+
# require 'lotus/router'
|
54
|
+
#
|
55
|
+
# endpoint = ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
|
56
|
+
# router = Lotus::Router.new do
|
57
|
+
# get '/welcome', to: endpoint, prefix: 'dashboard' # => '/dashboard/welcome'
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# # :prefix isn't mandatory for the default resolver (`Lotus::Routing::EndpointResolver.new`),
|
61
|
+
# # This behavior can be changed by passing a custom resolver to `Lotus::Router#initialize`
|
62
|
+
#
|
63
|
+
#
|
64
|
+
#
|
65
|
+
# @example Specify a named route with `:as`
|
66
|
+
# require 'lotus/router'
|
67
|
+
#
|
68
|
+
# endpoint = ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
|
69
|
+
# router = Lotus::Router.new(scheme: 'https', host: 'lotusrb.org') do
|
70
|
+
# get '/', to: endpoint, as: :root
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# router.path(:root) # => '/'
|
74
|
+
# router.url(:root) # => 'https://lotusrb.org/'
|
75
|
+
#
|
76
|
+
# # This isn't mandatory for the default route class (`Lotus::Routing::Route`),
|
77
|
+
# # This behavior can be changed by passing a custom route to `Lotus::Router#initialize`
|
78
|
+
class Router
|
79
|
+
# Initialize the router.
|
80
|
+
#
|
81
|
+
# @param options [Hash] the options to initialize the router
|
82
|
+
#
|
83
|
+
# @option options [String] :scheme The HTTP scheme (defaults to `"http"`)
|
84
|
+
# @option options [String] :host The URL host (defaults to `"localhost"`)
|
85
|
+
# @option options [String] :port The URL port (defaults to `"80"`)
|
86
|
+
# @option options [Object, #resolve, #find, #action_separator] :resolver
|
87
|
+
# the route resolver (defaults to `Lotus::Routing::EndpointResolver.new`)
|
88
|
+
# @option options [Object, #generate] :route the route class
|
89
|
+
# (defaults to `Lotus::Routing::Route`)
|
90
|
+
# @option options [String] :action_separator the separator between controller
|
91
|
+
# and action name (eg. 'dashboard#show', where '#' is the :action_separator)
|
92
|
+
#
|
93
|
+
# @param blk [Proc] the optional block to define the routes
|
94
|
+
#
|
95
|
+
# @return [Lotus::Router] self
|
96
|
+
#
|
97
|
+
# @since 0.1.0
|
98
|
+
#
|
99
|
+
# @example
|
100
|
+
# require 'lotus/router'
|
101
|
+
#
|
102
|
+
# endpoint = ->(env) { [200, {}, ['Welcome to Lotus::Router!']] }
|
103
|
+
#
|
104
|
+
# router = Lotus::Router.new
|
105
|
+
# router.get '/', to: endpoint
|
106
|
+
#
|
107
|
+
# # or
|
108
|
+
#
|
109
|
+
# router = Lotus::Router.new do
|
110
|
+
# get '/', to: endpoint
|
111
|
+
# end
|
112
|
+
def initialize(options = {}, &blk)
|
113
|
+
@router = Routing::HttpRouter.new(options)
|
114
|
+
instance_eval(&blk) if block_given?
|
115
|
+
end
|
116
|
+
|
117
|
+
# Defines a route that accepts a GET request for the given path.
|
118
|
+
#
|
119
|
+
# @param path [String] the relative URL to be matched
|
120
|
+
#
|
121
|
+
# @param options [Hash] the options to customize the route
|
122
|
+
# @option options [String,Proc,Class,Object#call] :to the endpoint
|
123
|
+
# @option options [String] :prefix an optional path prefix
|
124
|
+
#
|
125
|
+
# @param blk [Proc] the anonymous proc to be used as endpoint for the route
|
126
|
+
#
|
127
|
+
# @return [Lotus::Roting::Route] this may vary according to the :route
|
128
|
+
# option passed to the constructor
|
129
|
+
#
|
130
|
+
# @since 0.1.0
|
131
|
+
#
|
132
|
+
# @example Fixed matching string
|
133
|
+
# require 'lotus/router'
|
134
|
+
#
|
135
|
+
# router = Lotus::Router.new
|
136
|
+
# router.get '/lotus', to: ->(env) { [200, {}, ['Hello from Lotus!']] }
|
137
|
+
#
|
138
|
+
# @example String matching with variables
|
139
|
+
# require 'lotus/router'
|
140
|
+
#
|
141
|
+
# router = Lotus::Router.new
|
142
|
+
# router.get '/flowers/:id',
|
143
|
+
# to: ->(env) {
|
144
|
+
# [
|
145
|
+
# 200,
|
146
|
+
# {},
|
147
|
+
# ["Hello from Flower no. #{ env['router.params'][:id] }!"]
|
148
|
+
# ]
|
149
|
+
# }
|
150
|
+
#
|
151
|
+
# @example Variables Constraints
|
152
|
+
# require 'lotus/router'
|
153
|
+
#
|
154
|
+
# router = Lotus::Router.new
|
155
|
+
# router.get '/flowers/:id',
|
156
|
+
# id: /\d+/,
|
157
|
+
# to: ->(env) { [200, {}, [":id must be a number!"]] }
|
158
|
+
#
|
159
|
+
# @example String matching with globbling
|
160
|
+
# require 'lotus/router'
|
161
|
+
#
|
162
|
+
# router = Lotus::Router.new
|
163
|
+
# router.get '/*',
|
164
|
+
# to: ->(env) {
|
165
|
+
# [
|
166
|
+
# 200,
|
167
|
+
# {},
|
168
|
+
# ["This is catch all: #{ env['router.params'].inspect }!"]
|
169
|
+
# ]
|
170
|
+
# }
|
171
|
+
#
|
172
|
+
# @example String matching with optional tokens
|
173
|
+
# require 'lotus/router'
|
174
|
+
#
|
175
|
+
# router = Lotus::Router.new
|
176
|
+
# router.get '/lotus(.:format)',
|
177
|
+
# to: ->(env) {
|
178
|
+
# [200, {}, ["You've requested #{ env['router.params'][:format] }!"]]
|
179
|
+
# }
|
180
|
+
#
|
181
|
+
# @example Named routes
|
182
|
+
# require 'lotus/router'
|
183
|
+
#
|
184
|
+
# router = Lotus::Router.new(scheme: 'https', host: 'lotusrb.org')
|
185
|
+
# router.get '/lotus',
|
186
|
+
# to: ->(env) { [200, {}, ['Hello from Lotus!']] },
|
187
|
+
# as: :lotus
|
188
|
+
#
|
189
|
+
# router.path(:lotus) # => "/lotus"
|
190
|
+
# router.url(:lotus) # => "https://lotusrb.org/lotus"
|
191
|
+
#
|
192
|
+
# @example Prefixed routes
|
193
|
+
# require 'lotus/router'
|
194
|
+
#
|
195
|
+
# router = Lotus::Router.new
|
196
|
+
# router.get '/cats',
|
197
|
+
# prefix: '/animals/mammals',
|
198
|
+
# to: ->(env) { [200, {}, ['Meow!']] },
|
199
|
+
# as: :cats
|
200
|
+
#
|
201
|
+
# router.path(:animals_mammals_cats) # => "/animals/mammals/cats"
|
202
|
+
#
|
203
|
+
# @example Duck typed endpoints (Rack compatible objects)
|
204
|
+
# require 'lotus/router'
|
205
|
+
#
|
206
|
+
# router = Lotus::Router.new
|
207
|
+
#
|
208
|
+
# router.get '/lotus', to: ->(env) { [200, {}, ['Hello from Lotus!']] }
|
209
|
+
# router.get '/middleware', to: Middleware
|
210
|
+
# router.get '/rack-app', to: RackApp.new
|
211
|
+
# router.get '/method', to: ActionControllerSubclass.action(:new)
|
212
|
+
#
|
213
|
+
# # Everything that responds to #call is invoked as it is
|
214
|
+
#
|
215
|
+
# @example Duck typed endpoints (strings)
|
216
|
+
# require 'lotus/router'
|
217
|
+
#
|
218
|
+
# class RackApp
|
219
|
+
# def call(env)
|
220
|
+
# # ...
|
221
|
+
# end
|
222
|
+
# end
|
223
|
+
#
|
224
|
+
# router = Lotus::Router.new
|
225
|
+
# router.get '/lotus', to: 'rack_app' # it will map to RackApp.new
|
226
|
+
#
|
227
|
+
# @example Duck typed endpoints (string: controller + action)
|
228
|
+
# require 'lotus/router'
|
229
|
+
#
|
230
|
+
# class FlowersController
|
231
|
+
# class Index
|
232
|
+
# def call(env)
|
233
|
+
# # ...
|
234
|
+
# end
|
235
|
+
# end
|
236
|
+
# end
|
237
|
+
#
|
238
|
+
# router = Lotus::Router.new
|
239
|
+
# router.get '/flowers', to: 'flowers#index'
|
240
|
+
#
|
241
|
+
# # It will map to FlowersController::Index.new, which is the
|
242
|
+
# # Lotus::Controller convention.
|
243
|
+
def get(path, options = {}, &blk)
|
244
|
+
@router.get(path, options, &blk)
|
245
|
+
end
|
246
|
+
|
247
|
+
# Defines a route that accepts a POST request for the given path.
|
248
|
+
#
|
249
|
+
# @param path [String] the relative URL to be matched
|
250
|
+
#
|
251
|
+
# @param options [Hash] the options to customize the route
|
252
|
+
# @option options [String,Proc,Class,Object#call] :to the endpoint
|
253
|
+
# @option options [String] :prefix an optional path prefix
|
254
|
+
#
|
255
|
+
# @param blk [Proc] the anonymous proc to be used as endpoint for the route
|
256
|
+
#
|
257
|
+
# @return [Lotus::Roting::Route] this may vary according to the :route
|
258
|
+
# option passed to the constructor
|
259
|
+
#
|
260
|
+
# @see Lotus::Router#get
|
261
|
+
#
|
262
|
+
# @since 0.1.0
|
263
|
+
def post(path, options = {}, &blk)
|
264
|
+
@router.post(path, options, &blk)
|
265
|
+
end
|
266
|
+
|
267
|
+
# Defines a route that accepts a PUT request for the given path.
|
268
|
+
#
|
269
|
+
# @param path [String] the relative URL to be matched
|
270
|
+
#
|
271
|
+
# @param options [Hash] the options to customize the route
|
272
|
+
# @option options [String,Proc,Class,Object#call] :to the endpoint
|
273
|
+
# @option options [String] :prefix an optional path prefix
|
274
|
+
#
|
275
|
+
# @param blk [Proc] the anonymous proc to be used as endpoint for the route
|
276
|
+
#
|
277
|
+
# @return [Lotus::Roting::Route] this may vary according to the :route
|
278
|
+
# option passed to the constructor
|
279
|
+
#
|
280
|
+
# @see Lotus::Router#get
|
281
|
+
#
|
282
|
+
# @since 0.1.0
|
283
|
+
def put(path, options = {}, &blk)
|
284
|
+
@router.put(path, options, &blk)
|
285
|
+
end
|
286
|
+
|
287
|
+
# Defines a route that accepts a PATCH request for the given path.
|
288
|
+
#
|
289
|
+
# @param path [String] the relative URL to be matched
|
290
|
+
#
|
291
|
+
# @param options [Hash] the options to customize the route
|
292
|
+
# @option options [String,Proc,Class,Object#call] :to the endpoint
|
293
|
+
# @option options [String] :prefix an optional path prefix
|
294
|
+
#
|
295
|
+
# @param blk [Proc] the anonymous proc to be used as endpoint for the route
|
296
|
+
#
|
297
|
+
# @return [Lotus::Roting::Route] this may vary according to the :route
|
298
|
+
# option passed to the constructor
|
299
|
+
#
|
300
|
+
# @see Lotus::Router#get
|
301
|
+
#
|
302
|
+
# @since 0.1.0
|
303
|
+
def patch(path, options = {}, &blk)
|
304
|
+
@router.patch(path, options, &blk)
|
305
|
+
end
|
306
|
+
|
307
|
+
# Defines a route that accepts a DELETE request for the given path.
|
308
|
+
#
|
309
|
+
# @param path [String] the relative URL to be matched
|
310
|
+
#
|
311
|
+
# @param options [Hash] the options to customize the route
|
312
|
+
# @option options [String,Proc,Class,Object#call] :to the endpoint
|
313
|
+
# @option options [String] :prefix an optional path prefix
|
314
|
+
#
|
315
|
+
# @param blk [Proc] the anonymous proc to be used as endpoint for the route
|
316
|
+
#
|
317
|
+
# @return [Lotus::Roting::Route] this may vary according to the :route
|
318
|
+
# option passed to the constructor
|
319
|
+
#
|
320
|
+
# @see Lotus::Router#get
|
321
|
+
#
|
322
|
+
# @since 0.1.0
|
323
|
+
def delete(path, options = {}, &blk)
|
324
|
+
@router.delete(path, options, &blk)
|
325
|
+
end
|
326
|
+
|
327
|
+
# Defines a route that accepts a TRACE request for the given path.
|
328
|
+
#
|
329
|
+
# @param path [String] the relative URL to be matched
|
330
|
+
#
|
331
|
+
# @param options [Hash] the options to customize the route
|
332
|
+
# @option options [String,Proc,Class,Object#call] :to the endpoint
|
333
|
+
# @option options [String] :prefix an optional path prefix
|
334
|
+
#
|
335
|
+
# @param blk [Proc] the anonymous proc to be used as endpoint for the route
|
336
|
+
#
|
337
|
+
# @return [Lotus::Roting::Route] this may vary according to the :route
|
338
|
+
# option passed to the constructor
|
339
|
+
#
|
340
|
+
# @see Lotus::Router#get
|
341
|
+
#
|
342
|
+
# @since 0.1.0
|
343
|
+
def trace(path, options = {}, &blk)
|
344
|
+
@router.trace(path, options, &blk)
|
345
|
+
end
|
346
|
+
|
347
|
+
# Defines a route that accepts a OPTIONS request for the given path.
|
348
|
+
#
|
349
|
+
# @param path [String] the relative URL to be matched
|
350
|
+
#
|
351
|
+
# @param options [Hash] the options to customize the route
|
352
|
+
# @option options [String,Proc,Class,Object#call] :to the endpoint
|
353
|
+
# @option options [String] :prefix an optional path prefix
|
354
|
+
#
|
355
|
+
# @param blk [Proc] the anonymous proc to be used as endpoint for the route
|
356
|
+
#
|
357
|
+
# @return [Lotus::Roting::Route] this may vary according to the :route
|
358
|
+
# option passed to the constructor
|
359
|
+
#
|
360
|
+
# @see Lotus::Router#get
|
361
|
+
#
|
362
|
+
# @since 0.1.0
|
363
|
+
def options(path, options = {}, &blk)
|
364
|
+
@router.options(path, options, &blk)
|
365
|
+
end
|
366
|
+
|
367
|
+
# Defines an HTTP redirect
|
368
|
+
#
|
369
|
+
# @param path [String] the path that needs to be redirected
|
370
|
+
# @param options [Hash] the options to customize the redirect behavior
|
371
|
+
# @option options [Fixnum] the HTTP status to return (defaults to `302`)
|
372
|
+
#
|
373
|
+
# @return [Lotus::Routing::Route] the generated route.
|
374
|
+
# This may vary according to the `:route` option passed to the initializer
|
375
|
+
#
|
376
|
+
# @since 0.1.0
|
377
|
+
#
|
378
|
+
# @see Lotus::Router
|
379
|
+
#
|
380
|
+
# @example
|
381
|
+
# require 'lotus/router'
|
382
|
+
#
|
383
|
+
# Lotus::Router.new do
|
384
|
+
# redirect '/legacy', to: '/new_endpoint'
|
385
|
+
# redirect '/legacy2', to: '/new_endpoint2', code: 301
|
386
|
+
# end
|
387
|
+
#
|
388
|
+
# @example
|
389
|
+
# require 'lotus/router'
|
390
|
+
#
|
391
|
+
# router = Lotus::Router.new
|
392
|
+
# router.redirect '/legacy', to: '/new_endpoint'
|
393
|
+
def redirect(path, options = {}, &endpoint)
|
394
|
+
get(path).redirect @router.find(options), options[:code] || 302
|
395
|
+
end
|
396
|
+
|
397
|
+
# Defines a Ruby block: all the routes defined within it will be namespaced
|
398
|
+
# with the given prefix.
|
399
|
+
#
|
400
|
+
# Namespaces blocks can be nested multiple times.
|
401
|
+
#
|
402
|
+
# @param prefix [String] the path prefix
|
403
|
+
# @param blk [Proc] the block that defines the resources
|
404
|
+
#
|
405
|
+
# @return [Lotus::Routing::Namespace] the generated namespace.
|
406
|
+
#
|
407
|
+
# @since 0.1.0
|
408
|
+
#
|
409
|
+
# @see Lotus::Router
|
410
|
+
#
|
411
|
+
# @example Basic example
|
412
|
+
# require 'lotus/router'
|
413
|
+
#
|
414
|
+
# Lotus::Router.new do
|
415
|
+
# namespace 'trees' do
|
416
|
+
# get '/sequoia', to: endpoint # => '/trees/sequoia'
|
417
|
+
# end
|
418
|
+
#
|
419
|
+
# # equivalent to
|
420
|
+
#
|
421
|
+
# get '/sequoia', to: endpoint, prefix: 'trees' # => '/trees/sequoia'
|
422
|
+
# end
|
423
|
+
#
|
424
|
+
# @example Nested namespaces
|
425
|
+
# require 'lotus/router'
|
426
|
+
#
|
427
|
+
# Lotus::Router.new do
|
428
|
+
# namespace 'animals' do
|
429
|
+
# namespace 'mammals' do
|
430
|
+
# get '/cats', to: endpoint # => '/animals/mammals/cats'
|
431
|
+
# end
|
432
|
+
# end
|
433
|
+
# end
|
434
|
+
#
|
435
|
+
# @example
|
436
|
+
# require 'lotus/router'
|
437
|
+
#
|
438
|
+
# router = Lotus::Router.new
|
439
|
+
# router.namespace 'trees' do
|
440
|
+
# get '/sequoia', to: endpoint # => '/trees/sequoia'
|
441
|
+
# end
|
442
|
+
def namespace(prefix, &blk)
|
443
|
+
Routing::Namespace.new(self, prefix, &blk)
|
444
|
+
end
|
445
|
+
|
446
|
+
# Defines a set of named routes for a single RESTful resource.
|
447
|
+
# It has a built-in integration for Lotus::Controller.
|
448
|
+
#
|
449
|
+
# @param name [String] the name of the resource
|
450
|
+
# @param options [Hash] a set of options to customize the routes
|
451
|
+
# @option options [Array<Symbol>] :only a subset of the default routes
|
452
|
+
# that we want to generate
|
453
|
+
# @option options [Array<Symbol>] :except prevent the given routes to be
|
454
|
+
# generated
|
455
|
+
# @param blk [Proc] a block of code to generate additional routes
|
456
|
+
#
|
457
|
+
# @return [Lotus::Routing::Resource]
|
458
|
+
#
|
459
|
+
# @since 0.1.0
|
460
|
+
#
|
461
|
+
# @see Lotus::Routing::Resource
|
462
|
+
# @see Lotus::Routing::Resource::Action
|
463
|
+
# @see Lotus::Routing::Resource::Options
|
464
|
+
#
|
465
|
+
# @example Default usage
|
466
|
+
# require 'lotus/router'
|
467
|
+
#
|
468
|
+
# Lotus::Router.new do
|
469
|
+
# resource 'identity'
|
470
|
+
# end
|
471
|
+
#
|
472
|
+
# # It generates:
|
473
|
+
# #
|
474
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
475
|
+
# # | Verb | Path | Action | Name | Named Route |
|
476
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
477
|
+
# # | GET | /identity | IdentityController::Show | :show | :identity |
|
478
|
+
# # | GET | /identity/new | IdentityController::New | :new | :new_identity |
|
479
|
+
# # | POST | /identity | IdentityController::Create | :create | :identity |
|
480
|
+
# # | GET | /identity/edit | IdentityController::Edit | :edit | :edit_identity |
|
481
|
+
# # | PATCH | /identity | IdentityController::Update | :update | :identity |
|
482
|
+
# # | DELETE | /identity | IdentityController::Destroy | :destroy | :identity |
|
483
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
484
|
+
#
|
485
|
+
#
|
486
|
+
#
|
487
|
+
# @example Limit the generated routes with :only
|
488
|
+
# require 'lotus/router'
|
489
|
+
#
|
490
|
+
# Lotus::Router.new do
|
491
|
+
# resource 'identity', only: [:show, :new, :create]
|
492
|
+
# end
|
493
|
+
#
|
494
|
+
# # It generates:
|
495
|
+
# #
|
496
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
497
|
+
# # | Verb | Path | Action | Name | Named Route |
|
498
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
499
|
+
# # | GET | /identity | IdentityController::Show | :show | :identity |
|
500
|
+
# # | GET | /identity/new | IdentityController::New | :new | :new_identity |
|
501
|
+
# # | POST | /identity | IdentityController::Create | :create | :identity |
|
502
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
503
|
+
#
|
504
|
+
#
|
505
|
+
#
|
506
|
+
# @example Limit the generated routes with :except
|
507
|
+
# require 'lotus/router'
|
508
|
+
#
|
509
|
+
# Lotus::Router.new do
|
510
|
+
# resource 'identity', except: [:edit, :update, :destroy]
|
511
|
+
# end
|
512
|
+
#
|
513
|
+
# # It generates:
|
514
|
+
# #
|
515
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
516
|
+
# # | Verb | Path | Action | Name | Named Route |
|
517
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
518
|
+
# # | GET | /identity | IdentityController::Show | :show | :identity |
|
519
|
+
# # | GET | /identity/new | IdentityController::New | :new | :new_identity |
|
520
|
+
# # | POST | /identity | IdentityController::Create | :create | :identity |
|
521
|
+
# # +--------+----------------+-----------------------------+----------+----------------+
|
522
|
+
#
|
523
|
+
#
|
524
|
+
#
|
525
|
+
# @example Additional single routes
|
526
|
+
# require 'lotus/router'
|
527
|
+
#
|
528
|
+
# Lotus::Router.new do
|
529
|
+
# resource 'identity', only: [] do
|
530
|
+
# member do
|
531
|
+
# patch 'activate'
|
532
|
+
# end
|
533
|
+
# end
|
534
|
+
# end
|
535
|
+
#
|
536
|
+
# # It generates:
|
537
|
+
# #
|
538
|
+
# # +--------+--------------------+------------------------------+------+--------------------+
|
539
|
+
# # | Verb | Path | Action | Name | Named Route |
|
540
|
+
# # +--------+--------------------+------------------------------+------+--------------------+
|
541
|
+
# # | PATCH | /identity/activate | IdentityController::Activate | | :activate_identity |
|
542
|
+
# # +--------+--------------------+------------------------------+------+--------------------+
|
543
|
+
#
|
544
|
+
#
|
545
|
+
#
|
546
|
+
# @example Additional collection routes
|
547
|
+
# require 'lotus/router'
|
548
|
+
#
|
549
|
+
# Lotus::Router.new do
|
550
|
+
# resource 'identity', only: [] do
|
551
|
+
# collection do
|
552
|
+
# get 'keys'
|
553
|
+
# end
|
554
|
+
# end
|
555
|
+
# end
|
556
|
+
#
|
557
|
+
# # It generates:
|
558
|
+
# #
|
559
|
+
# # +------+----------------+--------------------------+------+----------------+
|
560
|
+
# # | Verb | Path | Action | Name | Named Route |
|
561
|
+
# # +------+----------------+--------------------------+------+----------------+
|
562
|
+
# # | GET | /identity/keys | IdentityController::Keys | | :keys_identity |
|
563
|
+
# # +------+----------------+--------------------------+------+----------------+
|
564
|
+
def resource(name, options = {}, &blk)
|
565
|
+
Routing::Resource.new(self, name, options.merge(separator: @router.action_separator), &blk)
|
566
|
+
end
|
567
|
+
|
568
|
+
# Defines a set of named routes for a plural RESTful resource.
|
569
|
+
# It has a built-in integration for Lotus::Controller.
|
570
|
+
#
|
571
|
+
# @param name [String] the name of the resource
|
572
|
+
# @param options [Hash] a set of options to customize the routes
|
573
|
+
# @option options [Array<Symbol>] :only a subset of the default routes
|
574
|
+
# that we want to generate
|
575
|
+
# @option options [Array<Symbol>] :except prevent the given routes to be
|
576
|
+
# generated
|
577
|
+
# @param blk [Proc] a block of code to generate additional routes
|
578
|
+
#
|
579
|
+
# @return [Lotus::Routing::Resources]
|
580
|
+
#
|
581
|
+
# @since 0.1.0
|
582
|
+
#
|
583
|
+
# @see Lotus::Routing::Resources
|
584
|
+
# @see Lotus::Routing::Resources::Action
|
585
|
+
# @see Lotus::Routing::Resource::Options
|
586
|
+
#
|
587
|
+
# @example Default usage
|
588
|
+
# require 'lotus/router'
|
589
|
+
#
|
590
|
+
# Lotus::Router.new do
|
591
|
+
# resources 'articles'
|
592
|
+
# end
|
593
|
+
#
|
594
|
+
# # It generates:
|
595
|
+
# #
|
596
|
+
# # +--------+--------------------+-----------------------------+----------+----------------+
|
597
|
+
# # | Verb | Path | Action | Name | Named Route |
|
598
|
+
# # +--------+--------------------+-----------------------------+----------+----------------+
|
599
|
+
# # | GET | /articles | ArticlesController::Index | :index | :articles |
|
600
|
+
# # | GET | /articles/:id | ArticlesController::Show | :show | :articles |
|
601
|
+
# # | GET | /articles/new | ArticlesController::New | :new | :new_articles |
|
602
|
+
# # | POST | /articles | ArticlesController::Create | :create | :articles |
|
603
|
+
# # | GET | /articles/:id/edit | ArticlesController::Edit | :edit | :edit_articles |
|
604
|
+
# # | PATCH | /articles/:id | ArticlesController::Update | :update | :articles |
|
605
|
+
# # | DELETE | /articles/:id | ArticlesController::Destroy | :destroy | :articles |
|
606
|
+
# # +--------+--------------------+-----------------------------+----------+----------------+
|
607
|
+
#
|
608
|
+
#
|
609
|
+
#
|
610
|
+
# @example Limit the generated routes with :only
|
611
|
+
# require 'lotus/router'
|
612
|
+
#
|
613
|
+
# Lotus::Router.new do
|
614
|
+
# resources 'articles', only: [:index]
|
615
|
+
# end
|
616
|
+
#
|
617
|
+
# # It generates:
|
618
|
+
# #
|
619
|
+
# # +------+-----------+---------------------------+--------+-------------+
|
620
|
+
# # | Verb | Path | Action | Name | Named Route |
|
621
|
+
# # +------+-----------+---------------------------+--------+-------------+
|
622
|
+
# # | GET | /articles | ArticlesController::Index | :index | :articles |
|
623
|
+
# # +------+-----------+---------------------------+--------+-------------+
|
624
|
+
#
|
625
|
+
#
|
626
|
+
#
|
627
|
+
# @example Limit the generated routes with :except
|
628
|
+
# require 'lotus/router'
|
629
|
+
#
|
630
|
+
# Lotus::Router.new do
|
631
|
+
# resources 'articles', except: [:edit, :update]
|
632
|
+
# end
|
633
|
+
#
|
634
|
+
# # It generates:
|
635
|
+
# #
|
636
|
+
# # +--------+--------------------+-----------------------------+----------+----------------+
|
637
|
+
# # | Verb | Path | Action | Name | Named Route |
|
638
|
+
# # +--------+--------------------+-----------------------------+----------+----------------+
|
639
|
+
# # | GET | /articles | ArticlesController::Index | :index | :articles |
|
640
|
+
# # | GET | /articles/:id | ArticlesController::Show | :show | :articles |
|
641
|
+
# # | GET | /articles/new | ArticlesController::New | :new | :new_articles |
|
642
|
+
# # | POST | /articles | ArticlesController::Create | :create | :articles |
|
643
|
+
# # | DELETE | /articles/:id | ArticlesController::Destroy | :destroy | :articles |
|
644
|
+
# # +--------+--------------------+-----------------------------+----------+----------------+
|
645
|
+
#
|
646
|
+
#
|
647
|
+
#
|
648
|
+
# @example Additional single routes
|
649
|
+
# require 'lotus/router'
|
650
|
+
#
|
651
|
+
# Lotus::Router.new do
|
652
|
+
# resources 'articles', only: [] do
|
653
|
+
# member do
|
654
|
+
# patch 'publish'
|
655
|
+
# end
|
656
|
+
# end
|
657
|
+
# end
|
658
|
+
#
|
659
|
+
# # It generates:
|
660
|
+
# #
|
661
|
+
# # +--------+-----------------------+-----------------------------+------+-------------------+
|
662
|
+
# # | Verb | Path | Action | Name | Named Route |
|
663
|
+
# # +--------+-----------------------+-----------------------------+------+-------------------+
|
664
|
+
# # | PATCH | /articles/:id/publish | ArticlesController::Publish | | :publish_articles |
|
665
|
+
# # +--------+-----------------------+-----------------------------+------+-------------------+
|
666
|
+
#
|
667
|
+
#
|
668
|
+
#
|
669
|
+
# @example Additional collection routes
|
670
|
+
# require 'lotus/router'
|
671
|
+
#
|
672
|
+
# Lotus::Router.new do
|
673
|
+
# resources 'articles', only: [] do
|
674
|
+
# collection do
|
675
|
+
# get 'search'
|
676
|
+
# end
|
677
|
+
# end
|
678
|
+
# end
|
679
|
+
#
|
680
|
+
# # It generates:
|
681
|
+
# #
|
682
|
+
# # +------+------------------+----------------------------+------+------------------+
|
683
|
+
# # | Verb | Path | Action | Name | Named Route |
|
684
|
+
# # +------+------------------+----------------------------+------+------------------+
|
685
|
+
# # | GET | /articles/search | ArticlesController::Search | | :search_articles |
|
686
|
+
# # +------+------------------+----------------------------+------+------------------+
|
687
|
+
def resources(name, options = {}, &blk)
|
688
|
+
Routing::Resources.new(self, name, options.merge(separator: @router.action_separator), &blk)
|
689
|
+
end
|
690
|
+
|
691
|
+
# Resolve the given Rack env to a registered endpoint and invoke it.
|
692
|
+
#
|
693
|
+
# @param env [Hash] a Rack env instance
|
694
|
+
#
|
695
|
+
# @return [Rack::Response, Array]
|
696
|
+
#
|
697
|
+
# @since 0.1.0
|
698
|
+
def call(env)
|
699
|
+
@router.call(env)
|
700
|
+
end
|
701
|
+
|
702
|
+
# Generate an relative URL for a specified named route.
|
703
|
+
# The additional arguments will be used to compose the relative URL - in
|
704
|
+
# case it has tokens to match - and for compose the query string.
|
705
|
+
#
|
706
|
+
# @param route [Symbol] the route name
|
707
|
+
#
|
708
|
+
# @return [String]
|
709
|
+
#
|
710
|
+
# @raise [Lotus::Routing::InvalidRouteException] when the router fails to
|
711
|
+
# recognize a route, because of the given arguments.
|
712
|
+
#
|
713
|
+
# @since 0.1.0
|
714
|
+
#
|
715
|
+
# @example
|
716
|
+
# require 'lotus/router'
|
717
|
+
#
|
718
|
+
# router = Lotus::Router.new(scheme: 'https', host: 'lotusrb.org')
|
719
|
+
# router.get '/login', to: 'sessions#new', as: :login
|
720
|
+
# router.get '/:name', to: 'frameworks#show', as: :framework
|
721
|
+
#
|
722
|
+
# router.path(:login) # => "/login"
|
723
|
+
# router.path(:login, return_to: '/dashboard') # => "/login?return_to=%2Fdashboard"
|
724
|
+
# router.path(:framework, name: 'router') # => "/router"
|
725
|
+
def path(route, *args)
|
726
|
+
@router.path(route, *args)
|
727
|
+
end
|
728
|
+
|
729
|
+
# Generate a URL for a specified named route.
|
730
|
+
# The additional arguments will be used to compose the relative URL - in
|
731
|
+
# case it has tokens to match - and for compose the query string.
|
732
|
+
#
|
733
|
+
# @param route [Symbol] the route name
|
734
|
+
#
|
735
|
+
# @return [String]
|
736
|
+
#
|
737
|
+
# @raise [Lotus::Routing::InvalidRouteException] when the router fails to
|
738
|
+
# recognize a route, because of the given arguments.
|
739
|
+
#
|
740
|
+
# @since 0.1.0
|
741
|
+
#
|
742
|
+
# @example
|
743
|
+
# require 'lotus/router'
|
744
|
+
#
|
745
|
+
# router = Lotus::Router.new(scheme: 'https', host: 'lotusrb.org')
|
746
|
+
# router.get '/login', to: 'sessions#new', as: :login
|
747
|
+
# router.get '/:name', to: 'frameworks#show', as: :framework
|
748
|
+
#
|
749
|
+
# router.url(:login) # => "https://lotusrb.org/login"
|
750
|
+
# router.url(:login, return_to: '/dashboard') # => "https://lotusrb.org/login?return_to=%2Fdashboard"
|
751
|
+
# router.url(:framework, name: 'router') # => "https://lotusrb.org/router"
|
752
|
+
def url(route, *args)
|
753
|
+
@router.url(route, *args)
|
754
|
+
end
|
6
755
|
end
|
7
756
|
end
|