ruby-linkedin 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,4 @@
1
+ Ruby-LinkedIn
2
+ =============
3
+
4
+ A Yahoo! BOSS derived LinkedIn API.
data/lib/old.rb ADDED
@@ -0,0 +1,110 @@
1
+ require 'rubygems'
2
+ require 'xmlsimple'
3
+ require 'net/http'
4
+ require 'hpricot'
5
+ require 'open-uri'
6
+ require 'date'
7
+
8
+ class Person
9
+ attr_accessor :given_name, :family_name, :summary, :locality, :title, :skills, :experiences, :educations
10
+ end
11
+
12
+
13
+ class Experience
14
+ attr_accessor :title, :org, :org_details, :start_date, :end_date, :description
15
+ end
16
+
17
+ class Education
18
+ attr_accessor :org, :degree, :major, :start_date, :end_date, :activities
19
+ end
20
+
21
+
22
+ class Linkedin
23
+
24
+ def initialize(count=50,boss_id= 'mKlZ3iDIkY8WF9_YXz7vwpz7rBAs1Ogz.Q--')
25
+ @boss_id = boss_id
26
+ @count = count
27
+ end
28
+
29
+ def find(query={})
30
+ q = query.values.join(" ")
31
+
32
+ url = "http://boss.yahooapis.com/ysearch/web/v1/#{q}?appid=#{@boss_id}&sites=linkedin.com&format=xml&count=#{@count}"
33
+ (res = Net::HTTP.get_response(URI.parse(URI.escape(url)))) rescue puts 'Cannot reach to URL'
34
+ d = XmlSimple.xml_in(res.body, { 'ForceArray' => false })['resultset_web']['result']
35
+ if d.kind_of? Array
36
+ data = d
37
+ elsif d.kind_of? Hash
38
+ data = [] << d
39
+ end
40
+
41
+ data.delete_if { |rec| true unless (rec['url'].include? 'http://www.linkedin.com/pub' or
42
+ rec['url'].include? 'http://www.linkedin.com/in')}
43
+
44
+ @people = []
45
+ data.each { |rec|
46
+ person = Person.new
47
+ doc = Hpricot(open(rec['url']))
48
+ person.given_name = doc.search('span.given-name').inner_text
49
+ person.family_name = doc.search('span.family-name').inner_text
50
+
51
+ person.title = doc.search('p.headline').inner_text.strip
52
+ person.summary = doc.search('p.summary').inner_text.strip
53
+ person.locality = doc.search('p.locality').inner_text.strip
54
+
55
+ person.experiences = []
56
+ # experiences
57
+ exp = doc.search('div#experience').search('ul.vcalendar').first
58
+ exp.children_of_type('li').each { |el|
59
+ ex = Experience.new
60
+ ex.title = el.at('h3.title').inner_text.strip if !el.at('h3.title').nil?
61
+ ex.org = el.at('h4.org').inner_text.strip if !el.at('h4.org').nil?
62
+ ex.org_details = el.at('p.organization-details').inner_text.strip if !el.at('p.organization-details').nil?
63
+ ex.description = el.at('p.description').inner_text.strip if !el.at('p.description').nil?
64
+ ex.start_date = Date.parse(el.at('abbr.dtstart').get_attribute('title')).to_s if !el.at('abbr.dtstart').nil? rescue ex.start_date = nil
65
+ ex.end_date = Date.parse(el.at('abbr.dtend').get_attribute('title')).to_s if !el.at('abbr.dtend').nil? rescue ex.end_date = nil
66
+ person.experiences << ex
67
+ } unless exp.nil?
68
+
69
+ person.educations = []
70
+ # educations
71
+ edu = doc.search('div#education').search('ul.vcalendar').first
72
+ edu.children_of_type('li').each { |el|
73
+ ed = Education.new
74
+ ed.org = el.at('h3.summary').inner_text.strip if !el.at('h3.summary').nil?
75
+ ed.degree = el.at('span.degree').inner_text.strip if !el.at('span.degree').nil?
76
+ ed.activities = el.search('dl.activities-societies').search('dd').inner_text.strip if !el.search('dl.activities-societies').search('dd').nil?
77
+ ed.start_date = Date.parse(el.at('abbr.dtstart').get_attribute('title')).to_s if !el.at('abbr.dtstart').nil? rescue ed.start_date = nil
78
+ ed.end_date = Date.parse(el.at('abbr.dtend').get_attribute('title')).to_s if !el.at('abbr.dtend').nil? rescue ed.end_date = nil
79
+ person.educations << ed
80
+ } unless edu.nil?
81
+
82
+ @people << person
83
+ } unless data.nil?
84
+
85
+ filter_off_empty
86
+ unless query[:given_name].nil? and query[:family_name].nil?
87
+ filter_off_by_name(query)
88
+ end
89
+ @people
90
+ end
91
+
92
+
93
+ private
94
+
95
+ def filter_off_empty
96
+ @people.delete_if { |person|
97
+ name = "#{person.given_name} #{person.family_name}"
98
+ true if name.strip.empty?
99
+ }
100
+ end
101
+
102
+ def filter_off_by_name(query)
103
+ @people.delete_if { |person|
104
+ name = "#{person.given_name} #{person.family_name}"
105
+ gn, fn = query[:given_name].nil? ? "" : query[:given_name], query[:family_name].nil? ? "" : query[:family_name]
106
+ true unless (name.downcase.include?(gn.downcase.to_s) and name.downcase.include?(fn.downcase.to_s))
107
+ }
108
+ end
109
+
110
+ end
@@ -0,0 +1,104 @@
1
+ require 'rubygems'
2
+ require 'xmlsimple'
3
+ require 'net/http'
4
+ require 'hpricot'
5
+ require 'open-uri'
6
+ require 'date'
7
+ require 'mofo'
8
+
9
+
10
+ class Linkedin
11
+
12
+ def initialize(count=50,boss_id= 'mKlZ3iDIkY8WF9_YXz7vwpz7rBAs1Ogz.Q--')
13
+ @boss_id = boss_id
14
+ @count = count
15
+ end
16
+
17
+ def find(query={})
18
+ q = query.values.join(" ")
19
+
20
+ url = "http://boss.yahooapis.com/ysearch/web/v1/#{q}?appid=#{@boss_id}&sites=linkedin.com&format=xml&count=#{@count}"
21
+ (res = Net::HTTP.get_response(URI.parse(URI.escape(url)))) rescue puts 'Cannot reach to URL'
22
+ d = XmlSimple.xml_in(res.body, { 'ForceArray' => false })['resultset_web']['result']
23
+ if d.kind_of? Array
24
+ data = d
25
+ elsif d.kind_of? Hash
26
+ data = [] << d
27
+ end
28
+
29
+ data.delete_if { |rec| true unless (rec['url'].include? 'http://www.linkedin.com/pub' or
30
+ rec['url'].include? 'http://www.linkedin.com/in')}
31
+
32
+ @people = []
33
+ data.each { |rec|
34
+ resume = hResume.find(rec['url'])
35
+ @people << resume if resume.kind_of? hResume
36
+ } unless data.nil?
37
+
38
+ # filter away the unnnecessary results
39
+ filter_off_empty
40
+
41
+ # filter by company person worked for
42
+ unless query[:org].nil?
43
+ filter_off_by_org(query)
44
+ end
45
+
46
+ # filter by name
47
+ unless query[:given_name].nil? and query[:family_name].nil?
48
+ filter_off_by_name(query)
49
+ end
50
+
51
+ # filter by current locality
52
+ unless query[:locality].nil?
53
+ filter_off_by_locality(query)
54
+ end
55
+
56
+ @people
57
+ end
58
+
59
+
60
+ private
61
+
62
+ def filter_off_empty
63
+ @people.delete_if { |person|
64
+ true if person.contact.fn.strip.empty?
65
+ }
66
+ end
67
+
68
+ def filter_off_by_org(query)
69
+ @people.delete_if {|person|
70
+ if person.experience.kind_of? Array
71
+ person.experience.each { |exp|
72
+ return false if exp.summary.downcase.include?(query[:org].downcase)
73
+ }
74
+ elsif person.experience.kind_of? HCalendar
75
+ puts person.experience.summary
76
+ return false if person.experience.summary.downcase.include?(query[:org].downcase)
77
+ else
78
+ return true
79
+ end
80
+ }
81
+ end
82
+
83
+ def filter_off_by_locality(query)
84
+ @people.delete_if {|person|
85
+ locality = person.contact.adr.locality.nil? ? "" : person.contact.adr.locality
86
+ true unless locality.downcase.include?(query[:locality].downcase)
87
+ }
88
+ end
89
+
90
+ def filter_off_by_name(query)
91
+ @people.delete_if { |person|
92
+ case
93
+ when query[:family_name].nil?
94
+ true unless person.contact.n.given_name.downcase.include?(query[:given_name].downcase)
95
+ when query[:given_name].nil?
96
+ true unless person.contact.n.family_name.downcase.include?(query[:family_name].downcase)
97
+ else
98
+ true unless person.contact.fn.downcase.include?(query[:family_name].downcase) and
99
+ person.contact.fn.downcase.include?(query[:given_name].downcase)
100
+ end
101
+ }
102
+ end
103
+
104
+ end
@@ -0,0 +1,37 @@
1
+ require 'test/unit'
2
+ require 'lib/ruby-linkedin'
3
+
4
+
5
+
6
+ class RubyLinkedIn < Test::Unit::TestCase
7
+ def setup
8
+ @linkedin = Linkedin.new
9
+ end
10
+
11
+
12
+ def test_find_barack
13
+ people = @linkedin.find({:given_name => 'Barack', :family_name => 'Obama'})
14
+
15
+ if people.kind_of? Array
16
+ people.each {|p|
17
+ puts p.contact.fn
18
+ puts p.contact.adr.locality
19
+ if p.experience.kind_of? Array
20
+ p.experience.each {|exp| puts " - " + exp.summary}
21
+ elsif p.experience.kind_of? hCalendar
22
+ puts " - " + p.experience.summary
23
+ end
24
+ puts
25
+ }
26
+ else
27
+ puts people.contact.fn
28
+ puts people.contact.adr.locality
29
+ if people.experience.kind_of? Array
30
+ people.experience.each {|exp| puts " - " + exp.summary}
31
+ end
32
+ puts
33
+
34
+ end
35
+ end
36
+
37
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-linkedin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Chang Sau Sheong
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-09 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: sausheong@ymail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ files:
25
+ - lib/old.rb
26
+ - lib/ruby-linkedin.rb
27
+ - test/ts_ruby-linkedin.rb
28
+ - README
29
+ has_rdoc: true
30
+ homepage: http://blog.saush.com
31
+ post_install_message:
32
+ rdoc_options: []
33
+
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ requirements: []
49
+
50
+ rubyforge_project:
51
+ rubygems_version: 1.0.1
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: A Yahoo! BOSS derived Ruby LinkedIn API
55
+ test_files:
56
+ - test/ts_ruby-linkedin.rb