class RspecApiDocumentation::Views::ApiBlueprintExample

Constants

TOTAL_SPACES_INDENTATION

Public Class Methods

new(example, configuration) click to toggle source
Calls superclass method
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 6
def initialize(example, configuration)
  super
  self.template_name = "rspec_api_documentation/api_blueprint_example"
end

Public Instance Methods

extension() click to toggle source
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 43
def extension
  Writers::ApiBlueprintWriter::EXTENSION
end
parameters() click to toggle source
Calls superclass method
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 11
def parameters
  super.map do |parameter|
    parameter.merge({
      :required => !!parameter[:required],
      :has_example => !!parameter[:example],
      :has_type => !!parameter[:type]
    })
  end
end
requests() click to toggle source
Calls superclass method
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 21
def requests
  super.map do |request|
    request[:request_headers_text]  = remove_utf8_for_json(remove_content_type(request[:request_headers_text]))
    request[:request_headers_text]  = indent(request[:request_headers_text])
    request[:request_content_type]  = content_type(request[:request_headers])
    request[:request_content_type]  = remove_utf8_for_json(request[:request_content_type])
    request[:request_body]          = body_to_json(request, :request)
    request[:request_body]          = indent(request[:request_body])

    request[:response_headers_text] = remove_utf8_for_json(remove_content_type(request[:response_headers_text]))
    request[:response_headers_text] = indent(request[:response_headers_text])
    request[:response_content_type] = content_type(request[:response_headers])
    request[:response_content_type] = remove_utf8_for_json(request[:response_content_type])
    request[:response_body]         = body_to_json(request, :response)
    request[:response_body]         = indent(request[:response_body])

    request[:has_request?]          = has_request?(request)
    request[:has_response?]         = has_response?(request)
    request
  end
end

Private Instance Methods

body_to_json(http_call, message_direction) click to toggle source

http_call: the hash that contains all information about the HTTP

request and response.

message_direction: either `request` or `response`.

# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 82
def body_to_json(http_call, message_direction)
  content_type = http_call["#{message_direction}_content_type".to_sym]
  body         = http_call["#{message_direction}_body".to_sym] # e.g request_body

  if json?(content_type) && body
    body = JSON.pretty_generate(JSON.parse(body))
  end

  body
end
content_type(headers) click to toggle source
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 107
def content_type(headers)
  headers && headers.fetch("Content-Type", nil)
end
has_request?(metadata) click to toggle source
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 61
def has_request?(metadata)
  metadata.any? do |key, value|
    [:request_body, :request_headers, :request_content_type].include?(key) && value
  end
end
has_response?(metadata) click to toggle source
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 67
def has_response?(metadata)
  metadata.any? do |key, value|
    [:response_status, :response_body, :response_headers, :response_content_type].include?(key) && value
  end
end
indent(string) click to toggle source
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 73
def indent(string)
  string.tap do |str|
    str.gsub!(/\n/, "\n" + (" " * TOTAL_SPACES_INDENTATION)) if str
  end
end
json?(string) click to toggle source
# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 111
def json?(string)
  string =~ /application\/.*json/
end
remove_content_type(headers) click to toggle source

`Content-Type` header is removed because the information would be duplicated since it's already present in `request`.

# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 51
def remove_content_type(headers)
  return unless headers
  headers
    .split("\n")
    .reject { |header|
      header.start_with?('Content-Type:')
    }
    .join("\n")
end
remove_utf8_for_json(headers) click to toggle source

JSON requests should use UTF-8 by default according to www.ietf.org/rfc/rfc4627.txt, so we will remove `charset=utf-8` when we find it to remove noise.

# File lib/rspec_api_documentation/views/api_blueprint_example.rb, line 96
def remove_utf8_for_json(headers)
  return unless headers
  headers
    .split("\n")
    .map { |header|
      header.gsub!(/; *charset=utf-8/, "") if json?(header)
      header
    }
    .join("\n")
end