update ruby sinatra samples

This commit is contained in:
William Cheng 2021-04-21 16:00:23 +08:00
parent d4748a7a20
commit 92561085ba
8 changed files with 148 additions and 768 deletions

View File

@ -0,0 +1,10 @@
Dockerfile
Gemfile
README.md
api/pet_api.rb
api/store_api.rb
api/user_api.rb
config.ru
lib/openapiing.rb
my_app.rb
openapi.yaml

View File

@ -1 +1 @@
4.2.1-SNAPSHOT
5.1.1-SNAPSHOT

View File

@ -0,0 +1,32 @@
## Build libraries
FROM ruby:3.0-alpine as rubydev
## for thin or falcon
#RUN apk --no-cache add make g++ libc-dev
## for puma
#RUN apk --no-cache add make gcc libc-dev
ADD . /app
WORKDIR /app
RUN bundle config set path lib
RUN bundle install
## Build Runtime image
FROM ruby:3.0-alpine
RUN apk --no-cache add tzdata ## ca-certificates
COPY --from=rubydev /app /app
WORKDIR /app
ENV SINATRA_HOST 0.0.0.0
ENV SINATRA_PORT 8080
EXPOSE $SINATRA_PORT
RUN addgroup sinatra
RUN adduser -S -G sinatra sinatra
USER sinatra
RUN bundle config set path lib
CMD bundle exec rackup --host $SINATRA_HOST -p $SINATRA_PORT

View File

@ -1,4 +1,5 @@
source 'https://rubygems.org'
gem "webrick"
gem "sinatra"
gem "sinatra-cross_origin"

View File

