coryodaniel/munson

View on GitHub
lib/munson.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'json'
require 'cgi'
require 'faraday'
require 'faraday_middleware'
require 'bigdecimal'

require "munson/version"
require 'munson/agent'
require 'munson/attribute'
require "munson/client"
require 'munson/collection'
require 'munson/connection'
require 'munson/document'
require 'munson/key_formatter'
require "munson/middleware/encode_json_api"
require "munson/middleware/json_parser"
require 'munson/resource'
require 'munson/response_mapper'
require 'munson/query'

module Munson
  class Error < StandardError; end;
  class UnsupportedSortDirectionError < Munson::Error; end;
  class UnrecognizedKeyFormatter < Munson::Error; end;
  class RelationshipNotIncludedError < Munson::Error; end;
  class RelationshipNotFound < Munson::Error; end;
  class ClientNotSet < Munson::Error; end;
  @registered_types = {}

  class << self
    # Transforms a JSONAPI hash into a Munson::Document, Munson::Resource, or arbitrary class
    # @param [Munson::Document,Hash] document to transform
    # @return [Munson::Document,~Munson::Resource]
    def factory(document)
      document = Munson::Document.new(document) if document.is_a?(Hash)
      klass    = Munson.lookup_type(document.type)

      if klass && klass.respond_to?(:munson_initializer)
        klass.munson_initializer(document)
      else
        document
      end
    end

    # Configure the default connection.
    #
    # @param [Hash] opts {Munson::Connection} configuration options
    # @param [Proc] block to yield to Faraday::Connection
    # @return [Munson::Connection] the default connection

    # @see https://github.com/lostisland/faraday/blob/master/lib/faraday/connection.rb Faraday::Connection
    # @see Munson::Connection
    def configure(opts={}, &block)
      @default_connection = Munson::Connection.new(opts, &block)
    end

    # The default connection
    #
    # @return [Munson::Connection, nil] the default connection if configured
    def default_connection
      defined?(@default_connection) ? @default_connection : nil
    end

    # Register a JSON Spec resource type to a class
    # This is used in Faraday response middleware to package the JSON into a domain model
    #
    # @example Mapping a type
    #   Munson.register_type("addresses", Address)
    #
    # @param [#to_sym] type JSON Spec type
    # @param [Class] klass to map to
    def register_type(type, klass)
      @registered_types[type.to_sym] = klass
    end

    # Lookup a class by JSON Spec type name
    #
    # @param [#to_sym] type JSON Spec type
    # @return [Class] domain model
    def lookup_type(type)
      @registered_types[type.to_sym]
    end
  end
end