• Stars
    star
    272
  • Rank 145,716 (Top 3 %)
  • Language
    Ruby
  • License
    MIT License
  • Created about 11 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A minimalistic microframework built on top of Rack.

Hobbit Build Status Code Climate Code Climate Coverage Dependency Status Gem Version

A minimalistic microframework built on top of Rack.

Installation

Add this line to your application's Gemfile:

gem 'hobbit'
# or this if you want to use hobbit master
# gem 'hobbit', github: 'patriciomacadden/hobbit'

And then execute:

$ bundle

Or install it yourself as:

$ gem install hobbit

Features

  • DSL inspired by Sinatra.
  • Speed.
  • Extensible with standard ruby classes and modules, with no extra logic. See hobbit-contrib.
  • Zero configuration.

Philosophy

  • Don't repeat yourself
  • Encourages the understanding and use of Rack and its extensions instead of providing such functionality.

Usage

Hobbit applications are just instances of classes that inherits from Hobbit::Base, which complies the Rack SPEC.

Hello World example

Create a file called app.rb:

require 'hobbit'

class App < Hobbit::Base
  get '/' do
    'Hello World!'
  end
end

Create a config.ru file:

require './app'

run App.new # or just `run App`

Run it with rackup:

$ rackup

View your app at http://localhost:9292.

Routes

Every route is composed of a verb, a path (optional) and a block. When an incoming request matches a route, the block is executed and a response is sent back to the client. The return value of the block will be the body of the response. The headers and status code of the response will be calculated by Hobbit::Response, but you could modify it anyway you want it.

See an example:

class App < Hobbit::Base
  get '/' do
    # ...
  end

  post '/' do
    # ...
  end

  put '/' do
    # ...
  end

  patch '/' do
    # ...
  end

  delete '/' do
    # ...
  end

  options '/' do
    # ...
  end
end

When a route gets called you have this methods available:

  • env: The Rack environment.
  • request: a Hobbit::Request instance.
  • response: a Hobbit::Response instance.

And any other method defined in your application.

Available methods

  • delete
  • get
  • head
  • options
  • patch
  • post
  • put

Note: Since most browsers don't support methods other than GET and POST you must use the Rack::MethodOverride middleware. (See Rack::MethodOverride).

Routes with parameters

Besides the standard GET and POST parameters, you can have routes with parameters:

require 'hobbit'

class App < Hobbit::Base
  # matches both /hi/hobbit and /hi/patricio
  get '/hi/:name' do
    # request.params is filled with the route paramters, like this:
    "Hello #{request.params[:name]}"
  end
end

Redirecting

If you look at Hobbit implementation, you may notice that there is no redirect method (or similar). This is because such functionality is provided by Rack::Response and for now we don't wan't to repeat ourselves (obviously you can create an extension!). So, if you want to redirect to another route, do it like this:

require 'hobbit'

class App < Hobbit::Base
  get '/' do
    response.redirect '/hi'
  end

  get '/hi' do
    'Hello World!'
  end
end

Halting

To immediately stop a request within route you can use halt.

require 'hobbit'

class App < Hobbit::Base
  use Rack::Session::Cookie, secret: SecureRandom.hex(64)

  def session
    env['rack.session']
  end

  get '/' do
    response.status = 401
    halt response.finish
  end
end

Built on top of rack

Each Hobbit application is a Rack stack (See this blog post for more information).

Mapping applications

You can mount any Rack application to the stack by using the map class method:

require 'hobbit'

class InnerApp < Hobbit::Base
  # gets called when path_info = '/inner'
  get do
    'Hello InnerApp!'
  end
end

class App < Hobbit::Base
  map('/inner') { run InnerApp.new }

  get '/' do
    'Hello App!'
  end
end

Using middleware

You can add any Rack middleware to the stack by using the use class method:

require 'hobbit'

class App < Hobbit::Base
  use Rack::Session::Cookie, secret: SecureRandom.hex(64)
  use Rack::ShowExceptions

  def session
    env['rack.session']
  end

  get '/' do
    session[:name] = 'hobbit'
  end

  # more routes...
end

run App.new

Security

By default, Hobbit (nor Rack) comes without any protection against web attacks. The use of rack-protection is highly recommended:

require 'hobbit'
require 'rack/protection'
require 'securerandom'

