ruby-linkedin 0.0.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/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