linkshare_api 0.1.0 → 0.2.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b32e4d516fc03567a0d237cf9668ff023e873ed7
4
+ data.tar.gz: 729a0129c9b661d5d3f211c5c7919bfe67e732ec
5
+ SHA512:
6
+ metadata.gz: 6f4053896f431cd45d1500a053ebf5fefef4c26783719f983b434bc36656ef712b297a50f5777ed9fae9569e25afabbfdf8b4df06a4118b44020a34b590e456f
7
+ data.tar.gz: 47dfebd2653f171431b0c5bbebe03020e79ec2a9612fe6822950fee56f8d342bb43fc3d41e78ad783fced9ccb54a0e39b7fe212a83a2f561d3981a858943d22b
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.1
data/.travis.yml CHANGED
@@ -1,4 +1,6 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
+ - 2.1.1
5
+ - 2.0.0
4
6
  - 1.9.3
data/README.md CHANGED
@@ -99,6 +99,26 @@ end
99
99
 
100
100
  When using the `all` method, `response` object is updated with the data returned by the last API request (last page). `response.all` returns the `data` array.
101
101
 
102
+ ### Coupon Web Services
103
+
104
+ Easy access to coupons and promotional link data for your advertisers using [Coupon Web Service](http://helpcenter.linkshare.com/publisher/questions.php?questionid=865)
105
+
106
+ ```ruby
107
+ # Search for promotion types "Clearance" (id 3) and "Dollar Amount Off" (id 5)
108
+ # from Wal-Mart (id 2149) within category "Apparel - Babies & Kids" (id 3)
109
+ # in the US network (id 1)
110
+ options = {
111
+ promotiontype: 3|5,
112
+ mid: 2149,
113
+ cat: 3,
114
+ network: 1
115
+ }
116
+ response = LinkshareAPI.coupon_web_service(options)
117
+ response.data.each do |item|
118
+ # Do stuff
119
+ end
120
+ ```
121
+
102
122
  ### Extra Configuration
103
123
 
104
124
  * `LinkshareAPI.api_timeout` - the timeout set when initiating requests to LinkShare Web Services (default value is 30 seconds)
data/lib/linkshare_api.rb CHANGED
@@ -2,20 +2,38 @@
2
2
  require "linkshare_api/version"
3
3
 
4
4
  # Resources
5
- require "linkshare_api/link_generator"
6
- require "linkshare_api/product_search"
7
- require "linkshare_api/response"
5
+ require File.expand_path("../linkshare_api/link_generator", __FILE__)
6
+ require File.expand_path("../linkshare_api/product_search", __FILE__)
7
+ require File.expand_path("../linkshare_api/coupon_web_service", __FILE__)
8
+ require File.expand_path("../linkshare_api/response", __FILE__)
8
9
 
9
10
  # Errors
10
- require "linkshare_api/errors/error"
11
- require "linkshare_api/errors/authentication_error"
12
- require "linkshare_api/errors/connection_error"
13
- require "linkshare_api/errors/invalid_request_error"
11
+ require File.expand_path("../linkshare_api/errors/error", __FILE__)
12
+ require File.expand_path("../linkshare_api/errors/authentication_error", __FILE__)
13
+ require File.expand_path("../linkshare_api/errors/connection_error", __FILE__)
14
+ require File.expand_path("../linkshare_api/errors/invalid_request_error", __FILE__)
14
15
 
15
16
  module LinkshareAPI
16
17
  WEB_SERVICE_URIS = {
17
18
  link_generator: "http://getdeeplink.linksynergy.com/createcustomlink.shtml",
18
- product_search: "http://productsearch.linksynergy.com/productsearch"
19
+ product_search: "http://productsearch.linksynergy.com/productsearch",
20
+ coupon_web_service: "http://couponfeed.linksynergy.com/coupon"
21
+ }
22
+
23
+ PARSE_RESULT = {
24
+ link_generator: "item",
25
+ product_search: "item",
26
+ coupon_web_service: "link"
27
+ }
28
+
29
+ RESULT = {
30
+ product_search: "result",
31
+ coupon_web_service: "couponfeed"
32
+ }
33
+
34
+ PAGE_NUMBER = {
35
+ product_search: "PageNumber",
36
+ coupon_web_service: "PageNumberRequested"
19
37
  }
20
38
 
21
39
  @api_timeout = 30
@@ -40,4 +58,9 @@ module LinkshareAPI
40
58
  product_search = LinkshareAPI::ProductSearch.new
41
59
  product_search.query(options)
42
60
  end
61
+
62
+ def self.coupon_web_service(options = {})
63
+ coupon_web_service = LinkshareAPI::CouponWebService.new
64
+ coupon_web_service.query(options)
65
+ end
43
66
  end
@@ -0,0 +1,49 @@
1
+ require "addressable/uri"
2
+ require "httparty"
3
+
4
+ module LinkshareAPI
5
+ # For implementation details please visit
6
+ # http://helpcenter.linkshare.com/publisher/questions.php?questionid=865
7
+ class CouponWebService
8
+ include HTTParty
9
+
10
+ attr_reader :api_base_url, :api_timeout, :token
11
+
12
+ def initialize
13
+ @token = LinkshareAPI.token
14
+ @api_base_url = LinkshareAPI::WEB_SERVICE_URIS[:coupon_web_service]
15
+ @api_timeout = LinkshareAPI.api_timeout
16
+
17
+ if @token.nil?
18
+ raise AuthenticationError.new(
19
+ "No token. Set your token by using 'LinkshareAPI.token = <TOKEN>'. " +
20
+ "You can retrieve your token from LinkhShare's Web Services page under the Links tab. " +
21
+ "See http://helpcenter.linkshare.com/publisher/questions.php?questionid=648 for details."
22
+ )
23
+ end
24
+ end
25
+
26
+ def query(params)
27
+ raise ArgumentError, "Hash expected, got #{params.class} instead" unless params.is_a?(Hash)
28
+
29
+ params.merge!(token: token)
30
+ begin
31
+ response = self.class.get(
32
+ api_base_url,
33
+ query: params,
34
+ timeout: api_timeout
35
+ )
36
+ rescue Timeout::Error
37
+ raise ConnectionError.new("Timeout error (#{timeout}s)")
38
+ end
39
+
40
+ if response.code != 200
41
+ raise Error.new(response.message, response.code)
42
+ end
43
+ error = response["fault"]
44
+ raise InvalidRequestError.new(error["errorstring"], error["errorcode"].to_i) if error
45
+
46
+ Response.new(response, :coupon_web_service)
47
+ end
48
+ end
49
+ end
@@ -14,6 +14,7 @@ module LinkshareAPI
14
14
  @token = LinkshareAPI.token
15
15
  @api_base_url = LinkshareAPI::WEB_SERVICE_URIS[:link_generator]
16
16
  @api_timeout = LinkshareAPI.api_timeout
17
+
17
18
  if @token.nil?
18
19
  raise AuthenticationError.new(
19
20
  "No token. Set your token by using 'LinkshareAPI.token = <TOKEN>'. " +
@@ -43,7 +43,7 @@ module LinkshareAPI
43
43
  error = response["result"]["Errors"]
44
44
  raise InvalidRequestError.new(error["ErrorText"], error["ErrorID"].to_i) if error
45
45
 
46
- Response.new(response)
46
+ Response.new(response, :product_search)
47
47
  end
48
48
  end
49
49
  end
@@ -4,14 +4,14 @@ module LinkshareAPI
4
4
  class Response
5
5
  attr_reader :total_matches, :total_pages, :page_number, :data, :request
6
6
 
7
- def initialize(response)
7
+ def initialize(response, from)
8
8
  @request = response.request
9
- result = response["result"]
10
-
9
+ result = response[LinkshareAPI::RESULT[from]]
10
+ @from = from
11
11
  @total_matches = result["TotalMatches"].to_i
12
12
  @total_pages = result["TotalPages"].to_i
13
- @page_number = result["PageNumber"].to_i
14
- @data = parse(result["item"])
13
+ @page_number = result[LinkshareAPI::PAGE_NUMBER[from]].to_i
14
+ @data = parse(result[LinkshareAPI::PARSE_RESULT[from]])
15
15
  end
16
16
 
17
17
  def all
@@ -19,7 +19,12 @@ module LinkshareAPI
19
19
  uri = Addressable::URI.parse(request.uri)
20
20
  params = uri.query_values
21
21
  params["pagenumber"] = page_number + 1
22
- next_page_response = LinkshareAPI::ProductSearch.new.query(params)
22
+
23
+ if @from == :coupon_web_service
24
+ next_page_response = LinkshareAPI::CouponWebService.new.query(params)
25
+ else
26
+ next_page_response = LinkshareAPI::ProductSearch.new.query(params)
27
+ end
23
28
  @page_number = next_page_response.page_number
24
29
  @data += next_page_response.data
25
30
  end
@@ -1,3 +1,3 @@
1
1
  module LinkshareAPI
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -19,13 +19,14 @@ Gem::Specification.new do |s|
19
19
  s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency "addressable", "~> 2.3.5"
23
- s.add_dependency "httparty", "~> 0.11.0"
24
- s.add_dependency "recursive-open-struct", "~> 0.4.3"
22
+ s.add_dependency "addressable", "~> 2.3"
23
+ s.add_dependency "httparty", "~> 0.13"
24
+ s.add_dependency "recursive-open-struct", "~> 0.4"
25
25
 
26
- s.add_development_dependency "bundler", "~> 1.3"
26
+ s.add_development_dependency "bundler", "~> 1.6"
27
27
  s.add_development_dependency "rake"
28
28
  s.add_development_dependency "webmock"
29
29
  s.add_development_dependency "test-unit"
30
30
  s.add_development_dependency "guard-test"
31
+ s.add_development_dependency "pry"
31
32
  end
@@ -0,0 +1,392 @@
1
+ require "test_helper"
2
+
3
+ class LinkshareCouponAPITest < Test::Unit::TestCase
4
+ def test_coupon_web_service_invalid_token
5
+ LinkshareAPI.token = nil
6
+ assert_raise LinkshareAPI::AuthenticationError do
7
+ LinkshareAPI.coupon_web_service(network: 1, mid: 38605)
8
+ end
9
+ end
10
+
11
+ def test_coupon_web_service_internal_error
12
+ LinkshareAPI.token = token
13
+ xml_response = <<-XML
14
+ <?xml version="1.0" encoding="UTF-8"?>
15
+ <fault>
16
+ <errorcode>10</errorcode>
17
+ <errorstring>Internal Error Unable To Process Request At This Time</errorstring>
18
+ </fault>
19
+ XML
20
+ stub_request(
21
+ :get,
22
+ "http://couponfeed.linksynergy.com/coupon?network=1&token=#{token}"
23
+ ).
24
+ to_return(
25
+ status: 200,
26
+ body: xml_response,
27
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
28
+ )
29
+ e = assert_raise LinkshareAPI::InvalidRequestError do
30
+ LinkshareAPI.coupon_web_service(network: 1)
31
+ end
32
+ assert_equal 10, e.code
33
+ assert_equal "Internal Error Unable To Process Request At This Time", e.message
34
+ end
35
+
36
+ def test_coupon_web_service_usage_limited
37
+ LinkshareAPI.token = token
38
+ xml_response = <<-XML
39
+ <?xml version="1.0" encoding="UTF-8"?>
40
+ <fault>
41
+ <errorcode>30</errorcode>
42
+ <errorstring>Usage Quota Exceeded</errorstring>
43
+ </fault>
44
+ XML
45
+ stub_request(
46
+ :get,
47
+ "http://couponfeed.linksynergy.com/coupon?network=1&token=#{token}"
48
+ ).
49
+ to_return(
50
+ status: 200,
51
+ body: xml_response,
52
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
53
+ )
54
+ e = assert_raise LinkshareAPI::InvalidRequestError do
55
+ LinkshareAPI.coupon_web_service(network: 1)
56
+ end
57
+ assert_equal 30, e.code
58
+ assert_equal "Usage Quota Exceeded", e.message
59
+ end
60
+
61
+ def test_coupon_web_service_invalid_or_missing_parameters
62
+ LinkshareAPI.token = token
63
+ xml_response = <<-XML
64
+ <?xml version="1.0" encoding="UTF-8"?>
65
+ <fault>
66
+ <errorcode>40</errorcode>
67
+ <errorstring>Invalid Request</errorstring>
68
+ </fault>
69
+ XML
70
+ stub_request(
71
+ :get,
72
+ "http://couponfeed.linksynergy.com/coupon?network=15&token=#{token}"
73
+ ).
74
+ to_return(
75
+ status: 200,
76
+ body: xml_response,
77
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
78
+ )
79
+ e = assert_raise LinkshareAPI::InvalidRequestError do
80
+ LinkshareAPI.coupon_web_service(network: 15)
81
+ end
82
+ assert_equal 40, e.code
83
+ assert_equal "Invalid Request", e.message
84
+ end
85
+
86
+ def test_coupon_web_service_invalid_or_not_approved_token
87
+ LinkshareAPI.token = token
88
+ xml_response = <<-XML
89
+ <?xml version="1.0" encoding="UTF-8"?>
90
+ <fault>
91
+ <errorcode>20</errorcode>
92
+ <errorstring>Access Denied Token ID Is Invalid or Not Approved for Coupon Feed</errorstring>
93
+ </fault>
94
+ XML
95
+ stub_request(
96
+ :get,
97
+ "http://couponfeed.linksynergy.com/coupon?network=15&token=#{token}"
98
+ ).
99
+ to_return(
100
+ status: 200,
101
+ body: xml_response,
102
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
103
+ )
104
+ e = assert_raise LinkshareAPI::InvalidRequestError do
105
+ LinkshareAPI.coupon_web_service(network: 15)
106
+ end
107
+ assert_equal 20, e.code
108
+ assert_equal "Access Denied Token ID Is Invalid or Not Approved for Coupon Feed", e.message
109
+ end
110
+
111
+ def test_coupon_web_service_with_no_results
112
+ LinkshareAPI.token = token
113
+ xml_response = <<-XML
114
+ <?xml version="1.0" encoding="UTF-8"?>
115
+ <couponfeed>
116
+ <TotalMatches>0</TotalMatches>
117
+ <TotalPages>0</TotalPages>
118
+ <PageNumberRequested>1</PageNumberRequested>
119
+ </couponfeed>
120
+ XML
121
+ stub_request(
122
+ :get,
123
+ "http://couponfeed.linksynergy.com/coupon?network=1&promotiontype=30&token=#{token}"
124
+ ).
125
+ to_return(
126
+ status: 200,
127
+ body: xml_response,
128
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
129
+ )
130
+ response = LinkshareAPI.coupon_web_service(network: 1, promotiontype: 30)
131
+ assert_equal 0, response.total_matches
132
+ assert_equal 0, response.total_pages
133
+ assert_equal 1, response.page_number
134
+ assert_equal [], response.data
135
+ end
136
+
137
+ def test_with_valid_results
138
+ LinkshareAPI.token = token
139
+ xml_response = <<-XML.strip
140
+ <?xml version="1.0" encoding="UTF-8"?>
141
+ <couponfeed>
142
+ <TotalMatches>1</TotalMatches>
143
+ <TotalPages>1</TotalPages>
144
+ <PageNumberRequested>1</PageNumberRequested>
145
+ <link type="TEXT">
146
+ <categories>
147
+ <category id="983">computers</category>
148
+ <category id="12">electronics</category>
149
+ <category id="14">gifts</category>
150
+ </categories>
151
+ <promotiontypes>
152
+ <promotiontype id="22">percentage off</promotiontype>
153
+ </promotiontypes>
154
+ <offerdescription>15 percent off</offerdescription>
155
+ <offerstartdate>2009-04-01</offerstartdate>
156
+ <offerenddate>2009-05-31</offerenddate>
157
+ <couponcode>KJEISLD</couponcode>
158
+ <couponrestriction>New Customers Only</couponrestriction>
159
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
160
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
161
+ <advertiserid>000</advertiserid>
162
+ <advertisername>Sample Advertiser Name</advertisername>
163
+ <network id="1">Linkshare Network</network>
164
+ </link>
165
+ <link type="TEXT">
166
+ <categories>
167
+ <category id="983">computers</category>
168
+ <category id="12">electronics</category>
169
+ <category id="14">gifts</category>
170
+ </categories>
171
+ <promotiontypes>
172
+ <promotiontype id="22">percentage off</promotiontype>
173
+ </promotiontypes>
174
+ <offerdescription>10 percent off</offerdescription>
175
+ <offerstartdate>2009-04-01</offerstartdate>
176
+ <offerenddate>2009-05-31</offerenddate>
177
+ <couponcode>KJEISLD</couponcode>
178
+ <couponrestriction>New Customers Only</couponrestriction>
179
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
180
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
181
+ <advertiserid>000</advertiserid>
182
+ <advertisername>Sample Advertiser Name</advertisername>
183
+ <network id="1">Linkshare Network</network>
184
+ </link>
185
+ </couponfeed>
186
+ XML
187
+ stub_request(
188
+ :get,
189
+ "http://couponfeed.linksynergy.com/coupon?network=1&promotiontype=22&token=#{token}"
190
+ ).
191
+ to_return(
192
+ status: 200,
193
+ body: xml_response,
194
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
195
+ )
196
+
197
+ response = LinkshareAPI.coupon_web_service(network: 1, promotiontype: 22)
198
+ assert_equal 1, response.total_matches
199
+ assert_equal 1, response.total_pages
200
+ assert_equal 1, response.page_number
201
+ assert_equal "KJEISLD", response.data.first.couponcode
202
+ assert_equal "10 percent off", response.data.last.offerdescription
203
+ end
204
+
205
+ def test_all_with_valid_results
206
+ LinkshareAPI.token = token
207
+ xml_response1 = <<-XML.strip
208
+ <?xml version="1.0" encoding="UTF-8"?>
209
+ <couponfeed>
210
+ <TotalMatches>6</TotalMatches>
211
+ <TotalPages>3</TotalPages>
212
+ <PageNumberRequested>1</PageNumberRequested>
213
+ <link type="TEXT">
214
+ <categories>
215
+ <category id="983">computers</category>
216
+ <category id="12">electronics</category>
217
+ <category id="14">gifts</category>
218
+ </categories>
219
+ <promotiontypes>
220
+ <promotiontype id="22">percentage off</promotiontype>
221
+ </promotiontypes>
222
+ <offerdescription>15 percent off</offerdescription>
223
+ <offerstartdate>2009-04-01</offerstartdate>
224
+ <offerenddate>2009-05-31</offerenddate>
225
+ <couponcode>KJEISLD</couponcode>
226
+ <couponrestriction>New Customers Only</couponrestriction>
227
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
228
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
229
+ <advertiserid>000</advertiserid>
230
+ <advertisername>Sample Advertiser Name</advertisername>
231
+ <network id="1">Linkshare Network</network>
232
+ </link>
233
+ <link type="TEXT">
234
+ <categories>
235
+ <category id="983">computers</category>
236
+ <category id="12">electronics</category>
237
+ <category id="14">gifts</category>
238
+ </categories>
239
+ <promotiontypes>
240
+ <promotiontype id="22">percentage off</promotiontype>
241
+ </promotiontypes>
242
+ <offerdescription>10 percent off</offerdescription>
243
+ <offerstartdate>2009-04-01</offerstartdate>
244
+ <offerenddate>2009-05-31</offerenddate>
245
+ <couponcode>KJEISLD</couponcode>
246
+ <couponrestriction>New Customers Only</couponrestriction>
247
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
248
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
249
+ <advertiserid>000</advertiserid>
250
+ <advertisername>Sample Advertiser Name</advertisername>
251
+ <network id="1">Linkshare Network</network>
252
+ </link>
253
+ </couponfeed>
254
+ XML
255
+ xml_response2 = <<-XML.strip
256
+ <?xml version="1.0" encoding="UTF-8"?>
257
+ <couponfeed>
258
+ <TotalMatches>6</TotalMatches>
259
+ <TotalPages>3</TotalPages>
260
+ <PageNumberRequested>2</PageNumberRequested>
261
+ <link type="TEXT">
262
+ <categories>
263
+ <category id="983">computers</category>
264
+ <category id="12">electronics</category>
265
+ <category id="14">gifts</category>
266
+ </categories>
267
+ <promotiontypes>
268
+ <promotiontype id="22">percentage off</promotiontype>
269
+ </promotiontypes>
270
+ <offerdescription>15 percent off</offerdescription>
271
+ <offerstartdate>2009-04-01</offerstartdate>
272
+ <offerenddate>2009-05-31</offerenddate>
273
+ <couponcode>KJEISLD</couponcode>
274
+ <couponrestriction>New Customers Only</couponrestriction>
275
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
276
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
277
+ <advertiserid>000</advertiserid>
278
+ <advertisername>Sample Advertiser Name</advertisername>
279
+ <network id="1">Linkshare Network</network>
280
+ </link>
281
+ <link type="TEXT">
282
+ <categories>
283
+ <category id="983">computers</category>
284
+ <category id="12">electronics</category>
285
+ <category id="14">gifts</category>
286
+ </categories>
287
+ <promotiontypes>
288
+ <promotiontype id="22">percentage off</promotiontype>
289
+ </promotiontypes>
290
+ <offerdescription>10 percent off</offerdescription>
291
+ <offerstartdate>2009-04-01</offerstartdate>
292
+ <offerenddate>2009-05-31</offerenddate>
293
+ <couponcode>KJEISLD</couponcode>
294
+ <couponrestriction>New Customers Only</couponrestriction>
295
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
296
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
297
+ <advertiserid>000</advertiserid>
298
+ <advertisername>Sample Advertiser Name</advertisername>
299
+ <network id="1">Linkshare Network</network>
300
+ </link>
301
+ </couponfeed>
302
+ XML
303
+ xml_response3 = <<-XML.strip
304
+ <?xml version="1.0" encoding="UTF-8"?>
305
+ <couponfeed>
306
+ <TotalMatches>6</TotalMatches>
307
+ <TotalPages>3</TotalPages>
308
+ <PageNumberRequested>3</PageNumberRequested>
309
+ <link type="TEXT">
310
+ <categories>
311
+ <category id="983">computers</category>
312
+ <category id="12">electronics</category>
313
+ <category id="14">gifts</category>
314
+ </categories>
315
+ <promotiontypes>
316
+ <promotiontype id="22">percentage off</promotiontype>
317
+ </promotiontypes>
318
+ <offerdescription>15 percent off</offerdescription>
319
+ <offerstartdate>2009-04-01</offerstartdate>
320
+ <offerenddate>2009-05-31</offerenddate>
321
+ <couponcode>KJEISLD</couponcode>
322
+ <couponrestriction>New Customers Only</couponrestriction>
323
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
324
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
325
+ <advertiserid>000</advertiserid>
326
+ <advertisername>Sample Advertiser Name</advertisername>
327
+ <network id="1">Linkshare Network</network>
328
+ </link>
329
+ <link type="TEXT">
330
+ <categories>
331
+ <category id="983">computers</category>
332
+ <category id="12">electronics</category>
333
+ <category id="14">gifts</category>
334
+ </categories>
335
+ <promotiontypes>
336
+ <promotiontype id="22">percentage off</promotiontype>
337
+ </promotiontypes>
338
+ <offerdescription>10 percent off</offerdescription>
339
+ <offerstartdate>2009-04-01</offerstartdate>
340
+ <offerenddate>2009-05-31</offerenddate>
341
+ <couponcode>KIRK</couponcode>
342
+ <couponrestriction>New Customers Only</couponrestriction>
343
+ <clickurl>http://click.linksynergy.com/fs-bin/click?id=XXXXXXXXXXX&amp;offerid=164317.10002595&amp;type=4&amp;subid=0</clickurl>
344
+ <impressionpixel>http://ad.linksynergy.com/fs-bin/show?id=XXXXXXXXXXX&amp;bids=164317.10002595&amp;type=4&amp;subid=0</impressionpixel>
345
+ <advertiserid>000</advertiserid>
346
+ <advertisername>Sample Advertiser Name</advertisername>
347
+ <network id="1">Linkshare Network</network>
348
+ </link>
349
+ </couponfeed>
350
+ XML
351
+ stub_request(
352
+ :get,
353
+ "http://couponfeed.linksynergy.com/coupon?network=1&promotiontype=22&token=#{token}"
354
+ ).
355
+ to_return(
356
+ status: 200,
357
+ body: xml_response1,
358
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
359
+ )
360
+ stub_request(
361
+ :get,
362
+ "http://couponfeed.linksynergy.com/coupon?network=1&promotiontype=22&pagenumber=2&token=#{token}"
363
+ ).
364
+ to_return(
365
+ status: 200,
366
+ body: xml_response2,
367
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
368
+ )
369
+ stub_request(
370
+ :get,
371
+ "http://couponfeed.linksynergy.com/coupon?network=1&promotiontype=22&pagenumber=3&token=#{token}"
372
+ ).
373
+ to_return(
374
+ status: 200,
375
+ body: xml_response3,
376
+ headers: { "Content-type" => "text/xml; charset=UTF-8" }
377
+ )
378
+
379
+ data = LinkshareAPI.coupon_web_service(network: 1, promotiontype: 22).all
380
+ assert_equal "KJEISLD", data.first.couponcode
381
+ assert_equal "KIRK", data.last.couponcode
382
+
383
+ end
384
+
385
+ private
386
+
387
+ def token
388
+ "abcdef"
389
+ end
390
+
391
+ end
392
+
metadata CHANGED
@@ -1,142 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linkshare_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Razvan Marescu
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-08-13 00:00:00.000000000 Z
11
+ date: 2014-05-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: addressable
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 2.3.5
19
+ version: '2.3'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 2.3.5
26
+ version: '2.3'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: httparty
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: 0.11.0
33
+ version: '0.13'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: 0.11.0
40
+ version: '0.13'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: recursive-open-struct
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 0.4.3
47
+ version: '0.4'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: 0.4.3
54
+ version: '0.4'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: bundler
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
- version: '1.3'
61
+ version: '1.6'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
- version: '1.3'
68
+ version: '1.6'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: webmock
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - ">="
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - ">="
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: test-unit
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - ">="
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - ">="
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: guard-test
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - ">="
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
140
137
  - !ruby/object:Gem::Version
141
138
  version: '0'
142
139
  description: Ruby wrapper for LinkShare Publisher Web Services. See http://helpcenter.linkshare.com/publisher/categories.php?categoryid=71.
@@ -146,14 +143,16 @@ executables: []
146
143
  extensions: []
147
144
  extra_rdoc_files: []
148
145
  files:
149
- - .gitignore
150
- - .travis.yml
146
+ - ".gitignore"
147
+ - ".ruby-version"
148
+ - ".travis.yml"
151
149
  - Gemfile
152
150
  - Guardfile
153
151
  - LICENSE.txt
154
152
  - README.md
155
153
  - Rakefile
156
154
  - lib/linkshare_api.rb
155
+ - lib/linkshare_api/coupon_web_service.rb
157
156
  - lib/linkshare_api/errors/authentication_error.rb
158
157
  - lib/linkshare_api/errors/connection_error.rb
159
158
  - lib/linkshare_api/errors/error.rb
@@ -164,32 +163,33 @@ files:
164
163
  - lib/linkshare_api/version.rb
165
164
  - linkshare_api.gemspec
166
165
  - test/linkshare_api_test.rb
166
+ - test/linkshare_coupon_api_test.rb
167
167
  - test/test_helper.rb
168
168
  homepage: https://github.com/rmarescu/linkshare_api
169
169
  licenses:
170
170
  - MIT
171
+ metadata: {}
171
172
  post_install_message:
172
173
  rdoc_options: []
173
174
  require_paths:
174
175
  - lib
175
176
  required_ruby_version: !ruby/object:Gem::Requirement
176
- none: false
177
177
  requirements:
178
- - - ! '>='
178
+ - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '1.9'
181
181
  required_rubygems_version: !ruby/object:Gem::Requirement
182
- none: false
183
182
  requirements:
184
- - - ! '>='
183
+ - - ">="
185
184
  - !ruby/object:Gem::Version
186
185
  version: '0'
187
186
  requirements: []
188
187
  rubyforge_project:
189
- rubygems_version: 1.8.23
188
+ rubygems_version: 2.2.2
190
189
  signing_key:
191
- specification_version: 3
190
+ specification_version: 4
192
191
  summary: Linkshare API
193
192
  test_files:
194
193
  - test/linkshare_api_test.rb
194
+ - test/linkshare_coupon_api_test.rb
195
195
  - test/test_helper.rb