lib/munson.rb
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