Class: Ramazon::Product

Inherits:
Object
  • Object
show all
Includes:
HappyMapper, AbstractElement
Defined in:
lib/ramazon/product.rb

Overview

Find and get product details with this class Currently supports the following accessors (all other elements can be accessed via nokogiri selectors and the get method)

asin

Amazon Identifier

upc

UPC ID

title

Title of the product

product_group

The category/product_group of the product

manufacturer

The manufacturer of the product

brand

The brand of the product

url

The Amazon URL of the product

small_image

The small image that Amazon provides (NOTE: Returns Ramazon::Image object)

medium_image

The medium image that Amazon provides (NOTE: Returns Ramazon::Image object)

large_image

The large image that Amazon provides (NOTE: Returns Ramazon::Image object)

list_price

The list price of the item (NOTE: Returns Ramazon::Price object)

lowest_new_price

The lowest new price from the offer summary (NOTE: Returns Ramazon::Price object)

sales_rank

The sales rank of the product

new_count

The quantity of new item offers

used_count

The quantity of used item offers

collectible_count

The quantity of collectible item offers

refurbished_count

The quantity of refurbished item offers

release_date

The release date of the product

original_release_date

The original release date of the product

offers

The collection of offers available for the given product

Examples:

find an individual item

@products = Ramazon::Product.find(:item_id => "B000NU2CY4", :response_group => "Medium")
@products[0].title
@products[0].asin
@products[0].upc
@products[0].large_image.url
@products[0].url

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from AbstractElement

included

Instance Attribute Details

#xml_docObject

Returns the value of attribute xml_doc.



128
129
130
# File 'lib/ramazon/product.rb', line 128

def xml_doc
  @xml_doc
end

Class Method Details

.find(*args) ⇒ Array

Creates the worker that performs the delta indexing (ie. passing the :response_group option will be converted to “ResponseGroup”) :item_id - the ASIN or UPC you’re looking for

Parameters:

  • options

    Amazon request options (you can use an underscore convention)

Returns:

  • (Array)

    array of Ramazon::Product objects



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ramazon/product.rb', line 91

def self.find(*args)
  options = args.extract_options!
  if options[:item_id]
    item_lookup(options[:item_id], options)
  else
    options[:operation] ||= "ItemSearch"
    options[:search_index] ||= "Blended"
    options[:item_page] ||= 1
    res = Ramazon::Request.new(options).submit
    Ramazon::ProductCollection.create_from_results(options[:item_page] || 1, 10, res)
  end
end

.item_lookup(item_id, options = {}) ⇒ Object

Performs an item lookup

Parameters:

  • item_id

    the ASIN or UPC you’re looking for



107
108
109
110
111
112
113
# File 'lib/ramazon/product.rb', line 107

def self.item_lookup(item_id, options = {})
  req = Ramazon::Request.new({:item_id => item_id, 
    :operation => "ItemLookup"}.merge(options))
  res = req.submit

  Ramazon::ProductCollection.create_from_results(1,1,res)
end

.offer_pages_for(product) ⇒ Object

gets the number of offer pages for the specified product



196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/ramazon/product.rb', line 196

def self.offer_pages_for(product)
  if !@offer_pages 
    offer_page_tags = product.get("//Offers/TotalOfferPages")
    if offer_page_tags.size > 0
      offer_pages = offer_page_tags[0].content.to_i
    else
      offer_pages = 1
    end
  end

  offer_pages
end

.parse(xml, options = {}) ⇒ Object



129
130
131
132
133
134
135
136
# File 'lib/ramazon/product.rb', line 129

def self.parse(xml, options = {})
  node = XML::Parser.string(xml.to_s).parse.root
  node.find("//Item").collect do |n|
    p = super(n.to_s)
    p.xml_doc = Nokogiri::XML.parse(n.to_s)
    p
  end
end

Instance Method Details

#category_treeObject

returns a hash of category browse nodes from the top down



148
149
150
151
152
153
154
# File 'lib/ramazon/product.rb', line 148

