EditLLC/ruby-montage

View on GitHub
lib/montage/response.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'montage/collections'
require 'montage/resources'

module Montage
  class Response
    attr_reader :status, :body, :members, :resource_name, :raw_body

    def initialize(status, body, resource_name = "resource")
      @status = status
      @resource_name = resource_name
      @raw_body = body.clone.freeze
      @body = get_body(body)
      @members = parse_members
    end

    def get_body(body)
      resource_name == "error" ? body["errors"] : body["data"] || body
    end

    def success?
      if raw_body["errors"]
        return false
      else
        (200..299).include?(status)
      end
    end

    def respond_to?(method_name, include_private = false)
      resource_name.to_sym == method_name || "#{resource_name}s".to_sym == method_name || method_name == "errors".to_sym || super
    end

    def method_missing(method_name, *args, &block)
      return super unless resource_name.to_sym == method_name || "#{resource_name}s".to_sym == method_name || method_name == "errors".to_sym
      members
    end

  private

    def parse_members
      klass = if body.is_a?(Array)
        Montage::Collections.find_class("#{resource_name}s")
      else
        Montage::Resources.find_class(resource_name)
      end

      klass.new(body)
    end
  end
end