module ActiveModel::Serializer::Caching::ClassMethods

def _attributes_keys

Other tags:
    See: Serializer::fragmented_attributes -
    See: Serializer::attribute -

Other tags:
    Api: - private
def _attributes_keys
  _attributes_data
    .each_with_object({}) do |(key, attr), hash|
    next if key == attr.name
    hash[attr.name] = { key: key }
  end
end

def _cache_digest

def _cache_digest
  return @_cache_digest if defined?(@_cache_digest)
  @_cache_digest = digest_caller_file(_cache_digest_file_path)
end

def _skip_digest?

def _skip_digest?
  _cache_options && _cache_options[:skip_digest]
end

def cache(options = {})

Other tags:
    Todo: - require less code comments. See

Parameters:
  • options (Hash) -- with valid keys:
def cache(options = {})
  self._cache =
    options.delete(:cache_store) ||
    ActiveModelSerializers.config.cache_store ||
    ActiveSupport::Cache.lookup_store(:null_store)
  self._cache_key = options.delete(:key)
  self._cache_only = options.delete(:only)
  self._cache_except = options.delete(:except)
  self._cache_options = options.empty? ? nil : options
end

def cache_enabled?

def cache_enabled?
  perform_caching? && cache_store && !_cache_only && !_cache_except
end

def cache_read_multi(collection_serializer, adapter_instance, include_directive)

Returns:
  • (Hash) -
def cache_read_multi(collection_serializer, adapter_instance, include_directive)
  return {} if ActiveModelSerializers.config.cache_store.blank?
  keys = object_cache_keys(collection_serializer, adapter_instance, include_directive)
  return {} if keys.blank?
  ActiveModelSerializers.config.cache_store.read_multi(*keys)
end

def cache_store

Returns:
  • (nil) - when _cache is the NullStore and ActiveModelSerializers.config.cache_store is nil.
  • (ActiveModelSerializers.config.cache_store) - when _cache is the NullStore.
  • (._cache) - when _cache is not the NullStore
  • (nil) - when _cache is not set (i.e. when `cache` has not been called)
def cache_store
  return nil if _cache.nil?
  return _cache if _cache.class != ActiveSupport::Cache::NullStore
  if ActiveModelSerializers.config.cache_store
    self._cache = ActiveModelSerializers.config.cache_store
  else
    nil
  end
end

def digest_caller_file(caller_line)

Hashes contents of file for +_cache_digest+
def digest_caller_file(caller_line)
  serializer_file_path = caller_line[CALLER_FILE]
  serializer_file_contents = IO.read(serializer_file_path)
  Digest::MD5.hexdigest(serializer_file_contents)
rescue TypeError, Errno::ENOENT
  warn <<-EOF.strip_heredoc
    Cannot digest non-existent file: '#{caller_line}'.
    Please set `::_cache_digest` of the serializer
    if you'd like to cache it.
    EOF
  ''.freeze
end

def fragment_cache_enabled?

def fragment_cache_enabled?
  perform_caching? && cache_store &&
    (_cache_only && !_cache_except || !_cache_only && _cache_except)
end

def fragmented_attributes

def fragmented_attributes
  cached = _cache_only ? _cache_only : _attributes - _cache_except
  cached = cached.map! { |field| _attributes_keys.fetch(field, field) }
  non_cached = _attributes - cached
  non_cached = non_cached.map! { |field| _attributes_keys.fetch(field, field) }
  {
    cached: cached,
    non_cached: non_cached
  }
end

def inherited(base)

def inherited(base)
  caller_line = caller[1]
  base._cache_digest_file_path = caller_line
  super
end

def object_cache_key(serializer, adapter_instance)

Returns:
  • (String, nil) - the cache_key of the serializer or nil
def object_cache_key(serializer, adapter_instance)
  return unless serializer.present? && serializer.object.present?
  (serializer.class.cache_enabled? || serializer.class.fragment_cache_enabled?) ? serializer.cache_key(adapter_instance) : nil
end

def object_cache_keys(collection_serializer, adapter_instance, include_directive)

Returns:
  • (Array) - all cache_key of collection_serializer

Parameters:
  • include_directive (JSONAPI::IncludeDirective) --
  • adapter_instance (ActiveModelSerializers::Adapter::Base) --
  • serializers (ActiveModel::Serializer::CollectionSerializer) --
def object_cache_keys(collection_serializer, adapter_instance, include_directive)
  cache_keys = []
  collection_serializer.each do |serializer|
    cache_keys << object_cache_key(serializer, adapter_instance)
    serializer.associations(include_directive).each do |association|
      # TODO(BF): Process relationship without evaluating lazy_association
      association_serializer = association.lazy_association.serializer
      if association_serializer.respond_to?(:each)
        association_serializer.each do |sub_serializer|
          cache_keys << object_cache_key(sub_serializer, adapter_instance)
        end
      else
        cache_keys << object_cache_key(association_serializer, adapter_instance)
      end
    end
  end
  cache_keys.compact.uniq
end

def perform_caching

Returns:
  • (true, false) -
def perform_caching
  return @@perform_caching if defined?(@@perform_caching) && !@@perform_caching.nil?
  @@perform_caching = ActiveModelSerializers.config.perform_caching
end