@ -1,4 +1,4 @@
# Swagger for Sinatra
# OpenAPI for Sinatra
## Overview
This is a project to provide Swagger support inside the [Sinatra](http://www.sinatrarb.com/) framework. You can find
@ -6,24 +6,60 @@ out more about both the spec and the framework at http://swagger.io. For more i
Wordnik's APIs, please visit http://developer.wordnik.com.
## Prerequisites
You need to install ruby 1.9.3 and the following gems:
As of ruby 3.0.0, the webrick web server library was removed.
You need to install a rack-supported web server, such as webrick and thin.
The default Gemfile is as follows.
Update the name of the web server as your prefer.
```
sinatra
sinatra-cross_origin
source 'https://rubygems.org'
gem "webrick"
gem "sinatra"
gem "sinatra-cross_origin"
```
## Getting started
This sample was generated with the [OpenAPI Generator](https://github.com/openapitools/openapi-generator) project.
To generate a ruby-sinatra server for petstore.yaml, please run the following:
```
rackup -p 4567 config.ru
openapi-generator-cli generate \
-i https://raw.githubusercontent.com/openapitools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml \
-g ruby-sinatra -o code
```
In your [swagger ui](https://github.com/swagger-api/swagger-ui), put in the following URL:
To run the generated server, please run the following:
```
http://localhost:4567/resources.json
cd code/
bundle config set path lib
bundle install
bundle exec rackup -p 8080
```
You can access the application by the following URL:
```
http://localhost:8080/v2/store/inventory
```
## Docker
If you want to use a web server other than webrick, you need to edit the generated Dockerfile to prepare the compiler and the make command. Please check the comment of the Dockerfile.
To run the code on docker, you can use the Dockerfile as follows:
### Build the docker image
The "container_name" can be changed for your preferences.
```
docker build . --tag "container_name"
```
### Run the docker image
```
docker run -it --rm -p 8080:8080 "container_name"
```
Voila!

View File

@ -5,7 +5,7 @@ MyApp.add_route('POST', '/v2/pet', {
"resourcePath" => "/Pet",
"summary" => "Add a new pet to the store",
"nickname" => "add_pet",
"responseClass" => "void",
"responseClass" => "Pet",
"endpoint" => "/pet",
"notes" => "",
"parameters" => [
@ -123,7 +123,7 @@ MyApp.add_route('PUT', '/v2/pet', {
"resourcePath" => "/Pet",
"summary" => "Update an existing pet",
"nickname" => "update_pet",
"responseClass" => "void",
"responseClass" => "Pet",
"endpoint" => "/pet",
"notes" => "",
"parameters" => [

View File

@ -26,7 +26,16 @@ paths:
requestBody:
$ref: '#/components/requestBodies/Pet'
responses:
405:
"200":
content:
application/xml:
schema:
$ref: '#/components/schemas/Pet'
application/json:
schema:
$ref: '#/components/schemas/Pet'
description: successful operation
"405":
description: Invalid input
security:
- petstore_auth:
@ -40,11 +49,20 @@ paths:
requestBody:
$ref: '#/components/requestBodies/Pet'
responses:
400:
"200":
content:
application/xml:
schema:
$ref: '#/components/schemas/Pet'
application/json:
schema:
$ref: '#/components/schemas/Pet'
description: successful operation
"400":
description: Invalid ID supplied
404:
"404":
description: Pet not found
405:
"405":
description: Validation exception
security:
- petstore_auth:
@ -74,7 +92,7 @@ paths:
type: array
style: form
responses:
200:
"200":
content:
application/xml:
schema:
@ -87,7 +105,7 @@ paths:
$ref: '#/components/schemas/Pet'
type: array
description: successful operation
400:
"400":
description: Invalid status value
security:
- petstore_auth:
@ -113,7 +131,7 @@ paths:
type: array
style: form
responses:
200:
"200":
content:
application/xml:
schema:
@ -126,7 +144,7 @@ paths:
$ref: '#/components/schemas/Pet'
type: array
description: successful operation
400:
"400":
description: Invalid tag value
security:
- petstore_auth:
@ -155,7 +173,7 @@ paths:
type: integer
style: simple
responses:
400:
"400":
description: Invalid pet value
security:
- petstore_auth:
@ -178,7 +196,7 @@ paths:
type: integer
style: simple
responses:
200:
"200":
content:
application/xml:
schema:
@ -187,9 +205,9 @@ paths:
schema:
$ref: '#/components/schemas/Pet'
description: successful operation
400:
"400":
description: Invalid ID supplied
404:
"404":
description: Pet not found
security:
- api_key: []
@ -222,7 +240,7 @@ paths:
type: string
type: object
responses:
405:
"405":
description: Invalid input
security:
- petstore_auth:
@ -259,7 +277,7 @@ paths:
type: string
type: object
responses:
200:
"200":
content:
application/json:
schema:
@ -277,7 +295,7 @@ paths:
description: Returns a map of status codes to quantities
operationId: getInventory
responses:
200:
"200":
content:
application/json:
schema:
@ -302,7 +320,7 @@ paths:
description: order placed for purchasing the pet
required: true
responses:
200:
"200":
content:
application/xml:
schema:
@ -311,7 +329,7 @@ paths:
schema:
$ref: '#/components/schemas/Order'
description: successful operation
400:
"400":
description: Invalid Order
summary: Place an order for a pet
tags:
@ -331,9 +349,9 @@ paths:
type: string
style: simple
responses:
400:
"400":
description: Invalid ID supplied
404:
"404":
description: Order not found
summary: Delete purchase order by ID
tags:
@ -355,7 +373,7 @@ paths:
type: integer
style: simple
responses:
200:
"200":
content:
application/xml:
schema:
@ -364,9 +382,9 @@ paths:
schema:
$ref: '#/components/schemas/Order'
description: successful operation
400:
"400":
description: Invalid ID supplied
404:
"404":
description: Order not found
summary: Find purchase order by ID
tags:
@ -386,7 +404,7 @@ paths:
default:
description: successful operation
security:
- auth_cookie: []
- api_key: []
summary: Create user
tags:
- user
@ -399,7 +417,7 @@ paths:
default:
description: successful operation
security:
- auth_cookie: []
- api_key: []
summary: Creates list of users with given input array
tags:
- user
@ -412,7 +430,7 @@ paths:
default:
description: successful operation
security:
- auth_cookie: []
- api_key: []
summary: Creates list of users with given input array
tags:
- user
@ -438,7 +456,7 @@ paths:
type: string
style: form
responses:
200:
"200":
content:
application/xml:
schema:
@ -449,8 +467,8 @@ paths:
description: successful operation
headers:
Set-Cookie:
description: Cookie authentication key for use with the `auth_cookie`
apiKey authentication.
description: Cookie authentication key for use with the `api_key` apiKey
authentication.
explode: false
schema:
example: AUTH_KEY=abcde12345; Path=/; HttpOnly
@ -470,7 +488,7 @@ paths:
format: date-time
type: string
style: simple
400:
"400":
description: Invalid username/password supplied
summary: Logs user into the system
tags:
@ -482,7 +500,7 @@ paths:
default:
description: successful operation
security:
- auth_cookie: []
- api_key: []
summary: Logs out current logged in user session
tags:
- user
@ -500,12 +518,12 @@ paths:
type: string
style: simple
responses:
400:
"400":
description: Invalid username supplied
404:
"404":
description: User not found
security:
- auth_cookie: []
- api_key: []
summary: Delete user
tags:
- user
@ -521,7 +539,7 @@ paths:
type: string
style: simple
responses:
200:
"200":
content:
application/xml:
schema:
@ -530,9 +548,9 @@ paths:
schema:
$ref: '#/components/schemas/User'
description: successful operation
400:
"400":
description: Invalid username supplied
404:
"404":
description: User not found
summary: Get user by user name
tags:
@ -557,12 +575,12 @@ paths:
description: Updated user object
required: true
responses:
400:
"400":
description: Invalid user supplied
404:
"404":
description: User not found
security:
- auth_cookie: []
- api_key: []
summary: Updated user
tags:
- user
@ -802,7 +820,3 @@ components:
in: header
name: api_key
type: apiKey
auth_cookie:
in: cookie
name: AUTH_KEY
type: apiKey

View File

@ -1,713 +0,0 @@
---
swagger: "2.0"
info:
description: "This is a sample server Petstore server. You can find out more about\
\ Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/).\
\ For this sample, you can use the api key `special-key` to test the authorization\
\ filters."
version: "1.0.0"
title: "Swagger Petstore"
termsOfService: "http://swagger.io/terms/"
contact:
email: "apiteam@swagger.io"
license:
name: "Apache 2.0"
url: "https://www.apache.org/licenses/LICENSE-2.0.html"
host: "petstore.swagger.io"
basePath: "/v2"
tags:
- name: "pet"
description: "Everything about your Pets"
externalDocs:
description: "Find out more"
url: "http://swagger.io"
- name: "store"
description: "Access to Petstore orders"
- name: "user"
description: "Operations about user"
externalDocs:
description: "Find out more about our store"
url: "http://swagger.io"
schemes:
- "http"
paths:
/pet:
post:
tags:
- "pet"
summary: "Add a new pet to the store"
description: ""
operationId: "addPet"
consumes:
- "application/json"
- "application/xml"
produces:
- "application/xml"
- "application/json"
parameters:
- in: "body"
name: "body"
description: "Pet object that needs to be added to the store"
required: true
schema:
$ref: "#/definitions/Pet"
responses:
405:
description: "Invalid input"
security:
- petstore_auth:
- "write:pets"
- "read:pets"
put:
tags:
- "pet"
summary: "Update an existing pet"
description: ""
operationId: "updatePet"
consumes:
- "application/json"
- "application/xml"
produces:
- "application/xml"
- "application/json"
parameters:
- in: "body"
name: "body"
description: "Pet object that needs to be added to the store"
required: true
schema:
$ref: "#/definitions/Pet"
responses:
400:
description: "Invalid ID supplied"
404:
description: "Pet not found"
405:
description: "Validation exception"
security:
- petstore_auth:
- "write:pets"
- "read:pets"
/pet/findByStatus:
get:
tags:
- "pet"
summary: "Finds Pets by status"
description: "Multiple status values can be provided with comma separated strings"
operationId: "findPetsByStatus"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "status"
in: "query"
description: "Status values that need to be considered for filter"
required: true
type: "array"
items:
type: "string"
enum:
- "available"
- "pending"
- "sold"
default: "available"
collectionFormat: "csv"
responses:
200:
description: "successful operation"
schema:
type: "array"
items:
$ref: "#/definitions/Pet"
400:
description: "Invalid status value"
security:
- petstore_auth:
- "write:pets"
- "read:pets"
/pet/findByTags:
get:
tags:
- "pet"
summary: "Finds Pets by tags"
description: "Multiple tags can be provided with comma separated strings. Use\
\ tag1, tag2, tag3 for testing."
operationId: "findPetsByTags"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "tags"
in: "query"
description: "Tags to filter by"
required: true
type: "array"
items:
type: "string"
collectionFormat: "csv"
responses:
200:
description: "successful operation"
schema:
type: "array"
items:
$ref: "#/definitions/Pet"
400:
description: "Invalid tag value"
security:
- petstore_auth:
- "write:pets"
- "read:pets"
/pet/{petId}:
get:
tags:
- "pet"
summary: "Find pet by ID"
description: "Returns a single pet"
operationId: "getPetById"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "petId"
in: "path"
description: "ID of pet to return"
required: true
type: "integer"
format: "int64"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/Pet"
400:
description: "Invalid ID supplied"
404:
description: "Pet not found"
security:
- api_key: []
post:
tags:
- "pet"
summary: "Updates a pet in the store with form data"
description: ""
operationId: "updatePetWithForm"
consumes:
- "application/x-www-form-urlencoded"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "petId"
in: "path"
description: "ID of pet that needs to be updated"
required: true
type: "integer"
format: "int64"
- name: "name"
in: "formData"
description: "Updated name of the pet"
required: false
type: "string"
- name: "status"
in: "formData"
description: "Updated status of the pet"
required: false
type: "string"
responses:
405:
description: "Invalid input"
security:
- petstore_auth:
- "write:pets"
- "read:pets"
delete:
tags:
- "pet"
summary: "Deletes a pet"
description: ""
operationId: "deletePet"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "api_key"
in: "header"
required: false
type: "string"
- name: "petId"
in: "path"
description: "Pet id to delete"
required: true
type: "integer"
format: "int64"
responses:
400:
description: "Invalid pet value"
security:
- petstore_auth:
- "write:pets"
- "read:pets"
/pet/{petId}/uploadImage:
post:
tags:
- "pet"
summary: "uploads an image"
description: ""
operationId: "uploadFile"
consumes:
- "multipart/form-data"
produces:
- "application/json"
parameters:
- name: "petId"
in: "path"
description: "ID of pet to update"
required: true
type: "integer"
format: "int64"
- name: "additionalMetadata"
in: "formData"
description: "Additional data to pass to server"
required: false
type: "string"
- name: "file"
in: "formData"
description: "file to upload"
required: false
type: "file"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/ApiResponse"
security:
- petstore_auth:
- "write:pets"
- "read:pets"
/store/inventory:
get:
tags:
- "store"
summary: "Returns pet inventories by status"
description: "Returns a map of status codes to quantities"
operationId: "getInventory"
produces:
- "application/json"
parameters: []
responses:
200:
description: "successful operation"
schema:
type: "object"
additionalProperties:
type: "integer"
format: "int32"
security:
- api_key: []
/store/order:
post:
tags:
- "store"
summary: "Place an order for a pet"
description: ""
operationId: "placeOrder"
produces:
- "application/xml"
- "application/json"
parameters:
- in: "body"
name: "body"
description: "order placed for purchasing the pet"
required: true
schema:
$ref: "#/definitions/Order"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/Order"
400:
description: "Invalid Order"
/store/order/{orderId}:
get:
tags:
- "store"
summary: "Find purchase order by ID"
description: "For valid response try integer IDs with value <= 5 or > 10. Other\
\ values will generated exceptions"
operationId: "getOrderById"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "orderId"
in: "path"
description: "ID of pet that needs to be fetched"
required: true
type: "integer"
maximum: 5
minimum: 1
format: "int64"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/Order"
400:
description: "Invalid ID supplied"
404:
description: "Order not found"
delete:
tags:
- "store"
summary: "Delete purchase order by ID"
description: "For valid response try integer IDs with value < 1000. Anything\
\ above 1000 or nonintegers will generate API errors"
operationId: "deleteOrder"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "orderId"
in: "path"
description: "ID of the order that needs to be deleted"
required: true
type: "string"
responses:
400:
description: "Invalid ID supplied"
404:
description: "Order not found"
/user:
post:
tags:
- "user"
summary: "Create user"
description: "This can only be done by the logged in user."
operationId: "createUser"
produces:
- "application/xml"
- "application/json"
parameters:
- in: "body"
name: "body"
description: "Created user object"
required: true
schema:
$ref: "#/definitions/User"
responses:
default:
description: "successful operation"
/user/createWithArray:
post:
tags:
- "user"
summary: "Creates list of users with given input array"
description: ""
operationId: "createUsersWithArrayInput"
produces:
- "application/xml"
- "application/json"
parameters:
- in: "body"
name: "body"
description: "List of user object"
required: true
schema:
type: "array"
items:
$ref: "#/definitions/User"
responses:
default:
description: "successful operation"
/user/createWithList:
post:
tags:
- "user"
summary: "Creates list of users with given input array"
description: ""
operationId: "createUsersWithListInput"
produces:
- "application/xml"
- "application/json"
parameters:
- in: "body"
name: "body"
description: "List of user object"
required: true
schema:
type: "array"
items:
$ref: "#/definitions/User"
responses:
default:
description: "successful operation"
/user/login:
get:
tags:
- "user"
summary: "Logs user into the system"
description: ""
operationId: "loginUser"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "username"
in: "query"
description: "The user name for login"
required: true
type: "string"
- name: "password"
in: "query"
description: "The password for login in clear text"
required: true
type: "string"
responses:
200:
description: "successful operation"
schema:
type: "string"
headers:
X-Rate-Limit:
type: "integer"
format: "int32"
description: "calls per hour allowed by the user"
X-Expires-After:
type: "string"
format: "date-time"
description: "date in UTC when toekn expires"
400:
description: "Invalid username/password supplied"
/user/logout:
get:
tags:
- "user"
summary: "Logs out current logged in user session"
description: ""
operationId: "logoutUser"
produces:
- "application/xml"
- "application/json"
parameters: []
responses:
default:
description: "successful operation"
/user/{username}:
get:
tags:
- "user"
summary: "Get user by user name"
description: ""
operationId: "getUserByName"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "username"
in: "path"
description: "The name that needs to be fetched. Use user1 for testing. "
required: true
type: "string"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/User"
400:
description: "Invalid username supplied"
404:
description: "User not found"
put:
tags:
- "user"
summary: "Updated user"
description: "This can only be done by the logged in user."
operationId: "updateUser"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "username"
in: "path"
description: "name that need to be deleted"
required: true
type: "string"
- in: "body"
name: "body"
description: "Updated user object"
required: true
schema:
$ref: "#/definitions/User"
responses:
400:
description: "Invalid user supplied"
404:
description: "User not found"
delete:
tags:
- "user"
summary: "Delete user"
description: "This can only be done by the logged in user."
operationId: "deleteUser"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "username"
in: "path"
description: "The name that needs to be deleted"
required: true
type: "string"
responses:
400:
description: "Invalid username supplied"
404:
description: "User not found"
securityDefinitions:
petstore_auth:
type: "oauth2"
authorizationUrl: "http://petstore.swagger.io/api/oauth/dialog"
flow: "implicit"
scopes:
write:pets: "modify pets in your account"
read:pets: "read your pets"
api_key:
type: "apiKey"
name: "api_key"
in: "header"
definitions:
Order:
type: "object"
properties:
id:
type: "integer"
format: "int64"
petId:
type: "integer"
format: "int64"
quantity:
type: "integer"
format: "int32"
shipDate:
type: "string"
format: "date-time"
status:
type: "string"
description: "Order Status"
enum:
- "placed"
- "approved"
- "delivered"
complete:
type: "boolean"
default: false
title: "Pet Order"
description: "An order for a pets from the pet store"
xml:
name: "Order"
Category:
type: "object"
properties:
id:
type: "integer"
format: "int64"
name:
type: "string"
title: "Pet category"
description: "A category for a pet"
xml:
name: "Category"
User:
type: "object"
properties:
id:
type: "integer"
format: "int64"
username:
type: "string"
firstName:
type: "string"
lastName:
type: "string"
email:
type: "string"
password:
type: "string"
phone:
type: "string"
userStatus:
type: "integer"
format: "int32"
description: "User Status"
title: "a User"
description: "A User who is purchasing from the pet store"
xml:
name: "User"
Tag:
type: "object"
properties:
id:
type: "integer"
format: "int64"
name:
type: "string"
title: "Pet Tag"
description: "A tag for a pet"
xml:
name: "Tag"
Pet:
type: "object"
required:
- "name"
- "photoUrls"
properties:
id:
type: "integer"
format: "int64"
category:
$ref: "#/definitions/Category"
name:
type: "string"
example: "doggie"
photoUrls:
type: "array"
xml:
name: "photoUrl"
wrapped: true
items:
type: "string"
tags:
type: "array"
xml:
name: "tag"
wrapped: true
items:
$ref: "#/definitions/Tag"
status:
type: "string"
description: "pet status in the store"
enum:
- "available"
- "pending"
- "sold"
title: "a Pet"
description: "A pet for sale in the pet store"
xml:
name: "Pet"
ApiResponse:
type: "object"
properties:
code:
type: "integer"
format: "int32"
type:
type: "string"
message:
type: "string"
title: "An uploaded response"
description: "Describes the result of uploading an image resource"
externalDocs:
description: "Find out more about Swagger"
url: "http://swagger.io"