linkedin 0.4.6 → 0.4.7

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -1
  3. data/.yardopts +7 -0
  4. data/{changelog.markdown → CHANGELOG.md} +5 -1
  5. data/EXAMPLES.md +199 -0
  6. data/Gemfile +4 -0
  7. data/README.md +43 -0
  8. data/Rakefile +2 -7
  9. data/lib/linked_in/api.rb +34 -2
  10. data/lib/linked_in/api/communications.rb +44 -0
  11. data/lib/linked_in/api/companies.rb +128 -0
  12. data/lib/linked_in/api/groups.rb +115 -0
  13. data/lib/linked_in/api/jobs.rb +64 -0
  14. data/lib/linked_in/api/people.rb +72 -0
  15. data/lib/linked_in/api/query_helpers.rb +86 -0
  16. data/lib/linked_in/api/share_and_social_stream.rb +133 -0
  17. data/lib/linked_in/client.rb +7 -2
  18. data/lib/linked_in/errors.rb +12 -2
  19. data/lib/linked_in/mash.rb +31 -4
  20. data/lib/linked_in/search.rb +16 -1
  21. data/lib/linked_in/version.rb +1 -1
  22. data/lib/linkedin.rb +4 -1
  23. data/linkedin.gemspec +5 -3
  24. data/spec/cases/api_spec.rb +15 -5
  25. data/spec/cases/mash_spec.rb +30 -2
  26. data/spec/cases/oauth_spec.rb +5 -6
  27. data/spec/cases/search_spec.rb +53 -23
  28. data/spec/fixtures/cassette_library/LinkedIn_Api/Company_API.yml +3 -3
  29. data/spec/fixtures/cassette_library/LinkedIn_Api/Company_API/should_load_correct_company_data.yml +81 -0
  30. data/spec/fixtures/cassette_library/LinkedIn_Client/{_authorize_from_request.yml → _authorize_from_request/should_return_a_valid_access_token.yml} +0 -0
  31. data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token/{with_a_callback_url.yml → with_a_callback_url/should_return_a_valid_access_token.yml} +0 -0
  32. data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token/{with_default_options.yml → with_default_options/should_return_a_valid_request_token.yml} +0 -0
  33. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/{by_company_name_option.yml → by_company_name_option/should_perform_a_search.yml} +8 -9
  34. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/by_email_address/should_perform_a_people_search.yml +57 -0
  35. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/{by_first_name_and_last_name_options.yml → by_first_name_and_last_name_options/should_perform_a_search.yml} +15 -15
  36. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/by_first_name_and_last_name_options_with_fields/should_perform_a_search.yml +114 -0
  37. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/{by_keywords_string_parameter.yml → by_keywords_string_parameter/should_perform_a_search.yml} +8 -9
  38. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/by_multiple_email_address/should_perform_a_multi-email_search.yml +59 -0
  39. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/{by_single_keywords_option.yml → by_single_keywords_option/should_perform_a_search.yml} +8 -9
  40. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/{by_single_keywords_option_with_pagination.yml → by_single_keywords_option_with_pagination/should_perform_a_search.yml} +1 -3
  41. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/email_search_returns_unauthorized/should_raise_an_unauthorized_error.yml +59 -0
  42. data/spec/fixtures/cassette_library/LinkedIn_Search/_search_company/by_keywords_options_with_fields/should_perform_a_search.yml +43 -0
  43. data/spec/fixtures/cassette_library/LinkedIn_Search/_search_company/{by_keywords_string_parameter.yml → by_keywords_string_parameter/should_perform_a_company_search.yml} +19 -19
  44. data/spec/fixtures/cassette_library/LinkedIn_Search/_search_company/{by_single_keywords_option.yml → by_single_keywords_option/should_perform_a_company_search.yml} +19 -19
  45. data/spec/fixtures/cassette_library/LinkedIn_Search/_search_company/{by_single_keywords_option_with_facets_to_return.yml → by_single_keywords_option_with_facets_to_return/should_return_a_facet.yml} +14 -14
  46. data/spec/fixtures/cassette_library/LinkedIn_Search/_search_company/{by_single_keywords_option_with_pagination.yml → by_single_keywords_option_with_pagination/should_perform_a_search.yml} +15 -15
  47. data/spec/helper.rb +9 -5
  48. metadata +76 -61
  49. data/.document +0 -5
  50. data/README.markdown +0 -84
  51. data/examples/authenticate.rb +0 -26
  52. data/examples/communication.rb +0 -7
  53. data/examples/network.rb +0 -12
  54. data/examples/profile.rb +0 -18
  55. data/examples/sinatra.rb +0 -77
  56. data/examples/status.rb +0 -6
  57. data/lib/linked_in/api/query_methods.rb +0 -176
  58. data/lib/linked_in/api/update_methods.rb +0 -85
  59. data/spec/fixtures/cassette_library/LinkedIn_Client/_request_token.yml +0 -37
  60. data/spec/fixtures/cassette_library/LinkedIn_Search/_search/by_first_name_and_last_name_options_with_fields.yml +0 -112
  61. data/spec/fixtures/cassette_library/LinkedIn_Search/_search_company/by_keywords_options_with_fields.yml +0 -232
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: beb262e6873736feb890b56c140f682c80beb36f
4
- data.tar.gz: 8e1878a8f048e6807c3c3470aa9e9cc391ba4354
3
+ metadata.gz: 4586ae7fcf4a2d1ed3767ba0f9f086366394f6b0
4
+ data.tar.gz: 7d56220662ae630e2aebc568348ae46fd073b354
5
5
  SHA512:
