First iteration of rspec driven swagger

This commit is contained in:
domaindrivendev
2016-04-06 09:19:41 -07:00
parent d579dab7d8
commit 63861a3940
17 changed files with 312 additions and 445 deletions

View File

@@ -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