linkedin 0.2.2 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/{spec/fixtures/blank.xml → .gemtest} +0 -0
- data/.gitignore +36 -21
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/Gemfile +6 -2
- data/Rakefile +9 -31
- data/changelog.markdown +1 -1
- data/lib/linked_in/api/query_methods.rb +49 -0
- data/lib/linked_in/api/update_methods.rb +54 -0
- data/lib/linked_in/client.rb +44 -147
- data/lib/linked_in/errors.rb +20 -0
- data/lib/linked_in/helpers/authorization.rb +67 -0
- data/lib/linked_in/helpers/request.rb +77 -0
- data/lib/linked_in/mash.rb +68 -0
- data/lib/linked_in/search.rb +34 -0
- data/lib/linked_in/version.rb +11 -0
- data/lib/linkedin.rb +4 -55
- data/linkedin.gemspec +26 -47
- data/spec/cases/client_spec.rb +260 -276
- data/spec/cases/linkedin_spec.rb +6 -6
- data/spec/cases/mash_spec.rb +85 -0
- data/spec/cases/oauth_spec.rb +146 -92
- data/spec/fixtures/cassette_library/LinkedIn_Client/_authorize_from_request.yml +28 -0
- data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token.yml +28 -0
- data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token/with_a_callback_url.yml +28 -0
- data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token/with_default_options.yml +28 -0
- data/spec/helper.rb +30 -0
- metadata +139 -169
- data/VERSION +0 -1
- data/lib/linked_in/api_standard_profile_request.rb +0 -17
- data/lib/linked_in/authorization_helpers.rb +0 -48
- data/lib/linked_in/base.rb +0 -13
- data/lib/linked_in/birthdate.rb +0 -21
- data/lib/linked_in/company.rb +0 -11
- data/lib/linked_in/connections.rb +0 -16
- data/lib/linked_in/country.rb +0 -9
- data/lib/linked_in/current_share.rb +0 -56
- data/lib/linked_in/education.rb +0 -41
- data/lib/linked_in/error.rb +0 -21
- data/lib/linked_in/group.rb +0 -32
- data/lib/linked_in/languages.rb +0 -28
- data/lib/linked_in/likes.rb +0 -23
- data/lib/linked_in/location.rb +0 -13
- data/lib/linked_in/message.rb +0 -20
- data/lib/linked_in/network.rb +0 -12
- data/lib/linked_in/patents.rb +0 -42
- data/lib/linked_in/people.rb +0 -18
- data/lib/linked_in/person.rb +0 -7
- data/lib/linked_in/phone_number.rb +0 -29
- data/lib/linked_in/position.rb +0 -46
- data/lib/linked_in/profile.rb +0 -85
- data/lib/linked_in/publications.rb +0 -40
- data/lib/linked_in/recipient.rb +0 -7
- data/lib/linked_in/recipients.rb +0 -18
- data/lib/linked_in/recommendations.rb +0 -30
- data/lib/linked_in/short_profile.rb +0 -13
- data/lib/linked_in/skill.rb +0 -33
- data/lib/linked_in/to_xml_helpers.rb +0 -53
- data/lib/linked_in/update.rb +0 -23
- data/lib/linked_in/url_resource.rb +0 -26
- data/spec/fixtures/connections.xml +0 -3733
- data/spec/fixtures/error.xml +0 -7
- data/spec/fixtures/likes.xml +0 -18
- data/spec/fixtures/mailbox_items.xml +0 -16
- data/spec/fixtures/network_status_with_group.xml +0 -44
- data/spec/fixtures/network_statuses.xml +0 -317
- data/spec/fixtures/picture_updates.xml +0 -117
- data/spec/fixtures/profile.xml +0 -9
- data/spec/fixtures/profile_full.xml +0 -3906
- data/spec/fixtures/profile_with_positions.xml +0 -79
- data/spec/fixtures/search.xml +0 -538
- data/spec/fixtures/shares.xml +0 -12
- data/spec/fixtures/status.xml +0 -2
- data/spec/spec_helper.rb +0 -49
@@ -1,48 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
|
3
|
-
module AuthorizationHelpers
|
4
|
-
|
5
|
-
def consumer
|
6
|
-
@consumer ||= begin
|
7
|
-
options = { :site => 'https://api.linkedin.com' }.merge(@consumer_options)
|
8
|
-
::OAuth::Consumer.new(@ctoken, @csecret, options)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def set_callback_url(url)
|
13
|
-
clear_request_token
|
14
|
-
request_token(:oauth_callback => url)
|
15
|
-
end
|
16
|
-
|
17
|
-
# Note: If using oauth with a web app, be sure to provide :oauth_callback.
|
18
|
-
# Options:
|
19
|
-
# :oauth_callback => String, url that LinkedIn should redirect to
|
20
|
-
def request_token(options={})
|
21
|
-
@request_token ||= consumer.get_request_token(options)
|
22
|
-
end
|
23
|
-
|
24
|
-
# For web apps use params[:oauth_verifier], for desktop apps,
|
25
|
-
# use the verifier is the pin that LinkedIn gives users.
|
26
|
-
def authorize_from_request(rtoken, rsecret, verifier_or_pin)
|
27
|
-
request_token = ::OAuth::RequestToken.new(consumer, rtoken, rsecret)
|
28
|
-
access_token = request_token.get_access_token(:oauth_verifier => verifier_or_pin)
|
29
|
-
@atoken, @asecret = access_token.token, access_token.secret
|
30
|
-
end
|
31
|
-
|
32
|
-
def access_token
|
33
|
-
@access_token ||= ::OAuth::AccessToken.new(consumer, @atoken, @asecret)
|
34
|
-
end
|
35
|
-
|
36
|
-
def authorize_from_access(atoken, asecret)
|
37
|
-
@atoken, @asecret = atoken, asecret
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def clear_request_token
|
43
|
-
@request_token = nil
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
data/lib/linked_in/base.rb
DELETED
data/lib/linked_in/birthdate.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Birthdate < LinkedIn::Base
|
3
|
-
|
4
|
-
def year
|
5
|
-
@year ||= @doc.xpath("/person/date-of-birth/year").text.to_i
|
6
|
-
end
|
7
|
-
|
8
|
-
def day
|
9
|
-
@day ||= @doc.xpath("/person/date-of-birth/day").text.to_i
|
10
|
-
end
|
11
|
-
|
12
|
-
def month
|
13
|
-
@month ||= @doc.xpath("/person/date-of-birth/month").text.to_i
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_date
|
17
|
-
Date.civil(y=year,m=month,d=day)
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
data/lib/linked_in/company.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Connections < LinkedIn::Base
|
3
|
-
|
4
|
-
def connections
|
5
|
-
@connections ||= @doc.xpath('//connections').children.inject([]) do |list, profile|
|
6
|
-
list << Profile.new(Nokogiri::XML(profile.to_xml)) unless profile.blank?
|
7
|
-
list
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def profiles
|
12
|
-
connections
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
data/lib/linked_in/country.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
|
3
|
-
class CurrentShare < LinkedIn::Base
|
4
|
-
%w[id comment].each do |f|
|
5
|
-
define_method(f.to_sym) do
|
6
|
-
@doc.xpath("./#{f.gsub(/_/,'-')}").text
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def submitted_url
|
11
|
-
@doc.xpath('./content/submitted-url').text
|
12
|
-
end
|
13
|
-
|
14
|
-
def resolved_url
|
15
|
-
@doc.xpath('./content/resolved-url').text
|
16
|
-
end
|
17
|
-
|
18
|
-
def shortened_url
|
19
|
-
@doc.xpath('./content/shortened-url').text
|
20
|
-
end
|
21
|
-
|
22
|
-
def title
|
23
|
-
@doc.xpath('./content/title').text
|
24
|
-
end
|
25
|
-
|
26
|
-
def description
|
27
|
-
@doc.xpath('./content/description').text
|
28
|
-
end
|
29
|
-
|
30
|
-
def submitted_image_url
|
31
|
-
@doc.xpath('./content/submitted-image-url').text
|
32
|
-
end
|
33
|
-
|
34
|
-
def thumbnail_url
|
35
|
-
@doc.xpath('./content/thumbnail-url').text
|
36
|
-
end
|
37
|
-
|
38
|
-
def timestamp
|
39
|
-
time = @doc.xpath('./timestamp').text.to_i
|
40
|
-
Time.at(time / 1000)
|
41
|
-
end
|
42
|
-
|
43
|
-
def visibility
|
44
|
-
@doc.xpath('./visibility/code').text
|
45
|
-
end
|
46
|
-
|
47
|
-
def application
|
48
|
-
@doc.xpath('./source/application/name').text
|
49
|
-
end
|
50
|
-
|
51
|
-
def author
|
52
|
-
@author ||= ShortProfile.new(@doc.xpath('./author'))
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
data/lib/linked_in/education.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Education < LinkedIn::Base
|
3
|
-
|
4
|
-
def educations
|
5
|
-
@educations ||= @doc.children.inject([]) do |list, edu|
|
6
|
-
list << Resource.new(edu) unless edu.blank?
|
7
|
-
list
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Resource
|
12
|
-
|
13
|
-
def initialize(education)
|
14
|
-
@education = education
|
15
|
-
end
|
16
|
-
|
17
|
-
%w[id school_name degree field_of_study activities notes].each do |f|
|
18
|
-
define_method(f.to_sym) do
|
19
|
-
@education.xpath("./#{f.gsub(/_/,'-')}").text
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def start_month
|
24
|
-
@education.xpath('./start-date/month').text.to_i
|
25
|
-
end
|
26
|
-
|
27
|
-
def start_year
|
28
|
-
@education.xpath('./start-date/year').text.to_i
|
29
|
-
end
|
30
|
-
|
31
|
-
def end_month
|
32
|
-
@education.xpath('./end-date/month').text.to_i
|
33
|
-
end
|
34
|
-
|
35
|
-
def end_year
|
36
|
-
@education.xpath('./end-date/year').text.to_i
|
37
|
-
end
|
38
|
-
end # resource class
|
39
|
-
|
40
|
-
end # education class
|
41
|
-
end
|
data/lib/linked_in/error.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Error < LinkedIn::Base
|
3
|
-
|
4
|
-
def status
|
5
|
-
@doc.xpath('//status').text.to_i
|
6
|
-
end
|
7
|
-
|
8
|
-
def timestamp
|
9
|
-
@doc.xpath('//timestamp').text.to_i
|
10
|
-
end
|
11
|
-
|
12
|
-
def code
|
13
|
-
@doc.xpath('//error-coce').text.to_i
|
14
|
-
end
|
15
|
-
|
16
|
-
def message
|
17
|
-
@doc.xpath('//message').text
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
data/lib/linked_in/group.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Group < LinkedIn::Base
|
3
|
-
|
4
|
-
def groups
|
5
|
-
@groups ||= @doc.children.inject([]) do |list, group|
|
6
|
-
list << Resource.new(group) unless group.blank?
|
7
|
-
list
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Resource
|
12
|
-
|
13
|
-
def initialize(group)
|
14
|
-
@group = group
|
15
|
-
end
|
16
|
-
|
17
|
-
def id
|
18
|
-
@group.xpath('//member-group/id').text.to_i
|
19
|
-
end
|
20
|
-
|
21
|
-
def name
|
22
|
-
@group.xpath('//member-group/name').text
|
23
|
-
end
|
24
|
-
|
25
|
-
def url
|
26
|
-
@group.xpath('//member-group/site-group-request/url').text
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
data/lib/linked_in/languages.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Languages < LinkedIn::Base
|
3
|
-
|
4
|
-
def languages
|
5
|
-
@languages ||= @doc.children.inject([]) do |list, lang|
|
6
|
-
list << Resource.new(lang) unless lang.blank?
|
7
|
-
list
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Resource
|
12
|
-
# proficiency level not implemented yet
|
13
|
-
# http://developer.linkedin.com/community/apis/blog/2011/01/04/new-profile-fields-are-here
|
14
|
-
def initialize(language)
|
15
|
-
@language = language
|
16
|
-
end
|
17
|
-
|
18
|
-
def id
|
19
|
-
@language.xpath("./id").text
|
20
|
-
end
|
21
|
-
|
22
|
-
def name
|
23
|
-
@language.xpath("./language/name").text
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|
data/lib/linked_in/likes.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Likes < LinkedIn::Base
|
3
|
-
|
4
|
-
def likes
|
5
|
-
@likes ||= @doc.xpath('//likes').children.inject([]) do |list, like|
|
6
|
-
list << Resource.new(like) unless like.blank?
|
7
|
-
list
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Resource
|
12
|
-
def initialize(like)
|
13
|
-
@like = like
|
14
|
-
end
|
15
|
-
|
16
|
-
def profile
|
17
|
-
Profile.new(Nokogiri::XML(@like.xpath('./person').to_xml))
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
data/lib/linked_in/location.rb
DELETED
data/lib/linked_in/message.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Message
|
3
|
-
|
4
|
-
attr_accessor :subject, :body, :recipients
|
5
|
-
|
6
|
-
def to_xml
|
7
|
-
self.to_xml_node(Nokogiri.XML('<root/>', nil, 'UTF-8')).to_xml
|
8
|
-
end
|
9
|
-
|
10
|
-
def to_xml_node(doc)
|
11
|
-
node = Nokogiri::XML::DocumentFragment.new(doc, '<mailbox-item><recipients/><subject/><body/></mailbox-item>')
|
12
|
-
node.at_css('recipients').add_child(self.recipients.to_xml_nodes(doc))
|
13
|
-
node.at_css('subject').content = self.subject
|
14
|
-
node.at_css('body').content = self.body
|
15
|
-
node
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
data/lib/linked_in/network.rb
DELETED
data/lib/linked_in/patents.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class Patents < LinkedIn::Base
|
3
|
-
|
4
|
-
def patents
|
5
|
-
@patents ||= @doc.children.inject([]) do |list, patent|
|
6
|
-
list << Resource.new(patent) unless patent.blank?
|
7
|
-
list
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Resource
|
12
|
-
|
13
|
-
def initialize(patent)
|
14
|
-
@patent = patent
|
15
|
-
end
|
16
|
-
|
17
|
-
%w[id title].each do |f|
|
18
|
-
define_method(f.to_sym) do
|
19
|
-
@patent.xpath("./#{f.gsub(/_/,'-')}").text
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def year
|
24
|
-
@year ||= @patent.xpath("./date/year").text.to_i
|
25
|
-
end
|
26
|
-
|
27
|
-
def day
|
28
|
-
@day ||= @patent.xpath("./date/day").text.to_i
|
29
|
-
end
|
30
|
-
|
31
|
-
def month
|
32
|
-
@month ||= @patent.xpath("./date/month").text.to_i
|
33
|
-
end
|
34
|
-
|
35
|
-
def date
|
36
|
-
Date.civil(y=year,m=month,d=day)
|
37
|
-
end
|
38
|
-
|
39
|
-
end # resource class
|
40
|
-
|
41
|
-
end # patent class
|
42
|
-
end
|
data/lib/linked_in/people.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module LinkedIn
|
2
|
-
class People < LinkedIn::Base
|
3
|
-
|
4
|
-
%w[total start count].each do |f|
|
5
|
-
define_method(f.to_sym) do
|
6
|
-
@doc.xpath('.//people').first["#{f.gsub(/_/,'-')}"].to_i
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def profiles
|
11
|
-
@profiles ||= @doc.xpath('//people').children.inject([]) do |list, profile|
|
12
|
-
list << Profile.new(Nokogiri::XML(profile.to_xml)) unless profile.blank?
|
13
|
-
list
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|