module AmazonParser

Public Class Methods

parse(product_hash:) click to toggle source
# File lib/amazonparser.rb, line 6
def parse(product_hash:)
  # 1. convert hash keys to snakecase
  product_hash = product_hash.to_snake_keys

  # 2. convert hash to open struct
  product = RecursiveOpenStruct.new(product_hash, recurse_over_arrays: true)

  # 3. setup basic scopes
  item            = product.item_lookup_response.items.item
  item_attributes = item.item_attributes
  images          = item.image_sets.image_set
  categories      = item.browse_nodes
  main_category   = item.browse_nodes.browse_node
  offer_summary   = item.offer_summary
  offers          = item.offers
  promotions      = item.offers.offer.promotions

  # 4. copy attributes into root struct

  # a. main response groups
  product.item            = item
  product.item_attributes = item_attributes
  product.images          = images
  product.categories      = categories
  product.main_category   = main_category
  product.offer_summary   = offer_summary
  product.offers          = offers
  product.promotions      = promotions

  # b. item
  product.asin        = item.asin
  product.parent_asin = item.parent_asin
  product.sales_rank  = item.sales_rank

  # c. category
  product.category = main_category.is_a?(Array) ? main_category[0].name : main_category.name

  # d. item attributes
  product.actor                   = item_attributes.actor
  product.artist                  = item_attributes.artist
  product.aspect_ratio            = item_attributes.aspect_ratio
  product.audience_rating         = item_attributes.audience_rating
  product.audio_format            = item_attributes.audio_format
  product.author                  = item_attributes.author
  product.brand                   = item_attributes.brand
  product.catalog_number_list     = item_attributes.catalog_number_list
  product.clothing_size           = item_attributes.clothing_size
  product.creator                 = item_attributes.creator
  product.department              = item_attributes.department
  product.director                = item_attributes.director
  product.ean                     = item_attributes.ean
  product.ean_list                = item_attributes.ean_list
  product.edition                 = item_attributes.edition
  product.eisbn                   = item_attributes.eisbn
  product.esrb_age_rating         = item_attributes.esrb_age_rating
  product.feature                 = item_attributes.feature
  product.format                  = item_attributes.format
  product.genre                   = item_attributes.genre
  product.hardware_platform       = item_attributes.hardware_platform
  product.hazardous_material_type = item_attributes.hazardous_material_type
  product.is_adult_product        = to_bool item_attributes.is_adult_product
  product.is_autographed          = to_bool item_attributes.is_autographed
  product.isbn                    = item_attributes.isbn
  product.is_memorabilia          = to_bool item_attributes.is_memorabilia
  product.issues_per_year         = item_attributes.issues_per_year
  product.label                   = item_attributes.label
  product.legal_disclaimer        = item_attributes.legal_disclaimer
  product.list_price              = item_attributes.list_price.amount&.to_i
  product.manufacturer            = item_attributes.manufacturer
  product.max_use_age             = item_attributes.manufacturer_maximum_age
  product.min_use_age             = item_attributes.manufacturer_minimum_age
  product.manufacturer_warranty   = item_attributes.manufacturer_parts_warranty_description
  product.material_type           = item_attributes.material_type
  product.media_type              = item_attributes.media_type
  product.meta_type               = item_attributes.metal_type
  product.model                   = item_attributes.model
  product.mpn                     = item_attributes.mpn
  product.number_of_discs         = item_attributes.number_of_discs&.to_i
  product.number_of_issues        = item_attributes.number_of_issues&.to_i
  product.number_of_items         = item_attributes.number_of_items&.to_i
  product.number_of_pages         = item_attributes.number_of_pages&.to_i
  product.number_of_tracks        = item_attributes.number_of_tracks&.to_i
  product.operating_system        = item_attributes.operating_system
  product.package_quantity        = item_attributes.package_quantity&.to_i
  product.part_number             = item_attributes.part_number
  product.platform                = item_attributes.platform
  product.group                   = item_attributes.product_group
  product.product_type_name       = item_attributes.product_type_name
  product.publication_date        = item_attributes.publication_date
  product.publisher               = item_attributes.publisher
  product.region_code             = item_attributes.region_code
  product.release_date            = item_attributes.release_date
  product.running_time            = item_attributes.running_time
  product.seikodo_product_code    = item_attributes.seikodo_product_code
  product.size                    = item_attributes.size
  product.sku                     = item_attributes.sku
  product.studio                  = item_attributes.studio
  product.subscription_length     = item_attributes.subscription_length
  product.title                   = item_attributes.title
  product.trade_in_value          = item_attributes.trade_in_value
  product.upc                     = item_attributes.upc
  product.upc_list                = item_attributes.upc_list
  product.warranty                = item_attributes.warranty
  product.weee_tax_value          = item_attributes.weee_tax_value

  # e. package size
  product.package_height       = item_attributes.package_dimensions.height.__content__&.to_i
  product.package_height_units = item_attributes.package_dimensions.height.units
  product.package_width        = item_attributes.package_dimensions.width.__content__&.to_i
  product.package_width_units  = item_attributes.package_dimensions.width.units
  product.package_length       = item_attributes.package_dimensions.length.__content__&.to_i
  product.package_length_units = item_attributes.package_dimensions.length.units

  # f. offers
  product.offers_count              = offers.total_offers&.to_i
  product.price                     = offers.offer.dig(:offer_listing, :price, :amount)&.to_i
  product.sale_price                = offers.offer.dig(:offer_listing, :sale_price, :amount)&.to_i
  product.discount                  = offers.offer.dig(:offer_listing, :amount_saved, :amount)&.to_i
  product.percent_discount          = offers.offer.offer_listing.percentage_saved&.to_i
  product.has_super_saver_shipping  = to_bool offers.offer.offer_listing.is_eligible_for_super_saver_shipping
  product.has_prime                 = to_bool offers.offer.offer_listing.is_eligible_for_prime
  product.has_prime_streaming       = to_bool offers.offer.offer_listing.is_eligible_for_prime_free_digital_video
  product.can_be_traded_in          = to_bool offers.offer.offer_listing.is_eligible_for_trade_in
  product.availability              = offers.offer.offer_listing.availability
  product.availability_type         = offers.offer.offer_listing.availability_attributes.availability_type
  product.min_hours_until_available = offers.offer.offer_listing.availability_attributes.minimum_hours&.to_i
  product.max_hours_until_available = offers.offer.offer_listing.availability_attributes.maximum_hours&.to_i

  # g. offer summary
  product.lowest_new_price         = offer_summary.dig(:lowest_new_price, :amount)&.to_i
  product.lowest_used_price        = offer_summary.dig(:lowest_used_price, :amount)&.to_i
  product.lowest_collectibe_price  = offer_summary.dig(:lowest_collectibe_price, :amount)&.to_i
  product.lowest_refurbished_price = offer_summary.dig(:lowest_refurbished_price, :amount)&.to_i
  product.new_count                = offer_summary.total_new&.to_i
  product.used_count               = offer_summary.total_used&.to_i
  product.collectible_count        = offer_summary.total_collectible&.to_i
  product.refurbished_count        = offer_summary.total_refurbished&.to_i

  # h. first promo
  product.promo_category    = promotions&.promotion&.summary&.category
  product.promo_requirement = promotions&.promotion&.summary&.eligibility_requirement_description
  product.promo_benefit     = promotions&.promotion&.summary&.benefit_description
  product.promo_terms       = promotions&.promotion&.summary&.terms_and_conditions

  product
end

Private Class Methods

to_bool(string) click to toggle source
# File lib/amazonparser.rb, line 155
def to_bool(string)
  return nil   if string.nil?
  return true  if string == true  || string == "1"
  return false if string == false || string == "0"
  raise ArgumentError.new("invalid value for Boolean: '#{string}'")
end