lib/goodwill/auction.rb in goodwill-0.3.0 vs lib/goodwill/auction.rb in goodwill-0.4.0
- old
+ new
@@ -1,5 +1,7 @@
+# frozen_string_literal: true
+
require 'mechanize'
require 'goodwill/csspaths'
require 'goodwill/urlpaths'
require 'goodwill/mechanize'
@@ -11,56 +13,77 @@
class Auction
include Goodwill::Mechanize
include CSSPaths
include URLPaths
+ attr_reader :item_page
+
attr_reader :bids
attr_reader :current
attr_reader :end
attr_reader :href
attr_reader :item
attr_reader :itemid
attr_reader :seller
attr_reader :shipping
+ attr_reader :type
- def initialize(itemid, zipcode = '97222', state = 'OR', country = 'United States')
+ def initialize(itemid, zipcode = '97222', state = 'OR', country = 'US')
@itemid = itemid
@zipcode = zipcode
@state = state
@country = country
@href = ITEM_SEARCH_URL + itemid.to_s
- item_page = mechanize.get(@href)
+ @item_page = mechanize.get(@href)
+
+ @type = parse_type
@bids = item_page.search(BIDS_PATH).text[/\d+/].to_i
@current = item_page.search(CURRENT_PRICE_PATH).text.tr('$', '').to_f
- @end = DateTime.strptime(item_page.search(END_TIME_PATH).text, '%m/%d/%Y %l:%M:%S %p %Z')
+ @end = parse_end_time
@item = item_page.search(ITEM_TITLE_PATH).text
@seller = item_page.search(SELLER_PATH).text
@bidding = false
- @shipping = calculate_shipping(@itemid, @zipcode, @state, @country)
+ @shipping = calculate_shipping(@itemid, @zipcode, @country)
end
def ==(other)
itemid == other.itemid
end
def to_hash
hash = {}
instance_variables.each do |var|
- if var == :@end
- hash[var.to_s.delete('@')] = instance_variable_get(var).to_s
- else
- hash[var.to_s.delete('@')] = instance_variable_get(var)
- end
+ next if var == :@item_page
+
+ hash[var.to_s.delete('@')] = if var == :@end
+ instance_variable_get(var).to_s
+ else
+ instance_variable_get(var)
+ end
end
hash
end
private
- def calculate_shipping(itemid, zipcode, state, country)
- params = "?itemid=#{itemid}&zip=#{zipcode}&state=#{state}&country=#{country}"
+ def calculate_shipping(itemid, zipcode, country)
+ params = "?ZipCode=#{zipcode}&Country=#{country}&ItemId=#{itemid}&Quantity=1&_=#{DateTime.now.strftime('%s')}"
page = mechanize.get(SHIPPING_URL + params)
- page.search(SHIPPING_PATH).text.tr('$', '').to_f
+ page.search(SHIPPING_PATH).text.split(': ').last.tr('$', '').to_f
+ end
+
+ def parse_end_time
+ search_path = type == :auction ? END_TIME_PATH : BIN_END_TIME_PATH
+ time = item_page.search(search_path).text.split(': ')[1]
+ return nil if time.nil?
+
+ DateTime.strptime(time, '%m/%d/%Y %l:%M:%S %p %Z')
+ rescue Date::Error
+ nil
+ end
+
+ def parse_type
+ item_page.search(BUY_IT_NOW_PATH).empty? ? :auction : :buyitnow
end
end
end