module Misty::HTTP::MethodBuilder

Public Instance Methods

method_missing(method_name, *args) click to toggle source
# File lib/misty/http/method_builder.rb, line 4
def method_missing(method_name, *args)
  if method = get_method(method_name)
    method_call(method, *args)
  else
    raise NoMethodError, "#{self.class}: #{method_name}"
  end
end

Private Instance Methods

base_filter(base, path) click to toggle source
# File lib/misty/http/method_builder.rb, line 58
def base_filter(base, path)
  return (@base_path + path) if base
  return path
end
count_path_params(str) click to toggle source
# File lib/misty/http/method_builder.rb, line 63
def count_path_params(str)
  subpath = /(.*)(\{.*\})(.*)/.match(str)
  return 0 unless subpath
  return count_path_params(subpath[1]) + 1
end
get_method(name) click to toggle source
# File lib/misty/http/method_builder.rb, line 69
def get_method(name)
  api.each do |path, verbs_list|
    verbs_list.each do |verb, methods|
      if methods.include?(name)
        return {:path => path, :request => verb, :name => name}
      end
    end
  end
  nil
end
inject_elements(str, args) click to toggle source
# File lib/misty/http/method_builder.rb, line 80
def inject_elements(str, args)
  subpath = /(.*)(\{.*\})(.*)/.match(str)
  return str unless subpath
  arg = args.pop
  raise ArgumentError, 'Not enough arguments' unless arg
  return inject_elements(subpath[1], args) + arg + subpath[3]
end
method_call(method, *args) click to toggle source
# File lib/misty/http/method_builder.rb, line 23
def method_call(method, *args)
  base, path = prefixed_path(method[:path])
  size_path_parameters = count_path_params(path)
  path_params = args[0, size_path_parameters]
  args_left = args - path_params
  path = inject_elements(path, path_params)
  final_path = base_filter(base, path)

  case method[:request]
  when :COPY
    http_copy(final_path, @request_headers.get)
  when :DELETE
    http_delete(final_path, @request_headers.get)
  when :GET
    final_path << query_param(args_left.shift) if args_left && args_left.size == 1
    http_get(final_path, @request_headers.get)
  when :HEAD
    http_head(final_path, @request_headers.get)
  when :POST
    final_path << query_param(args_left.shift) if args_left && args_left.size == 2
    data = process_data(@request_headers, args_left)
    http_post(final_path, @request_headers.get, data)
  when :PUT
    final_path << query_param(args_left.shift) if args_left && args_left.size == 2
    data = process_data(@request_headers, args_left)
    http_put(final_path, @request_headers.get, data)
  when :PATCH
    final_path << query_param(args_left.shift) if args_left && args_left.size == 2
    data = process_data(@request_headers, args_left)
    http_patch(final_path, @request_headers.get, data)
  else
    raise SyntaxError, "Invalid HTTP request: #{method[:request]}"
  end
end
prefixed_path(path) click to toggle source
# File lib/misty/http/method_builder.rb, line 88
def prefixed_path(path)
  unless prefix_path_to_ignore.empty?
    if path =~ %r{#{prefix_path_to_ignore}}
      return true, path.gsub(prefix_path_to_ignore, '')
    else
      return false, path
    end
  end
  return true, path
end
process_data(header, args) click to toggle source
# File lib/misty/http/method_builder.rb, line 14
def process_data(header, args)
  if args.size == 1 && Misty::Helper.json_encode?(args[0])
    header.add('Content-Type' => 'application/json')
    return Misty::Helper.to_json(args[0])
  elsif args.size == 1
    return args[0]
  end
end
query_param(data) click to toggle source
# File lib/misty/http/method_builder.rb, line 99
def query_param(data)
  result = nil
  if data.is_a? String
    result = ''
    if data != ''
      result = '?'
      result.force_encoding('ASCII-8BIT')
      result << data
    end
  elsif data.is_a? Hash
    result = data.empty? ? '' : '?' + URI.encode_www_form(data)
  end
  return result
end