Daniel Doubrovkine bio photo

Daniel Doubrovkine

aka dB., @awscloud, former CTO @artsy, +@vestris, NYC

Email Twitter LinkedIn Github Strava
Creative Commons License

Got a chance to play with Goliath for a bit. You don’t need to do much work to mount Grape behind it. Grape figures out content-negotiation and formatting for you, so just stream the response through Goliath.

module Acme
 class Ping < Grape::API
   format :json
   get '/ping' do
     { ping: "pong" }
   end
 end

 class App < Goliath::API
   use Goliath::Rack::Params
   use Goliath::Rack::Render

   def response(env)
     Acme::API.call(env)
   end
 end
end

Tests for something like this are a little bit tricky, because Goliath is fully asynchronous.

describe Acme::API do
 it "ping" do
   with_api Acme::App do
     get_request(path: "/api/ping") do |async|
       async.response.should == { ping: "pong" }.to_json
     end
   end
 end
end

Working code in https://github.com/dblock/grape-on-goliath.

There’s also a very complete demo with asynchronous IO and PostgreSQL here. Haven’t tried it, but looks very promising.