class ApiBlueprint
Public Class Methods
new(output)
click to toggle source
Calls superclass method
# File lib/api_blueprint.rb, line 12 def initialize(output) super @passed_examples = {} @group_level = 0 RSpec.configuration.silence_filter_announcements = true end
Public Instance Methods
example_passed(passed)
click to toggle source
# File lib/api_blueprint.rb, line 23 def example_passed(passed) metadata = passed.example.metadata if metadata[:apidoc] && metadata[:resource_group] && metadata[:resource] && metadata[:action] && metadata[:action_description] request = @example_group_instance.request response = @example_group_instance.response description = description_array_from(passed.example.metadata).reverse.join(' ').gsub(/[\(\)]/, '..') @passed_examples.deep_merge!({ metadata[:resource_group] => { metadata[:resource] => { metadata[:action] => { description: metadata[:action_description], parameters: metadata[:action_parameters], examples: { description => { request: { parameters: request.parameters.except(*request.path_parameters.keys.map(&:to_s)).to_json, format: request.format }, source: passed.example.instance_variable_get(:@example_block).source, location: metadata[:location], response: { status: response.status, body: response.body } } } } } } }) end @example_group_instance = nil end
example_started(notification)
click to toggle source
# File lib/api_blueprint.rb, line 19 def example_started(notification) @example_group_instance = notification.example.example_group_instance end
stop(notification)
click to toggle source
# File lib/api_blueprint.rb, line 64 def stop(notification) @passed_examples.sort_by { |k,v| k }.each do |resource_group_name, resource_group_resources| print_resource_group(resource_group_name, resource_group_resources) end end
Private Instance Methods
description_array_from(example_metadata)
click to toggle source
To include the descriptions of all the contexts that are below the action group, but not including resource/resource_group descriptions
# File lib/api_blueprint.rb, line 104 def description_array_from(example_metadata) parent = example_metadata[:parent_example_group] if example_metadata.key?(:parent_example_group) parent ||= example_metadata[:example_group] if example_metadata.key?(:example_group) if parent.nil? || parent[:action].nil? [] else [example_metadata[:description]] + description_array_from(parent) end end
print_action(action_name, action_metadata)
click to toggle source
# File lib/api_blueprint.rb, line 92 def print_action(action_name, action_metadata) output.puts ApiBlueprintFormatter::ActionFormatter.new(action_name, action_metadata).format action_metadata[:examples].each &method(:print_example) end
print_example(example_description, example_metadata)
click to toggle source
# File lib/api_blueprint.rb, line 98 def print_example(example_description, example_metadata) output.puts ApiBlueprintFormatter::ExampleFormatter.new(example_description, example_metadata).format end
print_resource(resource_name, actions)
click to toggle source
# File lib/api_blueprint.rb, line 77 def print_resource(resource_name, actions) unless resource_name =~ /^[^\[\]]*\[\/[^\]]+\]/ raise "resource: '#{resource_name}' is invalid. :resource needs to be specified according to https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md#resource-section" end output.puts "# #{resource_name}" http_verbs = actions.keys.map {|action| action.scan(/(GET|HEAD|POST|PATCH|PUT|DELETE|OPTIONS)/).flatten[0] } unless http_verbs.length == http_verbs.uniq.length raise "Action HTTP verbs are not unique #{actions.keys.inspect} for resource: '#{resource_name}'" end actions.each &method(:print_action) end
print_resource_group(resource_group_name, resource_group_resources)
click to toggle source
# File lib/api_blueprint.rb, line 72 def print_resource_group(resource_group_name, resource_group_resources) output.puts "# Group #{resource_group_name}" resource_group_resources.each &method(:print_resource) end