Class: Edi::Wayfair::ListingGenerator::Attributes::AttributeFactory

Inherits:
Object
  • Object
show all
Defined in:
app/services/edi/wayfair/listing_generator/attributes/attribute_factory.rb

Overview

Factory for creating Wayfair attribute mappers
Similar to Amazon's AttributeFactory, dynamically loads attribute classes

Class Method Summary collapse

Class Method Details

.attributes_availableArray<String>

Get all available attribute mapper names

Returns:

  • (Array<String>)

    Sorted list of attribute names



37
38
39
40
41
42
43
44
45
46
47
# File 'app/services/edi/wayfair/listing_generator/attributes/attribute_factory.rb', line 37

def attributes_available
  Edi::Wayfair::ListingGenerator::Attributes.constants.filter_map do |const|
    klass = Edi::Wayfair::ListingGenerator::Attributes.const_get(const)
    next unless klass.is_a?(Class) && klass < BaseAttribute

    attribute_name = const.to_s.underscore
    next if attribute_name.start_with?('base_')

    attribute_name
  end.sort
end

.attributes_by_taxonomy_idHash<String, Class>

Get all attribute classes with their taxonomy IDs

Returns:

  • (Hash<String, Class>)

    Map of taxonomy_attribute_id to class



51
52
53
54
55
56
57
58
59
60
61
# File 'app/services/edi/wayfair/listing_generator/attributes/attribute_factory.rb', line 51

def attributes_by_taxonomy_id
  @attributes_by_taxonomy_id ||= begin
    Edi::Wayfair::ListingGenerator::Attributes.constants.each_with_object({}) do |const, hash|
      klass = Edi::Wayfair::ListingGenerator::Attributes.const_get(const)
      next unless klass.is_a?(Class) && klass < BaseAttribute

      id = klass.taxonomy_attribute_id
      hash[id.to_s] = klass if id.present?
    end
  end
end

.build(attribute_name, catalog_item:, wayfair_schema: nil) ⇒ BaseAttribute

Build an attribute mapper by name

Parameters:

  • attribute_name (String, Symbol)

    The attribute name (e.g., :wattage, :fuel_type)

  • catalog_item (CatalogItem)

    The catalog item to map

  • wayfair_schema (WayfairSchema) (defaults to: nil)

    Optional schema (will be fetched if not provided)

Returns:



13
14
15
16
17
18
19
# File 'app/services/edi/wayfair/listing_generator/attributes/attribute_factory.rb', line 13

def build(attribute_name, catalog_item:, wayfair_schema: nil)
  attribute_class = constantize_attribute(attribute_name)
  attribute_class.new(
    catalog_item: catalog_item,
    wayfair_schema: wayfair_schema
  )
end

.build_by_id(taxonomy_attribute_id, catalog_item:, wayfair_schema: nil) ⇒ BaseAttribute?

Build an attribute mapper by taxonomy attribute ID

Parameters:

  • taxonomy_attribute_id (String, Integer)

    The Wayfair taxonomy attribute ID

  • catalog_item (CatalogItem)

    The catalog item to map

  • wayfair_schema (WayfairSchema) (defaults to: nil)

    Optional schema

Returns:

  • (BaseAttribute, nil)

    The attribute mapper or nil if not found



26
27
28
29
30
31
32
33
# File 'app/services/edi/wayfair/listing_generator/attributes/attribute_factory.rb', line 26

def build_by_id(taxonomy_attribute_id, catalog_item:, wayfair_schema: nil)
  attribute_name = id_to_attribute_name(taxonomy_attribute_id.to_s)
  return nil unless attribute_name

  build(attribute_name, catalog_item: catalog_item, wayfair_schema: wayfair_schema)
rescue NameError
  nil
end

.reset_cache!Object

Clear the cached mapping (useful after loading new attributes)



64
65
66
# File 'app/services/edi/wayfair/listing_generator/attributes/attribute_factory.rb', line 64

def reset_cache!
  @attributes_by_taxonomy_id = nil
end