#!/usr/bin/env unicorn -N -Ilib
require 'jellyfish'
class Jelly
include Jellyfish
controller_include Module.new{
def dispatch
headers_merge 'Content-Type' => 'application/json; charset=utf-8',
'Access-Control-Allow-Origin' => '*'
super
end
def render obj
["#{Jellyfish::Json.encode(obj)}\n"]
end
}
def self.info
{:title => 'Jellyfish Swagger UI',
:description =>
'This is a simple example for using Jellyfish and' \
' Swagger UI altogether. You could also try the' \
' official Swagger UI app,' \
' and fill it with the swagger URL.'
}
end
def self.swagger_apiVersion
'1.0.0'
end
handle Jellyfish::NotFound do |e|
status 404
body %Q|{"error":{"name":"NotFound"}}\n|
end
handle StandardError do |error|
jellyfish.log_error(error, env['rack.errors'])
name = error.class.name
message = error.message
status 500
body render('error' => {'name' => name, 'message' => message})
end
get '/users',
:summary => 'List users',
:notes => 'Note that we do not really have users.' do
render [:name => 'jellyfish']
end
post '/users',
:summary => 'Create a user',
:notes => 'Here we demonstrate how to write the swagger doc.',
:parameters => {:name => {:type => :string, :required => true,
:description => 'The name of the user'},
:sane => {:type => :boolean,
:description => 'If the user is sane'},
:type => {:type => :string,
:description => 'What kind of user',
:enum => %w[good neutral evil]}},
:responseMessages => [{:code => 400, :message => 'Invalid name'}] do
render :message => "jellyfish #{request.params['name']} created."
end
put %r{\A/users/(?\d+)},
:summary => 'Update a user',
:parameters => {:id => {:type => :integer,
:description => 'The id of the user'}} do |match|
render :message => "jellyfish ##{match[:id]} updated."
end
delete %r{\A/users/(?\d+)} do |match|
render :message => "jellyfish ##{match[:id]} deleted."
end
get %r{\A/posts/(?\d+)-(?\d+)/(?\w+)},
:summary => 'Get a post' do |match|
render Hash[match.names.zip(match.captures)]
end
get '/posts/tags/ruby' do
render []
end
end
App = Rack::Builder.app do
use Rack::CommonLogger
use Rack::Chunked
use Rack::ContentLength
use Rack::Deflater
map '/swagger' do
run Jellyfish::Swagger.new('', Jelly)
end
run Rack::Cascade.new([Rack::File.new('public/index.html'),
Rack::File.new('public'),
Jelly.new])
end
run App