lib/mambanation.rb in mambanation-0.1.29 vs lib/mambanation.rb in mambanation-0.1.30

- old
+ new

@@ -1,74 +1,120 @@ +require "forwardable" +require "hashie" +require "httparty" +require "yajl" + module MambaNation - class Request - extend Forwardable + include HTTParty + API_VERSION = "2".freeze + + class MambaNationError < StandardError + attr_reader :data - def self.get(client, path, options={}) - new(client, :get, path, options).perform + def initialize(data) + @data = data + super end - - def self.post(client, path, options={}) - new(client, :post, path, options).perform + end + + class RateLimitExceeded < MambaNationError; end + class Unauthorized < MambaNationError; end + class General < MambaNationError; end + + class Unavailable < StandardError; end + class InformMambaNation < StandardError; end + class NotFound < StandardError; end + + def self.api_endpoint + @api_endpoint ||= "api.mambanation.com" + end + + def self.api_endpoint=(value) + @api_endpoint = value + end + + private + + def self.perform_get(uri, options = {}) + base_uri(self.api_endpoint) + make_friendly(get(uri, options)) + end + + def self.make_friendly(response) + raise_errors(response) + data = parse(response) + # Don't mash arrays of integers + if data && data.is_a?(Array) && data.first.is_a?(Integer) + data + else + mash(data) end - - def self.put(client, path, options={}) - options[:body] ||= "" - new(client, :put, path, options).perform + end + + def self.raise_errors(response) + case response.code.to_i + when 400 + data = parse(response) + raise RateLimitExceeded.new(data), "(#{response.code}): #{response.message} - #{data['error'] if data}" + when 401 + data = parse(response) + raise Unauthorized.new(data), "(#{response.code}): #{response.message} - #{data['error'] if data}" + when 403 + data = parse(response) + raise General.new(data), "(#{response.code}): #{response.message} - #{data['error'] if data}" + when 404 + raise NotFound, "(#{response.code}): #{response.message}" + when 500 + raise InformMambaNation, "MambaNation had an internal error. Please let them know in the group. (#{response.code}): #{response.message}" + when 502..503 + raise Unavailable, "(#{response.code}): #{response.message}" end - - def self.delete(client, path, options={}) - new(client, :delete, path, options).perform + end + + def self.parse(response) + Yajl::Parser.parse(response.body) + end + + def self.mash(obj) + if obj.is_a?(Array) + obj.map{|item| make_mash_with_consistent_hash(item)} + elsif obj.is_a?(Hash) + make_mash_with_consistent_hash(obj) + else + obj end - - attr_reader :client, :method, :path, :options - - def_delegators :client, :get, :post, :put, :delete - - def initialize(client, method, path, options={}) - @client, @method, @path, @options = client, method, path, options + end + + # Lame workaround for the fact that mash doesn't hash correctly + def self.make_mash_with_consistent_hash(obj) + m = Hashie::Mash.new(obj) + def m.hash + inspect.hash end - - def uri - @uri ||= begin - uri = URI.parse(path) - - if options[:query] && options[:query] != {} - uri.query = to_query(options[:query]) - end - - uri.to_s - end + return m + end + +end + +module Hashie + class Mash + + # Converts all of the keys to strings, optionally formatting key name + def rubyify_keys! + keys.each{|k| + v = delete(k) + new_key = k.to_s.underscore + self[new_key] = v + v.rubyify_keys! if v.is_a?(Hash) + v.each{|p| p.rubyify_keys! if p.is_a?(Hash)} if v.is_a?(Array) + } + self end - - def perform - MambaNation.make_friendly(send("perform_#{method}")) - end - - private - - def perform_get - get(uri, options[:headers]) - end - - def perform_post - post(uri, options[:body], options[:headers]) - end - - def perform_put - put(uri, options[:body], options[:headers]) - end - - def perform_delete - delete(uri, options[:headers]) - end - - def to_query(options) - options.inject([]) do |collection, opt| - collection << case opt[1].class.to_s - when "Array" then opt[1].map { |value| "#{opt[0]}[]=#{value}" }.join('&') - else "#{opt[0]}=#{opt[1]}" - end - collection - end * '&' - end + end -end +end + +directory = File.expand_path(File.dirname(__FILE__)) + +require File.join(directory, "mambanation", "base") +require File.join(directory, "mambanation", "httpauth") +require File.join(directory, "mambanation", "request") \ No newline at end of file