module Apigen::Formats::OpenAPI::V3

OpenAPI 3 generator.

Public Class Methods

generate(api) click to toggle source
# File lib/apigen/formats/openapi.rb, line 15
def generate(api)
  # TODO: Allow overriding any of the hardcoded elements.
  {
    'openapi' => '3.0.0',
    'info' => {
      'version' => '1.0.0',
      'title' => 'API',
      'description' => api.description,
      'termsOfService' => '',
      'contact' => {
        'name' => ''
      },
      'license' => {
        'name' => ''
      }
    },
    'servers' => [
      {
        'url' => 'http://localhost'
      }
    ],
    'paths' => paths(api),
    'components' => {
      'schemas' => definitions(api)
    }
  }.to_yaml
end

Private Class Methods

input(api, property) click to toggle source
# File lib/apigen/formats/openapi.rb, line 89
def input(api, property)
  parameter = {
    'required' => true,
    'content' => {
      'application/json' => {
        '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/openapi.rb, line 117
def model_ref(type)
  "#/components/schemas/#{type}"
end
path_parameter(api, name, property) click to toggle source
# File lib/apigen/formats/openapi.rb, line 65
def path_parameter(api, name, property)
  parameter = {
    'in' => 'path',
    'name' => name.to_s,
    'required' => true,
    'schema' => schema(api, property.type)
  }
  add_description(parameter, property.description)
  add_example(parameter, property.example)
  parameter
end
paths(api) click to toggle source
# File lib/apigen/formats/openapi.rb, line 45
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) })
    responses = endpoint.outputs.map { |output| response(api, output) }.to_h
    operation = {
      'operationId' => endpoint.name.to_s,
      'parameters' => parameters,
      'responses' => responses
    }
    add_description(operation, endpoint.description)
    operation['requestBody'] = input(api, endpoint.input) if endpoint.input
    hash[endpoint.path] ||= {}
    hash[endpoint.path][endpoint.method.to_s] = operation
  end
  hash
end
query_parameter(api, name, property) click to toggle source
# File lib/apigen/formats/openapi.rb, line 77
def query_parameter(api, name, property)
  parameter = {
    'in' => 'query',
    'name' => name.to_s,
    'required' => property.required?,
    'schema' => schema(api, property.type)
  }
  add_description(parameter, property.description)
  add_example(parameter, property.example)
  parameter
end
response(api, output) click to toggle source
# File lib/apigen/formats/openapi.rb, line 103
def response(api, output)
  response = {}
  add_description(response, output.description)
  add_example(response, output.example)
  if output.type != Apigen::PrimaryType.new(:void)
    response['content'] = {
      'application/json' => {
        'schema' => schema(api, output.type)
      }
    }
  end
  [output.status.to_s, response]
end
supports_discriminator?() click to toggle source
# File lib/apigen/formats/openapi.rb, line 121
def supports_discriminator?
  true
end