6
- metadata.gz: 4de393817404a35a883e2987ef686e2763a5b9c0d684998aff0c66a28e988dde4da3513889fa6de8bed23562abd2e9a32851d8a6fedb6967d5027d2442c28f6d
7
- data.tar.gz: 8b22d8d9eff024281c1a8c388ecabe73e436f3ed80806694113890d319c72c206d3f58ad8a831e37d88e856490bdccf00f8f5d3365f65d2787e1adb998619be3
6
+ metadata.gz: fc14611de8a4c196203fd8300e1af097067172b463d919102d635ffb24f27a7b8b5e787530a0ca0e5b2669dae1be632e116097d7691b03ff3964952750dcaf41
7
+ data.tar.gz: 1a74bf22abe4fb30e037aeb004d3528965ed9050ab8bd416079cd1640223461a4bbc19c6c92172f2fd83068fbcf008111e7ac416bb02b3bba7983a1b86febdc4
@@ -2,6 +2,5 @@ rvm:
2
2
  - 2.0.0
3
3
  - 2.1.0
4
4
  - 1.9.3
5
- - jruby-18mode
6
5
  - jruby-19mode
7
6
  - rbx
@@ -0,0 +1,7 @@
1
+ --no-private
2
+ --markup markdown
3
+ -
4
+ README.md
5
+ CHANGELOG.md
6
+ LICENSE
7
+ EXAMPLES.md
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ * Document all methods
4
+ * Re-organize modules under Api to match organization in LinkedIn's REST
5
+ API documentation
6
+
3
7
  ## 0.4.4 - Jan 11, 2014
4
8
 
5
9
  * Group share add
@@ -92,4 +96,4 @@
92
96
 
93
97
  ## 0.0.1 - November 24, 2009
94
98
 
