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 +2 -0
- data/Gemfile +4 -0
- data/Guardfile +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +63 -0
- data/Rakefile +10 -0
- data/lib/linkshare_api.rb +35 -0
- data/lib/linkshare_api/errors/authentication_error.rb +4 -0
- data/lib/linkshare_api/errors/connection_error.rb +4 -0
- data/lib/linkshare_api/errors/error.rb +15 -0
- data/lib/linkshare_api/errors/invalid_request_error.rb +4 -0
- data/lib/linkshare_api/link_generator.rb +52 -0
- data/lib/linkshare_api/version.rb +3 -0
- data/linkshare_api.gemspec +29 -0
- data/test/linkshare_api_test.rb +65 -0
- data/test/test_helper.rb +7 -0
- metadata +160 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
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
|
+
[](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,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,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,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,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
|
data/test/test_helper.rb
ADDED
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
|