tipsanity_merchant_extractor 0.0.4.alpha → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +1 -1
- data/Gemfile +1 -1
- data/lib/tipsanity_merchant_extractor.rb +22 -107
- data/lib/tipsanity_merchant_extractor/1800lighting.rb +28 -0
- data/lib/tipsanity_merchant_extractor/amazon.rb +82 -0
- data/lib/tipsanity_merchant_extractor/attribute_extractor.rb +72 -0
- data/lib/tipsanity_merchant_extractor/best_buy.rb +28 -0
- data/lib/tipsanity_merchant_extractor/cj.rb +48 -0
- data/lib/tipsanity_merchant_extractor/linkshare.rb +30 -0
- data/lib/tipsanity_merchant_extractor/rakuten.rb +54 -0
- data/lib/tipsanity_merchant_extractor/registered_merchant_list.rb +21 -0
- data/lib/tipsanity_merchant_extractor/url_formatter.rb +25 -0
- data/lib/tipsanity_merchant_extractor/version.rb +1 -1
- data/spec/tipsanity_url_formatter_spec.rb +59 -14
- data/tipsanity_merchant_extractor.gemspec +5 -0
- metadata +79 -15
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -1,115 +1,30 @@
|
|
1
1
|
require "tipsanity_merchant_extractor/version"
|
2
|
-
require 'uri'
|
3
|
-
|
4
|
-
|
2
|
+
require 'open-uri'
|
3
|
+
require 'nori'
|
4
|
+
require 'nokogiri'
|
5
5
|
|
6
6
|
module TipsanityMerchantExtractor
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
7
|
+
autoload :UrlFormatter, 'tipsanity_merchant_extractor/url_formatter'
|
8
|
+
autoload :AttributeExtractor, 'tipsanity_merchant_extractor/attribute_extractor'
|
9
|
+
autoload :Amazon, 'tipsanity_merchant_extractor/amazon'
|
10
|
+
autoload :RegisteredMerchantList, 'tipsanity_merchant_extractor/registered_merchant_list'
|
11
|
+
autoload :LinkShare, 'tipsanity_merchant_extractor/linkshare'
|
12
|
+
autoload :Cj, 'tipsanity_merchant_extractor/cj'
|
13
|
+
autoload :Rakuten, 'tipsanity_merchant_extractor/rakuten'
|
14
|
+
autoload :BestBuy, 'tipsanity_merchant_extractor/best_buy'
|
15
|
+
autoload :OneEightThousandLighting,'tipsanity_merchant_extractor/1800lighting'
|
18
16
|
|
19
|
-
|
20
|
-
/http:|https:/ #[http:|https:] means that any of the charactor inside [] is matching.
|
21
|
-
end
|
17
|
+
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
19
|
+
class Array
|
20
|
+
def extract_options!
|
21
|
+
if last.is_a?(::Hash)# && last.extractable_options?
|
22
|
+
pop
|
23
|
+
else
|
24
|
+
{}
|
30
25
|
end
|
31
26
|
end
|
32
|
-
|
33
|
-
|
34
|
-
include UrlFormatter
|
35
|
-
attr_accessor :merchant_url,
|
36
|
-
:host_provider,
|
37
|
-
:product_name,
|
38
|
-
:description,
|
39
|
-
:final_price,
|
40
|
-
:list_price,
|
41
|
-
:expiry_date,
|
42
|
-
:currency_code,
|
43
|
-
:image_url,
|
44
|
-
:details_url,
|
45
|
-
:is_dp
|
46
|
-
|
47
|
-
def initialize merchant_url
|
48
|
-
@merchant_url = UrlFormatter.format_url merchant_url
|
49
|
-
@host_provider = URI(@merchant_url).host
|
50
|
-
|
51
|
-
case who_is_merchant
|
52
|
-
when REGISTERED_MERCHANT[:amazon]
|
53
|
-
client = ASIN::Client.instance
|
54
|
-
product = client.lookup filtered_asin_from_amazon_path
|
55
|
-
@product_name = product.first.title
|
56
|
-
filtered_asin_from_amazon_path{|is_dp| is_dp == false} ? @description = product.first.review : @description = product.first.raw.EditorialReviews.EditorialReview.first.Content
|
57
|
-
@list_price = product.first.amount.to_f/100 || product.first.raw.ItemAttributes.ListPrice.Amount.to_f/100
|
58
|
-
@currency_code = product.first.raw.ItemAttributes.ListPrice.CurrencyCode
|
59
|
-
@expiry_date = Date.today
|
60
|
-
@image_url = product.first.image_url || product.first.raw.ImageSets.ImageSet.LargeImage.URL
|
61
|
-
@details_url = product.first.details_url
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def who_is_merchant
|
67
|
-
case @host_provider
|
68
|
-
when is_merchant_amazon?
|
69
|
-
REGISTERED_MERCHANT[:amazon]
|
70
|
-
when "www.commissionjunction.com"
|
71
|
-
"commissionjunction"
|
72
|
-
else
|
73
|
-
"this merchant is not registered with system"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def is_merchant_amazon?
|
78
|
-
if @host_provider == REGISTERED_MERCHANT[:amazon]
|
79
|
-
block_given? ? true : @host_provider
|
80
|
-
else
|
81
|
-
false
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def merchant_amazon_path
|
86
|
-
if is_merchant_amazon?{}
|
87
|
-
path = URI(@merchant_url).path
|
88
|
-
else
|
89
|
-
"It is not amazon merchant"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def filtered_asin_from_amazon_path
|
94
|
-
split_path = merchant_amazon_path.split('/')
|
95
|
-
if split_path.include? 'gp'
|
96
|
-
if block_given?
|
97
|
-
@is_dp = false
|
98
|
-
yield @is_dp
|
99
|
-
else
|
100
|
-
asin = split_path[split_path.index('gp')+2]
|
101
|
-
end
|
102
|
-
elsif split_path.include? 'dp'
|
103
|
-
if block_given?
|
104
|
-
@is_dp = true
|
105
|
-
yield @is_dp
|
106
|
-
else
|
107
|
-
asin = split_path[split_path.index('dp')+1]
|
108
|
-
end
|
109
|
-
else
|
110
|
-
"path does not have asin"
|
111
|
-
end
|
112
|
-
end
|
27
|
+
def extractable_options?
|
28
|
+
instance_of?(Hash)
|
113
29
|
end
|
114
|
-
|
115
|
-
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module TipsanityMerchantExtractor
|
2
|
+
module OneEightThousandLighting
|
3
|
+
def is_merchant_cj_one_eight_thousand_lighting?(merchant_url)
|
4
|
+
if URI(merchant_url).host == RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:one_eight_thousand_lighting]
|
5
|
+
block_given? ? true : RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:one_eight_thousand_lighting]
|
6
|
+
else
|
7
|
+
false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def extract_cj_one_eight_thousand_lighting(merchant_url)
|
12
|
+
if is_merchant_cj_one_eight_thousand_lighting?(merchant_url){}
|
13
|
+
path = URI(merchant_url).path
|
14
|
+
product_name = path.split("/")[path.split("/").index("site")+1] if path.split("/").include?("site")
|
15
|
+
query = URI(merchant_url).query
|
16
|
+
yield(product_name, query)
|
17
|
+
else
|
18
|
+
block_given? ? yield("It is not bestbuy merchant connected with commission junction.") : "It is not bestbuy merchant connected with commission junction."
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_product_one_eight_thousand_lighting merchant_url, cj
|
23
|
+
product_name = extract_cj_one_eight_thousand_lighting(merchant_url){|product_name| product_name}
|
24
|
+
skuId = extract_cj_one_eight_thousand_lighting(merchant_url){|product_name, query| CGI.parse(query)["skuId"].first}
|
25
|
+
cj.product_search("keywords" => product_name, "advertiser-ids" => "notjoined", "advertiser-sku" => skuId).collect{|product| product}.first
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# require 'asin_configuration'
|
2
|
+
|
3
|
+
module TipsanityMerchantExtractor
|
4
|
+
module Amazon
|
5
|
+
def self.extended(base)
|
6
|
+
if base == AttributeExtractor
|
7
|
+
base.send :include, FindAmazon
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def is_merchant_amazon?(merchant_url)
|
12
|
+
if URI(merchant_url).host == TipsanityMerchantExtractor::RegisteredMerchantList::REGISTERED_MERCHANT[:amazon]
|
13
|
+
block_given? ? true : TipsanityMerchantExtractor::RegisteredMerchantList::REGISTERED_MERCHANT[:amazon]
|
14
|
+
else
|
15
|
+
false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def merchant_amazon_path(merchant_url)
|
20
|
+
if self.is_merchant_amazon?(merchant_url){}
|
21
|
+
path = URI(merchant_url).path
|
22
|
+
else
|
23
|
+
"It is not amazon merchant"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def filtered_asin_from_amazon_path(merchant_url)
|
28
|
+
split_path = self.merchant_amazon_path(merchant_url).split('/')
|
29
|
+
if split_path.include? 'gp'
|
30
|
+
if block_given?
|
31
|
+
@is_dp = false
|
32
|
+
yield @is_dp
|
33
|
+
else
|
34
|
+
asin = split_path[split_path.index('gp')+2]
|
35
|
+
end
|
36
|
+
elsif split_path.include? 'dp'
|
37
|
+
if block_given?
|
38
|
+
@is_dp = true
|
39
|
+
yield @is_dp
|
40
|
+
else
|
41
|
+
asin = split_path[split_path.index('dp')+1]
|
42
|
+
end
|
43
|
+
else
|
44
|
+
"path does not have asin"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module FindAmazon
|
49
|
+
include Amazon
|
50
|
+
def find_product_amazon(merchannt_url)
|
51
|
+
client = ASIN::Client.instance
|
52
|
+
product = client.lookup filtered_asin_from_amazon_path(merchant_url)
|
53
|
+
unless product.empty?
|
54
|
+
|
55
|
+
@response_object = product
|
56
|
+
@product_name = product.first.title
|
57
|
+
# filtered_asin_from_amazon_path{|is_dp| is_dp == false} ? @description = product.first.raw.EditorialReviews.EditorialReview.Content : @description = product.first.raw.EditorialReviews.EditorialReview.first.Content
|
58
|
+
@description = product.first.raw.keys.include?("EditorialReviews") ? (product.first.raw.EditorialReviews.EditorialReview.kind_of?(Array) ? product.first.raw.EditorialReviews.EditorialReview.first.Content : product.first.raw.EditorialReviews.EditorialReview.Content) : nil
|
59
|
+
@list_price = product.first.amount.to_f/100 || product.first.raw.ItemAttributes.ListPrice.Amount.to_f/100
|
60
|
+
@currency_code = product.first.raw.ItemAttributes.ListPrice.CurrencyCode
|
61
|
+
@expiry_date = Date.today
|
62
|
+
@image_url = product.first.image_url || product.first.raw.ImageSets.ImageSet.LargeImage.URL
|
63
|
+
@details_url = product.first.details_url
|
64
|
+
@final_price = product.first.raw.include?("OfferSummary") ? product.first.raw.OfferSummary.LowestNewPrice ? product.first.raw.OfferSummary.LowestNewPrice.Amount.to_f/100 : "0.00".to_f : "0.00".to_f
|
65
|
+
@categories = product.first.raw.ItemAttributes.Binding
|
66
|
+
@product_token = product.first.asin
|
67
|
+
else
|
68
|
+
@response_object = nil
|
69
|
+
@product_name = nil
|
70
|
+
@description = nil
|
71
|
+
@list_price = nil
|
72
|
+
@currency_code = nil
|
73
|
+
@expiry_date = nil
|
74
|
+
@image_url = nil
|
75
|
+
@details_url = nil
|
76
|
+
@final_price = nil
|
77
|
+
@categories = nil
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module TipsanityMerchantExtractor
|
2
|
+
class AttributeExtractor
|
3
|
+
extend UrlFormatter
|
4
|
+
[Amazon, LinkShare, Rakuten, BestBuy, Cj].each do |merchant|
|
5
|
+
extend merchant
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_accessor :merchant_url,
|
9
|
+
:host_provider,
|
10
|
+
:product_name,
|
11
|
+
:description,
|
12
|
+
:final_price,
|
13
|
+
:list_price,
|
14
|
+
:expiry_date,
|
15
|
+
:currency_code,
|
16
|
+
:image_url,
|
17
|
+
:details_url,
|
18
|
+
:is_dp,
|
19
|
+
:categories,
|
20
|
+
:response_object,
|
21
|
+
:product_token,
|
22
|
+
:options
|
23
|
+
:errors
|
24
|
+
|
25
|
+
class << self
|
26
|
+
def who_is_merchant(merchant_url)
|
27
|
+
case URI(merchant_url).host
|
28
|
+
when is_merchant_amazon?(merchant_url)
|
29
|
+
RegisteredMerchantList::REGISTERED_MERCHANT[:amazon]
|
30
|
+
when is_merchant_cj_bestbuy?(merchant_url)
|
31
|
+
RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:bestbuy]
|
32
|
+
when is_merchant_linkshare_rakuten?(merchant_url)
|
33
|
+
RegisteredMerchantList::REGISTERED_MERCHANT[:linkshare][0][:rakuten]
|
34
|
+
else
|
35
|
+
"this merchant is not registered merchant with our system. Please recommend us to affliate with us."
|
36
|
+
# URI(merchant_url).host
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
# end of self methods
|
41
|
+
|
42
|
+
def initialize merchant_url, *args
|
43
|
+
@options = args.extract_options!
|
44
|
+
@url = merchant_url
|
45
|
+
@merchant_url = self.class.format_url @url
|
46
|
+
@host_provider = URI(@merchant_url).host
|
47
|
+
@errors = []
|
48
|
+
case self.class.who_is_merchant(@merchant_url)
|
49
|
+
when RegisteredMerchantList::REGISTERED_MERCHANT[:amazon]
|
50
|
+
find_product_amazon @merchant_url
|
51
|
+
|
52
|
+
when RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:bestbuy]
|
53
|
+
find_product_cj @merchant_url
|
54
|
+
|
55
|
+
when RegisteredMerchantList::REGISTERED_MERCHANT[:linkshare][0][:rakuten]
|
56
|
+
find_product_rakuten @merchant_url, @options[:linkshare][:token], RegisteredMerchantList::REGISTERED_MERCHANT[:linkshare][0][:mid]
|
57
|
+
|
58
|
+
else
|
59
|
+
@product_name = nil
|
60
|
+
@description = nil
|
61
|
+
@list_price = nil
|
62
|
+
@currency_code = nil
|
63
|
+
@expiry_date = nil
|
64
|
+
@image_url = nil
|
65
|
+
@details_url = nil
|
66
|
+
@final_price = nil
|
67
|
+
@categories = nil
|
68
|
+
@errors << "Unable to retrive from api"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module TipsanityMerchantExtractor
|
2
|
+
module BestBuy
|
3
|
+
def is_merchant_cj_bestbuy?(merchant_url)
|
4
|
+
if URI(merchant_url).host == RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:bestbuy]
|
5
|
+
block_given? ? true : RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:bestbuy]
|
6
|
+
else
|
7
|
+
false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def extract_cj_bestbuy(merchant_url)
|
12
|
+
if is_merchant_cj_bestbuy?(merchant_url){}
|
13
|
+
path = URI(merchant_url).path
|
14
|
+
product_name = path.split("/")[path.split("/").index("site")+1] if path.split("/").include?("site")
|
15
|
+
query = URI(merchant_url).query
|
16
|
+
yield(product_name, query)
|
17
|
+
else
|
18
|
+
block_given? ? yield("It is not bestbuy merchant connected with commission junction.") : "It is not bestbuy merchant connected with commission junction."
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_product_best_buy merchant_url, cj, options = {}
|
23
|
+
product_name = extract_cj_bestbuy(merchant_url){|product_name| product_name}
|
24
|
+
skuId = extract_cj_bestbuy(merchant_url){|product_name, query| CGI.parse(query)["skuId"].first}
|
25
|
+
cj.product_search("keywords" => product_name, "advertiser-ids" => options["advertiser-ids"], "advertiser-sku" => skuId).collect{|product| product}.first
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'commission_junction'
|
2
|
+
|
3
|
+
module TipsanityMerchantExtractor
|
4
|
+
module Cj
|
5
|
+
include BestBuy
|
6
|
+
include OneEightThousandLighting
|
7
|
+
def self.extended(base)
|
8
|
+
if base == AttributeExtractor
|
9
|
+
base.send :include, FindCj
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def call_to_cj(merchant_url, developer_key, website_id)
|
14
|
+
|
15
|
+
cj = CommissionJunction.new(developer_key, website_id)
|
16
|
+
case AttributeExtractor.who_is_merchant merchant_url
|
17
|
+
when RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:bestbuy]
|
18
|
+
yield find_product_best_buy(merchant_url, cj, {"advertiser-ids" => "notjoined"})
|
19
|
+
|
20
|
+
when RegisteredMerchantList::REGISTERED_MERCHANT[:cjunction][:one_eight_thousand_lighting]
|
21
|
+
yield find_product_one_eight_thousand_lighting(merchant_url, cj, {"advertiser-ids" => "notjoined"})
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module FindCj
|
27
|
+
include Cj
|
28
|
+
def find_product_cj merchant_url
|
29
|
+
call_to_cj(merchant_url, @options[:cj][:developer_key], @options[:cj][:website_id]) do |product|
|
30
|
+
if product
|
31
|
+
|
32
|
+
@product_name = product.name
|
33
|
+
@description = product.description
|
34
|
+
@list_price = product.price
|
35
|
+
@currency_code = product.currency
|
36
|
+
@image_url = product.image_url
|
37
|
+
@details_url = product.buy_url
|
38
|
+
@categories = product.advertiser_category
|
39
|
+
@response_object = product
|
40
|
+
@product_token = self.class.extract_cj_bestbuy(@merchant_url){|product_name, query| CGI.parse(query)["skuId"].first}
|
41
|
+
else
|
42
|
+
@product_name = @description = @list_price = @currency_code = @image_url = @details_url = @categories = @response_object = nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module TipsanityMerchantExtractor
|
2
|
+
module LinkShare
|
3
|
+
def call_to_linkshare(merchant_url, token, mid)
|
4
|
+
product_name = extract_linkshare(merchant_url)
|
5
|
+
linkshare_base_url = "http://productsearch.linksynergy.com/productsearch?"
|
6
|
+
query_hash = {token: token, keyword: product_name, mid: mid, exact: product_name.split(" ").pop(2).join(" ")}
|
7
|
+
query = URI.encode_www_form query_hash
|
8
|
+
request_url = [linkshare_base_url, query].join
|
9
|
+
response_xml = Nokogiri::XML open(URI.escape(request_url))
|
10
|
+
unless response_xml.xpath("//Errors").empty?
|
11
|
+
product = nil
|
12
|
+
else
|
13
|
+
product = response_xml.xpath("//result")
|
14
|
+
end
|
15
|
+
yield product
|
16
|
+
end
|
17
|
+
|
18
|
+
def extract_linkshare(merchant_url)
|
19
|
+
capitalized_product_name = nil
|
20
|
+
if is_merchant_linkshare_rakuten?(merchant_url){}
|
21
|
+
path = URI(URI.unescape merchant_url).path
|
22
|
+
element_array = path.split("/")
|
23
|
+
product_name = element_array[element_array.index("p")+1] if element_array.include?("p")
|
24
|
+
product_name = element_array[element_array.index("prod")+1] if element_array.include?("prod")
|
25
|
+
capitalized_product_name = product_name.gsub(/\d/,'').split('-').delete_if{|x| x==""}.collect{|x| x.capitalize}[0..6].join(" ")
|
26
|
+
return capitalized_product_name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TipsanityMerchantExtractor
|
2
|
+
# include LinkShare
|
3
|
+
|
4
|
+
module Rakuten
|
5
|
+
def self.extended(base)
|
6
|
+
if base == AttributeExtractor
|
7
|
+
base.send :include, Rakuten
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def is_merchant_linkshare_rakuten?(merchant_url)
|
12
|
+
is_rakuten = ((URI(merchant_url).host == TipsanityMerchantExtractor::RegisteredMerchantList::REGISTERED_MERCHANT[:linkshare][0][:rakuten]) or !(URI(merchant_url).host.match(/rakuten/).nil?))
|
13
|
+
if is_rakuten
|
14
|
+
block_given? ? true : ((URI(merchant_url).host == TipsanityMerchantExtractor::RegisteredMerchantList::REGISTERED_MERCHANT[:linkshare][0][:rakuten]) ? TipsanityMerchantExtractor::RegisteredMerchantList::REGISTERED_MERCHANT[:linkshare][0][:rakuten] : URI(merchant_url).host)
|
15
|
+
else
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def extract_linkshare_rakuten(merchant_url, token, mid)
|
21
|
+
if is_merchant_linkshare_rakuten?(merchant_url){}
|
22
|
+
path_array = URI(merchant_url).path.split('/')
|
23
|
+
skuid_stringed = path_array.last.gsub(/\D/, "")
|
24
|
+
skuid = skuid_stringed.to_i==0 ? nil : skuid_stringed.to_i
|
25
|
+
if skuid
|
26
|
+
begin
|
27
|
+
scraped_screen = Nokogiri::HTML(open(merchant_url))
|
28
|
+
@product_name = scraped_screen.search('#AuthorArtistTitle_productTitle').first.text
|
29
|
+
@description = scraped_screen.search('#divDescription').first.text
|
30
|
+
@list_price = scraped_screen.search('#spanMainListPrice').first.text.gsub(/$/, "").to_i
|
31
|
+
@final_price = scraped_screen.search('#spanMainTotalPrice').first.text.gsub(/$/, "").to_i
|
32
|
+
@image_url = scraped_screen.search('#ImageVideo_ImageRepeater_ctl00_Image').first.attributes["src"].value
|
33
|
+
buy_url = "http://getdeeplink.linksynergy.com/createcustomlink.shtml?token=#{token}&mid=#{mid}&murl=#{merchant_url}"
|
34
|
+
@details_url = Nokogiri::HTML(open(buy_url)).search("p").text# it needs token to retrive buy url
|
35
|
+
@categories = scraped_screen.search('#anchorSimilarProds').first.text
|
36
|
+
@response_object = scraped_screen
|
37
|
+
@product_token = skuid
|
38
|
+
@errors = []
|
39
|
+
rescue
|
40
|
+
@errors << "Some errors from api information"
|
41
|
+
end
|
42
|
+
else
|
43
|
+
@errors << "Not valid Uri. Please make sure, Uri contain 'prod' and skuid."
|
44
|
+
end
|
45
|
+
else
|
46
|
+
block_given? ? yield("It is not bestbuy merchant connected with commission junction.") : "It is not bestbuy merchant connected with commission junction."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_product_rakuten merchant_url, token, mid
|
51
|
+
extract_linkshare_rakuten merchant_url, token, mid
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module TipsanityMerchantExtractor
|
2
|
+
class RegisteredMerchantList
|
3
|
+
REGISTERED_MERCHANT = {
|
4
|
+
amazon: "www.amazon.com",
|
5
|
+
cjunction: {
|
6
|
+
bestbuy: 'www.bestbuy.com',
|
7
|
+
one_eight_thousand_lighting: 'www.1800lighting.com'
|
8
|
+
},
|
9
|
+
linkshare: [
|
10
|
+
{
|
11
|
+
rakuten: "www.rakuten.com",
|
12
|
+
mid: 36342
|
13
|
+
},
|
14
|
+
{
|
15
|
+
tigerdirect: "www.tigerdirect.com",
|
16
|
+
mid: 14028
|
17
|
+
}
|
18
|
+
]
|
19
|
+
}#%w{www.amazon.com www.commissionjunction.com www.link_share.com}
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'uri'
|
2
|
+
module TipsanityMerchantExtractor
|
3
|
+
module UrlFormatter
|
4
|
+
def format_url url
|
5
|
+
URI.unescape url
|
6
|
+
if url.to_s !~ url_regexp && "http://#{url}" =~ url_regexp
|
7
|
+
"http://#{url.gsub(/\A[[:punct:]]*/,'')}"
|
8
|
+
else
|
9
|
+
url
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def url_regexp
|
14
|
+
/http:|https:/ #[http:|https:] means that any of the charactor inside [] is matching.
|
15
|
+
end
|
16
|
+
|
17
|
+
def valid_url url
|
18
|
+
if url =~ url_regexp
|
19
|
+
true
|
20
|
+
else
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,19 +1,22 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe TipsanityMerchantExtractor::
|
3
|
+
describe TipsanityMerchantExtractor::AttributeExtractor do
|
4
4
|
describe "url package" do
|
5
5
|
it "add http:// if it is not privided" do
|
6
|
-
TipsanityMerchantExtractor::
|
6
|
+
TipsanityMerchantExtractor::AttributeExtractor.format_url("example.com").should eq("http://example.com")
|
7
7
|
end
|
8
8
|
|
9
9
|
it "display the message valid url" do
|
10
|
-
TipsanityMerchantExtractor::
|
10
|
+
TipsanityMerchantExtractor::AttributeExtractor.valid_url("https://example.com").should be_true
|
11
11
|
end
|
12
12
|
|
13
13
|
it "says who is the marchant for amazon" do
|
14
|
-
|
15
|
-
@tipsanity_instance.who_is_merchant.should eq("www.amazon.com")
|
14
|
+
TipsanityMerchantExtractor::AttributeExtractor.who_is_merchant("http://www.amazon.com/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=1B2CFTWGZGRQE19V8J1V&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846").should eq("www.amazon.com")
|
16
15
|
end
|
16
|
+
|
17
|
+
# it "says available merchant" do
|
18
|
+
# TipsanityMerchantExtractor::AttributeExtractor::REGISTERED_MERCHANT.should eq('{:amazon=>"www.amazon.com", :cjunction=>{:bestbuy=>"www.bestbuy.com"}, :link_share=>"www.linkshare.com"}')
|
19
|
+
# end
|
17
20
|
end
|
18
21
|
|
19
22
|
describe "initialize attribute for url fro api" do
|
@@ -23,25 +26,23 @@ describe TipsanityMerchantExtractor::UrlFormatter do
|
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
|
-
describe "
|
29
|
+
describe "merchant initiator" do
|
27
30
|
it "is amazon.com" do
|
28
|
-
@tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.amazon.com/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=1B2CFTWGZGRQE19V8J1V&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846"
|
29
|
-
|
31
|
+
# @tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.amazon.com/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=1B2CFTWGZGRQE19V8J1V&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846"
|
32
|
+
TipsanityMerchantExtractor::AttributeExtractor.is_merchant_amazon?("http://www.amazon.com/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=1B2CFTWGZGRQE19V8J1V&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846"){}.should == true
|
30
33
|
end
|
31
34
|
|
32
35
|
it "is not amazon.com" do
|
33
|
-
@tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.yahoo.com/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=1B2CFTWGZGRQE19V8J1V&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846"
|
34
|
-
|
36
|
+
# @tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.yahoo.com/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=1B2CFTWGZGRQE19V8J1V&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846"
|
37
|
+
TipsanityMerchantExtractor::AttributeExtractor.is_merchant_amazon?("http://www.yahoo.com/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=1B2CFTWGZGRQE19V8J1V&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846"){}.should == false
|
35
38
|
end
|
36
39
|
|
37
40
|
it "is path of amazon.com" do
|
38
|
-
|
39
|
-
@tipsanity_instance.merchant_amazon_path.should eq("/gp/product/B00CMQTVQO/ref=s9_pop_gw_g63_ir05")
|
41
|
+
TipsanityMerchantExtractor::AttributeExtractor.merchant_amazon_path("http://www.amazon.com/Zwipes-Microfiber-Cleaning-Cloths-36-Pack/dp/B000XECJES?SubscriptionId=AKIAIJUCUBHUHOAHW3TA&tag=tipsanity-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B000XECJES").should eq("/Zwipes-Microfiber-Cleaning-Cloths-36-Pack/dp/B000XECJES")
|
40
42
|
end
|
41
43
|
|
42
44
|
it "filter asin from given url" do
|
43
|
-
|
44
|
-
@tipsanity_instance.filtered_asin_from_amazon_path.should eq("B00CMQTVQO")
|
45
|
+
TipsanityMerchantExtractor::AttributeExtractor.filtered_asin_from_amazon_path("http://www.amazon.com/Zwipes-Microfiber-Cleaning-Cloths-36-Pack/dp/B000XECJES?SubscriptionId=AKIAIJUCUBHUHOAHW3TA&tag=tipsanity-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B000XECJES").should eq("B000XECJES")
|
45
46
|
end
|
46
47
|
|
47
48
|
it "gets the product name from given url of amazon.com on the code gp" do
|
@@ -53,6 +54,50 @@ describe TipsanityMerchantExtractor::UrlFormatter do
|
|
53
54
|
@tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.amazon.com/Inferno-Novel-Robert-Langdon-ebook/dp/B00AXIZ4TQ/ref=pd_rhf_gw_s_ts_1_N8P4?ie=UTF8&refRID=0S1YP6CNWXFVPB12N8P4"
|
54
55
|
@tipsanity_instance.product_name.should eq("Inferno: A Novel (Robert Langdon)")
|
55
56
|
end
|
57
|
+
|
58
|
+
it "gets the product final price from given url of amazon.com on the code dp" do
|
59
|
+
@tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.amazon.com/Inferno-Novel-Robert-Langdon-ebook/dp/B00AXIZ4TQ/ref=pd_rhf_gw_s_ts_1_N8P4?ie=UTF8&refRID=0S1YP6CNWXFVPB12N8P4"
|
60
|
+
@tipsanity_instance.final_price.should eq(0.0)
|
61
|
+
end
|
56
62
|
|
63
|
+
it "extract the query from best buy" do
|
64
|
+
# @tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.bestbuy.com/site/Lens+and+LCD+Screen+Cleaning+Cloth/6732119.p?id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1"
|
65
|
+
TipsanityMerchantExtractor::AttributeExtractor.extract_cj_bestbuy("http://www.bestbuy.com/site/Lens+and+LCD+Screen+Cleaning+Cloth/6732119.p?id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1"){|a, query| query}.should eq("id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "extract the product name from best buy" do
|
69
|
+
# @tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.bestbuy.com/site/Lens+and+LCD+Screen+Cleaning+Cloth/6732119.p?id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1"
|
70
|
+
TipsanityMerchantExtractor::AttributeExtractor.extract_cj_bestbuy("http://www.bestbuy.com/site/Lens+and+LCD+Screen+Cleaning+Cloth/6732119.p?id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1"){|product_name, query| product_name.gsub("+", " ")}.should eq("Lens and LCD Screen Cleaning Cloth")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "extract sku from query of bestbuy.com" do
|
74
|
+
# @tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.bestbuy.com/site/Lens+and+LCD+Screen+Cleaning+Cloth/6732119.p?id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1"
|
75
|
+
TipsanityMerchantExtractor::AttributeExtractor.extract_cj_bestbuy("http://www.bestbuy.com/site/Lens+and+LCD+Screen+Cleaning+Cloth/6732119.p?id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1"){|product_name, query| CGI.parse(query)["skuId"].first}.should eq("6732119")
|
76
|
+
end
|
77
|
+
|
78
|
+
# it "get the product name from bestbuy" do
|
79
|
+
# @tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new "http://www.bestbuy.com/site/Lens+and+LCD+Screen+Cleaning+Cloth/6732119.p?id=1087340386022&skuId=6732119&st=6732119&cp=1&lp=1", cj: {developer_key:"008dc8f793ca7bd35171100e2ea7376f514b9345bb6844e689d908bedfadada0c6b8fed3b766913fa22ffdd97553498816471aff50c82cc847dae723ce535dbbe7/008928dbd03df651b41c8322a5212070709d82c7d78703f85d6bf698e7bb9516cd13a1a429cb8e35989291e7a7bbc600db8913a7e4687257f805186af6dd6627b9", website_id: "7191286"}
|
80
|
+
# @tipsanity_instance.product_name.should eql("DigiPower - Lens and LCD Screen Cleaning Cloth")
|
81
|
+
# end
|
82
|
+
|
83
|
+
it "extract the product name from rakuten url" do
|
84
|
+
TipsanityMerchantExtractor::AttributeExtractor.extract_linkshare("http://www.rakuten.com/prod/v7-pa19s-extreme-guard-iphone-5-case-iphone-white-polycarbonate/247297348.html?sellerid=0").should eql("V Pas Extreme Guard Iphone Case Iphone")
|
85
|
+
#http://mambate.shop.rakuten.com/p/7-agptek-android-4-2-quad-core-1024-600-hd-screen-with-1gb-ddr3-4gb/251837691.html is needed to analyse
|
86
|
+
# http://www.rakuten.com/prod/v7-vantage-ccv4-carrying-case-backpack-for-13-notebook-black-polyester/246418473.html?sellerid=0 is valid url for now.
|
87
|
+
end
|
88
|
+
|
89
|
+
# it "call linkshare for rakuten to get product name" do
|
90
|
+
# @tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new("http://mambate.shop.rakuten.com/p/7-agptek-android-4-2-quad-core-1024-600-hd-screen-with-1gb-ddr3-4gb/251837691.html", linkshare:{token: "23bf03f93e1cbccd9009ab0b9128f2e57a6a245af6c2be5ebcfe6b7285ad9a79"})
|
91
|
+
# @tipsanity_instance.product_name.should eql(" 7 AGPtek Android 4.2 Quad Core 1024*600 HD Screen with 1GB RAM HDMI 1080P Tablet + Audio Leather Case for Google Play eBook Reader 3D GAMES ")
|
92
|
+
# end
|
93
|
+
|
94
|
+
it "gives the rakuten url" do
|
95
|
+
@tipsanity_instance = TipsanityMerchantExtractor::AttributeExtractor.new("http://www.rakuten.com/prod/v7-pa19s-extreme-guard-iphone-5-case-iphone-white-polycarbonate/247297348.html?sellerid=0", linkshare:{token: "23bf03f93e1cbccd9009ab0b9128f2e57a6a245af6c2be5ebcfe6b7285ad9a79"})
|
96
|
+
@tipsanity_instance.details_url.should eql("http://affiliate.rakuten.com/fs-bin/click?id=B/IDdUgQ0Rg&subid=0&offerid=288682.1&type=10&tmpid=6932&RD_PARM1=http%3A%2F%2Fwww.rakuten.com%2Fprod%2Fv7-pa19s-extreme-guard-iphone-5-case-iphone-white-polycarbonate%2F247297348.html%3Fsellerid%3D0")
|
97
|
+
end
|
98
|
+
it "check whether it is rekutan or not." do
|
99
|
+
# TipsanityMerchantExtractor::AttributeExtractor.is_merchant_linkshare_rakuten?("http://mambate.shop.rakuten.com/p/7-agptek-android-4-2-quad-core-1024-600-hd-screen-with-1gb-ddr3-4gb/251837691.html").should eq("www.rakuten.com")
|
100
|
+
TipsanityMerchantExtractor::AttributeExtractor.who_is_merchant("http://mambate.shop.rakuten.com/p/7-agptek-android-4-2-quad-core-1024-600-hd-screen-with-1gb-ddr3-4gb/251837691.html").should eq("www.rakuten.com")
|
101
|
+
end
|
57
102
|
end
|
58
103
|
end
|
@@ -18,6 +18,11 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
20
|
gem.add_dependency "asin"
|
21
|
+
gem.add_dependency "commission_junction"
|
22
|
+
gem.add_dependency "linkshare"
|
23
|
+
gem.add_dependency "nokogiri"
|
24
|
+
gem.add_dependency "nori"
|
25
|
+
gem.add_dependency "hashie"
|
21
26
|
|
22
27
|
gem.add_dependency 'httpclient'
|
23
28
|
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tipsanity_merchant_extractor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.5
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Umesh Umesh
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: asin
|
16
|
-
requirement: &
|
16
|
+
requirement: &74521950 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,65 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *74521950
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: commission_junction
|
27
|
+
requirement: &74521580 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *74521580
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: linkshare
|
38
|
+
requirement: &74521270 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *74521270
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: nokogiri
|
49
|
+
requirement: &74520860 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *74520860
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: nori
|
60
|
+
requirement: &74519480 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *74519480
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: hashie
|
71
|
+
requirement: &74518870 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *74518870
|
25
80
|
- !ruby/object:Gem::Dependency
|
26
81
|
name: httpclient
|
27
|
-
requirement: &
|
82
|
+
requirement: &74518280 !ruby/object:Gem::Requirement
|
28
83
|
none: false
|
29
84
|
requirements:
|
30
85
|
- - ! '>='
|
@@ -32,10 +87,10 @@ dependencies:
|
|
32
87
|
version: '0'
|
33
88
|
type: :runtime
|
34
89
|
prerelease: false
|
35
|
-
version_requirements: *
|
90
|
+
version_requirements: *74518280
|
36
91
|
- !ruby/object:Gem::Dependency
|
37
92
|
name: rake
|
38
|
-
requirement: &
|
93
|
+
requirement: &74517720 !ruby/object:Gem::Requirement
|
39
94
|
none: false
|
40
95
|
requirements:
|
41
96
|
- - ! '>='
|
@@ -43,10 +98,10 @@ dependencies:
|
|
43
98
|
version: '0'
|
44
99
|
type: :development
|
45
100
|
prerelease: false
|
46
|
-
version_requirements: *
|
101
|
+
version_requirements: *74517720
|
47
102
|
- !ruby/object:Gem::Dependency
|
48
103
|
name: rspec
|
49
|
-
requirement: &
|
104
|
+
requirement: &74517100 !ruby/object:Gem::Requirement
|
50
105
|
none: false
|
51
106
|
requirements:
|
52
107
|
- - ! '>='
|
@@ -54,10 +109,10 @@ dependencies:
|
|
54
109
|
version: '0'
|
55
110
|
type: :development
|
56
111
|
prerelease: false
|
57
|
-
version_requirements: *
|
112
|
+
version_requirements: *74517100
|
58
113
|
- !ruby/object:Gem::Dependency
|
59
114
|
name: httpclient
|
60
|
-
requirement: &
|
115
|
+
requirement: &74516670 !ruby/object:Gem::Requirement
|
61
116
|
none: false
|
62
117
|
requirements:
|
63
118
|
- - ! '>='
|
@@ -65,7 +120,7 @@ dependencies:
|
|
65
120
|
version: '0'
|
66
121
|
type: :development
|
67
122
|
prerelease: false
|
68
|
-
version_requirements: *
|
123
|
+
version_requirements: *74516670
|
69
124
|
description: Tipsanity website uses this gem to extract their marchant related information
|
70
125
|
email:
|
71
126
|
- umeshblader@gmail.com
|
@@ -82,6 +137,15 @@ files:
|
|
82
137
|
- README.md
|
83
138
|
- Rakefile
|
84
139
|
- lib/tipsanity_merchant_extractor.rb
|
140
|
+
- lib/tipsanity_merchant_extractor/1800lighting.rb
|
141
|
+
- lib/tipsanity_merchant_extractor/amazon.rb
|
142
|
+
- lib/tipsanity_merchant_extractor/attribute_extractor.rb
|
143
|
+
- lib/tipsanity_merchant_extractor/best_buy.rb
|
144
|
+
- lib/tipsanity_merchant_extractor/cj.rb
|
145
|
+
- lib/tipsanity_merchant_extractor/linkshare.rb
|
146
|
+
- lib/tipsanity_merchant_extractor/rakuten.rb
|
147
|
+
- lib/tipsanity_merchant_extractor/registered_merchant_list.rb
|
148
|
+
- lib/tipsanity_merchant_extractor/url_formatter.rb
|
85
149
|
- lib/tipsanity_merchant_extractor/version.rb
|
86
150
|
- spec/spec_helper.rb
|
87
151
|
- spec/tipsanity_url_formatter_spec.rb
|
@@ -101,9 +165,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
166
|
none: false
|
103
167
|
requirements:
|
104
|
-
- - ! '
|
168
|
+
- - ! '>='
|
105
169
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
170
|
+
version: '0'
|
107
171
|
requirements: []
|
108
172
|
rubyforge_project:
|
109
173
|
rubygems_version: 1.8.15
|