module Apigen::Formats::Swagger::V2

Swagger 2 (aka OpenAPI 2) generator.

Public Class Methods

generate(api) click to toggle source
# File lib/apigen/formats/swagger.rb, line 15
def generate(api)
  # TODO: Allow overriding any of the hardcoded elements.
  {
    'swagger' => '2.0',
    'info' => info(api),
    'host' => 'localhost',
    'basePath' => '/',
    'schemes' => %w[
      http
      https
    ],
    'consumes' => [
      'application/json'
    ],
    'produces' => [
      'application/json'
    ],
    'paths' => paths(api),
    'definitions' => definitions(api)
  }.to_yaml
end

Private Class Methods

info(api) click to toggle source
# File lib/apigen/formats/swagger.rb, line 39
def info(api)
  {
    'version' => '1.0.0',
    'title' => 'API',
    'description' => api.description,
    'termsOfService' => '',
    'contact' => {
      'name' => ''
    },
    'license' => {
      'name' => ''
    }
  }
end
input_parameter(api, property) click to toggle source
# File lib/apigen/formats/swagger.rb, line 88
def input_parameter(api, property)
  parameter = {
    'name' => 'input',
    'in' => 'body',
    'required' => true,
    'schema' => schema(api, property.type)
  }
  add_description(parameter, property.description)
  add_example(parameter, property.example)
  parameter
end
model_ref(type) click to toggle source
# File lib/apigen/formats/swagger.rb, line 108
def model_ref(type)
  "#/definitions/#{type}"
end
path_parameter(api, name, property) click to toggle source
# File lib/apigen/formats/swagger.rb, line 72
def path_parameter(api, name, property)
  {
    'in' => 'path',
    'name' => name.to_s,
    'required' => true
  }.merge(schema(api, property.type, property.description, property.example))
end
paths(api) click to toggle source
# File lib/apigen/formats/swagger.rb, line 54
def paths(api)
  hash = {}
  api.endpoints.each do |endpoint|
    parameters = []
    parameters.concat(endpoint.path_parameters.properties.map { |name, property| path_parameter(api, name, property) })
    parameters.concat(endpoint.query_parameters.properties.map { |name, property| query_parameter(api, name, property) })
    parameters << input_parameter(api, endpoint.input) if endpoint.input
    responses = endpoint.outputs.map { |output| response(api, output) }.to_h
    hash[endpoint.path] ||= {}
    hash[endpoint.path][endpoint.method.to_s] = {
      'parameters' => parameters,
      'responses' => responses
    }
    add_description(hash[endpoint.path][endpoint.method.to_s], endpoint.description)
  end
  hash
end
query_parameter(api, name, property) click to toggle source
# File lib/apigen/formats/swagger.rb, line 80
def query_parameter(api, name, property)
  {
    'in' => 'query',
    'name' => name.to_s,
    'required' => property.required?
  }.merge(schema(api, property.type, property.description, property.example))
end
response(api, output) click to toggle source
# File lib/apigen/formats/swagger.rb, line 100
def response(api, output)
  response = {}
  add_description(response, output.description)
  add_example(response, output.example)
  response['schema'] = schema(api, output.type) if output.type != Apigen::PrimaryType.new(:void)
  [output.status.to_s, response]
end
supports_discriminator?() click to toggle source
# File lib/apigen/formats/swagger.rb, line 112
def supports_discriminator?
  true
end