Introduction
A Ruby DSL over Rack. You can create with it reusable web applications, suitable for both standalone and inside-Rails use.
Installation
Add this line to your application’s Gemfile:
gem 'hobby'
# or this if you want to use hobby master
# gem 'hobby', github: 'ch1c0t/hobby'And then execute:
$ bundleOr install it yourself as:
$ gem install hobbyUsage
To create a Hobby application, you create a class and include Hobby in it.
For example:
require 'hobby'
class C
include Hobby
get "/hello" do
"Hello, world."
end
endThen, you can create an instance of C with
C.newwhich will return a Rack application(an object which complies to Rack SPEC).
Because a Hobby application is just a Ruby class, you can do with it pretty much anything you would expect to be able to do with a Ruby class.
Using #initialize
You can set some state in #initialize and then use it in the route’s action:
class C
include Hobby
def initialize name
@name = name
end
get "/hello" do
"Hello, #{@name}."
end
endUsing instance methods
class C
include Hobby
def initialize name
@name = name
end
def name
@name.upcase
end
get "/hello" do
"Hello, #{name}."
end
endHow to run
To run an application, you can put it into config.ru:
run C.new 'Hobby'and then use rackup:
$ rackupOr, if you are using Rails, you can mount it in config/routes.rb with:
mount C.new('Hobby') => '/some_path'Routes
For common HTTP verbs, Hobby provides the route definers(methods named accordingly):
class App
include Hobby
get { 'Some string.' }
post { 'Some string.' }
put { 'Some string.' }
patch { 'Some string.' }
delete { 'Some string.' }
# TODO: find a good example for `options`
endA definer should be called with a path(optional) and an action(passed as a block).
Calling a definer has a side effect of defining a route in the router.
When an incoming request matches a route,
the action is executed and a response is sent back to the client.
The return value of the action will be the body of the response.
Default route
If a path was omitted
get do
'The body returned to the HTTP client making the request.'
endthe action is attached to the root route, like if
get '/' do
'The body returned to the HTTP client making the request.'
endwere called.
Route params
Can be accessed with route.params (or a shortcut my):
# will match '/index', '/hobby', '/purpose', etc.
get '/:name' do
route.params[:name]
end
# will match '/index.css', '/index.js', etc.
get '/:name.:ext' do
"The name is #{my[:name]} and the ext is #{my[:ext]}."
endDefault methods
The following methods are predefined:
-
env: aHash, a Rack environment. -
request: aRack::Request. -
response: aRack::Response. -
route: aHobby::Router::Route, the currently executing route. -
route.params, or a shortcutmy: aHashwhich stores route params. See Route params for a usage example. -
halt: returns theresponseimmediately. See Halting for a usage example.
Halting
class App
include Hobby
use Rack::Session::Cookie, secret: SecureRandom.hex(64)
def session
env['rack.session']
end
get '/' do
response.status = 401
halt
'This line is never going to be returned.'
end
endExtensions
You can extend Hobby with usual modules:
module MyExtension
def do_something
# do something
end
end
class App
include Hobby
include MyExtension
get '/' do
do_something
'Hello World!'
end
endAvailable extensions
-
hobby-json: JSON requests and responses.
-
hobby-auth: User authorization.
Using Rack::Builder
You can use map and use from Rack::Builder.
Mapping applications
You can mount any Rack application to a Hobby application with map.
Here is an example of mounting the application from Using #initialize
to '/anatoly' and '/patricio' routes:
class App
include Hobby
map '/anatoly', C.new('Anatoly')
map '/patricio', C.new('Patricio')
get '/' do
'Mapping app.'
end
endUsing middleware
You can use any Rack middleware with use:
class App
include Hobby
use Rack::Session::Cookie, secret: SecureRandom.hex(64)
use Rack::ShowExceptions
def session
env['rack.session']
end
get '/' do
session[:name] = 'username'
end
endDevelopment
To run the specs:
bundle exec rspec