class CrapiDocs::Session

Attributes

actions[R]

Public Class Methods

new(pattern) click to toggle source
# File lib/crapidocs/session.rb, line 5
def initialize(pattern)
  @pattern = pattern
  @actions = {}
end

Public Instance Methods

body(path, method) click to toggle source
# File lib/crapidocs/session.rb, line 52
def body(path, method)
  res = @actions[path][method]
    .map { |a| a[:response] }
    .find { |r| r[:status] / 100 == 2 }
  return nil unless res
  parse_body(res[:body])
end
merge(sessions) click to toggle source
# File lib/crapidocs/session.rb, line 60
def merge(sessions)
  sessions = [sessions] unless sessions.is_a?(Array)
  @actions = sessions.reduce(@actions) do |a, session|
    a.deep_merge(session.actions)
  end
end
methods(path) click to toggle source
# File lib/crapidocs/session.rb, line 41
def methods(path)
  @actions[path].keys.sort
end
params(path, method) click to toggle source
# File lib/crapidocs/session.rb, line 45
def params(path, method)
  reqs = @actions[path][method].map { |a| a[:request] }
  params = merge_params(reqs)
  return nil unless params.keys.any?
  params
end
paths() click to toggle source
# File lib/crapidocs/session.rb, line 37
def paths
  @actions.keys.sort
end
track(args, result) click to toggle source
# File lib/crapidocs/session.rb, line 10
def track(args, result)
  uri, env = args
  status, headers, body = result
  body = body.respond_to?(:body) ? body.body : ''
  method = env['REQUEST_METHOD']

  return unless relevant?(uri)

  action = {
    request: {
      method: method,
      body: env['rack.input'].string,
      headers: clean_headers(env)
    },
    response: {
      status: status,
      headers: headers,
      body: body
    }
  }

  path = clean_path(uri.path)
  @actions[path] ||= {}
  @actions[path][method] ||= []
  @actions[path][method] << action
end

Private Instance Methods

clean_headers(headers) click to toggle source
# File lib/crapidocs/session.rb, line 83
def clean_headers(headers)
  headers.delete_if { |_k, v| !v.is_a?(String) }
end
clean_path(path) click to toggle source
# File lib/crapidocs/session.rb, line 87
def clean_path(path)
  last = nil
  path.split('/').reject(&:blank?).reduce('') do |cleaned, part|
    part = ":#{last.singularize}_id" if part =~ /^\d+$/
    part = ':token' if tokenish?(part)
    last = part
    "#{cleaned}/#{part}"
  end
end
merge_params(reqs) click to toggle source
# File lib/crapidocs/session.rb, line 75
def merge_params(reqs)
  params = reqs.reduce({}) do |hash, r|
    hash.merge(parse_body(r[:body]))
  end
  params.delete('format')
  params
end
parse_body(body) click to toggle source
# File lib/crapidocs/session.rb, line 69
def parse_body(body)
  JSON.parse(body)
rescue
  Rack::Utils.parse_nested_query(body)
end
relevant?(uri) click to toggle source
# File lib/crapidocs/session.rb, line 101
def relevant?(uri)
  (uri.to_s =~ @pattern).present?
end
tokenish?(s) click to toggle source
# File lib/crapidocs/session.rb, line 97
def tokenish?(s)
  (s =~ /\d+/ && s =~ /[a-zA-Z]+/ && s.length >= 10) == true
end