Hatt

Do cool stuff with HTTP JSON APIs. Designed for the real world of developing systems based on service-oriented-architecture.

What is Hatt?


Hatt is primarily designed to be used by software teams that build HTTP JSON services. Hatt makes it easy to:

  • Define “macro” methods that accomplish high level goals through service calls.

  • Call services or macro methods from the command line, adhoc scripts, or programtically within any Ruby program.

  • Test services using RSpec or other testing frameworks

  • “Point” at different environments (eg. QA, Staging, Production)

Hatt relies heavily on the ‘convention over configuration’ approach. For very little code, you get a lot of functionality.

Hatt is based on [Faraday](github.com/lostisland/faraday), thus there is basic support for making requests concurrently, and for swapping out the HTTP “adapter”.

Getting Started


Lets demo how this works using a simple example of an API that requires no authentication.

The OpenWeatherMap is a good candidate for a simple API which is accessible without needing any authentication key:

api.openweathermap.org/

### make a project directory

mkdir weather
cd weather

### setup hatt.yml

services:
  owm:
    hostname: api.openweathermap.org

### make the hatts directory, and a hatt file

mkdir owm_hatts
touch owm_hatts/weather_hatts.rb

### add method for checking weather to owm_hatts/weather.rb

def weather_for city
  owm.get "/data/2.5/weather?q=#{URI.encode(city)}"
end

### Call it from the cmd line:

$ hatt weather_for 'Pleasantville, NY'

And that returns something like this:

{"coord"=>{"lon"=>-73.79169, "lat"=>41.13436}, "sys"=>{"country"=>"United States of America", "sunrise"=>1366883974, "sunset"=>1366933583}, "weather"=>[{"id"=>501, "main"=>"Rain", "description"=>"moderate rain", "icon"=>"10d"}], "base"=>"global stations", "main"=>{"temp"=>290.46, "humidity"=>26, "pressure"=>1020, "temp_min"=>289.15, "temp_max"=>292.59}, "wind"=>{"speed"=>2.06, "gust"=>4.11, "deg"=>265}, "rain"=>{"1h"=>2.32}, "clouds"=>{"all"=>0}, "dt"=>1366926419, "id"=>5131757, "name"=>"Pleasantville", "cod"=>200}

Use the -v command line option and see the full request/response logged to StdOut

### Script it Make a file called temperatures.rb with this in it:

[
  'New York, NY',
  'Toronto, Canada',
  'Paris, France',
  'Tokyo, Japan',
  'Sydney, Australia',
].each do |city|
  weather = weather_for city
  kelvin = weather['main']['temp']
  celcius = (kelvin - 273.15).round
  puts "#{city}: #{celcius} celcius"
end

And then run the hatt script like so:

hatt -f temperatures.rb

And get this nice output:

I: [04/25/13 17:59:22][hatt] - Running data script 'temperatures.rb'
New York, NY: 18 celcius
Toronto, Canada: 7 celcius
Paris, France: 18 celcius
Tokyo, Japan: 16 celcius
Sydney, Australia: 14 celcius

### Test it Using the included helper module, testing an api becomes easy. Lets setup a simple RSpec example. Step one is create the spec folder:

mkdir spec

Setup spec/spec_helper.rb with contents like:

require 'hatt/helpers'

RSpec.configure do |config|
  config.include Hatt::Helpers
end

Setup spec/weather_spec.rb with contents like:

require 'spec_helper'
describe "getting weather reports" do
  it "should know the weather for New York City" do
    response = weather_for 'New York, NY'
    expected_items = ['temp', 'temp_min', 'temp_max', 'humidity', 'pressure']
    response['main'].keys.should include(*expected_items)
  end
end

Run it:

gem install rspec
rspec

And get back:

1 example, 0 failures