lib/rspec_api_docs/formatter.rb in rspec-api-docs-0.1.0 vs lib/rspec_api_docs/formatter.rb in rspec-api-docs-0.2.0

- old
+ new

@@ -1,27 +1,65 @@ require 'rspec/core/formatters/base_formatter' -require 'json' +require 'rspec_api_docs' require 'rspec_api_docs/formatter/resource' -require 'rspec_api_docs/formatter/renderers/json_renderer' +require 'rspec_api_docs/formatter/renderer/json_renderer' +require 'rspec_api_docs/formatter/renderer/raddocs_renderer' +require 'rspec_api_docs/formatter/renderer/slate_renderer' module RspecApiDocs + # Unknown renderer configured. + UnknownRenderer = Class.new(BaseError) + + # The RSpec formatter. + # + # Usage: + # + # rspec --format=RspecApiDocs::Formatter class Formatter < RSpec::Core::Formatters::BaseFormatter RSpec::Core::Formatters.register self, :example_passed, :close attr_reader :resources def initialize(*args) - @resources = [] + @resources = {} super args end + # Initializes and stores {Resource}s. + # + # @return [void] def example_passed(example_notification) - return unless example_notification.example.metadata[METADATA_NAMESPACE] - resources << Resource.new(example_notification.example) + rspec_example = example_notification.example + return unless rspec_example.metadata[METADATA_NAMESPACE] + resource = Resource.new(rspec_example) + resources[resource.name] ||= resource + resources[resource.name].examples << Resource::Example.new(rspec_example) end + # Calls the configured renderer with the stored {Resource}s. + # + # @return [void] def close(null_notification) - JSONRender.new(resources).render + renderer.new(resources.values).render + end + + private + + def renderer + value = RspecApiDocs.configuration.renderer + + case value + when :json + Renderer::JSONRenderer + when :raddocs + Renderer::RaddocsRenderer + when :slate + Renderer::SlateRenderer + when Class + value + else + raise UnknownRenderer, "unknown renderer #{value.inspect}" + end end end end