mirror of
https://github.com/ditkrg/rswag.git
synced 2026-01-25 15:22:56 +00:00
First iteration of rspec driven swagger
This commit is contained in:
@@ -1,36 +1,60 @@
|
||||
require 'rspec/core/formatters/base_text_formatter'
|
||||
require 'rails_helper'
|
||||
|
||||
module SwaggerRails
|
||||
module RSpec
|
||||
|
||||
class Formatter
|
||||
::RSpec::Core::Formatters.register self,
|
||||
:example_group_started,
|
||||
:example_group_finished,
|
||||
:stop
|
||||
|
||||
def initialize(output)
|
||||
@output = output
|
||||
@swagger_docs = {}
|
||||
@group_level = 0
|
||||
@swagger_docs = SwaggerRails.swagger_docs
|
||||
|
||||
@output.puts 'Generating Swagger Docs ...'
|
||||
end
|
||||
|
||||
def example_group_started(notification)
|
||||
@group_level += 1
|
||||
group = notification.group
|
||||
metadata = group.metadata
|
||||
|
||||
@output.puts "group_level: #{@group_level}"
|
||||
@output.puts metadata.slice(:doc, :path_template, :operation, :response).inspect
|
||||
end
|
||||
|
||||
def example_group_finished(notification)
|
||||
@group_level -= 1
|
||||
metadata = notification.group.metadata
|
||||
return unless metadata.has_key?(:response_code)
|
||||
|
||||
swagger_data = swagger_data_from(metadata)
|
||||
swagger_doc = @swagger_docs[metadata[:docs_path]] || @swagger_docs.values.first
|
||||
swagger_doc.deep_merge!(swagger_data)
|
||||
end
|
||||
|
||||
def stop(notification)
|
||||
@swagger_docs.each do |path, doc|
|
||||
file_path = File.join(Rails.root, 'config/swagger', path)
|
||||
|
||||
File.open(file_path, 'w') do |file|
|
||||
file.write(JSON.pretty_generate(doc))
|
||||
end
|
||||
end
|
||||
|
||||
@output.puts 'Swagger Doc generated'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def swagger_data_from(metadata)
|
||||
{
|
||||
paths: {
|
||||
metadata[:path_template] => {
|
||||
metadata[:http_verb] => operation_from(metadata)
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def operation_from(metadata)
|
||||
metadata.slice(:summary, :consumes, :produces, :parameters).tap do |operation|
|
||||
operation[:responses] = {
|
||||
metadata[:response_code] => metadata[:response]
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user