class Swaggable::Swagger2Serializer

Generates a Swagger 2 hash from an {ApiDefinition}.

@example Basic usage

serializer = Swagger2Serializer.new
api_definition = ApiDefinition.new
serializer.serialize(api_definition)
# => {:swagger=>"2.0", :basePath=>nil, :info=>{:title=>nil, :description=>nil, :version=>nil}, :tags=>[], :paths=>{}}

Attributes

tag_serializer[RW]

Public Instance Methods

serialize(api) click to toggle source

Main method that given an {ApiDefinition} will return a hash to serialize

# File lib/swaggable/swagger_2_serializer.rb, line 14
def serialize api
  {
    swagger: '2.0',
    basePath: api.base_path,
    info: serialize_info(api),
    tags: api.tags.map{|t| serialize_tag t },
    paths: serialize_endpoints(api.endpoints),
    definitions: serialize_definitions(api),
  }
end
serialize_definitions(api) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 118
def serialize_definitions api
  api.used_schemas.inject({}) do |acc, schema|
    acc[schema.name] = serialize_parameter_schema schema
    acc
  end
end
serialize_endpoint(endpoint) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 52
def serialize_endpoint endpoint
  {
    tags: endpoint.tags.map(&:name),
    consumes: endpoint.consumes.map(&:http_string),
    produces: endpoint.produces.map(&:http_string),
    parameters: endpoint.parameters.map{|p| serialize_parameter p },
    responses: serialize_responses(endpoint.responses),
  }.
  tap do |e|
    e[:summary] = endpoint.summary if endpoint.summary
    e[:description] = endpoint.description if endpoint.description
  end
end
serialize_endpoints(endpoints) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 44
def serialize_endpoints endpoints
  endpoints.inject({}) do |out, endpoint|
    out[endpoint.path] ||= {}
    out[endpoint.path][endpoint.verb.downcase.to_sym] = serialize_endpoint(endpoint)
    out
  end
end
serialize_info(api) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 25
def serialize_info api
  {
    title: api.title.to_s,
    version: (api.version || '0.0.0'),
  }.
  tap do |h|
    h[:description] = api.description if api.description
  end
end
serialize_parameter(parameter) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 66
def serialize_parameter parameter
  p = {
    in: parameter.location.to_s,
    name: parameter.name,
    required: parameter.required?,
  }

  p[:type] = parameter.type || 'string' unless parameter.location == :body
  p[:description] = parameter.description if parameter.description

  unless parameter.schema.empty?
    p[:schema] = {:"$ref" => "#/definitions/#{parameter.schema.name}"}
  end

  p
end
serialize_parameter_attribute(attribute) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 97
def serialize_parameter_attribute attribute
  {
    type: attribute.json_type,
  }.
  tap do |e|
    e[:description] = attribute.description if attribute.description
    e[:format] = attribute.json_format if attribute.json_format
  end
end
serialize_parameter_schema(schema) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 83
def serialize_parameter_schema schema
  out = {type: 'object'}

  required_attrs = schema.attributes.select(&:required?)
  out[:required] = required_attrs.map(&:name) if required_attrs.any?

  out[:properties] = schema.attributes.inject({}) do |acc, attribute|
    acc[attribute.name] = serialize_parameter_attribute attribute
    acc
  end

  out
end
serialize_responses(responses) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 107
def serialize_responses responses
  if responses.any?
    responses.inject({}) do |acc, r|
      acc[r.status] = {description: r.description}
      acc
    end
  else
    {200 => {description: 'Success'}}
  end
end
serialize_tag(tag) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 35
def serialize_tag tag
  {
    name: tag.name,
  }.
  tap do |e|
    e[:description] = tag.description if tag.description
  end
end
validate(api) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 129
def validate api
  Swagger2Validator.validate serialize(api)
end
validate!(api) click to toggle source
# File lib/swaggable/swagger_2_serializer.rb, line 125
def validate! api
  Swagger2Validator.validate! serialize(api)
end