TL;DR: have a look at sinatra-rabbit.
When we converted Deltacloud from Rails to Sinatra, we needed a way to conveniently write the controller logic for RESTful routes with Sinatra. On a lark, I cooked up a DSL called ‘Rabbit’ that lets you write things like
collection :images do
  description "The collection of images"
  operation :index do
    description "List all images"
    param :id,            :string
    param :architecture,  :string,  :optional
    control { ... controller code ... }
  end
  operation :show do
    description 'Show an image identified by "id" parameter.'
    param :id,           :string, :required
    control { ... show image params[:id] ... }
  end
  operation :destroy do
    description "Remove specified"
    param :id,    :string,    :required
    control do
      driver.destroy_image(credentials, params[:id])
      status 204
      respond_to do |format|
        format.xml
        format.json
        format.html { redirect(images_url) }
      end
    end
  end
end
That makes supporting the common REST operations convenient, and allows us to auto-generate documentation for the REST API. It has been very useful in writing the two frontends for Deltacloud.
The DSL has lots of features, for example, validation of input parameters,
conditionally allowing additional parameters, describing subcollections,
autogenerating HEAD and OPTIONS routes and controllers, and many more.
Michal Fojtik has pulled that code out of Deltacloud and
extracted it into its own github project as
sinatra-rabbit In the process,
there were quite a few dragones to slay: for example, in Deltacloud we
change what parameters some operations can accept based on the specific
backend driver. For example, in some clouds, it is possible to inject
user-defined data into instances upon launch. In Deltacloud, the logic of
what routes to turn on or off is based on introspecting the current driver,
which means that Deltacloud’s Rabbit knows about drivers. That, of course,
has to be changed for the standalone sinatra-rabbit. Michal just added
route conditions that look like
collection :images do
    operation :create, :if => lambda { complicated_condition(request) } do
        ...
    end
end
Hopefully, sinatra-rabbit will grow to the point where we can remove our
bundled implementation from Deltacloud, and use the standalone version;
there’s still a couple of features missing, but with enough people
sending patches, it can’t be very long now ;)
          
             Watzmann.Blog by David Lutterkort is licensed under
          a Creative Commons Attribution-Share Alike 3.0
            United States License.
          
          Watzmann.Blog by David Lutterkort is licensed under
          a Creative Commons Attribution-Share Alike 3.0
            United States License.
          
Generated with Jekyll