linkedin 0.2.2 → 0.3.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/{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
|