def category_tree
  @category_tree = {}
  get_category_browse_nodes.each do |n|
    build_category_tree(n)
  end
  @category_tree
end

#get(*args) ⇒ Object

perform a nokogiri search on the product’s XML

Examples:

find the actor

@product = Ramazon::Product.find(:item_id => "B000NU2CY4", :response_group => "Medium")[0]
@product.get("ItemAttributes Actor").collect{|a| a.content}

Parameters:

  • args

    Passes directly to a Nokogiri::Xml.parse(xml).search method



143
144
145
# File 'lib/ramazon/product.rb', line 143

def get(*args)
  result = @xml_doc.search(args)
end

#imagesHash

assembles the available images for the object

Returns:

  • (Hash)

    hash of symbolized image_name => Ramazon::Image pairs



117
118
119
120
121
122
123
124
125
126
# File 'lib/ramazon/product.rb', line 117

def images
  if !@images
    @images = {}
    @images[:thumb] = self.thumb_image if self.thumb_image
    @images[:tiny_image] = self.tiny_image if self.tiny_image
    @images[:small] = self.small_image if self.small_image   
    @images[:medium] = self.medium_image if self.medium_image
    @images[:large] = self.large_image if self.large_image
  end
end

#lowest_offersHash

get the lowest offers broken down by subcondition

Returns:

  • (Hash)

    a nested hash of prices ie [“new”] => Ramazon::Offer



211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/ramazon/product.rb', line 211

def lowest_offers
  if @lowest_offers.nil?
    @lowest_offers = {}
    offers_by_condition.each do |condition, sub_conditions|
      @lowest_offers[condition] = {}
      sub_conditions.each do |sub_condition, col|
        sorted_offers = col.sort{|a,b| a.price.amount.to_i <=> b.price.amount.to_i}
        @lowest_offers[condition][sub_condition] = sorted_offers.first
      end
    end
  end

  @lowest_offers
end

#offer_page(page = 1) ⇒ Array

get offers from a given page

Parameters:

  • page (Integer) (defaults to: 1)

    the page number you want to get

Returns:

  • (Array)

    Array of Offers returned from the page



237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/ramazon/product.rb', line 237

def offer_page(page = 1)
  #get all offers
  products = self.class.find(:item_id => self.asin, 
    :response_group => "OfferListings",
    :merchant_id => "All",
    :condition => "All",
    :offer_page => page)

  if products
    product = products[0] 
    self.offer_pages = self.class.offer_pages_for(product)
    product.offers
  else
    []
  end
end

#offer_pagesObject



230
231
232
# File 'lib/ramazon/product.rb', line 230

def offer_pages
  @offer_pages
end

#offer_pages=(pages) ⇒ Object



226
227
228
# File 'lib/ramazon/product.rb', line 226

def offer_pages=(pages)
  @offer_pages = pages.to_i
end

#offers_by_conditionHash

breaks down all the offers in a nested hash of [condition] note: this will load ALL offers into memory

Returns:

  • (Hash)

    a nest hash of offers [condition] => Array of Ramazon::Offer objects



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/ramazon/product.rb', line 173

def offers_by_condition
  @offer_hash = {}
  offer_page = 1
  
  
  offers = offer_page(offer_page)
  while offer_page <= offer_pages
    offers.each do |o|
      @offer_hash[o.condition.downcase] ||= {}
      @offer_hash[o.condition.downcase][o.sub_condition] ||= []
      @offer_hash[o.condition.downcase][o.sub_condition] << o
    end

    offer_page += 1
    offers = offer_page(offer_page)
  end

  @offer_hash
end

#used_offersObject

a sorted list of used offers



157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/ramazon/product.rb', line 157

def used_offers
  if @used_offers.nil?
    @used_offers = []
    self.offers.each do |o|
      if o.condition.downcase == "used"
        @used_offers << o
      end
    end
    @used_offers.sort!{|a,b| a.price.amount <=> b.price.amount}
  end
  @used_offers
end