forked from loafle/openapi-generator-original
Merge branch 'master' of github.com:wordnik/swagger-codegen
This commit is contained in:
commit
a38fc6eb06
@ -1,24 +1,5 @@
|
|||||||
#!/bin/bash
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
echo "" > classpath.txt
|
export CLASSPATH="$DIR/../target/lib/*:$DIR/../target/*"
|
||||||
for file in `ls target/*.jar`;
|
export JAVA_OPTS="${JAVA_OPTS} -DXmx4096M"
|
||||||
do echo -n '' >> classpath.txt;
|
scala $WORDNIK_OPTS $JAVA_OPTS -cp $CLASSPATH "$@"
|
||||||
echo -n $file >> classpath.txt;
|
|
||||||
echo -n ':' >> classpath.txt;
|
|
||||||
done
|
|
||||||
for file in `ls target/lib`;
|
|
||||||
do echo -n 'target/lib/' >> classpath.txt;
|
|
||||||
echo -n $file >> classpath.txt;
|
|
||||||
echo -n ':' >> classpath.txt;
|
|
||||||
done
|
|
||||||
|
|
||||||
WORDNIK_OPTS=${WORDNIK_OPTS:=NOPE}
|
|
||||||
|
|
||||||
if [ $WORDNIK_OPTS = NOPE ];
|
|
||||||
then
|
|
||||||
export WORDNIK_OPTS="-DconfigFile=conf/config.xml -DdevMode=true"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
export CLASSPATH=$(cat classpath.txt)
|
|
||||||
export JAVA_OPTS="${JAVA_OPTS} -DrulePath=data -Xmx4096M -DloggerPath=conf/log4j.properties"
|
|
||||||
scala $WORDNIK_OPTS $JAVA_CONFIG_OPTIONS -cp $CLASSPATH "$@"
|
|
||||||
|
@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012 Wordnik, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.wordnik.swagger.codegen.BasicRubyGenerator
|
||||||
|
import com.wordnik.swagger.core._
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
import scala.collection.mutable.{ HashMap, ListBuffer }
|
||||||
|
|
||||||
|
object SinatraServerGenerator extends BasicRubyGenerator {
|
||||||
|
def main(args: Array[String]) = generateClient(args)
|
||||||
|
|
||||||
|
override def toApiName(name: String): String = {
|
||||||
|
name + "_api"
|
||||||
|
}
|
||||||
|
|
||||||
|
override def templateDir = "samples/server-generator/sinatra/templates"
|
||||||
|
|
||||||
|
val outputFolder = "samples/server-generator/sinatra/output"
|
||||||
|
|
||||||
|
// where to write generated code
|
||||||
|
override def destinationDir = outputFolder + ""
|
||||||
|
|
||||||
|
override def modelPackage = Some("com.wordnik.client.model")
|
||||||
|
|
||||||
|
// template used for apis
|
||||||
|
apiTemplateFiles ++= Map("api.mustache" -> ".rb")
|
||||||
|
|
||||||
|
modelTemplateFiles.clear
|
||||||
|
|
||||||
|
override def apiPackage = Some("lib")
|
||||||
|
|
||||||
|
// supporting classes
|
||||||
|
override def supportingFiles = List(
|
||||||
|
("README.md", outputFolder, "README.md"),
|
||||||
|
("config.ru", outputFolder, "config.ru"),
|
||||||
|
("Gemfile", outputFolder, "Gemfile"),
|
||||||
|
("my_app.mustache", outputFolder, "my_app.rb"),
|
||||||
|
("lib/swaggering.rb", outputFolder + File.separator + "lib", "swaggering.rb"))
|
||||||
|
|
||||||
|
override def processApiMap(m: Map[String, AnyRef]): Map[String, AnyRef] = {
|
||||||
|
val mutable = scala.collection.mutable.Map() ++ m
|
||||||
|
|
||||||
|
mutable.map(k => {
|
||||||
|
k._1 match {
|
||||||
|
// the scalatra templates like lower-case httpMethods
|
||||||
|
case e: String if (e == "httpMethod") => mutable += "httpMethod" -> k._2.toString.toLowerCase
|
||||||
|
|
||||||
|
// convert path into ruby-ish syntax without basePart (i.e. /pet.{format}/{petId} => /:petId
|
||||||
|
case e: String if (e == "path") => {
|
||||||
|
val path = {
|
||||||
|
val arr = k._2.toString.split("/")
|
||||||
|
if (arr.length >= 2) {
|
||||||
|
mutable += "basePart" -> (arr.slice(2, arr.length).mkString("", "/", ""))
|
||||||
|
"/" + arr.slice(2, arr.length).mkString("", "/", "")
|
||||||
|
} else
|
||||||
|
k._2.toString
|
||||||
|
}
|
||||||
|
mutable += "path" -> path.replaceAll("\\{", ":").replaceAll("\\}", "")
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
|
})
|
||||||
|
mutable.toMap
|
||||||
|
}
|
||||||
|
}
|
4
samples/server-generator/sinatra/output/Gemfile
Normal file
4
samples/server-generator/sinatra/output/Gemfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem "sinatra"
|
||||||
|
gem "sinatra-cross_origin"
|
29
samples/server-generator/sinatra/output/README.md
Normal file
29
samples/server-generator/sinatra/output/README.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# Swagger for Sinatra
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
This is a project to provide Swagger support inside the [Sinatra](http://www.sinatrarb.com/) framework. You can find
|
||||||
|
out more about both the spec and the framework at http://swagger.wordnik.com. For more information about
|
||||||
|
Wordnik's APIs, please visit http://developer.wordnik.com.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
You need to install ruby 1.9.3 and the following gems:
|
||||||
|
|
||||||
|
```
|
||||||
|
sinatra
|
||||||
|
sinatra-cross_origin
|
||||||
|
```
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
This sample was generated with the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project.
|
||||||
|
|
||||||
|
```
|
||||||
|
rackup -p 4567 examples/config.ru
|
||||||
|
```
|
||||||
|
|
||||||
|
In your [swagger ui](https://github.com/wordnik/swagger-ui), put in the following URL:
|
||||||
|
|
||||||
|
```
|
||||||
|
http://localhost:4567/resources.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Voila!
|
2
samples/server-generator/sinatra/output/config.ru
Normal file
2
samples/server-generator/sinatra/output/config.ru
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
require './my_app'
|
||||||
|
run MyApp
|
154
samples/server-generator/sinatra/output/lib/Swaggering.rb
Normal file
154
samples/server-generator/sinatra/output/lib/Swaggering.rb
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
require 'json'
|
||||||
|
require 'sinatra/base'
|
||||||
|
require 'sinatra/cross_origin'
|
||||||
|
|
||||||
|
class Configuration
|
||||||
|
attr_accessor :base_path, :api_version, :swagger_version, :format_specifier
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@api_version = '1.0'
|
||||||
|
@base_path = 'http://localhost:4567'
|
||||||
|
@swagger_version = '1.1'
|
||||||
|
@format_specifier = ".json"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Swaggering < Sinatra::Base
|
||||||
|
register Sinatra::CrossOrigin
|
||||||
|
|
||||||
|
@@routes = {}
|
||||||
|
@@configuration = Configuration.new
|
||||||
|
|
||||||
|
attr_accessor :configuration
|
||||||
|
|
||||||
|
def self.configure
|
||||||
|
get("/resources" + @@configuration.format_specifier) {
|
||||||
|
cross_origin
|
||||||
|
Swaggering.to_resource_listing
|
||||||
|
}
|
||||||
|
@@configuration ||= Configuration.new
|
||||||
|
yield(@@configuration) if block_given?
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.add_route(method, path, swag={}, opts={}, &block)
|
||||||
|
fullPath = swag["resourcePath"].to_s + @@configuration.format_specifier + path
|
||||||
|
|
||||||
|
accepted = case method
|
||||||
|
when 'get'
|
||||||
|
get(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
when 'post'
|
||||||
|
post(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
when 'delete'
|
||||||
|
delete(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
when 'put'
|
||||||
|
put(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
if accepted then
|
||||||
|
resourcePath = swag["resourcePath"].to_s
|
||||||
|
ops = @@routes[resourcePath]
|
||||||
|
if ops.nil?
|
||||||
|
ops = Array.new
|
||||||
|
@@routes.merge!(resourcePath => ops)
|
||||||
|
|
||||||
|
get(resourcePath + @@configuration.format_specifier) do
|
||||||
|
cross_origin
|
||||||
|
Swaggering.to_api(resourcePath)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
swag.merge!("httpMethod" => method.to_s.upcase)
|
||||||
|
ops.push(swag)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.to_resource_listing
|
||||||
|
apis = Array.new
|
||||||
|
(@@routes.keys).each do |key|
|
||||||
|
api = {
|
||||||
|
"path" => (key + ".{format}"),
|
||||||
|
"description" => "no description"
|
||||||
|
}
|
||||||
|
apis.push api
|
||||||
|
end
|
||||||
|
|
||||||
|
resource = {
|
||||||
|
"apiVersion" => @@configuration.api_version,
|
||||||
|
"swaggerVersion" => @@configuration.swagger_version,
|
||||||
|
"apis" => apis
|
||||||
|
}
|
||||||
|
|
||||||
|
resource.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.to_api(resourcePath)
|
||||||
|
apis = {}
|
||||||
|
models = []
|
||||||
|
|
||||||
|
@@routes[resourcePath].each do |route|
|
||||||
|
endpoint = route["endpoint"].gsub(/:(\w+)(\/?)/,'{\1}\2')
|
||||||
|
path = (resourcePath + ".{format}" + endpoint)
|
||||||
|
api = apis[path]
|
||||||
|
if api.nil?
|
||||||
|
api = {"path" => path, "description" => "description", "operations" => []}
|
||||||
|
apis.merge!(path => api)
|
||||||
|
end
|
||||||
|
|
||||||
|
parameters = route["parameters"]
|
||||||
|
|
||||||
|
unless parameters.nil? then
|
||||||
|
parameters.each do |param|
|
||||||
|
av_string = param["allowableValues"]
|
||||||
|
unless av_string.nil?
|
||||||
|
if av_string.count('[') > 0
|
||||||
|
pattern = /^([A-Z]*)\[(.*)\]/
|
||||||
|
match = pattern.match av_string
|
||||||
|
case match.to_a[1]
|
||||||
|
when "LIST"
|
||||||
|
allowables = match.to_a[2].split(',')
|
||||||
|
param["allowableValues"] = {
|
||||||
|
"valueType" => "LIST",
|
||||||
|
"values" => allowables
|
||||||
|
}
|
||||||
|
when "RANGE"
|
||||||
|
allowables = match.to_a[2].split(',')
|
||||||
|
param["allowableValues"] = {
|
||||||
|
"valueType" => "RANGE",
|
||||||
|
"min" => allowables[0],
|
||||||
|
"max" => allowables[1]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
op = {
|
||||||
|
"httpMethod" => route["httpMethod"],
|
||||||
|
"description" => route["summary"],
|
||||||
|
"responseClass" => route["responseClass"],
|
||||||
|
"notes" => route["notes"],
|
||||||
|
"nickname" => route["nickname"],
|
||||||
|
"summary" => route["summary"],
|
||||||
|
"parameters" => route["parameters"]
|
||||||
|
}
|
||||||
|
api["operations"].push(op)
|
||||||
|
end
|
||||||
|
|
||||||
|
api_listing = {
|
||||||
|
"apiVersion" => @@configuration.api_version,
|
||||||
|
"swaggerVersion" => @@configuration.swagger_version,
|
||||||
|
"basePath" => @@configuration.base_path,
|
||||||
|
"resourcePath" => resourcePath,
|
||||||
|
"apis" => apis.values,
|
||||||
|
"models" => models
|
||||||
|
}
|
||||||
|
api_listing.to_json
|
||||||
|
end
|
||||||
|
end
|
112
samples/server-generator/sinatra/output/lib/pet_api.rb
Normal file
112
samples/server-generator/sinatra/output/lib/pet_api.rb
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
require 'json'
|
||||||
|
|
||||||
|
MyApp.add_route('get', '/:petId', {
|
||||||
|
"resourcePath" => "/pet",
|
||||||
|
"summary" => "Find pet by ID",
|
||||||
|
"nickname" => "getPetById",
|
||||||
|
"responseClass" => "Pet",
|
||||||
|
"endpoint" => "/:petId",
|
||||||
|
"notes" => "Returns a pet based on ID",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "petId",
|
||||||
|
"description" => "ID of pet that needs to be fetched",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "path",
|
||||||
|
},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('post', '/', {
|
||||||
|
"resourcePath" => "/pet",
|
||||||
|
"summary" => "Add a new pet to the store",
|
||||||
|
"nickname" => "addPet",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "Pet object that needs to be added to the store",
|
||||||
|
"dataType" => "Pet",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('put', '/', {
|
||||||
|
"resourcePath" => "/pet",
|
||||||
|
"summary" => "Update an existing pet",
|
||||||
|
"nickname" => "updatePet",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "Pet object that needs to be updated in the store",
|
||||||
|
"dataType" => "Pet",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('get', '/findByStatus', {
|
||||||
|
"resourcePath" => "/pet",
|
||||||
|
"summary" => "Finds Pets by status",
|
||||||
|
"nickname" => "findPetsByStatus",
|
||||||
|
"responseClass" => "List[Pet]",
|
||||||
|
"endpoint" => "/findByStatus",
|
||||||
|
"notes" => "Multiple status values can be provided with comma seperated strings",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "status",
|
||||||
|
"description" => "Status values that need to be considered for filter",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "query",
|
||||||
|
"allowMultiple" => true,
|
||||||
|
"allowableValues" => "LIST[available,pending,sold]",
|
||||||
|
"defaultValue" => "available"},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('get', '/findByTags', {
|
||||||
|
"resourcePath" => "/pet",
|
||||||
|
"summary" => "Finds Pets by tags",
|
||||||
|
"nickname" => "findPetsByTags",
|
||||||
|
"responseClass" => "List[Pet]",
|
||||||
|
"endpoint" => "/findByTags",
|
||||||
|
"notes" => "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "tags",
|
||||||
|
"description" => "Tags to filter by",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "query",
|
||||||
|
"allowMultiple" => true,
|
||||||
|
"allowableValues" => "",
|
||||||
|
},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
|
66
samples/server-generator/sinatra/output/lib/store_api.rb
Normal file
66
samples/server-generator/sinatra/output/lib/store_api.rb
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
require 'json'
|
||||||
|
|
||||||
|
MyApp.add_route('get', '/order/:orderId', {
|
||||||
|
"resourcePath" => "/store",
|
||||||
|
"summary" => "Find purchase order by ID",
|
||||||
|
"nickname" => "getOrderById",
|
||||||
|
"responseClass" => "Order",
|
||||||
|
"endpoint" => "/order/:orderId",
|
||||||
|
"notes" => "For valid response try integer IDs with value <= 5. Anything above 5 or nonintegers will generate API errors",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "orderId",
|
||||||
|
"description" => "ID of pet that needs to be fetched",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "path",
|
||||||
|
},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('delete', '/order/:orderId', {
|
||||||
|
"resourcePath" => "/store",
|
||||||
|
"summary" => "Delete purchase order by ID",
|
||||||
|
"nickname" => "deleteOrder",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/order/:orderId",
|
||||||
|
"notes" => "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "orderId",
|
||||||
|
"description" => "ID of the order that needs to be deleted",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "path",
|
||||||
|
},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('post', '/order', {
|
||||||
|
"resourcePath" => "/store",
|
||||||
|
"summary" => "Place an order for a pet",
|
||||||
|
"nickname" => "placeOrder",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/order",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "order placed for purchasing the pet",
|
||||||
|
"dataType" => "Order",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
|
181
samples/server-generator/sinatra/output/lib/user_api.rb
Normal file
181
samples/server-generator/sinatra/output/lib/user_api.rb
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
require 'json'
|
||||||
|
|
||||||
|
MyApp.add_route('post', '/createWithArray', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Creates list of users with given input array",
|
||||||
|
"nickname" => "createUsersWithArrayInput",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/createWithArray",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "List of user object",
|
||||||
|
"dataType" => "Array[User]",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('post', '/', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Create user",
|
||||||
|
"nickname" => "createUser",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/",
|
||||||
|
"notes" => "This can only be done by the logged in user.",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "Created user object",
|
||||||
|
"dataType" => "User",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('post', '/createWithList', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Creates list of users with given list input",
|
||||||
|
"nickname" => "createUsersWithListInput",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/createWithList",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "List of user object",
|
||||||
|
"dataType" => "List[User]",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('put', '/:username', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Updated user",
|
||||||
|
"nickname" => "updateUser",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/:username",
|
||||||
|
"notes" => "This can only be done by the logged in user.",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "username",
|
||||||
|
"description" => "name that need to be deleted",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "path",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "Updated user object",
|
||||||
|
"dataType" => "User",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('delete', '/:username', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Delete user",
|
||||||
|
"nickname" => "deleteUser",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/:username",
|
||||||
|
"notes" => "This can only be done by the logged in user.",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "username",
|
||||||
|
"description" => "The name that needs to be deleted",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "path",
|
||||||
|
},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('get', '/:username', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Get user by user name",
|
||||||
|
"nickname" => "getUserByName",
|
||||||
|
"responseClass" => "User",
|
||||||
|
"endpoint" => "/:username",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "username",
|
||||||
|
"description" => "The name that needs to be fetched. Use user1 for testing.",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "path",
|
||||||
|
},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('get', '/login', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Logs user into the system",
|
||||||
|
"nickname" => "loginUser",
|
||||||
|
"responseClass" => "string",
|
||||||
|
"endpoint" => "/login",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
{
|
||||||
|
"name" => "username",
|
||||||
|
"description" => "The user name for login",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "query",
|
||||||
|
"allowMultiple" => false,
|
||||||
|
"allowableValues" => "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" => "password",
|
||||||
|
"description" => "The password for login in clear text",
|
||||||
|
"dataType" => "string",
|
||||||
|
"paramType" => "query",
|
||||||
|
"allowMultiple" => false,
|
||||||
|
"allowableValues" => "",
|
||||||
|
},
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
MyApp.add_route('get', '/logout', {
|
||||||
|
"resourcePath" => "/user",
|
||||||
|
"summary" => "Logs out current logged in user session",
|
||||||
|
"nickname" => "logoutUser",
|
||||||
|
"responseClass" => "void",
|
||||||
|
"endpoint" => "/logout",
|
||||||
|
"notes" => "",
|
||||||
|
"parameters" => [
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
|
13
samples/server-generator/sinatra/output/my_app.rb
Normal file
13
samples/server-generator/sinatra/output/my_app.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
require './lib/swaggering'
|
||||||
|
|
||||||
|
# only need to extend if you want special configuration!
|
||||||
|
class MyApp < Swaggering
|
||||||
|
self.configure do |config|
|
||||||
|
config.api_version = '0.2'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require './lib/pet_api.rb'
|
||||||
|
require './lib/store_api.rb'
|
||||||
|
require './lib/user_api.rb'
|
||||||
|
|
4
samples/server-generator/sinatra/templates/Gemfile
Normal file
4
samples/server-generator/sinatra/templates/Gemfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem "sinatra"
|
||||||
|
gem "sinatra-cross_origin"
|
29
samples/server-generator/sinatra/templates/README.md
Normal file
29
samples/server-generator/sinatra/templates/README.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# Swagger for Sinatra
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
This is a project to provide Swagger support inside the [Sinatra](http://www.sinatrarb.com/) framework. You can find
|
||||||
|
out more about both the spec and the framework at http://swagger.wordnik.com. For more information about
|
||||||
|
Wordnik's APIs, please visit http://developer.wordnik.com.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
You need to install ruby 1.9.3 and the following gems:
|
||||||
|
|
||||||
|
```
|
||||||
|
sinatra
|
||||||
|
sinatra-cross_origin
|
||||||
|
```
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
This sample was generated with the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project.
|
||||||
|
|
||||||
|
```
|
||||||
|
rackup -p 4567 examples/config.ru
|
||||||
|
```
|
||||||
|
|
||||||
|
In your [swagger ui](https://github.com/wordnik/swagger-ui), put in the following URL:
|
||||||
|
|
||||||
|
```
|
||||||
|
http://localhost:4567/resources.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Voila!
|
57
samples/server-generator/sinatra/templates/api.mustache
Normal file
57
samples/server-generator/sinatra/templates/api.mustache
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
require 'json'
|
||||||
|
|
||||||
|
{{#operations}}
|
||||||
|
{{#operation}}
|
||||||
|
|
||||||
|
MyApp.add_route('{{httpMethod}}', '{{path}}', {
|
||||||
|
"resourcePath" => "/{{name}}",
|
||||||
|
"summary" => "{{{summary}}}",
|
||||||
|
"nickname" => "{{nickname}}",
|
||||||
|
"responseClass" => "{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}",
|
||||||
|
"endpoint" => "{{path}}",
|
||||||
|
"notes" => "{{{notes}}}",
|
||||||
|
"parameters" => [
|
||||||
|
{{#queryParams}}
|
||||||
|
{
|
||||||
|
"name" => "{{paramName}}",
|
||||||
|
"description" => "{{description}}",
|
||||||
|
"dataType" => "{{swaggerDataType}}",
|
||||||
|
"paramType" => "query",
|
||||||
|
"allowMultiple" => {{allowMultiple}},
|
||||||
|
"allowableValues" => "{{allowableValues}}",
|
||||||
|
{{#defaultValue}}"defaultValue" => {{{defaultValue}}}{{/defaultValue}}
|
||||||
|
},
|
||||||
|
{{/queryParams}}
|
||||||
|
{{#pathParams}}
|
||||||
|
{
|
||||||
|
"name" => "{{paramName}}",
|
||||||
|
"description" => "{{description}}",
|
||||||
|
"dataType" => "{{swaggerDataType}}",
|
||||||
|
"paramType" => "path",
|
||||||
|
},
|
||||||
|
{{/pathParams}}
|
||||||
|
{{#headerParams}}
|
||||||
|
{
|
||||||
|
"name" => "{{paramName}}",
|
||||||
|
"description" => "{{description}}",
|
||||||
|
"dataType" => "{{swaggerDataType}}",
|
||||||
|
"paramType" => "header",
|
||||||
|
},
|
||||||
|
{{/headerParams}}
|
||||||
|
{{#bodyParams}}
|
||||||
|
{
|
||||||
|
"name" => "body",
|
||||||
|
"description" => "{{description}}",
|
||||||
|
"dataType" => "{{swaggerDataType}}",
|
||||||
|
"paramType" => "body",
|
||||||
|
}
|
||||||
|
{{/bodyParams}}
|
||||||
|
]}) do
|
||||||
|
cross_origin
|
||||||
|
# the guts live here
|
||||||
|
|
||||||
|
{"message" => "yes, it worked"}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
{{/operation}}
|
||||||
|
{{/operations}}
|
2
samples/server-generator/sinatra/templates/config.ru
Normal file
2
samples/server-generator/sinatra/templates/config.ru
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
require './my_app'
|
||||||
|
run MyApp
|
154
samples/server-generator/sinatra/templates/lib/Swaggering.rb
Normal file
154
samples/server-generator/sinatra/templates/lib/Swaggering.rb
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
require 'json'
|
||||||
|
require 'sinatra/base'
|
||||||
|
require 'sinatra/cross_origin'
|
||||||
|
|
||||||
|
class Configuration
|
||||||
|
attr_accessor :base_path, :api_version, :swagger_version, :format_specifier
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@api_version = '1.0'
|
||||||
|
@base_path = 'http://localhost:4567'
|
||||||
|
@swagger_version = '1.1'
|
||||||
|
@format_specifier = ".json"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Swaggering < Sinatra::Base
|
||||||
|
register Sinatra::CrossOrigin
|
||||||
|
|
||||||
|
@@routes = {}
|
||||||
|
@@configuration = Configuration.new
|
||||||
|
|
||||||
|
attr_accessor :configuration
|
||||||
|
|
||||||
|
def self.configure
|
||||||
|
get("/resources" + @@configuration.format_specifier) {
|
||||||
|
cross_origin
|
||||||
|
Swaggering.to_resource_listing
|
||||||
|
}
|
||||||
|
@@configuration ||= Configuration.new
|
||||||
|
yield(@@configuration) if block_given?
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.add_route(method, path, swag={}, opts={}, &block)
|
||||||
|
fullPath = swag["resourcePath"].to_s + @@configuration.format_specifier + path
|
||||||
|
|
||||||
|
accepted = case method
|
||||||
|
when 'get'
|
||||||
|
get(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
when 'post'
|
||||||
|
post(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
when 'delete'
|
||||||
|
delete(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
when 'put'
|
||||||
|
put(fullPath, opts, &block)
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
if accepted then
|
||||||
|
resourcePath = swag["resourcePath"].to_s
|
||||||
|
ops = @@routes[resourcePath]
|
||||||
|
if ops.nil?
|
||||||
|
ops = Array.new
|
||||||
|
@@routes.merge!(resourcePath => ops)
|
||||||
|
|
||||||
|
get(resourcePath + @@configuration.format_specifier) do
|
||||||
|
cross_origin
|
||||||
|
Swaggering.to_api(resourcePath)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
swag.merge!("httpMethod" => method.to_s.upcase)
|
||||||
|
ops.push(swag)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.to_resource_listing
|
||||||
|
apis = Array.new
|
||||||
|
(@@routes.keys).each do |key|
|
||||||
|
api = {
|
||||||
|
"path" => (key + ".{format}"),
|
||||||
|
"description" => "no description"
|
||||||
|
}
|
||||||
|
apis.push api
|
||||||
|
end
|
||||||
|
|
||||||
|
resource = {
|
||||||
|
"apiVersion" => @@configuration.api_version,
|
||||||
|
"swaggerVersion" => @@configuration.swagger_version,
|
||||||
|
"apis" => apis
|
||||||
|
}
|
||||||
|
|
||||||
|
resource.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.to_api(resourcePath)
|
||||||
|
apis = {}
|
||||||
|
models = []
|
||||||
|
|
||||||
|
@@routes[resourcePath].each do |route|
|
||||||
|
endpoint = route["endpoint"].gsub(/:(\w+)(\/?)/,'{\1}\2')
|
||||||
|
path = (resourcePath + ".{format}" + endpoint)
|
||||||
|
api = apis[path]
|
||||||
|
if api.nil?
|
||||||
|
api = {"path" => path, "description" => "description", "operations" => []}
|
||||||
|
apis.merge!(path => api)
|
||||||
|
end
|
||||||
|
|
||||||
|
parameters = route["parameters"]
|
||||||
|
|
||||||
|
unless parameters.nil? then
|
||||||
|
parameters.each do |param|
|
||||||
|
av_string = param["allowableValues"]
|
||||||
|
unless av_string.nil?
|
||||||
|
if av_string.count('[') > 0
|
||||||
|
pattern = /^([A-Z]*)\[(.*)\]/
|
||||||
|
match = pattern.match av_string
|
||||||
|
case match.to_a[1]
|
||||||
|
when "LIST"
|
||||||
|
allowables = match.to_a[2].split(',')
|
||||||
|
param["allowableValues"] = {
|
||||||
|
"valueType" => "LIST",
|
||||||
|
"values" => allowables
|
||||||
|
}
|
||||||
|
when "RANGE"
|
||||||
|
allowables = match.to_a[2].split(',')
|
||||||
|
param["allowableValues"] = {
|
||||||
|
"valueType" => "RANGE",
|
||||||
|
"min" => allowables[0],
|
||||||
|
"max" => allowables[1]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
op = {
|
||||||
|
"httpMethod" => route["httpMethod"],
|
||||||
|
"description" => route["summary"],
|
||||||
|
"responseClass" => route["responseClass"],
|
||||||
|
"notes" => route["notes"],
|
||||||
|
"nickname" => route["nickname"],
|
||||||
|
"summary" => route["summary"],
|
||||||
|
"parameters" => route["parameters"]
|
||||||
|
}
|
||||||
|
api["operations"].push(op)
|
||||||
|
end
|
||||||
|
|
||||||
|
api_listing = {
|
||||||
|
"apiVersion" => @@configuration.api_version,
|
||||||
|
"swaggerVersion" => @@configuration.swagger_version,
|
||||||
|
"basePath" => @@configuration.base_path,
|
||||||
|
"resourcePath" => resourcePath,
|
||||||
|
"apis" => apis.values,
|
||||||
|
"models" => models
|
||||||
|
}
|
||||||
|
api_listing.to_json
|
||||||
|
end
|
||||||
|
end
|
12
samples/server-generator/sinatra/templates/my_app.mustache
Normal file
12
samples/server-generator/sinatra/templates/my_app.mustache
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
require './lib/swaggering'
|
||||||
|
|
||||||
|
# only need to extend if you want special configuration!
|
||||||
|
class MyApp < Swaggering
|
||||||
|
self.configure do |config|
|
||||||
|
config.api_version = '0.2'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
{{#apis}}
|
||||||
|
require './lib/{{className}}.rb'
|
||||||
|
{{/apis}}
|
@ -107,8 +107,6 @@ abstract class BasicGenerator extends CodegenConfig with PathUtil {
|
|||||||
m += "outputDirectory" -> (destinationDir + File.separator + apiPackage.getOrElse("").replaceAll("\\.", File.separator))
|
m += "outputDirectory" -> (destinationDir + File.separator + apiPackage.getOrElse("").replaceAll("\\.", File.separator))
|
||||||
m += "newline" -> "\n"
|
m += "newline" -> "\n"
|
||||||
|
|
||||||
// println(json.writeValueAsString(m))
|
|
||||||
|
|
||||||
for ((file, suffix) <- apiTemplateFiles) {
|
for ((file, suffix) <- apiTemplateFiles) {
|
||||||
m += "filename" -> (className + suffix)
|
m += "filename" -> (className + suffix)
|
||||||
generateAndWrite(m.toMap, file)
|
generateAndWrite(m.toMap, file)
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.wordnik.swagger.codegen
|
||||||
|
|
||||||
|
class BasicRubyGenerator extends BasicGenerator {
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user