class App < Hobbit::Base
  use Rack::Session::Cookie, secret: SecureRandom.hex(64)
  use Rack::Protection

  get '/' do
    'Hello World!'
  end
end

See the rack-protection documentation for futher information.

Testing

rack-test is highly recommended. See an example:

In app.rb:

require 'hobbit'

class App < Hobbit::Base
  get '/' do
    'Hello World!'
  end
end

In app_spec.rb:

require 'minitest/autorun'
# imagine that app.rb and app_spec.rb are stored in the same directory
require 'app'

describe App do
  include Rack::Test::Methods

  def app
    App.new
  end

  describe 'GET /' do
    it 'must be ok' do
      get '/'
      last_response.must_be :ok?
      last_response.body.must_match /Hello World!/
    end
  end
end

See the rack-test documentation for futher information.

Extensions

You can extend Hobbit by creating standard ruby modules. See an example:

module MyExtension
  def do_something
    # do something
  end
end

class App < Hobbit::Base
  include MyExtension

  get '/' do
    do_something
    'Hello World!'
  end
end

Hobbit::Contrib

hobbit-contrib is a ruby gem that comes with a lot of hobbit extensions, such as:

  • Hobbit::Render: provides basic template rendering.
  • Hobbit::Session: provides helper methods for handling user sessions.
  • Hobbit::Environment: provides helper methods for handling application environments.
  • Hobbit::Filter: provides helper class methods for handling Sinatra-like filters.
  • Hobbit::ErrorHandling: provides helper class methods for handling Sinatra-like error handling.

... And many more!

Community

Presentations

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

License

See the LICENSE.

More Repositories

1

hobbit-contrib

Contributed Hobbit extensions.
Ruby
19
star
2

icd.json

WHO's ICD.
10
star
3

hat

Hobbit Application Template
Ruby
10
star
4

pass-chrome-extension

Google Chrome extension for pass, the password store.
JavaScript
10
star
5

fogata

Fogata is an open source group chat. Basically, Fogata is an open source Campfire clone.
Ruby
10
star
6

icd

International Classification of Diseases (ICD)
Ruby
8
star
7

sat

Sinatra Application Template.
Ruby
8
star
8

oktobertest

Small test library.
Ruby
7
star
9

microbenchmarks

Benchmarking microframeworks. [DEPRECATED] See luislavena/bench-micro
Ruby
6
star
10

ment

(environ)ment adds methods for asking what's the value of ENV['RACK_ENV'].
Ruby
6
star
11

isco

International Standard Classification of Occupations. A browsable database of ISCO 08.
Ruby
4
star
12

time_sugar

Syntactic sugar for handling time. If you are familiar with Active Support, but you don't want to add the whole library for just handling time, time_sugar may be helpful.
Ruby
4
star
13

miniconfig

Minimalistic configuration files for your projects.
Ruby
4
star
14

ser

Lightweight foreman alternative
Ruby
3
star
15

goqr

QR codes for ruby/rails using goqr.me API
Ruby
3
star
16

nice_generators

Nice generators for rails 3.
Ruby
3
star
17

isco.json

ILO's ISCO
3
star
18

lazy_form

Forms for the rest of us, the lazy.
Ruby
2
star
19

sinatra-verbose

Sinatra verbose logging extension
Ruby
2
star
20

bootstrap-generators

Rails generators for twitter/bootstrap goodness
Ruby
2
star
21

jquery.rack.js

Javascript helpers for any Rack based application (except rails).
JavaScript
2
star
22

simple_gravatar

Add gravatars to your ruby project as simple as possible.
Ruby
2
star
23

autokey-macOS

macOS-like keybindings for linux
Python
2
star
24

pumistrano

Puma for Capistrano 3
Ruby
1
star
25

projecteuler

My solutions to Project Euler problems
Ruby
1
star
26

cuba-sprockets

Sprockets helpers for Cuba
Ruby
1
star
27

oktobertest-contrib

Oktobertest contributed extensions.
Ruby
1
star
28

crest

Cuba + REST
Ruby
1
star
29

rack.js

Vanilla javascript helpers for any rack based application.
JavaScript
1
star
30

dotfiles

My configuration files
Shell
1
star
31

hobbit-routes

Hobbit with routes! (A proof of concept)
Ruby
1
star
32

cv

My Curriculum Vitae
1
star