require 'httparty' require 'active_support/core_ext/string' require 'active_support/core_ext/hash' require 'active_support/inflector' require 'json' require 'uri' require 'active_model' module Shutl::Resource module Rest extend HTTParty include ActiveModel::Serialization attr_reader :response def self.included(base) base.send :extend, Shutl::Resource::RestClassMethods base.send :resource_name, base.name.split('::').last.underscore base.send :resource_id, :id end def initialize(args = {}, response=nil) update_attributes args @response = response end def as_json(_) attributes end def to_json(options = nil) { :"#{prefix}" => attributes }.to_json(options) end def update_attributes(attrs) attrs.each { |a, v| instance_variable_set(:"@#{a}", v) } end def update!(attrs) new_attributes = attributes.merge attrs update_attributes(self.class.add_resource_id_to new_attributes) save end def save options={} self.class.save self, options end def destroy options self.class.destroy self, options end def method_missing(method, *args, &block) if self.instance_variables.include?(:"@#{method}") return self.instance_variable_get(:"@#{method}") end super end def respond_to? method self.instance_variables.include?(:"@#{method}") ? true : super end def parsed @parsed ||= response.body.with_indifferent_access end def status response.code end def pagination parsed[:pagination] end def next_resource pagination[:next_resource] if pagination end def previous_resource pagination[:previous_resource] if pagination end attr_accessor :errors def valid? errors.blank? end def resource_id instance_variable_get :"@#{self.class.resource_id_name}" end def attributes (instance_variables - [:@response]).inject({}.with_indifferent_access) do |h, var| h.merge( { var.to_s.gsub('@','').to_sym => instance_variable_get(var)}) end end private def check_fail *args self.class.send :check_fail, *args end protected def prefix self.class.instance_variable_get(:@resource_name) end end end