class Porridge::Factory

{Factory} is a class that is capable of instantiating various porridge serializers and extractors. All extractor- creation methods are suffixed with _extractor, all serializer-creation methods are suffixed with _serializer, and all field serializer-creation methods are suffixed with _field_serializer.

You may subclass this class if you wish to change its behavior. For example, if you wished to substitute your own “from name” extractor, that accesses a hash value rather than sends a method call, for the default one:

class CustomPorridgeFactory < Porridge::Factory
  def from_name_extractor(name)
    extractor HashValueExtractor.new(name)
  end
end

{#from_name_field_serializer}, {#attribute_extractor}, and {#attribute_field_serializer} would then be automatically updated in the process, along with any other methods that depend on the aforementioned ones.

This method is rarely used directly. Typically, it is used in conjunction with a {SerializerDefiner} and/or {SerializerDefinition} instance.

Public Instance Methods

association_extractor(serializer:, extractor: nil, extraction_name: nil, callback: nil, &block) click to toggle source
# File lib/porridge/factory.rb, line 42
def association_extractor(serializer:, extractor: nil, extraction_name: nil, callback: nil, &block)
  extractor SerializingExtractor.new(
    extractor || attribute_extractor(name: extraction_name, callback: callback, &block),
    serializer
  )
end
association_field_serializer(name, options = {}, &block) click to toggle source
# File lib/porridge/factory.rb, line 92
def association_field_serializer(name, options = {}, &block)
  options[:extraction_name] ||= name
  field_serializer(name, association_extractor(**options, &block))
end
attribute_extractor(name: nil, callback: nil, &block) click to toggle source
# File lib/porridge/factory.rb, line 38
def attribute_extractor(name: nil, callback: nil, &block)
  custom_extractor(callback || block) || from_name_extractor(name)
end
attribute_field_serializer(name, callback = nil, extraction_name: nil, &block) click to toggle source
# File lib/porridge/factory.rb, line 84
def attribute_field_serializer(name, callback = nil, extraction_name: nil, &block)
  field_serializer(name, attribute_extractor(name: extraction_name || name, callback: callback, &block))
end
attributes_field_serializer(*names) click to toggle source
# File lib/porridge/factory.rb, line 88
def attributes_field_serializer(*names)
  serializers(*names.map { |name| attribute_field_serializer(name) })
end
belongs_to_extractor(...) click to toggle source
# File lib/porridge/factory.rb, line 49
def belongs_to_extractor(...)
  association_extractor(...)
end
belongs_to_field_serializer(...) click to toggle source
# File lib/porridge/factory.rb, line 97
def belongs_to_field_serializer(...)
  association_field_serializer(...)
end
chain_serializer(*bases) click to toggle source
# File lib/porridge/factory.rb, line 64
def chain_serializer(*bases)
  serializer ChainSerializer.new(*bases)
end
custom_extractor(callback) click to toggle source
# File lib/porridge/factory.rb, line 34
def custom_extractor(callback)
  extractor callback
end
extractor(base) click to toggle source
# File lib/porridge/factory.rb, line 23
def extractor(base)
  return nil if base.nil?

  Extractor.ensure_valid!(base)
  base
end
field_serializer(name, extractor) click to toggle source
# File lib/porridge/factory.rb, line 80
def field_serializer(name, extractor)
  serializer FieldSerializer.new(name, extractor)
end
for_extracted_serializer(serializer, extractor) click to toggle source
# File lib/porridge/factory.rb, line 72
def for_extracted_serializer(serializer, extractor)
  serializer SerializerForExtracted.new(serializer, extractor)
end
from_name_extractor(name) click to toggle source
# File lib/porridge/factory.rb, line 30
def from_name_extractor(name)
  extractor SendExtractor.new(name)
end
has_many_extractor(...) click to toggle source
# File lib/porridge/factory.rb, line 53
def has_many_extractor(...) # rubocop:disable Naming/PredicateName
  association_extractor(...)
end
has_many_field_serializer(...) click to toggle source
# File lib/porridge/factory.rb, line 101
def has_many_field_serializer(...) # rubocop:disable Naming/PredicateName
  association_field_serializer(...)
end
serializer(base) click to toggle source
# File lib/porridge/factory.rb, line 57
def serializer(base)
  return nil if base.nil?

  Serializer.ensure_valid!(base)
  base
end
serializer_for_extracted(...) click to toggle source
# File lib/porridge/factory.rb, line 76
def serializer_for_extracted(...)
  for_extracted_serializer(...)
end
serializers(...) click to toggle source
# File lib/porridge/factory.rb, line 68
def serializers(...)
  chain_serializer(...)
end