linked_in 0.0.21
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/History.txt +4 -0
- data/Manifest.txt +27 -0
- data/PostInstall.txt +0 -0
- data/README.rdoc +104 -0
- data/Rakefile +26 -0
- data/docs/sample-oauth-plugin_token.rb +18 -0
- data/lib/linked_in.rb +27 -0
- data/lib/linked_in/base.rb +84 -0
- data/lib/linked_in/oauth.rb +65 -0
- data/lib/linked_in/request.rb +86 -0
- data/linked_in.gemspec +42 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/fixtures/connections.xml +55 -0
- data/spec/fixtures/connections_with_field_selectors.xml +11 -0
- data/spec/fixtures/empty.xml +2 -0
- data/spec/fixtures/error.xml +7 -0
- data/spec/fixtures/network.xml +99 -0
- data/spec/fixtures/people.xml +100 -0
- data/spec/fixtures/profile.xml +9 -0
- data/spec/linked_in/base_spec.rb +150 -0
- data/spec/linked_in/oauth_spec.rb +106 -0
- data/spec/linked_in/request_spec.rb +115 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +39 -0
- data/tasks/rspec.rake +21 -0
- metadata +145 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
describe LinkedIn::OAuth, 'when doing CRUD' do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@default_options = {:access_token_path=>"/uas/oauth/accessToken", :site=>"https://api.linkedin.com",
|
7
|
+
:authorize_path=>"/uas/oauth/authorize", :request_token_path=>"/uas/oauth/requestToken?oauth_callback=oob"}
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should initialize with consumer token and secret" do
|
11
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
12
|
+
|
13
|
+
linkedin.ctoken.should == 'token'
|
14
|
+
linkedin.csecret.should == 'secret'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "shgould set autorization path to '/uas/oauth/authorize' by default" do
|
18
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
19
|
+
linkedin.consumer.options[:authorize_path].should == '/uas/oauth/authorize'
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have a consumer" do
|
23
|
+
consumer = mock('oauth consumer')
|
24
|
+
OAuth::Consumer.should_receive(:new).with('token', 'secret', @default_options).and_return(consumer)
|
25
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
26
|
+
linkedin.consumer.should == consumer
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should have a request token from the consumer" do
|
30
|
+
consumer = mock('oauth consumer')
|
31
|
+
request_token = mock('request token')
|
32
|
+
consumer.should_receive(:get_request_token).and_return(request_token)
|
33
|
+
OAuth::Consumer.should_receive(:new).with('token', 'secret', @default_options).and_return(consumer)
|
34
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
35
|
+
|
36
|
+
linkedin.request_token.should == request_token
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should clear request token and set the callback url" do
|
40
|
+
consumer = mock('oauth consumer')
|
41
|
+
request_token = mock('request token')
|
42
|
+
|
43
|
+
OAuth::Consumer.
|
44
|
+
should_receive(:new).
|
45
|
+
with('token', 'secret', @default_options).
|
46
|
+
and_return(consumer)
|
47
|
+
|
48
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
49
|
+
|
50
|
+
consumer.
|
51
|
+
should_receive(:get_request_token).
|
52
|
+
with({:oauth_callback => 'http://myapp.com/oauth_callback'})
|
53
|
+
|
54
|
+
linkedin.set_callback_url('http://myapp.com/oauth_callback')
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should be able to create access token from request token, request secret and verifier" do
|
58
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
59
|
+
consumer = OAuth::Consumer.new('token', 'secret', @default_options)
|
60
|
+
linkedin.stub!(:consumer => consumer)
|
61
|
+
|
62
|
+
access_token = mock('access token', :token => 'atoken', :secret => 'asecret')
|
63
|
+
request_token = mock('request token')
|
64
|
+
request_token.
|
65
|
+
should_receive(:get_access_token).
|
66
|
+
with(:oauth_verifier => 'verifier').
|
67
|
+
and_return(access_token)
|
68
|
+
|
69
|
+
OAuth::RequestToken.
|
70
|
+
should_receive(:new).
|
71
|
+
with(consumer, 'rtoken', 'rsecret').
|
72
|
+
and_return(request_token)
|
73
|
+
|
74
|
+
linkedin.authorize_from_request('rtoken', 'rsecret', 'verifier')
|
75
|
+
linkedin.access_token.class.should be(OAuth::AccessToken)
|
76
|
+
linkedin.access_token.token.should == 'atoken'
|
77
|
+
linkedin.access_token.secret.should == 'asecret'
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should create access token from access token and secret" do
|
81
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
82
|
+
consumer = OAuth::Consumer.new('token', 'secret', @default_options)
|
83
|
+
linkedin.stub!(:consumer => consumer)
|
84
|
+
|
85
|
+
linkedin.authorize_from_access('atoken', 'asecret')
|
86
|
+
linkedin.access_token.class.should be(OAuth::AccessToken)
|
87
|
+
linkedin.access_token.token.should == 'atoken'
|
88
|
+
linkedin.access_token.secret.should == 'asecret'
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should delegate get to access token" do
|
92
|
+
access_token = mock('access token')
|
93
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
94
|
+
linkedin.stub!(:access_token => access_token)
|
95
|
+
access_token.should_receive(:get).and_return(nil)
|
96
|
+
linkedin.get('/foo')
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should delegate post to access token" do
|
100
|
+
access_token = mock('access token')
|
101
|
+
linkedin = LinkedIn::OAuth.new('token', 'secret')
|
102
|
+
linkedin.stub!(:access_token => access_token)
|
103
|
+
access_token.should_receive(:post).and_return(nil)
|
104
|
+
linkedin.post('/foo')
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
describe LinkedIn::Request, 'when getting requests' do
|
4
|
+
before do
|
5
|
+
@client = mock('twitter client')
|
6
|
+
@request = LinkedIn::Request.new(@client, :get, '/statuses/user_timeline.json', {:query => {:since_id => 1234}})
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should have client" do
|
10
|
+
@request.client.should == @client
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have method" do
|
14
|
+
@request.method.should == :get
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have path" do
|
18
|
+
@request.path.should == '/statuses/user_timeline.json'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should have options" do
|
22
|
+
@request.options[:query].should == {:since_id => 1234}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should have uri" do
|
26
|
+
@request.uri.should == '/statuses/user_timeline.json?since_id=1234'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe LinkedIn::Request, 'when putting requests' do
|
31
|
+
before do
|
32
|
+
@client = mock('twitter client')
|
33
|
+
@request = LinkedIn::Request.new(@client, :put, '/statuses/user_timeline.json', {:body => '<some>xml</some>'})
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should have client" do
|
37
|
+
@request.client.should == @client
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should have method" do
|
41
|
+
@request.method.should == :put
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have path" do
|
45
|
+
@request.path.should == '/statuses/user_timeline.json'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should have options" do
|
49
|
+
@request.options[:body].should == '<some>xml</some>'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe LinkedIn::Request, 'when getting raising errors' do
|
54
|
+
before do
|
55
|
+
oauth = LinkedIn::OAuth.new('token', 'secret')
|
56
|
+
oauth.authorize_from_access('atoken', 'asecret')
|
57
|
+
@client = LinkedIn::Base.new(oauth)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should not raise error for 200" do
|
61
|
+
stub_get('/foo', 'empty.xml', ['200'])
|
62
|
+
lambda {
|
63
|
+
LinkedIn::Request.get(@client, '/foo')
|
64
|
+
}.should_not raise_error
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should not raise error for 304" do
|
68
|
+
stub_get('/foo', 'empty.xml', ['304'])
|
69
|
+
lambda {
|
70
|
+
LinkedIn::Request.get(@client, '/foo')
|
71
|
+
}.should_not raise_error
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should raise Unauthorized for 401" do
|
75
|
+
stub_get('/foo', 'empty.xml', ['401'])
|
76
|
+
lambda {
|
77
|
+
LinkedIn::Request.get(@client, '/foo')
|
78
|
+
}.should raise_error(LinkedIn::Unauthorized)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should raise General for 403" do
|
82
|
+
stub_get('/foo', 'empty.xml', ['403'])
|
83
|
+
lambda {
|
84
|
+
LinkedIn::Request.get(@client, '/foo')
|
85
|
+
}.should raise_error(LinkedIn::Forbidden)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should raise NotFound for 404" do
|
89
|
+
stub_get('/foo', 'empty.xml', ['404'])
|
90
|
+
lambda {
|
91
|
+
LinkedIn::Request.get(@client, '/foo')
|
92
|
+
}.should raise_error(LinkedIn::NotFound)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should raise Unavailable for 500" do
|
96
|
+
stub_get('/foo', 'empty.xml', ['500'])
|
97
|
+
lambda {
|
98
|
+
LinkedIn::Request.get(@client, '/foo')
|
99
|
+
}.should raise_error(LinkedIn::Unavailable)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should raise Unavailable for 502" do
|
103
|
+
stub_get('/foo', 'empty.xml', ['502'])
|
104
|
+
lambda {
|
105
|
+
LinkedIn::Request.get(@client, '/foo')
|
106
|
+
}.should raise_error(LinkedIn::Unavailable)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should raise Unavailable for 503" do
|
110
|
+
stub_get('/foo', 'empty.xml', ['503'])
|
111
|
+
lambda {
|
112
|
+
LinkedIn::Request.get(@client, '/foo')
|
113
|
+
}.should raise_error(LinkedIn::Unavailable)
|
114
|
+
end
|
115
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
5
|
+
gem 'rspec'
|
6
|
+
require 'spec'
|
7
|
+
end
|
8
|
+
|
9
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
10
|
+
|
11
|
+
require 'linked_in'
|
12
|
+
require 'fakeweb'
|
13
|
+
|
14
|
+
FakeWeb.allow_net_connect = false
|
15
|
+
|
16
|
+
def linkedin_url(path)
|
17
|
+
"https://api.linkedin.com#{path}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def fixture_file(filename)
|
21
|
+
return '' if filename == ''
|
22
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/' + filename)
|
23
|
+
File.read(file_path)
|
24
|
+
end
|
25
|
+
|
26
|
+
def stub_get(url, filename, status=nil)
|
27
|
+
options = {:body => fixture_file(filename)}
|
28
|
+
options.merge!({:status => status}) unless status.nil?
|
29
|
+
|
30
|
+
FakeWeb.register_uri(:get, linkedin_url(url), options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def stub_post(url, filename)
|
34
|
+
FakeWeb.register_uri(:post, linkedin_url(url), :body => fixture_file(filename))
|
35
|
+
end
|
36
|
+
|
37
|
+
def stub_put(url, filename)
|
38
|
+
FakeWeb.register_uri(:put, linkedin_url(url), :body => fixture_file(filename))
|
39
|
+
end
|
data/tasks/rspec.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
5
|
+
require 'spec'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
rescue LoadError
|
10
|
+
puts <<-EOS
|
11
|
+
To use rspec for testing you must install rspec gem:
|
12
|
+
gem install rspec
|
13
|
+
EOS
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run the specs under spec/models"
|
18
|
+
Spec::Rake::SpecTask.new do |t|
|
19
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: linked_in
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.21
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Peter T. Brown
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-25 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hoe
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.3.3
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: oauth
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.5
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: jordi-xml-object
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.9.91
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: hoe
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.3.3
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: oauth
|
57
|
+
type: :development
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.3.5
|
64
|
+
version:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: jordi-xml-object
|
67
|
+
type: :development
|
68
|
+
version_requirement:
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 0.9.91
|
74
|
+
version:
|
75
|
+
description: The linked_in gem wraps the LinkedIn API, including support for OAuth
|
76
|
+
email:
|
77
|
+
- peter@flippyhead.com
|
78
|
+
executables: []
|
79
|
+
|
80
|
+
extensions: []
|
81
|
+
|
82
|
+
extra_rdoc_files:
|
83
|
+
- History.txt
|
84
|
+
- Manifest.txt
|
85
|
+
- PostInstall.txt
|
86
|
+
- README.rdoc
|
87
|
+
files:
|
88
|
+
- History.txt
|
89
|
+
- Manifest.txt
|
90
|
+
- PostInstall.txt
|
91
|
+
- README.rdoc
|
92
|
+
- Rakefile
|
93
|
+
- docs/sample-oauth-plugin_token.rb
|
94
|
+
- lib/linked_in.rb
|
95
|
+
- lib/linked_in/base.rb
|
96
|
+
- lib/linked_in/oauth.rb
|
97
|
+
- lib/linked_in/request.rb
|
98
|
+
- linked_in.gemspec
|
99
|
+
- script/console
|
100
|
+
- script/destroy
|
101
|
+
- script/generate
|
102
|
+
- spec/fixtures/connections.xml
|
103
|
+
- spec/fixtures/connections_with_field_selectors.xml
|
104
|
+
- spec/fixtures/empty.xml
|
105
|
+
- spec/fixtures/error.xml
|
106
|
+
- spec/fixtures/network.xml
|
107
|
+
- spec/fixtures/people.xml
|
108
|
+
- spec/fixtures/profile.xml
|
109
|
+
- spec/linked_in/base_spec.rb
|
110
|
+
- spec/linked_in/oauth_spec.rb
|
111
|
+
- spec/linked_in/request_spec.rb
|
112
|
+
- spec/spec.opts
|
113
|
+
- spec/spec_helper.rb
|
114
|
+
- tasks/rspec.rake
|
115
|
+
has_rdoc: true
|
116
|
+
homepage: http://github.com/flippyhead/linked_in
|
117
|
+
licenses: []
|
118
|
+
|
119
|
+
post_install_message: PostInstall.txt
|
120
|
+
rdoc_options:
|
121
|
+
- --main
|
122
|
+
- README.rdoc
|
123
|
+
require_paths:
|
124
|
+
- lib
|
125
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: "0"
|
130
|
+
version:
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: "0"
|
136
|
+
version:
|
137
|
+
requirements: []
|
138
|
+
|
139
|
+
rubyforge_project:
|
140
|
+
rubygems_version: 1.3.5
|
141
|
+
signing_key:
|
142
|
+
specification_version: 3
|
143
|
+
summary: The linked_in gem wraps the LinkedIn API making it easy to read and write profile information and messages on http://linked_in.com. Full support for OAuth is provided including a wrapper for Pelle's oauth-plugin (http://github.com/pelle/oauth-plugin/). This gem borrowed heavily from junemakers twitter gem (http://github.com/jnunemaker/twitter/).
|
144
|
+
test_files: []
|
145
|
+
|