class RSpec::Apib::Recorder

Attributes

apib[R]
example[R]
request[R]
response[R]
routes[R]

Public Class Methods

new(example, request, response, routes, apib) click to toggle source
# File lib/rspec/apib/recorder.rb, line 6
def initialize(example, request, response, routes, apib)
  @example  = example
  @request  = request
  @response = response
  @routes   = routes
  @apib     = apib
end

Public Instance Methods

comments_parser() click to toggle source
# File lib/rspec/apib/recorder.rb, line 22
def comments_parser
  @comments_parser ||= CommentsParser.new(example)
end
run() click to toggle source
# File lib/rspec/apib/recorder.rb, line 14
def run
  return unless request
  return unless response

  document_request
  document_response
end

Private Instance Methods

action() click to toggle source
# File lib/rspec/apib/recorder.rb, line 96
def action
  @action ||= begin
    name = "#{request.method} #{path}"
    group[name] ||= {
      request: { _status: 600 },
      response: []
    }
  end
end
document_request() click to toggle source
# File lib/rspec/apib/recorder.rb, line 106
def document_request
  document_request_params
  return if response.status >= action[:request][:_status]
  action[:request][:description] = comments_parser.description("request")
  action[:request][:_status] = response.status
  action[:request][:path]    = request.path
  action[:request][:body]    = request.body.read
  document_request_header
end
document_request_header() click to toggle source
# File lib/rspec/apib/recorder.rb, line 116
def document_request_header
  action[:request][:headers] = {}
  request.headers.each do |k, v|
    next unless k.starts_with?('HTTP_')
    header = k.gsub('HTTP_', '').downcase
    next if request_header_blacklist.include? header
    next if v.nil? || v.empty?
    action[:request][:headers][header] = v
  end
end
document_request_params() click to toggle source
# File lib/rspec/apib/recorder.rb, line 127
def document_request_params
  return if (200..299).exclude?(response.status)
  params = request.params.symbolize_keys
  request_param_blacklist.each { |param| params.except!(param) }
  action[:request][:params] ||= {}
  params.each do |name, value|
    action[:request][:params][name] ||= {
      value: value,
      path: route.parts.include?(name),
      required: route.required_parts.include?(name)
    }
  end
end
document_response() click to toggle source
# File lib/rspec/apib/recorder.rb, line 141
def document_response
  data = {}
  return if response_exists?
  data[:description]  = comments_parser.description("response") || example.description
  data[:status]       = response.status
  data[:content_type] = response.content_type.to_s
  data[:body]         = response.body
  data[:headers]      = response.headers
  action[:response] << data
end
example_group() click to toggle source

The top level example group the example is contained in

# File lib/rspec/apib/recorder.rb, line 48
def example_group
  @example_group ||= begin
    example_group = example.metadata[:example_group]
    while example_group[:parent_example_group]
      example_group = example_group[:parent_example_group]
    end
    example_group
  end
end
group() click to toggle source
# File lib/rspec/apib/recorder.rb, line 80
def group
  @group ||= begin
    apib[resource_name] ||= {}
  end
end
path() click to toggle source
# File lib/rspec/apib/recorder.rb, line 58
def path
  @path ||= begin
    parts = route.parts
    tmp = {}
    parts.each do |part|
      optional_parts = route.respond_to?(:optional_parts) ?
                         route.optional_parts :
                         (route.parts - route.required_parts)

      if optional_parts.include?(part)
        tmp[part] = "(:#{part}:)"
      else
        tmp[part] = ":#{part}:"
      end
    end
    result = route.format(tmp).gsub(/:(.*?):/, '{\\1}')
    result = result.gsub('.(', '(.')
    result = result.gsub('/(', '(/')
    result
  end
end
request_header_blacklist() click to toggle source

Request headers contained in the blacklist will not be included in the API documentation

# File lib/rspec/apib/recorder.rb, line 30
def request_header_blacklist
  RSpec::Apib.config.request_header_blacklist
end
request_param_blacklist() click to toggle source
# File lib/rspec/apib/recorder.rb, line 34
def request_param_blacklist
  RSpec::Apib.config.request_param_blacklist
end
resource_name() click to toggle source
# File lib/rspec/apib/recorder.rb, line 92
def resource_name
  @resource_name ||= example_group[:description].to_s.singularize
end
resource_type() click to toggle source
# File lib/rspec/apib/recorder.rb, line 86
def resource_type
  @resource_type ||= begin
    route.required_parts.include?(:id) ? 'resource' : 'collection'
  end
end
response_exists?() click to toggle source
# File lib/rspec/apib/recorder.rb, line 152
def response_exists?
  action[:response].any? { |r| r[:status] == response.status }
end
route() click to toggle source

The routing object for the rails route of the request

# File lib/rspec/apib/recorder.rb, line 39
def route
  return @route if @route
  routes.router.recognize(request) do |r, params|
    @route = r
  end
  @route
end