Pendragon
Pendragon provides an HTTP router and its toolkit for use in Rack. As a Rack application, it makes it easy to define complicated routing. Algorithms of the router are used in Padrino and Grape, it's fast, flexible and robust.
If you want to use in Ruby-1.9, you can do it by using mustermann19.
Pendragon.new do
get('/') { [200, {}, ['hello world']] }
namespace :users do
get('/', to: -> { [200, {}, ['User page index']] })
get('/:id', to: -> (id) { [200, {}, [id]] })
get('/:id/comments') { |id| [200, {}, [User.find_by(id: id).comments.to_json]] }
end
endRouter Patterns
| Type | Description | Note |
|---|---|---|
| liner | Linear search, Optimized Mustermann patterns | |
| realism | First route is detected by union regexps (Actually, O(1) in ruby level), routes since the first time will be retected by linear search | this algorithm is using in Grape |
| radix | Radix Tree, not using Mustermann and regexp | requires C++11 |
Installation
Add this line to your application's Gemfile:
gem 'pendragon'And then execute:
$ bundle
Or install it yourself as:
$ gem install pendragon
Usage
Selects router pattern
You can select router pattern as following code.
# Gets Linear router class by passing type in `Pendragon.[]`
Pendragon[:linear] #=> Pendragon::Linear
# Specify :type to construction of Pendragon.
Pendragon.new(type: :linear) { ... }Registers a route
It has some methods to register a route. For example, #get, #post and #delete are so.
This section introduces all those methods.
route(method, path, **options, &block)
The method is the basis of the registration method of all. In comparison with other registration methods, one argument is increased.
Pendragon.new do
route('GET', ?/){ [200, {}, ['hello']] }
end
get(path, **options, &block), post, delete, put and head
Basically the usage is the same with #route.
You may as well use those methods instead of #route because those methods are easy to understand.
Pendragon.new do
get (?/) { [200, {}, ['hello']] }
post (?/) { [200, {}, ['hello']] }
delete(?/) { [200, {}, ['hello']] }
put (?/) { [200, {}, ['hello']] }
head (?/) { [200, {}, ['hello']] }
endMounts Rack Application
You can easily mount your rack application onto Pendragon.
Please note that pendragon distinguishes between processing Proc and Rack Application.
class RackApp
def call(env)
puts env #=> rack default env
[200, {}, ['hello']]
end
end
Pendragon.new do
get '/ids/:id', to: -> (id) { p id } # Block parameters are available
get '/rack/:id', to: RackApp.new # RackApp#call will be called, `id` is not passed and `env` is passed instead.
endHalt
You can halt to processing by calling throw :halt inside your route.
Pendragon.new do
get ?/ do
throw :halt, [404, {}, ['not found']]
[200, {}, ['failed to halt']]
end
endCascading
A route can punt to the next matching route by using X-Cascade header.
pendragon = Pendragon.new do
foo = 1
get ?/ do
[200, { 'X-Cascade' => 'pass' }, ['']]
end
get ?/ do
[200, {}, ['goal!']]
end
end
env = Rack::MockRequest.env_for(?/)
pendragon.call(env) #=> [200, {}, ['goal!']]Contributing
- fork the project.
- create your feature branch. (
git checkout -b my-feature) - commit your changes. (
git commit -am 'commit message') - push to the branch. (
git push origin my-feature) - send pull request.
License
the MIT License