linkedin 0.1.7 → 0.2.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.
Files changed (66) hide show
  1. data/.autotest +14 -0
  2. data/.document +5 -0
  3. data/.gitignore +25 -0
  4. data/Gemfile +3 -0
  5. data/README.markdown +12 -7
  6. data/Rakefile +10 -33
  7. data/VERSION +1 -1
  8. data/changelog.markdown +38 -0
  9. data/examples/authenticate.rb +1 -1
  10. data/lib/linked_in/api_standard_profile_request.rb +14 -6
  11. data/lib/linked_in/authorization_helpers.rb +48 -0
  12. data/lib/linked_in/base.rb +13 -0
  13. data/lib/linked_in/birthdate.rb +21 -0
  14. data/lib/linked_in/client.rb +86 -146
  15. data/lib/linked_in/company.rb +9 -7
  16. data/lib/linked_in/connections.rb +14 -5
  17. data/lib/linked_in/country.rb +7 -5
  18. data/lib/linked_in/current_share.rb +56 -0
  19. data/lib/linked_in/education.rb +40 -14
  20. data/lib/linked_in/error.rb +19 -8
  21. data/lib/linked_in/group.rb +30 -7
  22. data/lib/linked_in/languages.rb +28 -0
  23. data/lib/linked_in/likes.rb +23 -0
  24. data/lib/linked_in/location.rb +11 -6
  25. data/lib/linked_in/message.rb +20 -0
  26. data/lib/linked_in/network.rb +10 -5
  27. data/lib/linked_in/patents.rb +42 -0
  28. data/lib/linked_in/people.rb +16 -8
  29. data/lib/linked_in/person.rb +7 -0
  30. data/lib/linked_in/phone_number.rb +29 -0
  31. data/lib/linked_in/position.rb +45 -14
  32. data/lib/linked_in/profile.rb +81 -28
  33. data/lib/linked_in/publications.rb +40 -0
  34. data/lib/linked_in/recipient.rb +7 -0
  35. data/lib/linked_in/recipients.rb +18 -0
  36. data/lib/linked_in/recommendations.rb +30 -0
  37. data/lib/linked_in/request_helpers.rb +76 -0
  38. data/lib/linked_in/short_profile.rb +13 -0
  39. data/lib/linked_in/skill.rb +33 -0
  40. data/lib/linked_in/to_xml_helpers.rb +53 -0
  41. data/lib/linked_in/update.rb +21 -9
  42. data/lib/linked_in/url_resource.rb +24 -6
  43. data/lib/linkedin.rb +58 -59
  44. data/linkedin.gemspec +52 -0
  45. data/spec/cases/client_spec.rb +281 -0
  46. data/spec/cases/linkedin_spec.rb +37 -0
  47. data/spec/cases/oauth_spec.rb +109 -0
  48. data/{test → spec}/fixtures/blank.xml +0 -0
  49. data/{test → spec}/fixtures/connections.xml +0 -0
  50. data/{test → spec}/fixtures/error.xml +0 -0
  51. data/spec/fixtures/likes.xml +18 -0
  52. data/spec/fixtures/mailbox_items.xml +16 -0
  53. data/{test → spec}/fixtures/network_status_with_group.xml +3 -3
  54. data/{test → spec}/fixtures/network_statuses.xml +18 -0
  55. data/{test → spec}/fixtures/picture_updates.xml +0 -0
  56. data/{test → spec}/fixtures/profile.xml +0 -0
  57. data/{test → spec}/fixtures/profile_full.xml +57 -0
  58. data/{test → spec}/fixtures/profile_with_positions.xml +0 -0
  59. data/{test → spec}/fixtures/search.xml +2 -2
  60. data/spec/fixtures/shares.xml +12 -0
  61. data/{test → spec}/fixtures/status.xml +0 -0
  62. data/spec/spec_helper.rb +49 -0
  63. metadata +160 -76
  64. data/test/client_test.rb +0 -124
  65. data/test/oauth_test.rb +0 -117
  66. data/test/test_helper.rb +0 -51
