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