module Scripper::Sequel::ModelStripper

Public Class Methods

strip(object, with_associations: nil, with_attributes: nil) click to toggle source
# File lib/scripper/sequel/model_stripper.rb, line 7
def strip(object, with_associations: nil, with_attributes: nil)
  association_fields = build_association_fields(object, with_associations)
  attribute_fields = build_attribute_fields(object, with_attributes)

  attrs = {
    **convert_values(object.values),
    **association_fields,
    **attribute_fields,
  }

  struct_klass = Struct.new(*attrs.keys)
  struct_klass.new(*attrs.values)
end

Private Class Methods

build_association_fields(object, associations) click to toggle source
# File lib/scripper/sequel/model_stripper.rb, line 23
def build_association_fields(object, associations)
  return {} if associations.nil?

  if associations.is_a?(Array)
    build_association_fields_from_array(object, associations)
  else # consider associations a hash
    build_association_fields_from_hash(object, associations)
  end
end
build_association_fields_from_array(object, associations) click to toggle source
# File lib/scripper/sequel/model_stripper.rb, line 43
def build_association_fields_from_array(object, associations)
  associations.reduce({}) do |acc, association|
    association_value = object.public_send(association)
    stripped_association_value =
      if association_value.is_a?(Array)
        association_value.map { |obj| strip(obj) }
      else
        strip(association_value)
      end

    acc.merge(association.to_sym => stripped_association_value)
  end
end
build_association_fields_from_hash(object, associations) click to toggle source
# File lib/scripper/sequel/model_stripper.rb, line 57
def build_association_fields_from_hash(object, associations)
  associations.entries.reduce({}) do |acc, (association, condition)|
    association_ds = object.class.association_reflection(association).associated_dataset

    acc.merge(
      association.to_sym => condition.call(association_ds).all.map { |obj| strip(obj) },
    )
  end
end
build_attribute_fields(object, attributes) click to toggle source
# File lib/scripper/sequel/model_stripper.rb, line 33
def build_attribute_fields(object, attributes)
  return {} if attributes.nil?

  convert_values(attributes)
end
convert_values(hsh) click to toggle source
# File lib/scripper/sequel/model_stripper.rb, line 39
def convert_values(hsh)
  hsh.transform_values { |v| ValueConverter.convert_value(v) }
end