@@ -0,0 +1,14 @@
1
+ Autotest.add_hook(:initialize) do |at|
2
+ at.add_exception(".git")
3
+ end
4
+
5
+ Autotest.add_hook(:initialize) do |at|
6
+ at.clear_mappings
7
+
8
+ at.add_mapping %r%/^lib/(.*)\.rb$% do |_, m|
9
+ possible = File.basename(m[1])
10
+ files_matching %r%^test/.*(#{possible}_test|test_#{possible})\.rb$%
11
+ end
12
+
13
+ at.add_mapping(%r%^test/.*\.rb$%) {|filename, _| filename }
14
+ end
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,25 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ examples/wynn.rb
23
+
24
+ ## Bundler
25
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
@@ -2,12 +2,12 @@
2
2
 
3
3
  Ruby wrapper for the [LinkedIn API](http://developer.linkedin.com). Heavily inspired by [John Nunemaker's](http://github.com/jnunemaker) [Twitter gem](http://github.com/jnunemaker/twitter), the LinkedIn gem provides an easy-to-use wrapper for LinkedIn's Oauth/XML APIs.
4
4
 
5
+ Travis CI : [![Build Status](http://travis-ci.org/pengwynn/linkedin.png)](http://travis-ci.org/pengwynn/linkedin)
6
+
5
7
  ## Installation
6
8
 
7
- sudo gem install gemcutter
8
- gem tumble
9
- sudo gem install linkedin
10
-
9
+ [sudo] gem install linkedin
10
+
11
11
  ## Usage
12
12
 
13
13
  ### Authenticate
@@ -46,19 +46,24 @@ LinkedIn's API uses Oauth for authentication. Luckily, the LinkedIn gem hides mo
46
46
 
47
47
  # get a profile for someone via their public profile url
48
48
  client.profile(:url => 'http://www.linkedin.com/in/netherland')
49
-
49
+
50
50
 
51
51
 
52
52
  More examples in the [examples folder](http://github.com/pengwynn/linkedin/blob/master/examples).
53
53
 
54
+ For a nice example on using this in a [Rails App](http://pivotallabs.com/users/will/blog/articles/1096-linkedin-gem-for-a-web-app).
54
55
 
56
+ If you want to play with the LinkedIn api without using the gem, have a look at the [apigee LinkedIn console](http://app.apigee.com/console/linkedin).
55
57
 
56
58
  ## TODO
57
59
 
60
+ * Change to json api
61
+ * Update and correct test suite
62
+ * Change to Faraday for authentication
58
63
  * Implement Messaging APIs
59
64
 
60
65
  ## Note on Patches/Pull Requests
61
-
66
+
62
67
  * Fork the project.
63
68
  * Make your feature addition or bug fix.
64
69
  * Add tests for it. This is important so I don't break it in a
@@ -70,4 +75,4 @@ More examples in the [examples folder](http://github.com/pengwynn/linkedin/blob/
70
75
 
71
76
  ## Copyright
72
77
 
73
- Copyright (c) 2009 [Wynn Netherland](http://wynnnetherland.com). See LICENSE for details.
78
+ Copyright (c) 2009-11 [Wynn Netherland](http://wynnnetherland.com). See LICENSE for details.
data/Rakefile CHANGED
@@ -1,41 +1,21 @@
1
- require 'rubygems'
2
1
  require 'rake'
3
2
 
4
3
  begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "linkedin"
8
- gem.summary = %Q{Ruby wrapper for the LinkedIn API}
9
- gem.description = %Q{Ruby wrapper for the LinkedIn API}
10
- gem.email = "wynn.netherland@gmail.com"
11
- gem.homepage = "http://github.com/pengwynn/linkedin"
12
- gem.authors = ["Wynn Netherland"]
13
- gem.files = FileList["[A-Z]*", "{lib,test}/**/*"]
14
-
15
-
16
- gem.add_dependency('oauth', '~> 0.3.5')
17
- gem.add_dependency('roxml', '~> 3.1.3')
18
- gem.add_dependency('crack', '~> 0.1.4')
19
-
20
- gem.add_development_dependency('thoughtbot-shoulda', '>= 2.10.1')
21
- gem.add_development_dependency('jnunemaker-matchy', '0.4.0')
22
- gem.add_development_dependency('mocha', '0.9.4')
23
- gem.add_development_dependency('fakeweb', '>= 1.2.5')
24
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
25
- end
26
- Jeweler::GemcutterTasks.new
4
+ require 'bundler/setup'
5
+ Bundler::GemHelper.install_tasks
27
6
  rescue LoadError
28
- puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
7
+ puts 'although not required, bundler is recommened for running the tests'
29
8
  end
30
9
 
31
- require 'rake/testtask'
32
- Rake::TestTask.new(:test) do |test|
33
- test.libs << 'test'
34
- test.ruby_opts << '-rubygems'
35
- test.pattern = 'test/**/*_test.rb'
36
- test.verbose = true
10
+
11
+ task :default => :spec
12
+
13
+ require 'rspec/core/rake_task'
14
+ RSpec::Core::RakeTask.new do |t|
15
+ t.rspec_opts = ["--color", '--format doc']
37
16
  end
38
17
 
18
+
39
19
  begin
40
20
  require 'rcov/rcovtask'
41
21
  Rcov::RcovTask.new do |test|
@@ -49,9 +29,6 @@ rescue LoadError
49
29
  end
50
30
  end
51
31
 
52
- task :test => :check_dependencies
53
-
54
- task :default => :test
55
32
 
56
33
  require 'rake/rdoctask'
57
34
  Rake::RDocTask.new do |rdoc|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.2.1
@@ -0,0 +1,38 @@
1
+ # Changelog
2
+
3
+ ## 0.1.7 - February 5, 2010
4
+
5
+ * New group join status support JGRP from Terry Ray
6
+
7
+ ## 0.1.6 - January 20, 2010
8
+
9
+ * Fixed bug with network status update connection collections - thanks Terry Ray
10
+
11
+ ## 0.1.5 - January 13, 2010
12
+ * Added education and profile fields missing from updated LinkedIn docs
13
+ ## 0.1.4 - January 13, 2010
14
+
15
+ * Applied patch for position end month/year from @holman
16
+
17
+ ## 0.1.3 - December 24, 2009
18
+
19
+ * Added configure block for easier initialization of consumer token, secret
20
+
21
+ ## 0.1.1 - December 8, 2009
22
+
23
+ * Applied patch from [nfo](http://github.com/nfo) to fix error handling
24
+
25
+ ### 0.1.0 - November 25, 2009
26
+
27
+ * Network updates API support
28
+ * Search API support
29
+ * Updates API support
30
+
31
+ ### 0.0.2 - November 25, 2009
32
+
33
+ * Swapped out Crack for ROXML for prettier object access
34
+ * Added more tests for Profile API
35
+
36
+ ### 0.0.1 - November 24, 2009
37
+
38
+ * Initial release
@@ -18,4 +18,4 @@ client.authorize_from_request(rtoken, rsecret, pin)
18
18
  # or authorize from previously fetched access keys
19
19
  c.authorize_from_access("OU812", "8675309")
20
20
 
21
- # you're now free to move about the cabin, call any API method
21
+ # you're now free to move about the cabin, call any API method
@@ -1,9 +1,17 @@
1
1
  module LinkedIn
2
- class ApiStandardProfileRequest
3
- include ROXML
4
- xml_convention {|val| val.gsub("_","-") }
5
- xml_reader :url
6
- xml_reader :headers, :as => {:key => 'name', :value => 'value'}, :in => 'headers/http-header'
7
-
2
+ class ApiStandardProfileRequest < LinkedIn::Base
3
+
4
+ def url
5
+ @doc.xpath("//api-standard-profile-request/url").text
6
+ end
7
+
8
+ # returning a hash should be ok, but suggestions are welcome
9
+ def headers
10
+ hash = {}
11
+ hash[:name] = @doc.xpath("//api-standard-profile-request/headers/http-header/name").text
12
+ hash[:value] = @doc.xpath("//api-standard-profile-request/headers/http-header/value").text
13
+ hash
14
+ end
15
+
8
16
  end
9
17
  end
@@ -0,0 +1,48 @@
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
@@ -0,0 +1,13 @@
1
+ module LinkedIn
2
+ class Base
3
+
4
+ def self.from_xml(doc)
5
+ new(Nokogiri::XML(doc))
6
+ end
7
+
8
+ def initialize(doc)
9
+ @doc = doc
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,21 @@
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
@@ -1,171 +1,135 @@
1
1
  module LinkedIn
2
2
  class Client
3
-
3
+ include ToXmlHelpers
4
+ include RequestHelpers
5
+ include AuthorizationHelpers
6
+
4
7
  attr_reader :ctoken, :csecret, :consumer_options
5
-
8
+
6
9
  def initialize(ctoken=LinkedIn.token, csecret=LinkedIn.secret, options={})
7
- opts = {
8
- :request_token_path => "/uas/oauth/requestToken",
9
- :access_token_path => "/uas/oauth/accessToken",
10
- :authorize_path => "/uas/oauth/authorize"
11
- }
10
+ opts = {
11
+ :request_token_path => "/uas/oauth/requestToken",
12
+ :access_token_path => "/uas/oauth/accessToken",
13
+ :authorize_path => "/uas/oauth/authorize"
14
+ }
12
15
  @ctoken, @csecret, @consumer_options = ctoken, csecret, opts.merge(options)
13
16
  end
14
-
15
- def consumer
16
- @consumer ||= ::OAuth::Consumer.new(@ctoken, @csecret, {:site => 'https://api.linkedin.com'}.merge(consumer_options))
17
- end
18
-
19
- def set_callback_url(url)
20
- clear_request_token
21
- request_token(:oauth_callback => url)
22
- end
23
-
24
- # Note: If using oauth with a web app, be sure to provide :oauth_callback.
25
- # Options:
26
- # :oauth_callback => String, url that LinkedIn should redirect to
27
- def request_token(options={})
28
- @request_token ||= consumer.get_request_token(options)
29
- end
30
-
31
- # For web apps use params[:oauth_verifier], for desktop apps,
32
- # use the verifier is the pin that LinkedIn gives users.
33
- def authorize_from_request(rtoken, rsecret, verifier_or_pin)
34
- request_token = ::OAuth::RequestToken.new(consumer, rtoken, rsecret)
35
- access_token = request_token.get_access_token(:oauth_verifier => verifier_or_pin)
36
- @atoken, @asecret = access_token.token, access_token.secret
37
- end
38
-
39
- def access_token
40
- @access_token ||= ::OAuth::AccessToken.new(consumer, @atoken, @asecret)
41
- end
42
-
43
- def authorize_from_access(atoken, asecret)
44
- @atoken, @asecret = atoken, asecret
45
- end
46
-
47
- def get(path, options={})
48
- path = "/v1#{path}"
49
- response = access_token.get(path, options)
50
- raise_errors(response)
51
- response.body
52
- end
53
-
54
- def put(path, options={})
55
- path = "/v1#{path}"
56
- response = access_token.put(path, options)
57
- raise_errors(response)
58
- response
59
- end
60
-
61
- def delete(path, options={})
62
- path = "/v1#{path}"
63
- response = access_token.delete(path, options)
64
- raise_errors(response)
65
- response
66
- end
67
-
68
-
17
+
18
+
69
19
  def profile(options={})
70
-
71
- path = person_path(options)
72
-
73
- unless options[:fields].nil?
74
- if options[:public]
75
- path +=":public"
76
- else
77
- path +=":(#{options[:fields].map{|f| f.to_s.gsub("_","-")}.join(',')})"
78
- end
20
+ path = person_path(options)
21
+ fields = options[:fields] || LinkedIn.default_profile_fields
22
+
23
+ if options[:public]
24
+ path +=":public"
25
+ elsif fields
26
+ path +=":(#{fields.map{ |f| f.to_s.gsub("_","-") }.join(',')})"
79
27
  end
80
-
28
+
81
29
  Profile.from_xml(get(path))
82
30
  end
83
-
31
+
84
32
  def connections(options={})
85
33
  path = "#{person_path(options)}/connections"
86
-
87
- unless options[:fields].nil?
88
- if options[:public]
89
- path +=":public"
90
- else
91
- path +=":(#{options[:fields].map{|f| f.to_s.gsub("_","-")}.join(',')})"
92
- end
34
+ fields = options[:fields] || LinkedIn.default_profile_fields
35
+
36
+ if options[:public]
37
+ path +=":public"
38
+ elsif fields
39
+ path +=":(#{fields.map{ |f| f.to_s.gsub("_","-") }.join(',')})"
93
40
  end
94
-
41
+
95
42
  Connections.from_xml(get(path)).profiles
96
43
  end
97
-
44
+
98
45
  def search(options={})
99
46
  path = "/people"
100
- options = {:keywords => options} if options.is_a?(String)
47
+ options = { :keywords => options } if options.is_a?(String)
101
48
  options = format_options_for_query(options)
102
-
49
+
103
50
  People.from_xml(get(to_uri(path, options)))
104
51
  end
105
-
52
+
106
53
  def current_status
107
54
  path = "/people/~/current-status"
108
55
  Crack::XML.parse(get(path))['current_status']
109
56
  end
110
-
57
+
111
58
  def update_status(text)
112
59
  path = "/people/~/current-status"
113
60
  put(path, status_to_xml(text))
114
61
  end
115
-
62
+
63
+ def share(options={})
64
+ path = "/people/~/shares"
65
+ defaults = { :visability => 'anyone' }
66
+ post(path, share_to_xml(defaults.merge(options)))
67
+ end
68
+
69
+ def update_comment(network_key, comment)
70
+ path = "/people/~/network/updates/key=#{network_key}/update-comments"
71
+ post(path, comment_to_xml(comment))
72
+ end
73
+
74
+ def like(network_key, is_liked=true)
75
+ path = "/people/~/network/updates/key=#{network_key}/is-liked"
76
+ put(path, is_liked_to_xml(is_liked))
77
+ end
78
+
79
+ def likes(network_key)
80
+ path = "/people/~/network/updates/key=#{network_key}/likes"
81
+ Likes.from_xml(get(path)).likes
82
+ end
83
+
84
+ def update_network(message)
85
+ path = "/people/~/person-activities"
86
+ post(path, network_update_to_xml(message))
87
+ end
88
+
116
89
  def clear_status
117
90
  path = "/people/~/current-status"
118
91
  delete(path).code
119
92
  end
120
-
93
+
94
+ def send_message(subject, body, recipient_paths)
95
+ path = "/people/~/mailbox"
96
+
97
+ message = LinkedIn::Message.new
98
+ message.subject = subject
99
+ message.body = body
100
+ recipients = LinkedIn::Recipients.new
101
+
102
+ recipients.recipients = recipient_paths.map do |profile_path|
103
+ recipient = LinkedIn::Recipient.new
104
+ recipient.person = LinkedIn::Person.new
105
+ recipient.person.path = "/people/#{profile_path}"
106
+ recipient
107
+ end
108
+
109
+ message.recipients = recipients
110
+ post(path, message_to_xml(message)).code
111
+ end
112
+
121
113
  def network_statuses(options={})
122
114
  options[:type] = 'STAT'
123
115
  network_updates(options)
124
116
  end
125
-
117
+
126
118
  def network_updates(options={})
127
119
  path = "/people/~/network"
128
120
  Network.from_xml(get(to_uri(path, options)))
129
121
  end
130
-
131
-
132
-
133
-
134
- # helpful in making authenticated calls and writing the
122
+
123
+ # helpful in making authenticated calls and writing the
135
124
  # raw xml to a fixture file
136
125
  def write_fixture(path, filename)
137
126
  file = File.new("test/fixtures/#{filename}", "w")
138
127
  file.puts(access_token.get(path).body)
139
128
  file.close
140
129
  end
141
-
130
+
142
131
  private
143
- def clear_request_token
144
- @request_token = nil
145
- end
146
-
147
- def raise_errors(response)
148
- # Even if the XML answer contains the HTTP status code, LinkedIn also sets this code
149
- # in the HTTP answer (thankfully).
150
- case response.code.to_i
151
- when 400
152
- data = LinkedIn::Error.from_xml(response.body)
153
- raise RateLimitExceeded.new(data), "(#{response.code}): #{response.message} - #{data.code if data}"
154
- when 401
155
- data = LinkedIn::Error.from_xml(response.body)
156
- raise Unauthorized.new(data), "(#{response.code}): #{response.message} - #{data.code if data}"
157
- when 403
158
- data = LinkedIn::Error.from_xml(response.body)
159
- raise General.new(data), "(#{response.code}): #{response.message} - #{data.code if data}"
160
- when 404
161
- raise NotFound, "(#{response.code}): #{response.message}"
162
- when 500
163
- raise InformLinkedIn, "LinkedIn had an internal error. Please let them know in the forum. (#{response.code}): #{response.message}"
164
- when 502..503
165
- raise Unavailable, "(#{response.code}): #{response.message}"
166
- end
167
- end
168
-
132
+
169
133
  def format_options_for_query(opts)
170
134
  opts.keys.each do |key|
171
135
  value = opts.delete(key)
@@ -175,29 +139,11 @@ module LinkedIn
175
139
  end
176
140
  opts
177
141
  end
178
-
179
- def to_query(options)
180
- options.inject([]) do |collection, opt|
181
- collection << "#{opt[0]}=#{opt[1]}"
182
- collection
183
- end * '&'
184
- end
185
-
186
- def to_uri(path, options)
187
- uri = URI.parse(path)
188
142
 
189
- if options && options != {}
190
- uri.query = to_query(options)
191
- end
192
- uri.to_s
193
- end
194
-
195
143
  def person_path(options)
196
144
  path = "/people/"
197
145
  if options[:id]
198
146
  path += "id=#{options[:id]}"
199
- elsif options[:email]
200
- path += "email=#{options[:email]}"
201
147
  elsif options[:url]
202
148
  path += "url=#{CGI.escape(options[:url])}"
203
149
  else
@@ -205,11 +151,5 @@ module LinkedIn
205
151
  end
206
152
  end
207
153
 
208
- def status_to_xml(status)
209
- %Q{<?xml version="1.0" encoding="UTF-8"?>
210
- <current-status>#{status}</current-status>}
211
- end
212
-
213
-
214
154
  end
215
- end
155
+ end