linkshare_api 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in pepperjam.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,10 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :test do
5
+ watch(%r{^test/.+_test\.rb$})
6
+ watch("test/test_helper.rb") { "test" }
7
+
8
+ watch(%r{^app/models/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
9
+ watch(%r{^app/validators/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
10
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2013- Venture Media Labs, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # LinkShare API
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/linkshare_api.png)](http://badge.fury.io/rb/linkshare_api)
4
+
5
+ Ruby wrapper for [LinkShare Publisher Web Services](http://helpcenter.linkshare.com/publisher/categories.php?categoryid=71).
6
+ Supported web services:
7
+ * [Automated LinkGenerator](#automated_link_generator)
8
+
9
+ If you need services that are not yet supported, feel free to [contribute](#contributing).
10
+ For questions or bugs please [create an issue](../../issues/new).
11
+
12
+ ## <a id="installation"></a>Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'linkshare_api'
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install linkshare_api
25
+
26
+ ## <a id="requirement"></a>Requirements
27
+
28
+ [Ruby](http://www.ruby-lang.org/en/downloads/) 1.9 or above.
29
+
30
+ ## <a id="usage"></a>Usage
31
+
32
+ Before using **LinkShare API** you need to set up your publisher token first. If you use Ruby on Rails, the token can be set in a configuration file (i.e. `app/config/initializers/linkshare_api.rb`), otherwise just set it in your script. The token can be found on LinkShare's Web Services page under the Links tab.
33
+
34
+ ```ruby
35
+ require "linkshare_api" # no need for RoR
36
+ LinkshareAPI.token = ENV["LINKSHARE_TOKEN"]
37
+ ```
38
+
39
+ ### Automated Link Generator
40
+
41
+ Generate affiliate URLs using [Automated LinkGenerator](http://helpcenter.linkshare.com/publisher/categories.php?categoryid=72) service.
42
+ Below is an example of generating an affiliate URL for [Walmart](http://www.walmart.com). Walmart merchant code is `2149`.
43
+
44
+ ```ruby
45
+ url = "http://www.walmart.com/cp/Electronics/3944?povid=P1171-C1093.2766-L33"
46
+ affiliate_url = LinkshareAPI.link_generator(2149, url)
47
+ ```
48
+
49
+ ### Extra Configuration
50
+
51
+ * `LinkshareAPI.api_timeout` - the timeout set when initiating requests to LinkShare Web Services (default value is 30 seconds)
52
+
53
+ ## <a id="contributing"></a>Contributing
54
+
55
+ 1. Fork it
56
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
57
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
58
+ 4. Push to the branch (`git push origin my-new-feature`)
59
+ 5. Create new Pull Request
60
+
61
+ ## <a id="license"></a>License
62
+
63
+ [MIT](LICENSE.txt)
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << "lib" << "test"
6
+ test.pattern = "test/**/*_test.rb"
7
+ test.verbose = true
8
+ end
9
+
10
+ task default: :test
@@ -0,0 +1,35 @@
1
+ # Version
2
+ require "linkshare_api/version"
3
+
4
+ # Resources
5
+ require "linkshare_api/link_generator"
6
+
7
+ # Errors
8
+ require "linkshare_api/errors/error"
9
+ require "linkshare_api/errors/authentication_error"
10
+ require "linkshare_api/errors/connection_error"
11
+ require "linkshare_api/errors/invalid_request_error"
12
+
13
+ module LinkshareAPI
14
+ WEB_SERVICE_URIS = {
15
+ link_generator: "http://getdeeplink.linksynergy.com/createcustomlink.shtml"
16
+ }
17
+
18
+ @api_timeout = 30
19
+
20
+ class << self
21
+ attr_accessor :token
22
+ attr_reader :api_timeout
23
+ end
24
+
25
+ def self.api_timeout=(timeout)
26
+ raise ArgumentError, "Timeout must be a Fixnum; got #{timeout.class} instead" unless timeout.is_a? Fixnum
27
+ raise ArgumentError, "Timeout must be > 0; got #{timeout} instead" unless timeout > 0
28
+ @api_timeout = timeout
29
+ end
30
+
31
+ def self.link_generator(mid, murl)
32
+ link_generator = LinkshareAPI::LinkGenerator.new
33
+ link_generator.build(mid, murl)
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ module LinkshareAPI
2
+ class AuthenticationError < Error
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LinkshareAPI
2
+ class ConnectionError < Error
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module LinkshareAPI
2
+ class Error < StandardError
3
+ attr_reader :message, :code
4
+
5
+ def initialize(message = nil, code = nil)
6
+ @message = message
7
+ @code = code
8
+ end
9
+
10
+ def to_s
11
+ code_string = code.nil? ? "" : " (Code #{code})"
12
+ "#{message}#{code_string}"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ module LinkshareAPI
2
+ class InvalidRequestError < Error
3
+ end
4
+ end
@@ -0,0 +1,52 @@
1
+ require "addressable/uri"
2
+ require "cgi"
3
+ require "httparty"
4
+
5
+ module LinkshareAPI
6
+ # For implementation details please visit
7
+ # http://helpcenter.linkshare.com/publisher/questions.php?questionid=648
8
+ class LinkGenerator
9
+ include HTTParty
10
+
11
+ attr_reader :api_base_url, :token, :api_timeout
12
+
13
+ def initialize
14
+ @token = LinkshareAPI.token
15
+ @api_base_url = LinkshareAPI::WEB_SERVICE_URIS[:link_generator]
16
+ @api_timeout = LinkshareAPI.api_timeout
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 build(mid, murl)
27
+ raise ArgumentError, "mid must be a Fixnum, got #{mid.class} instead" unless mid.is_a?(Fixnum)
28
+
29
+ query_string = "token=#{CGI.escape(token)}"
30
+ query_string << "&mid=#{mid}"
31
+ # murl must not be encoded (RFC ftw)
32
+ query_string << "&murl=#{murl}"
33
+ api_request_url = "#{api_base_url}?#{query_string}"
34
+ begin
35
+ response = self.class.get(api_request_url, timeout: api_timeout)
36
+ rescue Timeout::Error
37
+ raise ConnectionError.new("Timeout error (#{timeout}s)")
38
+ end
39
+
40
+ if response.code != 200
41
+ raise Error.new("Unexpected response: #{response.message}", response.code)
42
+ end
43
+
44
+ # If the body content looks like an URL, then would be
45
+ # safe to assume that the request was processed correctly
46
+ unless response.body.start_with? "http://", "https://"
47
+ raise InvalidRequestError.new(response.body)
48
+ end
49
+ response.body
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,3 @@
1
+ module LinkshareAPI
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "linkshare_api/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "linkshare_api"
8
+ s.version = LinkshareAPI::VERSION
9
+ s.authors = ["Razvan Marescu"]
10
+ s.email = ["razvan@marescu.net"]
11
+ s.description = %q{Ruby wrapper for LinkShare Publisher Web Services. See http://helpcenter.linkshare.com/publisher/categories.php?categoryid=71.}
12
+ s.summary = %q{Linkshare API}
13
+ s.homepage = "https://github.com/rmarescu/linkshare_api"
14
+ s.license = "MIT"
15
+ s.required_ruby_version = ">= 1.9"
16
+
17
+ s.files = `git ls-files`.split($/)
18
+ s.test_files = s.files.grep(%r{^(test|s|features)/})
19
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "httparty", "~> 0.11.0"
23
+
24
+ s.add_development_dependency "bundler", "~> 1.3"
25
+ s.add_development_dependency "rake"
26
+ s.add_development_dependency "webmock"
27
+ s.add_development_dependency "test-unit"
28
+ s.add_development_dependency "guard-test"
29
+ end
@@ -0,0 +1,65 @@
1
+ require "test_helper"
2
+
3
+ class LinkshareAPITest < Test::Unit::TestCase
4
+ def test_link_generator_invalid_token
5
+ LinkshareAPI.token = nil
6
+ assert_raise LinkshareAPI::AuthenticationError do
7
+ LinkshareAPI.link_generator(123, "http://www.example.com")
8
+ end
9
+ end
10
+
11
+ def test_link_generator_invalid_timeout
12
+ assert_raise ArgumentError do
13
+ LinkshareAPI.api_timeout = ""
14
+ end
15
+
16
+ assert_raise ArgumentError do
17
+ LinkshareAPI.api_timeout = "20"
18
+ end
19
+
20
+ assert_raise ArgumentError do
21
+ LinkshareAPI.api_timeout = 0
22
+ end
23
+ end
24
+
25
+ def test_link_generator_invalid_mid
26
+ LinkshareAPI.token = "token"
27
+ assert_raise ArgumentError do
28
+ LinkshareAPI.link_generator(nil, nil)
29
+ end
30
+ end
31
+
32
+ def test_link_generator_missing_url
33
+ LinkshareAPI.token = "your_token"
34
+ stub_request(
35
+ :get,
36
+ "http://getdeeplink.linksynergy.com/createcustomlink.shtml?token=your_token&mid=123&murl="
37
+ ).
38
+ to_return(
39
+ status: 200,
40
+ body: "No Advertiser URL provided for deep linking. This could be because murl was not found or was empty.",
41
+ headers: {}
42
+ )
43
+ e = assert_raise LinkshareAPI::InvalidRequestError do
44
+ LinkshareAPI.link_generator(123, nil)
45
+ end
46
+ assert_equal "No Advertiser URL provided for deep linking. This could be because murl was not found or was empty.", e.to_s
47
+ end
48
+
49
+ def test_link_generator_valid_request
50
+ LinkshareAPI.token = "your_token"
51
+ mid = 2149
52
+ murl = "http://www.walmart.com/cp/blu-ray/616859?povid=P1171-C1110.2784+1455.2776+1115.2956-L44"
53
+ stub_request(
54
+ :get,
55
+ "http://getdeeplink.linksynergy.com/createcustomlink.shtml?token=your_token&mid=#{mid}&murl=#{murl}"
56
+ ).
57
+ to_return(
58
+ status: 200,
59
+ body: "http://linksynergy.walmart.com/fs-bin/click?id=yourid&subid=0&offerid=223073.1&type=10&tmpid=273&RD_PARM0=http%3A%2F%2Fwww.walmart.com%2Fcp%2Fblu-ray%2F616859%3Fpovid%3DP1171-C1110.2784%2B1455.2776%2B1115.2956-L44&RD_PARM1=http%3A%2F%2Fwww.walmart.com%2Fcp%2Fblu-ray%2F616859%3F&RD_PARM2=povid%3DP1171-C1110.2784%2B1455.2776%2B1115.2956-L44",
60
+ headers: {}
61
+ )
62
+ url = LinkshareAPI.link_generator(mid, murl)
63
+ assert_equal "http://linksynergy.walmart.com/fs-bin/click?id=yourid&subid=0&offerid=223073.1&type=10&tmpid=273&RD_PARM0=http%3A%2F%2Fwww.walmart.com%2Fcp%2Fblu-ray%2F616859%3Fpovid%3DP1171-C1110.2784%2B1455.2776%2B1115.2956-L44&RD_PARM1=http%3A%2F%2Fwww.walmart.com%2Fcp%2Fblu-ray%2F616859%3F&RD_PARM2=povid%3DP1171-C1110.2784%2B1455.2776%2B1115.2956-L44", url
64
+ end
65
+ end
@@ -0,0 +1,7 @@
1
+ require "rubygems"
2
+ require "test/unit"
3
+ require "webmock/test_unit"
4
+
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
7
+ require "linkshare_api"
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: linkshare_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Razvan Marescu
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-08-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.11.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.11.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: webmock
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: test-unit
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: guard-test
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: Ruby wrapper for LinkShare Publisher Web Services. See http://helpcenter.linkshare.com/publisher/categories.php?categoryid=71.
111
+ email:
112
+ - razvan@marescu.net
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - Gemfile
119
+ - Guardfile
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - lib/linkshare_api.rb
124
+ - lib/linkshare_api/errors/authentication_error.rb
125
+ - lib/linkshare_api/errors/connection_error.rb
126
+ - lib/linkshare_api/errors/error.rb
127
+ - lib/linkshare_api/errors/invalid_request_error.rb
128
+ - lib/linkshare_api/link_generator.rb
129
+ - lib/linkshare_api/version.rb
130
+ - linkshare_api.gemspec
131
+ - test/linkshare_api_test.rb
132
+ - test/test_helper.rb
133
+ homepage: https://github.com/rmarescu/linkshare_api
134
+ licenses:
135
+ - MIT
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '1.9'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 1.8.23
155
+ signing_key:
156
+ specification_version: 3
157
+ summary: Linkshare API
158
+ test_files:
159
+ - test/linkshare_api_test.rb
160
+ - test/test_helper.rb