linkshare_api 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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