lib/scripper/sequel/model_stripper.rb in scripper-0.1.0 vs lib/scripper/sequel/model_stripper.rb in scripper-0.1.1

- old
+ new

@@ -1,63 +1,69 @@ -# frozen_string_literal: true - -module Scripper - module Sequel - module ModelStripper - class << self - 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 - - 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 - - def build_attribute_fields(object, attributes) - return {} if attributes.nil? - - convert_values(attributes) - end - - def convert_values(hsh) - hsh.transform_values { |v| ValueConverter.convert_value(v) } - end - - def build_association_fields_from_array(object, associations) - associations.reduce({}) do |acc, association| - acc.merge( - association.to_sym => object.public_send(association).map { |obj| strip(obj) }, - ) - end - end - - 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 - end - end - end -end +# frozen_string_literal: true + +module Scripper + module Sequel + module ModelStripper + class << self + 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 + + 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 + + def build_attribute_fields(object, attributes) + return {} if attributes.nil? + + convert_values(attributes) + end + + def convert_values(hsh) + hsh.transform_values { |v| ValueConverter.convert_value(v) } + end + + 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 + + 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 + end + end + end +end