95
- * Initial release
99
+ * Initial release
@@ -0,0 +1,199 @@
1
+ # Linkedin Gem Examples
2
+
3
+ ## OAuth 1.0a Authentication
4
+
5
+ Here's an example of authenticating with the LinkedIn API
6
+
7
+ ```ruby
8
+ require 'rubygems'
9
+ require 'linkedin'
10
+
11
+ # get your api keys at https://www.linkedin.com/secure/developer
12
+ client = LinkedIn::Client.new('your_consumer_key', 'your_consumer_secret')
13
+
14
+ # If you want to use one of the scopes from linkedin you have to pass it in at this point
15
+ # You can learn more about it here: http://developer.linkedin.com/documents/authentication
16
+ request_token = client.request_token({}, :scope => "r_basicprofile+r_emailaddress")
17
+
18
+ rtoken = request_token.token
19
+ rsecret = request_token.secret
20
+
21
+ # to test from your desktop, open the following url in your browser
22
+ # and record the pin it gives you
23
+ request_token.authorize_url
24
+ => "https://api.linkedin.com/uas/oauth/authorize?oauth_token=<generated_token>"
25
+
26
+ # then fetch your access keys
27
+ client.authorize_from_request(rtoken, rsecret, pin)
28
+ => ["OU812", "8675309"] # <= save these for future requests
29
+
30
+ # or authorize from previously fetched access keys
31
+ client.authorize_from_access("OU812", "8675309")
32
+
33
+ # you're now free to move about the cabin, call any API method
34
+ ```
35
+
36
+
37
+ ## Profile
38
+
39
+ Here are some examples of accessing a user's profile
40
+
41
+ ```ruby
42
+ # AUTHENTICATE FIRST found in examples/authenticate.rb
43
+
44
+ # client is a LinkedIn::Client
45
+
46
+ # get the profile for the authenticated user
47
+ client.profile
48
+
49
+ # get a profile for someone found in network via ID
50
+ client.profile(:id => 'gNma67_AdI')
51
+
52
+ # get a profile for someone via their public profile url
53
+ client.profile(:url => 'http://www.linkedin.com/in/netherland')
54
+
55
+ # provides the ability to access authenticated user's company field in the profile
56
+ user = client.profile(:fields => %w(positions))
57
+ companies = user.positions.all.map{|t| t.company}
58
+ # Example: most recent company can be accessed via companies[0]
59
+
60
+ # Example of a multi-email search against the special email search API
61
+ account_exists = client.profile(:email => 'email=yy@zz.com,email=xx@yy.com', :fields => ['id'])
62
+ ```
63
+
64
+
65
+ ## Sending a Message
66
+
67
+ Here's an example of sending a message to two recipients
68
+
69
+ ```ruby
70
+ # AUTHENTICATE FIRST found in examples/authenticate.md
71
+
72
+ # client is a LinkedIn::Client
73
+
74
+ # send a message to a person in your network. you will need to authenticate the
75
+ # user and ask for the "w_messages" permission.
76
+ response = client.send_message("subject", "body", ["person_1_id", "person_2_id"])
77
+ ```
78
+
79
+
80
+ ## User's Network
81
+
82
+ Here are some examples of accessing network updates and connections of
83
+ the authenticated user
84
+
85
+ ``` ruby
86
+ # AUTHENTICATE FIRST found in examples/authenticate.rb
87
+
88
+ # client is a LinkedIn::Client
89
+
90
+ # get network updates for the authenticated user
91
+ client.network_updates
92
+
93
+ # get profile picture changes
94
+ client.network_updates(:type => 'PICT')
95
+
96
+ # view connections for the currently authenticated user
97
+ client.connections
98
+ ```
99
+ # get the original picture-url for one of the connections
100
+ client.picture_urls(:id => 'id_of_connection')
101
+
102
+ ## Update User's Status
103
+
104
+ Here's an example of updating the current user's status
105
+
106
+ ```ruby
107
+ # AUTHENTICATE FIRST found in examples/authenticate.rb
108
+
109
+ # client is a LinkedIn::Client
110
+
111
+ # update status for the authenticated user
112
+ client.add_share(:comment => 'is playing with the LinkedIn Ruby gem')
113
+ ```
114
+
115
+
116
+ ## Sinatra App
117
+
118
+ Here's an example sinatra application that performs authentication,
119
+ after which some info about the authenticated user can be retrieved.
120
+
121
+ ```ruby
122
+ require "rubygems"
123
+ require "haml"
124
+ require "sinatra"
125
+ require "linkedin"
126
+
127
+ enable :sessions
128
+
129
+ helpers do
130
+ def login?
131
+ !session[:atoken].nil?
132
+ end
133
+
134
+ def profile
135
+ linkedin_client.profile unless session[:atoken].nil?
136
+ end
137
+
138
+ def connections
139
+ linkedin_client.connections unless session[:atoken].nil?
140
+ end
141
+
142
+ private
143
+ def linkedin_client
144
+ client = LinkedIn::Client.new(settings.api, settings.secret)
145
+ client.authorize_from_access(session[:atoken], session[:asecret])
146
+ client
147
+ end
148
+
149
+ end
150
+
151
+ configure do
152
+ # get your api keys at https://www.linkedin.com/secure/developer
153
+ set :api, "your_api_key"
154
+ set :secret, "your_secret"
155
+ end
156
+
157
+ get "/" do
158
+ haml :index
159
+ end
160
+
161
+ get "/auth" do
162
+ client = LinkedIn::Client.new(settings.api, settings.secret)
163
+ request_token = client.request_token(:oauth_callback => "http://#{request.host}:#{request.port}/auth/callback")
164
+ session[:rtoken] = request_token.token
165
+ session[:rsecret] = request_token.secret
166
+
167
+ redirect client.request_token.authorize_url
168
+ end
169
+
170
+ get "/auth/logout" do
171
+ session[:atoken] = nil
172
+ redirect "/"
173
+ end
174
+
175
+ get "/auth/callback" do
176
+ client = LinkedIn::Client.new(settings.api, settings.secret)
177
+ if session[:atoken].nil?
178
+ pin = params[:oauth_verifier]
179
+ atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], pin)
180
+ session[:atoken] = atoken
181
+ session[:asecret] = asecret
182
+ end
183
+ redirect "/"
184
+ end
185
+
186
+
187
+ __END__
188
+ @@index
189
+ -if login?
190
+ %p Welcome #{profile.first_name}!
191
+ %a{:href => "/auth/logout"} Logout
192
+ %p= profile.headline
193
+ %br
194
+ %div= "You have #{connections.total} connections!"
195
+ -connections.all.each do |c|
196
+ %div= "#{c.first_name} #{c.last_name} - #{c.headline}"
197
+ -else
198
+ %a{:href => "/auth"} Login using LinkedIn
199
+ ```
data/Gemfile CHANGED
@@ -4,4 +4,8 @@ platforms :jruby do
4
4
  gem 'jruby-openssl', '~> 0.7'
