Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
A mini view framework for console/irb that's easy to use, even while under its influence. Console goodies include a no-wrap table, auto-pager, tree and menu.

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.



Hirb provides a mini view framework for console applications and uses it to improve irb's default inspect output. Given an object or array of objects, hirb renders a view based on the object's class and/or ancestry. Hirb offers reusable views in the form of helper classes. The two main helpers, Hirb::Helpers::Table and Hirb::Helpers::Tree, provide several options for generating ascii tables and trees. Using Hirb::Helpers::AutoTable, hirb has useful default views for at least ten popular database gems i.e. Rails' ActiveRecord::Base. Other than views, hirb offers a smart pager and a console menu. The smart pager only pages when the output exceeds the current screen size. The menu is used in conjunction with tables to offer two dimensional menus.

Note: To read a linked version of this README, click here.


Install the gem with:

sudo gem install hirb

View Tutorials

Rails Example

Let's load and enable the view framework:

$ script/console
Loading local environment (Rails 2.3.5)
>> require 'hirb'
=> true
>> Hirb.enable
=> nil

The default configuration provides table views for ActiveRecord::Base descendants. If a class isn't configured, Hirb reverts to irb's default echo mode.

>> Hirb::Formatter.dynamic_config['ActiveRecord::Base']
=> {:class=>Hirb::Helpers::AutoTable, :ancestor=>true}

# Tag is a model class and descendant of ActiveRecord::Base
>> Tag.last
| id  | created_at              | description | name          | namespace | predicate | value |
| 907 | 2009-03-06 21:10:41 UTC |             | gem:tags=yaml | gem       | tags      | yaml  |
1 row in set

>> Hirb::Formatter.dynamic_config['String']
=> nil
>> 'plain ol irb'
=> 'plain ol irb'
>> Hirb::Formatter.dynamic_config['Symbol']
=> nil
>> :blah
=> :blah

From above you can see there are no views configured for a String or a Symbol so Hirb defaults to irb's echo mode. On the other hand, Tag has a view thanks to being a descendant of ActiveRecord::Base and there being an :ancestor option.

Having seen hirb display views based on an output object's class, let's see it handle an array of objects:

>> Tag.all :limit=>3, :order=>"id DESC"
| id  | created_at              | description | name              | namespace | predicate | value    |
| 907 | 2009-03-06 21:10:41 UTC |             | gem:tags=yaml     | gem       | tags      | yaml     |
| 906 | 2009-03-06 08:47:04 UTC |             | gem:tags=nomonkey | gem       | tags      | nomonkey |
| 905 | 2009-03-04 00:30:10 UTC |             | article:tags=ruby | article   | tags      | ruby     |
3 rows in set

At any time you can disable Hirb if you really like irb's lovely echo mode:

>> Hirb.disable
=> nil
>> Tag.all :limit=>3, :order=>"id DESC"
=> [#<Tag id: 907, name: "gem:tags=yaml", description: nil, created_at: "2009-03-06 21:10:41",
namespace: "gem", predicate: "tags", value: "yaml">, #<Tag id: 906, name: "gem:tags=nomonkey",
description: nil, created_at: "2009-03-06 08:47:04", namespace: "gem", predicate: "tags", value:
"nomonkey">, #<Tag id: 905, name: "article:tags=ruby", description: nil, created_at: "2009-03-04
00:30:10", namespace: "article", predicate: "tags", value: "ruby">]

Views: Anytime, Anywhere

While preconfigured tables are great for database records, sometimes you just want to create tables/views for any output object:

#These examples don't need to have Hirb::View enabled.
>> Hirb.disable
=> nil

# Imports table() and view()
>> extend Hirb::Console
=> main

# Create a table of Dates comparing them with different formats.
>> table [,], :fields=>[:to_s, :ld, :ajd, :amjd, :asctime]
| to_s       | ld     | ajd       | amjd  | asctime                  |
| 2009-03-11 | 155742 | 4909803/2 | 54901 | Wed Mar 11 00:00:00 2009 |
| 2009-04-11 | 155773 | 4909865/2 | 54932 | Sat Apr 11 00:00:00 2009 |
2 rows in set

# Same table as the previous method. However view() will be able to call any helper.
>> view [,], :class=>:object_table,
  :fields=>[:to_s, :ld, :ajd, :amjd, :asctime]

If these console methods weren't convenient enough, try:

# Imports view() to all objects.
>> require 'hirb/import_object'
# Yields same table as above examples.
>> [,].view :class=>:object_table,
  :fields=>[:to_s, :ld, :ajd, :amjd, :asctime]

Although views by default are printed to STDOUT, they can be easily modified to write anywhere:

# Setup views to write to file 'console.log'.
>> Hirb::View.render_method = lambda {|output|"console.log", 'w') {|f| f.write(output) } }

# Writes to file with same table output as above example.
>> view [,], :class=>:object_table,
  :fields=>[:to_s, :ld, :ajd, :amjd, :asctime]

# Doesn't write to file because Symbol doesn't have a view and thus defaults to irb's echo mode.
>> :blah

# Go back to printing Hirb views to STDOUT.
>> Hirb::View.reset_render_method


Hirb has both pager and formatter functionality enabled by default. If you want to turn off the functionality of either you can pass that in at startup:

Hirb.enable :pager=>false
Hirb.enable :formatter=>false

or toggle their state at runtime:


Sharing Helpers and Views

If you have tested helpers you'd like to share, fork Hirb and put them under lib/hirb/helpers. To share views for certain classes, put them under lib/hirb/views. Please submit views for gems that have a nontrivial number of users.


If using Wirble, you should call Hirb after it since they both override irb's default output.


Table code from and my console app’s needs.


  • Chrononaut for vertical table helper.

  • crafterm, spastorino, xaviershay and joshua for bug fixes.


Please report them on github.



  • Consider generating views based on methods an object responds to.

  • Provide helper methods to all views.

  • Consider adding a template helper.

Something went wrong with that request. Please try again.