class Rswag::Specs::SwaggerFormatter

Public Class Methods

new(output, config = Rswag::Specs.config) click to toggle source
# File lib/rswag/specs/swagger_formatter.rb, line 13
def initialize(output, config = Rswag::Specs.config)
  @output = output
  @config = config

  @output.puts 'Generating Swagger docs ...'
end

Public Instance Methods

example_group_finished(notification) click to toggle source
# File lib/rswag/specs/swagger_formatter.rb, line 20
def example_group_finished(notification)
  # NOTE: rspec 2.x support
  if RSPEC_VERSION > 2
    metadata = notification.group.metadata
  else
    metadata = notification.metadata
  end

  return unless metadata.has_key?(:response)
  swagger_doc = @config.get_swagger_doc(metadata[:swagger_doc])
  swagger_doc.deep_merge!(metadata_to_swagger(metadata))
end
stop(notification=nil) click to toggle source
# File lib/rswag/specs/swagger_formatter.rb, line 33
def stop(notification=nil)
  @config.swagger_docs.each do |url_path, doc|
    file_path = File.join(@config.swagger_root, url_path)
    dirname = File.dirname(file_path)
    FileUtils.mkdir_p dirname unless File.exists?(dirname)

    File.open(file_path, 'w') do |file|
      file.write(JSON.pretty_generate(doc))
    end

    @output.puts "Swagger doc generated at #{file_path}"
  end
end

Private Instance Methods

metadata_to_swagger(metadata) click to toggle source
# File lib/rswag/specs/swagger_formatter.rb, line 49
def metadata_to_swagger(metadata)
  response_code = metadata[:response][:code]
  response = metadata[:response].reject { |k,v| k == :code }

  verb = metadata[:operation][:verb]
  operation = metadata[:operation]
    .reject { |k,v| k == :verb }
    .merge(responses: { response_code => response })

  path_template = metadata[:path_item][:template]
  path_item = metadata[:path_item]
    .reject { |k,v| k == :template }
    .merge(verb => operation)

  { paths: { path_template => path_item } }
end