5
5
  end
6
6
 
7
+ platforms :rbx do
8
+ gem 'rubysl'
9
+ end
10
+
7
11
  gemspec
@@ -0,0 +1,43 @@
1
+ # LinkedIn
2
+
3
+ Ruby wrapper for the [LinkedIn API](http://developer.linkedin.com). The LinkedIn gem provides an easy-to-use wrapper for LinkedIn's REST APIs.
4
+
5
+ Travis CI : [![Build Status](https://secure.travis-ci.org/hexgnu/linkedin.png)](http://travis-ci.org/hexgnu/linkedin)
6
+
7
+ ## Installation
8
+
9
+ gem install linkedin
10
+
11
+ ## Documentation
12
+
13
+ [http://rdoc.info/gems/linkedin](http://rdoc.info/gems/linkedin)
14
+
15
+ ## Usage
16
+
17
+ [View the Examples](EXAMPLES.md)
18
+
19
+ ## Changelog
20
+
21
+ [View the Changelog](CHANGELOG.md)
22
+
23
+ ## TODO
24
+
25
+ * Update and correct test suite
26
+ * Change to Faraday for authentication
27
+ * Implement Messaging APIs
28
+
29
+ ## Note on Patches/Pull Requests
30
+
31
+ * Fork the project.
32
+ * Make your feature addition or bug fix.
33
+ * Add tests for it. This is important so I don't break it in a
34
+ future version unintentionally.
35
+ * Make sure your test doesn't just check of instance of LinkedIn::Mash :smile:.
36
+ * Commit, do not mess with rakefile, version, or history.
37
+ (if you want to have your own version, that is fine but
38
+ bump version in a commit by itself I can ignore when I pull)
39
+ * Send me a pull request. Bonus points for topic branches.
40
+
41
+ ## Copyright
42
+
43
+ Copyright (c) 2013-Present [Matt Kirk](http://matthewkirk.com) 2009-11 [Wynn Netherland](http://wynnnetherland.com). See LICENSE for details.
data/Rakefile CHANGED
@@ -10,11 +10,6 @@ task :test => :spec
10
10
  task :default => :spec
11
11
  load 'vcr/tasks/vcr.rake'
12
12
 
13
- require 'rdoc/task'
14
13
  require File.expand_path('../lib/linked_in/version', __FILE__)
15
- RDoc::Task.new do |rdoc|
16
- rdoc.rdoc_dir = 'rdoc'
17
- rdoc.title = "linkedin #{LinkedIn::VERSION::STRING}"
18
- rdoc.rdoc_files.include('README*')
19
- rdoc.rdoc_files.include('lib/**/*.rb')
20
- end
14
+ require 'yard'
15
+ YARD::Rake::YardocTask.new
@@ -1,6 +1,38 @@
1
1
  module LinkedIn
2
2
  module Api
3
- autoload :QueryMethods, "linked_in/api/query_methods"
4
- autoload :UpdateMethods, "linked_in/api/update_methods"
3
+
4
+ # @!macro person_path_options
5
+ # @param [Hash] options identifies the user profile you want
6
+ # @option options [String] :id a member token
7
+ # @option options [String] :url a Public Profile URL
8
+ # @option options [String] :email
9
+
10
+ # @!macro company_path_options
11
+ # @param [Hash] options identifies the user profile you want
12
+ # @option options [String] :domain company email domain
13
+ # @option options [String] :id company ID
14
+ # @option options [String] :url
15
+ # @option options [String] :name company universal name
16
+ # @option options [String] :is_admin list all companies that the
17
+ # authenticated is an administrator of
18
+
19
+ # @!macro share_input_fields
20
+ # @param [Hash] share content of the share
21
+ # @option share [String] :comment
22
+ # @option share [String] :content
23
+ # @option share [String] :title
24
+ # @option share [String] :submitted-url
25
+ # @option share [String] :submitted-image-url
26
+ # @option share [String] :description
27
+ # @option share [String] :visibility
28
+ # @option share [String] :code
29
+
30
+ autoload :QueryHelpers, "linked_in/api/query_helpers"
31
+ autoload :People, "linked_in/api/people"
32
+ autoload :Groups, "linked_in/api/groups"
33
+ autoload :Companies, "linked_in/api/companies"
34
+ autoload :Jobs, "linked_in/api/jobs"
35
+ autoload :ShareAndSocialStream, "linked_in/api/share_and_social_stream"
36
+ autoload :Communications, "linked_in/api/communications"
5
37
  end
6
38
  end
@@ -0,0 +1,44 @@
1
+ module LinkedIn
2
+ module Api
3
+
4
+ # Communications APIs
5
+ #
6
+ # @see http://developer.linkedin.com/documents/communications
7
+ module Communications
8
+
9
+ # (Create) send a message from the authenticated user to a
10
+ # connection
11
+ #
12
+ # Permissions: w_messages
13
+ #
14
+ # @see http://developer.linkedin.com/documents/messaging-between-connections-api
15
+ # @see http://developer.linkedin.com/documents/invitation-api Invitation API
16
+ #
17
+ # @example
18
+ # client.send_message("subject", "body", ["person_1_id", "person_2_id"])
19
+ #
20
+ # @param [String] subject Subject of the message
21
+ # @param [String] body Body of the message, plain text only
22
+ # @param [Array<String>] recipient_paths a collection of
23
+ # profile paths that identify the users who will receive the
24
+ # message
25
+ # @return [void]
26
+ def send_message(subject, body, recipient_paths)
27
+ path = "/people/~/mailbox"
28
+
29
+ message = {
30
+ 'subject' => subject,
31
+ 'body' => body,
32
+ 'recipients' => {
33
+ 'values' => recipient_paths.map do |profile_path|
34
+ { 'person' => { '_path' => "/people/#{profile_path}" } }
35
+ end
36
+ }
37
+ }
38
+ post(path, MultiJson.dump(message), "Content-Type" => "application/json")
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,128 @@
1
+ module LinkedIn
2
+ module Api
3
+
4
+ # Companies API
5
+ #
6
+ # @see http://developer.linkedin.com/documents/companies Companies API
7
+ # @see http://developer.linkedin.com/documents/company-lookup-api-and-fields Company Fields
8
+ #
9
+ # The following API actions do not have corresponding methods in
10
+ # this module
11
+ #
12
+ # * Permissions Checking Endpoints for Company Shares
13
+ # * GET Suggested Companies to Follow
14
+ # * GET Company Products
15
+ #
16
+ # [(contribute here)](https://github.com/hexgnu/linkedin)
17
+ module Companies
18
+
19
+ # Retrieve a Company Profile
20
+ #
21
+ # @see http://developer.linkedin.com/documents/company-lookup-api-and-fields
22
+ #
23
+ # @macro company_path_options
24
+ # @option options [String] :scope
25
+ # @option options [String] :type
26
+ # @option options [String] :count
27
+ # @option options [String] :start
28
+ # @return [LinkedIn::Mash]
29
+ def company(options = {})
30
+ path = company_path(options)
31
+ simple_query(path, options)
32
+ end
33
+
34
+ # Retrieve a feed of event items for a Company
35
+ #
36
+ # @see http://developer.linkedin.com/reading-company-shares
37
+ #
38
+ # @macro company_path_options
39
+ # @option options [String] :event-type
40
+ # @option options [String] :count
41
+ # @option options [String] :start
42
+ # @return [LinkedIn::Mash]
43
+ def company_updates(options={})
44
+ path = "#{company_path(options)}/updates"
45
+ simple_query(path, options)
46
+ end
47
+
48
+ # Retrieve statistics for a particular company page
49
+ #
50
+ # Permissions: rw_company_admin
51
+ #
52
+ # @see http://developer.linkedin.com/documents/company-statistics
53
+ #
54
+ # @macro company_path_options
55
+ # @return [LinkedIn::Mash]
56
+ def company_statistics(options={})
57
+ path = "#{company_path(options)}/company-statistics"
58
+ simple_query(path, options)
59
+ end
60
+
61
+ # Retrieve comments on a particular company update:
62
+ #
63
+ # @see http://developer.linkedin.com/reading-company-shares
64
+ #
65
+ # @param [String] update_key a update/update-key representing a
66
+ # particular company update
67
+ # @macro company_path_options
68
+ # @return [LinkedIn::Mash]
69
+ def company_updates_comments(update_key, options={})
70
+ path = "#{company_path(options)}/updates/key=#{update_key}/update-comments"
71
+ simple_query(path, options)
72
+ end
73
+
74
+ # Retrieve likes on a particular company update:
75
+ #
76
+ # @see http://developer.linkedin.com/reading-company-shares
77
+ #
78
+ # @param [String] update_key a update/update-key representing a
79
+ # particular company update
80
+ # @macro company_path_options
81
+ # @return [LinkedIn::Mash]
82
+ def company_updates_likes(update_key, options={})
83
+ path = "#{company_path(options)}/updates/key=#{update_key}/likes"
84
+ simple_query(path, options)
85
+ end
86
+
87
+ # Create a share for a company that the authenticated user
88
+ # administers
89
+ #
90
+ # Permissions: rw_company_admin
91
+ #
92
+ # @see http://developer.linkedin.com/creating-company-shares
93
+ # @see http://developer.linkedin.com/documents/targeting-company-shares Targeting Company Shares
94
+ #
95
+ # @param [String] company_id Company ID
96
+ # @macro share_input_fields
97
+ # @return [void]
98
+ def add_company_share(company_id, share)
99
+ path = "/companies/#{company_id}/shares"
100
+ defaults = {:visibility => {:code => "anyone"}}
101
+ post(path, MultiJson.dump(defaults.merge(share)), "Content-Type" => "application/json")
102
+ end
103
+
104
+ # (Create) authenticated user starts following a company
105
+ #
106
+ # @see http://developer.linkedin.com/documents/company-follow-and-suggestions
107
+ #
108
+ # @param [String] company_id Company ID
109
+ # @return [void]
110
+ def follow_company(company_id)
111
+ path = "/people/~/following/companies"
112
+ body = {:id => company_id }
113
+ post(path, MultiJson.dump(body), "Content-Type" => "application/json")
114
+ end
115
+
116
+ # (Destroy) authenticated user stops following a company
117
+ #
118
+ # @see http://developer.linkedin.com/documents/company-follow-and-suggestions
119
+ #
120
+ # @param [String] company_id Company ID
121
+ # @return [void]
122
+ def unfollow_company(company_id)
123
+ path = "/people/~/following/companies/id=#{company_id}"
124
+ delete(path)
125
+ end
126
+ end
127
+ end
128
+ end