linkedin 0.1.7 → 0.2.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/.autotest +14 -0
- data/.document +5 -0
- data/.gitignore +25 -0
- data/Gemfile +3 -0
- data/README.markdown +12 -7
- data/Rakefile +10 -33
- data/VERSION +1 -1
- data/changelog.markdown +38 -0
- data/examples/authenticate.rb +1 -1
- data/lib/linked_in/api_standard_profile_request.rb +14 -6
- data/lib/linked_in/authorization_helpers.rb +48 -0
- data/lib/linked_in/base.rb +13 -0
- data/lib/linked_in/birthdate.rb +21 -0
- data/lib/linked_in/client.rb +86 -146
- data/lib/linked_in/company.rb +9 -7
- data/lib/linked_in/connections.rb +14 -5
- data/lib/linked_in/country.rb +7 -5
- data/lib/linked_in/current_share.rb +56 -0
- data/lib/linked_in/education.rb +40 -14
- data/lib/linked_in/error.rb +19 -8
- data/lib/linked_in/group.rb +30 -7
- data/lib/linked_in/languages.rb +28 -0
- data/lib/linked_in/likes.rb +23 -0
- data/lib/linked_in/location.rb +11 -6
- data/lib/linked_in/message.rb +20 -0
- data/lib/linked_in/network.rb +10 -5
- data/lib/linked_in/patents.rb +42 -0
- data/lib/linked_in/people.rb +16 -8
- data/lib/linked_in/person.rb +7 -0
- data/lib/linked_in/phone_number.rb +29 -0
- data/lib/linked_in/position.rb +45 -14
- data/lib/linked_in/profile.rb +81 -28
- data/lib/linked_in/publications.rb +40 -0
- data/lib/linked_in/recipient.rb +7 -0
- data/lib/linked_in/recipients.rb +18 -0
- data/lib/linked_in/recommendations.rb +30 -0
- data/lib/linked_in/request_helpers.rb +76 -0
- data/lib/linked_in/short_profile.rb +13 -0
- data/lib/linked_in/skill.rb +33 -0
- data/lib/linked_in/to_xml_helpers.rb +53 -0
- data/lib/linked_in/update.rb +21 -9
- data/lib/linked_in/url_resource.rb +24 -6
- data/lib/linkedin.rb +58 -59
- data/linkedin.gemspec +52 -0
- data/spec/cases/client_spec.rb +281 -0
- data/spec/cases/linkedin_spec.rb +37 -0
- data/spec/cases/oauth_spec.rb +109 -0
- data/{test → spec}/fixtures/blank.xml +0 -0
- data/{test → spec}/fixtures/connections.xml +0 -0
- data/{test → spec}/fixtures/error.xml +0 -0
- data/spec/fixtures/likes.xml +18 -0
- data/spec/fixtures/mailbox_items.xml +16 -0
- data/{test → spec}/fixtures/network_status_with_group.xml +3 -3
- data/{test → spec}/fixtures/network_statuses.xml +18 -0
- data/{test → spec}/fixtures/picture_updates.xml +0 -0
- data/{test → spec}/fixtures/profile.xml +0 -0
- data/{test → spec}/fixtures/profile_full.xml +57 -0
- data/{test → spec}/fixtures/profile_with_positions.xml +0 -0
- data/{test → spec}/fixtures/search.xml +2 -2
- data/spec/fixtures/shares.xml +12 -0
- data/{test → spec}/fixtures/status.xml +0 -0
- data/spec/spec_helper.rb +49 -0
- metadata +160 -76
- data/test/client_test.rb +0 -124
- data/test/oauth_test.rb +0 -117
- data/test/test_helper.rb +0 -51
data/test/client_test.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ClientTest < Test::Unit::TestCase
|
4
|
-
context "when hitting the LinkedIn API" do
|
5
|
-
setup do
|
6
|
-
@linkedin = LinkedIn::Client.new('token', 'secret')
|
7
|
-
consumer = OAuth::Consumer.new('token', 'secret', {:site => 'https://api.linkedin.com'})
|
8
|
-
@linkedin.stubs(:consumer).returns(consumer)
|
9
|
-
|
10
|
-
@linkedin.authorize_from_access('atoken', 'asecret')
|
11
|
-
end
|
12
|
-
|
13
|
-
should "retrieve a profile for the authenticated user" do
|
14
|
-
stub_get("/v1/people/~", "profile_full.xml")
|
15
|
-
p = @linkedin.profile
|
16
|
-
p.first_name.should == 'Wynn'
|
17
|
-
p.last_name.should == 'Netherland'
|
18
|
-
p.positions.size.should == 4
|
19
|
-
p.positions.first.company.name.should == 'Orrka'
|
20
|
-
|
21
|
-
hp = p.positions[2]
|
22
|
-
hp.start_month.should == 10
|
23
|
-
hp.start_year.should == 2004
|
24
|
-
hp.end_month.should == 6
|
25
|
-
hp.end_year.should == 2007
|
26
|
-
|
27
|
-
education = p.education.first
|
28
|
-
education.start_month.should == 8
|
29
|
-
education.start_year.should == 1994
|
30
|
-
education.end_month.should == 5
|
31
|
-
education.end_year.should == 1998
|
32
|
-
|
33
|
-
p.connections.size.should == 146
|
34
|
-
p.connections.first.first_name.should == "Ali"
|
35
|
-
end
|
36
|
-
|
37
|
-
should "retrieve a profile for a member by id" do
|
38
|
-
stub_get("/v1/people/id=gNma67_AdI", "profile.xml")
|
39
|
-
p = @linkedin.profile(:id => "gNma67_AdI")
|
40
|
-
p.first_name.should == 'Wynn'
|
41
|
-
end
|
42
|
-
|
43
|
-
should "retrieve a profile for a member by url" do
|
44
|
-
stub_get("/v1/people/url=http%3A%2F%2Fwww.linkedin.com%2Fin%2Fnetherland", "profile.xml")
|
45
|
-
p = @linkedin.profile(:url => "http://www.linkedin.com/in/netherland")
|
46
|
-
p.last_name.should == 'Netherland'
|
47
|
-
end
|
48
|
-
|
49
|
-
should "accept field selectors when retrieving a profile" do
|
50
|
-
stub_get("/v1/people/~:(first-name,last-name)", "profile.xml")
|
51
|
-
p = @linkedin.profile(:fields => [:first_name, :last_name])
|
52
|
-
p.first_name.should == 'Wynn'
|
53
|
-
p.last_name.should == 'Netherland'
|
54
|
-
end
|
55
|
-
|
56
|
-
should "retrieve connections for the authenticated user" do
|
57
|
-
stub_get("/v1/people/~/connections", "connections.xml")
|
58
|
-
cons = @linkedin.connections
|
59
|
-
cons.size.should == 146
|
60
|
-
cons.last.last_name.should == 'Yuchnewicz'
|
61
|
-
end
|
62
|
-
|
63
|
-
should "perform a search by keyword" do
|
64
|
-
stub_get("/v1/people?keywords=github", "search.xml")
|
65
|
-
results = @linkedin.search(:keywords => 'github')
|
66
|
-
results.start == 0
|
67
|
-
results.count == 10
|
68
|
-
results.profiles.first.first_name.should == 'Zach'
|
69
|
-
results.profiles.first.last_name.should == 'Inglis'
|
70
|
-
end
|
71
|
-
|
72
|
-
should "perform a search by multiple keywords" do
|
73
|
-
stub_get("/v1/people?keywords=ruby+rails", "search.xml")
|
74
|
-
results = @linkedin.search(:keywords => ["ruby", "rails"])
|
75
|
-
results.start == 0
|
76
|
-
results.count == 10
|
77
|
-
results.profiles.first.first_name.should == 'Zach'
|
78
|
-
results.profiles.first.last_name.should == 'Inglis'
|
79
|
-
end
|
80
|
-
|
81
|
-
should "perform a search by name" do
|
82
|
-
stub_get("/v1/people?name=Zach+Inglis", "search.xml")
|
83
|
-
results = @linkedin.search(:name => "Zach Inglis")
|
84
|
-
results.start == 0
|
85
|
-
results.count == 10
|
86
|
-
results.profiles.first.first_name.should == 'Zach'
|
87
|
-
results.profiles.first.last_name.should == 'Inglis'
|
88
|
-
end
|
89
|
-
|
90
|
-
should "update a user's current status" do
|
91
|
-
stub_put("/v1/people/~/current-status", "blank.xml")
|
92
|
-
@linkedin.update_status("Testing out the LinkedIn API")
|
93
|
-
end
|
94
|
-
|
95
|
-
should "clear a user's current status" do
|
96
|
-
stub_delete("/v1/people/~/current-status", "blank.xml")
|
97
|
-
@linkedin.clear_status
|
98
|
-
end
|
99
|
-
|
100
|
-
should "retrieve the authenticated user's current status" do
|
101
|
-
stub_get("/v1/people/~/current-status", "status.xml")
|
102
|
-
@linkedin.current_status.should == "New blog post: What makes a good API wrapper? http://wynnnetherland.com/2009/11/what-makes-a-good-api-wrapper/"
|
103
|
-
end
|
104
|
-
|
105
|
-
should "retrieve status updates for the authenticated user's network" do
|
106
|
-
stub_get("/v1/people/~/network?type=STAT", "network_statuses.xml")
|
107
|
-
stats = @linkedin.network_statuses
|
108
|
-
stats.updates.first.profile.id.should == "19408512"
|
109
|
-
stats.updates.first.profile.first_name.should == 'Vahid'
|
110
|
-
stats.updates.first.profile.connections.first.id.should == "28072758"
|
111
|
-
stats.updates.first.profile.connections.first.last_name.should == 'Varone'
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
should "retrieve network updates" do
|
116
|
-
stub_get("/v1/people/~/network?type=PICT", "picture_updates.xml")
|
117
|
-
stats = @linkedin.network_updates(:type => "PICT")
|
118
|
-
stats.updates.size.should == 4
|
119
|
-
stats.updates.last.profile.headline.should == "Creative Director for Intridea"
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
data/test/oauth_test.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class OAuthTest < Test::Unit::TestCase
|
4
|
-
should "initialize with consumer token and secret" do
|
5
|
-
linkedin = LinkedIn::Client.new('token', 'secret')
|
6
|
-
|
7
|
-
linkedin.ctoken.should == 'token'
|
8
|
-
linkedin.csecret.should == 'secret'
|
9
|
-
end
|
10
|
-
|
11
|
-
should "set authorization path to '/uas/oauth/authorize' by default" do
|
12
|
-
linkedin = LinkedIn::Client.new('token', 'secret')
|
13
|
-
linkedin.consumer.options[:authorize_path].should == '/uas/oauth/authorize'
|
14
|
-
end
|
15
|
-
|
16
|
-
should "have a consumer" do
|
17
|
-
consumer = mock('oauth consumer')
|
18
|
-
options = {
|
19
|
-
:request_token_path => "/uas/oauth/requestToken",
|
20
|
-
:access_token_path => "/uas/oauth/accessToken",
|
21
|
-
:authorize_path => "/uas/oauth/authorize",
|
22
|
-
:site => 'https://api.linkedin.com'
|
23
|
-
}
|
24
|
-
OAuth::Consumer.expects(:new).with('token', 'secret', options).returns(consumer)
|
25
|
-
linkedin = LinkedIn::Client.new('token', 'secret')
|
26
|
-
|
27
|
-
linkedin.consumer.should == consumer
|
28
|
-
end
|
29
|
-
|
30
|
-
should "have a request token from the consumer" do
|
31
|
-
options = {
|
32
|
-
:request_token_path => "/uas/oauth/requestToken",
|
33
|
-
:access_token_path => "/uas/oauth/accessToken",
|
34
|
-
:authorize_path => "/uas/oauth/authorize",
|
35
|
-
:site => 'https://api.linkedin.com'
|
36
|
-
}
|
37
|
-
consumer = mock('oauth consumer')
|
38
|
-
request_token = mock('request token')
|
39
|
-
consumer.expects(:get_request_token).returns(request_token)
|
40
|
-
OAuth::Consumer.expects(:new).with('token', 'secret', options).returns(consumer)
|
41
|
-
linkedin = LinkedIn::Client.new('token', 'secret')
|
42
|
-
|
43
|
-
linkedin.request_token.should == request_token
|
44
|
-
end
|
45
|
-
|
46
|
-
context "set_callback_url" do
|
47
|
-
should "clear request token and set the callback url" do
|
48
|
-
consumer = mock('oauth consumer')
|
49
|
-
request_token = mock('request token')
|
50
|
-
options = {
|
51
|
-
:request_token_path => "/uas/oauth/requestToken",
|
52
|
-
:access_token_path => "/uas/oauth/accessToken",
|
53
|
-
:authorize_path => "/uas/oauth/authorize",
|
54
|
-
:site => 'https://api.linkedin.com'
|
55
|
-
}
|
56
|
-
OAuth::Consumer.
|
57
|
-
expects(:new).
|
58
|
-
with('token', 'secret', options).
|
59
|
-
returns(consumer)
|
60
|
-
|
61
|
-
linkedin = LinkedIn::Client.new('token', 'secret')
|
62
|
-
|
63
|
-
consumer.
|
64
|
-
expects(:get_request_token).
|
65
|
-
with({:oauth_callback => 'http://myapp.com/oauth_callback'})
|
66
|
-
|
67
|
-
linkedin.set_callback_url('http://myapp.com/oauth_callback')
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
should "be able to create access token from request token, request secret and verifier" do
|
72
|
-
linkedin = LinkedIn::Client.new('token', 'secret')
|
73
|
-
consumer = OAuth::Consumer.new('token', 'secret', {:site => 'https://api.linkedin.com'})
|
74
|
-
linkedin.stubs(:consumer).returns(consumer)
|
75
|
-
|
76
|
-
access_token = mock('access token', :token => 'atoken', :secret => 'asecret')
|
77
|
-
request_token = mock('request token')
|
78
|
-
request_token.
|
79
|
-
expects(:get_access_token).
|
80
|
-
with(:oauth_verifier => 'verifier').
|
81
|
-
returns(access_token)
|
82
|
-
|
83
|
-
OAuth::RequestToken.
|
84
|
-
expects(:new).
|
85
|
-
with(consumer, 'rtoken', 'rsecret').
|
86
|
-
returns(request_token)
|
87
|
-
|
88
|
-
linkedin.authorize_from_request('rtoken', 'rsecret', 'verifier')
|
89
|
-
linkedin.access_token.class.should be(OAuth::AccessToken)
|
90
|
-
linkedin.access_token.token.should == 'atoken'
|
91
|
-
linkedin.access_token.secret.should == 'asecret'
|
92
|
-
end
|
93
|
-
|
94
|
-
should "be able to create access token from access token and secret" do
|
95
|
-
linkedin = LinkedIn::Client.new('token', 'secret')
|
96
|
-
consumer = OAuth::Consumer.new('token', 'secret', {:site => 'https://api.linkedin.com'})
|
97
|
-
linkedin.stubs(:consumer).returns(consumer)
|
98
|
-
|
99
|
-
linkedin.authorize_from_access('atoken', 'asecret')
|
100
|
-
linkedin.access_token.class.should be(OAuth::AccessToken)
|
101
|
-
linkedin.access_token.token.should == 'atoken'
|
102
|
-
linkedin.access_token.secret.should == 'asecret'
|
103
|
-
end
|
104
|
-
|
105
|
-
should "be able to configure consumer token and consumer secret without passing to initialize" do
|
106
|
-
LinkedIn.configure do |config|
|
107
|
-
config.token = 'consumer_token'
|
108
|
-
config.secret = 'consumer_secret'
|
109
|
-
end
|
110
|
-
|
111
|
-
linkedin = LinkedIn::Client.new
|
112
|
-
linkedin.ctoken.should == 'consumer_token'
|
113
|
-
linkedin.csecret.should == 'consumer_secret'
|
114
|
-
end
|
115
|
-
|
116
|
-
|
117
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'pathname'
|
3
|
-
require 'rubygems'
|
4
|
-
|
5
|
-
gem 'thoughtbot-shoulda', '>= 2.10.1'
|
6
|
-
gem 'jnunemaker-matchy', '0.4.0'
|
7
|
-
gem 'mocha', '0.9.4'
|
8
|
-
gem 'fakeweb', '>= 1.2.5'
|
9
|
-
|
10
|
-
require 'shoulda'
|
11
|
-
require 'matchy'
|
12
|
-
require 'mocha'
|
13
|
-
require 'fakeweb'
|
14
|
-
|
15
|
-
FakeWeb.allow_net_connect = false
|
16
|
-
|
17
|
-
dir = (Pathname(__FILE__).dirname + '../lib').expand_path
|
18
|
-
require dir + 'linkedin'
|
19
|
-
|
20
|
-
class Test::Unit::TestCase
|
21
|
-
end
|
22
|
-
|
23
|
-
def fixture_file(filename)
|
24
|
-
return '' if filename == ''
|
25
|
-
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/' + filename)
|
26
|
-
File.read(file_path)
|
27
|
-
end
|
28
|
-
|
29
|
-
def linkedin_url(url)
|
30
|
-
url =~ /^http/ ? url : "https://api.linkedin.com#{url}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def stub_get(url, filename, status=nil)
|
34
|
-
options = {:body => fixture_file(filename)}
|
35
|
-
options.merge!({:status => status}) unless status.nil?
|
36
|
-
|
37
|
-
FakeWeb.register_uri(:get, linkedin_url(url), options)
|
38
|
-
end
|
39
|
-
|
40
|
-
def stub_post(url, filename)
|
41
|
-
FakeWeb.register_uri(:post, linkedin_url(url), :body => fixture_file(filename))
|
42
|
-
end
|
43
|
-
|
44
|
-
def stub_put(url, filename)
|
45
|
-
FakeWeb.register_uri(:put, linkedin_url(url), :body => fixture_file(filename))
|
46
|
-
end
|
47
|
-
|
48
|
-
def stub_delete(url, filename)
|
49
|
-
FakeWeb.register_uri(:delete, linkedin_url(url), :body => fixture_file(filename))
|
50
|
-
|
51
|
-
end
|