class ActiveFacets::ResourceManager

Attributes

memoized_resource_map[RW]
memoized_serializers[RW]
registry[RW]

Public Class Methods

default_resource_mapper(resource_class) click to toggle source

Default resource mapping scheme, can be overrided with config

# File lib/active_facets/resource_manager.rb, line 8
def self.default_resource_mapper(resource_class)
  [].tap do |map|
    until(resource_class.superclass == BasicObject) do
      map << resource_class.name.tableize
      resource_class = resource_class.superclass
    end
  end
end
default_serializer_mapper(resource_class, serializer, type, version, options) click to toggle source

TODO –jdc implement recursive superclass/parentclass lookup Default serializer mapping scheme, can be overrided with config

# File lib/active_facets/resource_manager.rb, line 20
def self.default_serializer_mapper(resource_class, serializer, type, version, options)
  case type
  when :serializer
    [
      'V' + version.to_i.to_s + '::' + resource_class.name.camelcase + '::' + resource_class.name.camelcase + type.to_s.camelcase,
      'V' + version.to_i.to_s + '::' + resource_class.name.camelcase + type.to_s.camelcase,
    ].each { |name|
      klass = name.safe_constantize
      return klass.new if klass.present?
    }
  else
    [
      'V' + version.to_i.to_s + '::' + resource_class.name.camelcase + '::' + serializer + type.to_s.camelcase,
      'V' + version.to_i.to_s + '::' + serializer + type.to_s.camelcase,
    ].find { |name|
      klass = name.safe_constantize
      return klass if klass.present?
    }
  end
end
instance() click to toggle source

Singleton @return [ResourceManager]

# File lib/active_facets/resource_manager.rb, line 44
def self.instance
  @instance ||= new
end
new() click to toggle source

@return [ResourceManager]

# File lib/active_facets/resource_manager.rb, line 102
def initialize
  self.registry = {}
  self.memoized_serializers = {}
  self.memoized_resource_map = {}
end

Public Instance Methods

attribute_serializer_class_for(resource_class, attribute_name, options) click to toggle source

Fetches the attribute serializer registered for the given resource_class @param resource_class [Object] to find attribute serializer class for @param attribute_class_name [String] to find attribute serializer class for @param options [Hash] context @return [AttributeSerializer::Base]

# File lib/active_facets/resource_manager.rb, line 70
def attribute_serializer_class_for(resource_class, attribute_name, options)
  fetch_serializer(resource_class, attribute_name.to_s.camelcase, :attribute_serializer, options)
end
extract_version_from_opts(options) click to toggle source
# File lib/active_facets/resource_manager.rb, line 93
def extract_version_from_opts(options)
  ((options.try(:[], ActiveFacets.opts_key) || {})[ActiveFacets.version_key] || ActiveFacets.default_version).to_f
end
register(resource_class, serializer, namespace = nil) click to toggle source

(Memoized) Associate a serializer with a resource_class @param resource_class [Object] @param serializer [Serializer::Base] @param namespace [String] (TODO –jdc currently unused) @return [Array]

# File lib/active_facets/resource_manager.rb, line 53
def register(resource_class, serializer, namespace = nil)
  registry[resource_class] = [serializer, namespace]
end
resource_class_for(serializer) click to toggle source

Fetches the resource class registered for the serializer @param serializer [Serializer::Base] to find resource class for @return [Object]

# File lib/active_facets/resource_manager.rb, line 77
def resource_class_for(serializer)
  registry.each_pair do |resource_class, entry|
    return resource_class if serializer == entry[0]
  end
  nil
end
resource_map(resource_class) click to toggle source

Fetches the set of filter and field override indexes for resource_class @param resource_class [Object] @return [Array] of string indexes

# File lib/active_facets/resource_manager.rb, line 87
def resource_map(resource_class)
  memoized_resource_map[resource_class] ||= begin
    self.class.resource_mapper.call(resource_class)
  end
end
serializer_for(resource_class, options) click to toggle source

Fetches the serializer registered for the resource_class @param resource_class [Object] to find serializer for @param options [Hash] context @return [Serializer::Base]

# File lib/active_facets/resource_manager.rb, line 61
def serializer_for(resource_class, options)
  fetch_serializer(resource_class, resource_class.name.demodulize.to_s.camelcase, :serializer, options)
end

Private Instance Methods

fetch_serializer(resource_class, serializer, type, options) click to toggle source

Retrieves serializer class from memory or lookup @param resource_class [Class] the class of the resource to serialize @param serializer [String] name of the base_class of the resource to serialize @param type [String] type of serializer to look for (attribute vs. basic, etc.) @param options [Hash] context @return [Class] the first Class successfully described

# File lib/active_facets/resource_manager.rb, line 114
def fetch_serializer(resource_class, serializer, type, options)
  version = extract_version_from_opts(options)
  unless result = self.class.serializer_mapper.call(resource_class, serializer, type, version, options)
    error_message = "Unable to locate serializer for:: " + [resource_class.name, serializer, type, version].to_s
    Rails.logger.debug error_message
    raise ActiveFacets::Errors::LookupError.new(error_message) if ActiveFacets.strict_lookups
  end
  result
end