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
# 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
# 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
# File lib/porridge/factory.rb, line 38 def attribute_extractor(name: nil, callback: nil, &block) custom_extractor(callback || block) || from_name_extractor(name) end
# 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
# File lib/porridge/factory.rb, line 88 def attributes_field_serializer(*names) serializers(*names.map { |name| attribute_field_serializer(name) }) end
# File lib/porridge/factory.rb, line 49 def belongs_to_extractor(...) association_extractor(...) end
# File lib/porridge/factory.rb, line 97 def belongs_to_field_serializer(...) association_field_serializer(...) end
# File lib/porridge/factory.rb, line 64 def chain_serializer(*bases) serializer ChainSerializer.new(*bases) end
# File lib/porridge/factory.rb, line 34 def custom_extractor(callback) extractor callback end
# File lib/porridge/factory.rb, line 23 def extractor(base) return nil if base.nil? Extractor.ensure_valid!(base) base end
# File lib/porridge/factory.rb, line 80 def field_serializer(name, extractor) serializer FieldSerializer.new(name, extractor) end
# File lib/porridge/factory.rb, line 72 def for_extracted_serializer(serializer, extractor) serializer SerializerForExtracted.new(serializer, extractor) end
# File lib/porridge/factory.rb, line 30 def from_name_extractor(name) extractor SendExtractor.new(name) end
# File lib/porridge/factory.rb, line 53 def has_many_extractor(...) # rubocop:disable Naming/PredicateName association_extractor(...) end
# File lib/porridge/factory.rb, line 101 def has_many_field_serializer(...) # rubocop:disable Naming/PredicateName association_field_serializer(...) end
# File lib/porridge/factory.rb, line 57 def serializer(base) return nil if base.nil? Serializer.ensure_valid!(base) base end
# File lib/porridge/factory.rb, line 76 def serializer_for_extracted(...) for_extracted_serializer(...) end
# File lib/porridge/factory.rb, line 68 def serializers(...) chain_serializer(...) end