linkedin-oauth2 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +9 -9
  2. data/.gitignore +24 -39
  3. data/.travis.yml +4 -4
  4. data/.yardopts +2 -0
  5. data/CHANGELOG.md +10 -0
  6. data/CONTRIBUTING.md +1 -0
  7. data/Gemfile +6 -5
  8. data/LICENSE +19 -17
  9. data/README.md +399 -0
  10. data/Rakefile +15 -22
  11. data/lib/linked_in/access_token.rb +24 -0
  12. data/lib/linked_in/api.rb +96 -3
  13. data/lib/linked_in/api_resource.rb +165 -0
  14. data/lib/linked_in/communications.rb +40 -0
  15. data/lib/linked_in/companies.rb +146 -0
  16. data/lib/linked_in/configuration.rb +41 -0
  17. data/lib/linked_in/connection.rb +31 -0
  18. data/lib/linked_in/errors.rb +33 -13
  19. data/lib/linked_in/groups.rb +116 -0
  20. data/lib/linked_in/jobs.rb +68 -0
  21. data/lib/linked_in/mash.rb +34 -34
  22. data/lib/linked_in/oauth2.rb +223 -0
  23. data/lib/linked_in/people.rb +141 -0
  24. data/lib/linked_in/search.rb +58 -43
  25. data/lib/linked_in/share_and_social_stream.rb +128 -0
  26. data/lib/linked_in/version.rb +1 -9
  27. data/lib/linkedin-oauth2.rb +43 -25
  28. data/linkedin-oauth2.gemspec +35 -21
  29. data/spec/linked_in/api/api_spec.rb +41 -0
  30. data/spec/linked_in/api/communications_spec.rb +13 -0
  31. data/spec/linked_in/api/companies_spec.rb +59 -0
  32. data/spec/linked_in/api/groups_spec.rb +55 -0
  33. data/spec/linked_in/api/jobs_spec.rb +33 -0
  34. data/spec/linked_in/api/people_spec.rb +181 -0
  35. data/spec/linked_in/api/search_spec.rb +71 -0
  36. data/spec/linked_in/api/share_and_social_stream_spec.rb +60 -0
  37. data/spec/linked_in/configuration_spec.rb +46 -0
  38. data/spec/linked_in/connection_spec.rb +10 -0
  39. data/spec/linked_in/module_loading_spec.rb +23 -0
  40. data/spec/linked_in/oauth/access_token_spec.rb +27 -0
  41. data/spec/linked_in/oauth/auth_code_spec.rb +86 -0
  42. data/spec/linked_in/oauth/credentials_spec.rb +96 -0
  43. data/spec/linked_in/oauth/get_access_token_spec.rb +108 -0
  44. data/spec/spec_helper.rb +15 -0
  45. data/spec/vcr_cassettes/access_token_success.yml +84 -0
  46. data/spec/vcr_cassettes/bad_code.yml +78 -0
  47. data/spec/vcr_cassettes/companies_data.yml +44 -0
  48. data/spec/vcr_cassettes/invalid_access_token.yml +60 -0
  49. data/spec/vcr_cassettes/not_found.yml +64 -0
  50. data/spec/vcr_cassettes/people_picture_urls.yml +54 -0
  51. data/spec/vcr_cassettes/people_profile_connections_fields.yml +73 -0
  52. data/spec/vcr_cassettes/people_profile_connections_other.yml +78 -0
  53. data/spec/vcr_cassettes/people_profile_connections_self.yml +78 -0
  54. data/spec/vcr_cassettes/people_profile_fields_complex.yml +70 -0
  55. data/spec/vcr_cassettes/people_profile_fields_simple.yml +57 -0
  56. data/spec/vcr_cassettes/people_profile_lang_spanish.yml +59 -0
  57. data/spec/vcr_cassettes/people_profile_multiple_fields.yml +68 -0
  58. data/spec/vcr_cassettes/people_profile_multiple_uids.yml +70 -0
  59. data/spec/vcr_cassettes/people_profile_multiple_uids_and_urls.yml +76 -0
  60. data/spec/vcr_cassettes/people_profile_multiple_urls.yml +70 -0
  61. data/spec/vcr_cassettes/people_profile_new_connections_fields.yml +69 -0
  62. data/spec/vcr_cassettes/people_profile_new_connections_other.yml +72 -0
  63. data/spec/vcr_cassettes/people_profile_new_connections_self.yml +72 -0
  64. data/spec/vcr_cassettes/people_profile_other_uid.yml +59 -0
  65. data/spec/vcr_cassettes/people_profile_other_url.yml +59 -0
  66. data/spec/vcr_cassettes/people_profile_own.yml +59 -0
  67. data/spec/vcr_cassettes/people_profile_own_secure.yml +59 -0
  68. data/spec/vcr_cassettes/unauthorized.yml +61 -0
  69. data/spec/vcr_cassettes/unavailable.yml +81 -0
  70. metadata +145 -88
  71. data/.autotest +0 -14
  72. data/.document +0 -5
  73. data/.gemtest +0 -0
  74. data/.rspec +0 -1
  75. data/.ruby-gemset +0 -1
  76. data/.ruby-version +0 -1
  77. data/README.markdown +0 -121
  78. data/changelog.markdown +0 -94
  79. data/examples/authenticate.rb +0 -16
  80. data/examples/network.rb +0 -12
  81. data/examples/profile.rb +0 -18
  82. data/examples/sinatra.rb +0 -69
  83. data/examples/status.rb +0 -6
  84. data/lib/linked_in/api/query_methods.rb +0 -123
  85. data/lib/linked_in/api/update_methods.rb +0 -76
  86. data/lib/linked_in/client.rb +0 -31
  87. data/lib/linked_in/helpers.rb +0 -6
  88. data/lib/linked_in/helpers/authorization.rb +0 -106
  89. data/lib/linked_in/helpers/request.rb +0 -93
  90. data/spec/cases/api_spec.rb +0 -192
  91. data/spec/cases/linkedin_spec.rb +0 -37
  92. data/spec/cases/mash_spec.rb +0 -85
  93. data/spec/cases/oauth_spec.rb +0 -130
  94. data/spec/cases/search_spec.rb +0 -190
  95. data/spec/helper.rb +0 -30
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YjgxY2YzOGY3OTc1ZjE3NTAzNzZmMTEyMjM3YjI2MDUxY2FkNDI1Ng==
4
+ Zjk1YTQ0ZjFjMzIzMDE0M2EzZTNiYTEyMzhlMjMyMTU5NjhjMGM4OQ==
5
5
  data.tar.gz: !binary |-
6
- MmFiMmQ0YzQwYjQzMDI2MjI0NWU3YmZjNWIzNjc0M2JlYjcwYjBmNg==
7
- !binary "U0hBNTEy":
6
+ MDAzY2MzZjJhYWJjMWFiMDk2MTRiMGIzZGIxN2U3YTczZWI0Y2Y3ZQ==
7
+ SHA512:
8
8
  metadata.gz: !binary |-
9
- NWViNDkwYTYyMGM0ODYzYzQ2MmNiYjdmNThhZWEzYWJiNGQ1ZGNkYTE3YmE3
10
- NGZjMGZlMThlYTU0NWUwMDdhMDRlMTYxZTdlMDA1MzkxY2FhMmE0YWUwMmU2
11
- ZjFiNjA0NDY3YmEwNDY1MDMxOTVmYzAyMTgyYTA0OTNiOGNhNjI=
9
+ MDBiOTVhZmU1NmYyYWYzNDRhODQ1ZTk3MzQ2NzY4ZmMwZjM1YmIyOTljNzky
10
+ MWM4NzhlNWU2NGE5NGRiMjZkOWJiNmE2MzcyNTJlYmQ0ZDBhMTFjMDE5ZTAy
11
+ NmEyZDhiMzJlMGJlZWFmM2Q3MDM0NmU5OGMyMGZkM2IzMGZiMzg=
12
12
  data.tar.gz: !binary |-
13
- NGI3ZTlmOWM4OTU4MjIzOWViNWVhNmZhZGFkM2U5MDEwZDRmYzM4ODZjNWJm
14
- Mjc4MGU3YWEyOWNjNDgwZjZlNTZjMWFlY2RjNTliYmU0MjdlNjViNjQ0ZTU4
15
- ODg2MmYwNDU4ODRlMTE1NzdiN2Q2NTZlNWVlNWE1MjI3NDg3M2E=
13
+ OWJhZDU1N2I1YjYyMGQ5ODJjY2I1NTM5YjI1NDY4N2IwMTk0ZWIwNTQzMjM0
14
+ Y2FiMmExN2FhOWMwYzNlMWJlMDc1ZjIwMzY2OGUyNGNjNzdiNjg4ODkyNzY1
15
+ NWNiZTRmNDk3NDY4YzQzMWM3MjBiODJjY2U5ZDlkZjg2NDMzYTk=
data/.gitignore CHANGED
@@ -1,41 +1,26 @@
1
- *.gem
2
- *.rbc
3
- *.sw[a-p]
4
- *.tmproj
5
- *.tmproject
6
- *.un~
7
- *~
8
- .DS_Store
9
- .Spotlight-V100
10
- .Trashes
11
- ._*
12
- .bundle
13
- .config
14
- .directory
15
- .elc
16
- .redcar
17
- .yardoc
18
- .rvmrc
19
- /.emacs.desktop
20
- /.emacs.desktop.lock
21
- Desktop.ini
1
+ # Only gem-specific ignores are included in this file.
2
+ # For common .gitignore items, you should set your local ~/.gitignore
3
+
4
+ # We want to ignore Gemfile.lock for gems. See http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/
22
5
  Gemfile.lock
23
- Icon?
24
- InstalledFiles
25
- Session.vim
26
- Thumbs.db
27
- \#*\#
28
- _yardoc
29
- auto-save-list
30
- coverage
6
+ .Gemfile
7
+
8
+ # Use your own ~/.rspec
9
+ # See suggested options in Rakefile
10
+ .rspec
11
+
12
+ # We do not want to lock a ruby version or gemeset to develop on
13
+ .rvmrc
14
+ .ruby-gemset
15
+ .ruby-version
16
+
17
+ # Compile yarddoc with the `yard` command
18
+ .yardoc
31
19
  doc/
32
- lib/bundler/man
33
- pkg
34
- pkg/*
35
- rdoc
36
- spec/reports
37
- test/tmp
38
- test/version_tmp
39
- tmp
40
- tmtags
41
- tramp
20
+
21
+ # Run `rake build` to generate the gem
22
+ /*.gem
23
+ pkg/
24
+
25
+ # Running coveralls
26
+ coverage
@@ -1,5 +1,5 @@
1
+ language: ruby
1
2
  rvm:
2
- - 1.8.7
3
- - 1.9.2
4
- - 1.9.3
5
- - ree
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+ - "2.1.1"
@@ -0,0 +1,2 @@
1
+ --markup-provider=redcarpet
2
+ --markup=markdown
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ ## 1.0.0 - August 1, 2014
4
+
5
+ * Complete re-architecture of the Oauth2.0 gem.
6
+
7
+ ## 0.1.0 - July 15, 2013
8
+
9
+ * Migrated API over to use Linkedin's OAuth 2.0
10
+ * **NOTE:** This was based off of a heavily modified fork from hexgnu/linkedin
@@ -0,0 +1 @@
1
+ Read [GitHub's "Contributing to Open Source on GitHub"](https://guides.github.com/activities/contributing-to-open-source/)
data/Gemfile CHANGED
@@ -1,7 +1,8 @@
1
- source 'http://rubygems.org'
2
-
3
- platforms :jruby do
4
- gem 'jruby-openssl', '~> 0.7'
5
- end
1
+ source "https://rubygems.org"
6
2
 
3
+ # Dependencies defined in linkedin-oauth2.gemspec
7
4
  gemspec
5
+
6
+ group :test do
7
+ gem "coveralls", require: false
8
+ end
data/LICENSE CHANGED
@@ -1,20 +1,22 @@
1
- Copyright (c) 2013 Evan Morikawa
1
+ The MIT License
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
3
+ Copyright (c) 2014-present Evan Morikawa (evan@evanmorikawa.com) 2013-2014
4
+ Matt Kirk 2009-11 Wynn Netherland.
10
5
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
13
12
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
@@ -0,0 +1,399 @@
1
+ # LinkedIn OAuth 2.0
2
+ [![Build Status](https://travis-ci.org/emorikawa/linkedin-oauth2.svg?branch=master)](https://travis-ci.org/emorikawa/linkedin-oauth2)
3
+ [![Coverage Status](https://coveralls.io/repos/emorikawa/linkedin-oauth2/badge.png)](https://coveralls.io/r/emorikawa/linkedin-oauth2)
4
+ [![Code Climate](https://codeclimate.com/github/emorikawa/linkedin-oauth2/badges/gpa.svg)](https://codeclimate.com/github/emorikawa/linkedin-oauth2)
5
+ [![Dependency Status](https://gemnasium.com/emorikawa/linkedin-oauth2.svg)](https://gemnasium.com/emorikawa/linkedin-oauth2)
6
+
7
+ OAuth 2.0 Ruby wrapper for the [LinkedIn API](http://developer.linkedin.com).
8
+
9
+ If you are using OAuth 1.0, see the [hexgnu/linkedin](https://github.com/hexgnu/linkedin)
10
+
11
+ If you are upgrading from the oauth2-v0.1.0 version of this gem, see the
12
+ [upgrade notes](#upgrading) below.
13
+
14
+ # Installation
15
+
16
+ In Bundler:
17
+
18
+ ```ruby
19
+ gem "linkedin-oauth2", "~> 1.0"
20
+ ```
21
+
22
+ Otherwise:
23
+
24
+ [sudo|rvm] gem install linkedin-oauth2
25
+
26
+ # Usage
27
+
28
+ **[Step 1:](#step-1-register-your-application)** [Register](https://www.linkedin.com/secure/developer) your
29
+ application with LinkedIn. They will give you a **Client ID** (aka API
30
+ Key) and a **Client Secret** (aka Secret Key)
31
+
32
+ **[Step 2:](#step-2-getting-an-access-token)** Use your **Client ID** and **Client Secret** to obtain an **Access Token** from some user.
33
+
34
+ **[Step 3:](#step-3-using-linkedins-api)** Use an **Access Token** to query the API.
35
+
36
+ ```ruby
37
+ api = LinkedIn::API.new(access_token)
38
+ me = api.profile
39
+ ```
40
+
41
+ ## Step 1: Register your Application
42
+
43
+ You first need to create and register an application with LinkedIn
44
+ [here](https://www.linkedin.com/secure/developer).
45
+
46
+ You will not be able to use any part of the API without registering first.
47
+
48
+ Once you have registered you will need to take note of a few key items on
49
+ your Application Details page.
50
+
51
+ 1. **API Key** - We refer to this as your client id or `client_id`
52
+ 1. **Secret Key** - We refer to this as your client secret or
53
+ `client_secret`
54
+ 1. **Default Scope** - This is the set of permissions you request from
55
+ users when they connect to your app. If you want to set this on a
56
+ request-by-request basis, you can use the `scope` option with the
57
+ `auth_code_url` method.
58
+ 1. **OAuth 2.0 Redirect URLs** - For security reasons, the url you enter
59
+ in this box must exactly match the `redirect_uri` you use in this gem.
60
+
61
+ You do NOT need **OAuth User Token** nor **OAuth User Secret**. That is
62
+ for OAuth 1.0. This gem is for OAuth 2.0.
63
+
64
+ ## Step 2: Getting An Access Token
65
+
66
+ All LinkedIn API requests must be made in the context of an access token.
67
+ The access token encodes what LinkedIn information your AwesomeApp® can
68
+ gather on behalf of "John Doe".
69
+
70
+ There are a few different ways to get an access token from a user.
71
+
72
+ 1. You can use [LinkedIn's Javascript API](https://developer.linkedin.com/documents/javascript-api-reference-0) to authenticate on the front-end and then pass the access token to the backend via [this procedure](https://developer.linkedin.com/documents/exchange-jsapi-tokens-rest-api-oauth-tokens).
73
+
74
+ 1. If you use OmniAuth, I would recommend looking at [decioferreira/omniauth-linkedin-oauth2](https://github.com/decioferreira/omniauth-linkedin-oauth2) to help automate authentication.
75
+
76
+ 1. You can do it manually using this linkedin-oauth2 gem and the steps
77
+ below.
78
+
79
+ Here is how to get an access token using this linkedin-oauth2 gem:
80
+
81
+ ### Step 2A: Configuration
82
+
83
+ You will need to configure the following items:
84
+
85
+ 1. Your **client id** (aka API Key)
86
+ 1. Your **client secret** (aka Secret Key)
87
+ 1. Your **redirect uri**. On LinkedIn's website you must input a list of
88
+ valid redirect URIs. If you use the same one each time, you can set it
89
+ in the `LinkedIn.configure` block. If your redirect uris change
90
+ depending on business logic, you can pass it into the `auth_code_url`
91
+ method.
92
+
93
+ ```ruby
94
+ # It's best practice to keep secret credentials out of source code.
95
+ # You can, of course, hardcode dev keys or directly pass them in as the
96
+ # first two arguments of LinkedIn::OAuth2.new
97
+ LinkedIn.configure do |config|
98
+ config.client_id = ENV["LINKEDIN_CLIENT_ID"]
99
+ config.client_secret = ENV["LINKEDIN_CLIENT_SECRET"]
100
+
101
+ # This must exactly match the redirect URI you set on your application's
102
+ # settings page. If your redirect_uri is dynamic, pass it into
103
+ # `auth_code_url` instead.
104
+ config.redirect_uri = "https://getawesomeapp.io/linkedin/oauth2"
105
+ end
106
+ ```
107
+
108
+ ### Step 2B: Get Auth Code URL
109
+
110
+ ```ruby
111
+ oauth = LinkedIn::OAuth2.new
112
+
113
+ url = oauth.auth_code_url
114
+ ```
115
+
116
+ ### Step 2C: User Sign In
117
+
118
+ You must now load url from Step 2B in a browser. It will pull up the
119
+ LinkedIn sign in box. Once LinkedIn user credentials are entered, the box
120
+ will close and redirect to your redirect url, passing along with it the
121
+ **OAuth code** as the `code` GET param.
122
+
123
+ Be sure to read the extended documentation around the LinkedIn::OAuth2
124
+ module for more options you can set.
125
+
126
+ **Note:** The **OAuth code** only lasts for ~20 seconds!
127
+
128
+ ### Step 2D: Get Access Token
129
+
130
+ ```ruby
131
+ code = "THE_OAUTH_CODE_LINKEDIN_GAVE_ME"
132
+
133
+ access_token = oauth.get_access_token(code)
134
+ ```
135
+
136
+ Now that you have an access token, you can use it to query the API.
137
+
138
+ The `LinkedIn::OAuth2` inherits from [intreda/oauth2](https://github.com/intridea/oauth2)'s `OAuth2::Client` class. See that gem's [documentation](https://github.com/intridea/oauth2/blob/master/lib/oauth2/client.rb) for more usage examples.
139
+
140
+ ## Step 3: Using LinkedIn's API
141
+
142
+ Once you have an access token, you can query LinkedIn's API.
143
+
144
+ Your access token encodes the permissions you're allowed to have. See Step
145
+ 2 and [this LinkedIn document](https://developer.linkedin.com/documents/authentication#granting) for how to change the permissions. See each section's documentation on LinkedIn for more information on what permissions get you access to.
146
+
147
+ ### People
148
+
149
+ See the Profiles of yourself and other users. See the connections of
150
+ yourslef and other users.
151
+
152
+ See https://developer.linkedin.com/documents/people
153
+
154
+ ```ruby
155
+ api = LinkedIn::API.new(access_token)
156
+ ```
157
+
158
+ #### Yourself
159
+
160
+ ```ruby
161
+ me = api.profile
162
+ ```
163
+
164
+ #### Others
165
+
166
+ ```ruby
167
+ evan_morikawa = api.profile("SDmkCxL2ya")
168
+ evan_morikawa = api.profile(id: "SDmkCxL2ya")
169
+ evan_morikawa = api.profile(url: "http://www.linkedin.com/in/evanmorikawa")
170
+ ```
171
+
172
+ #### Specific Fields
173
+
174
+ See [available fields here](https://developer.linkedin.com/documents/profile-fields)
175
+
176
+ ```ruby
177
+ my_name = api.profile(fields: ["first-name", "last-name"])
178
+ my_job_titles = api.profile(fields: ["id", {"positions" => ["title"]}])
179
+ ```
180
+
181
+ #### Multiple People
182
+
183
+ ```ruby
184
+ me_and_others = api.profile(ids: ["self", "SDmkCxL2ya"])
185
+ ```
186
+
187
+ #### Connections
188
+
189
+ ```ruby
190
+ # Takes the same arguments as `LinkedIn::API#profile`
191
+ my_connections = api.connections
192
+ evans_connections = api.connections(id: "SDmkCxL2ya")
193
+ ```
194
+
195
+ #### New Connections
196
+
197
+ ```ruby
198
+ # Takes the same options argument as `LinkedIn::API#connections`
199
+ since = Time.new(2014,1,1)
200
+ my_new_connections = api.connections(since)
201
+ evans_new_connections = api.connections(since, id: "SDmkCxL2ya")
202
+ ```
203
+
204
+ ### People Search
205
+
206
+ Search through People
207
+
208
+ See https://developer.linkedin.com/documents/people-search-api
209
+
210
+ ```ruby
211
+ api.search
212
+ api.search("Proximate")
213
+ api.search(keywords: "Proximate Olin")
214
+ api.search(keywords: "Proximate Olin", start: 10, count: 20)
215
+ api.search(school_name: "Olin College of Engineering")
216
+
217
+ api.search(fields: {facets: ["code", {buckets: ["code", "name"]}] },
218
+ facets: "location")
219
+
220
+ # Identify all 1st degree connections living in the San Francisco Bay Area
221
+ # See https://developer.linkedin.com/documents/people-search-api#Facets
222
+ api.search(fields: {facets: ["code", {buckets: ["code", "name", "count"]}]},
223
+ facets: "location,network",
224
+ facet: ["location,us:84", "network,F"])
225
+ ```
226
+
227
+ ### Groups
228
+
229
+ Access and interact with LinkedIn Groups
230
+
231
+ You need the "rw_groups" permission for most group actions
232
+
233
+ See https://developer.linkedin.com/documents/groups
234
+
235
+ ```ruby
236
+ # My groups
237
+ api.group_suggestions
238
+ api.group_memberships
239
+
240
+ # Another group
241
+ api.group_profile(id: 12345)
242
+ api.group_posts(id: 12345, count: 10, start: 10)
243
+
244
+ # Participate
245
+ api.add_group_share(12345, title: "Hi")
246
+
247
+ api.join_group(12345)
248
+ ```
249
+
250
+ ### Companies
251
+
252
+ Detailed overviews of Company information
253
+
254
+ See https://developer.linkedin.com/documents/companies
255
+
256
+ ```ruby
257
+ # Company info
258
+ api.company(name: "google")
259
+ api.company(id: 12345)
260
+ api.company_updates(name: "google")
261
+ api.company_statistics(name: "google")
262
+
263
+ # Info on a particular company update
264
+ api.company_update_comments(1337, name: "google")
265
+ api.company_update_likes(1337, name: "google")
266
+
267
+ # Follow/unfollow
268
+ api.follow_company(12345)
269
+ api.unfollow_company(12345)
270
+
271
+ # Need rw_company_admin
272
+ api.add_company_share(12345, content: "Hi")
273
+ ```
274
+
275
+ ### Jobs
276
+
277
+ A search for Jobs on LinkedIn
278
+
279
+ See https://developer.linkedin.com/documents/jobs
280
+
281
+ ```ruby
282
+ # Find a job
283
+ api.job(id: 12345)
284
+
285
+ # Your jobs
286
+ api.job_bookmarks
287
+ api.job_suggestions
288
+ api.add_job_bookmark(12345)
289
+ ```
290
+
291
+ ### Share and Social Stream
292
+
293
+ View and update content on social streams
294
+
295
+ See https://developer.linkedin.com/documents/share-and-social-stream
296
+
297
+ ```ruby
298
+ # Your news feed
299
+ api.network_updates
300
+ api.shares
301
+
302
+ api.add_share(content: "hi")
303
+ api.update_comment(12345, content: "hi")
304
+
305
+ # For a particular feed item
306
+ api.share_comments(12345)
307
+ api.share_likes(12345)
308
+
309
+ api.like_share(12345)
310
+ api.unlike_share(12345)
311
+ ```
312
+
313
+ ### Communications
314
+
315
+ Invitations and messages between connections apis
316
+
317
+ See https://developer.linkedin.com/documents/communications
318
+
319
+ ```ruby
320
+ # Need w_messages permissions
321
+
322
+ api.send_message("Subject", "Body", ["user1234", "user3456"])
323
+ ```
324
+
325
+ # Documentation
326
+
327
+ On [RubyDoc here](http://rubydoc.info/github/emorikawa/linkedin-oauth2/frames/file/README.md)
328
+
329
+ Read the source for [LinkedIn::API](https://github.com/emorikawa/linkedin-oauth2/blob/master/lib/linked_in/api.rb) and [LinkedIn::OAuth2](https://github.com/emorikawa/linkedin-oauth2/blob/master/lib/linked_in/oauth2.rb)
330
+
331
+ # Upgrading
332
+
333
+ v1.0 of linkedin-oauth2 is a near complete re-write of the gem. Its
334
+ primary goals were to:
335
+
336
+ * Better isolate OAuth 2.0 logic
337
+ * Better documentation around OAuth 2.0
338
+ * Build on top of [Faraday](https://github.com/lostisland/faraday)
339
+ * Modularize the API Endpoints
340
+ * Better cover LinkedIn's vast API & audit deprecated actions
341
+ * Achieve near perfect test coverage & code quality
342
+
343
+ There are two places you may be upgrading from:
344
+
345
+ 1. oauth2-v0.1 of this linkedin-oauth2 gem
346
+ 2. [hexgnu/linkedin](https://github.com/hexgnu/linkedin) OAuth 1.0 gem
347
+
348
+ ### From oauth2-v0.1.0 of linkedin-oauth2
349
+
350
+ See the [README from oauth2-v0.1](https://github.com/emorikawa/linkedin-oauth2/blob/395540d029156f29d0e53f588feb31f279aa5d70/README.markdown)
351
+
352
+ * The OAuth portion has substantially changed. There should be no changes
353
+ for the signature of API calls or the response hashes
354
+ * Some of the API calls in the oauth2-v0.1 were actually broken in the
355
+ initial OAuth2.0 transition. Those have now been fixed.
356
+ * Instead of a single `LinkedIn::Client` object there are now two separate
357
+ major objects.
358
+
359
+ 1. `LinkedIn::OAuth2` for performing authentication
360
+ 1. `LinkedIn::API` for accessing the API
361
+
362
+ * Requests used to be done through the `OAuth2::AccessToken` object. Now
363
+ they are done through `LinkedIn::Connection`, which is a thin subclass of
364
+ `Faraday::Connection`. This is composed into the main `LinkedIn::API`
365
+ object.
366
+
367
+ ### From hexgnu/linkedin OAuth 1.0
368
+
369
+ * OAuth 2.0 is substantially different then OAuth 1.0
370
+ * The actual API methods, arguments, and return values were designed to
371
+ look the same as hexgnu/linkedin. You should only have to swap out the
372
+ Authentication and API client construction.
373
+ * There is no more `consumer` object. Everything in OAuth 2.0 is centered
374
+ around acquiring an **Access Token**. Use the new `LinkedIn::OAuth2`
375
+ class to acquire the token.
376
+ * There is no more single `client` object. The equivalent is the
377
+ `LinkedIn::API` object. The `LinkedIn::API` object only needs an access
378
+ token to work
379
+ * Requests used to be done through an `OAuth::AccessToken` object. Now
380
+ they are done through `LinkedIn::Connection`, which is a thin subclass of
381
+ `Faraday::Connection`. This means that you have the full power and
382
+ method signatures of Faraday at your disposal.
383
+
384
+ # Contributing
385
+
386
+ Please see [CONTRIBUTING.md](https://github.com/emorikawa/linkedin-oauth2/blob/master/CONTRIBUTING.md) for details.
387
+
388
+ # Credits
389
+
390
+ * [Evan Morikawa](https://twitter.com/eom) ([emorikawa](https://github.com/emorikawa))
391
+ * [Matt Kirk](http://matthewkirk.com) ([hexgnu](https://github.com/hexgnu))
392
+ * [Wynn Netherland](http://wynnetherland.com) ([pengwynn](https://github.com/pengwynn))
393
+ * Josh Kalderimis ([joshk](https://github.com/joshk))
394
+ * Erik Michaels-Ober ([sferik](https://github.com/sferik))
395
+ * And Many More [Contributors](https://github.com/emorikawa/linkedin-oauth2/graphs/contributors)
396
+
397
+ # License
398
+
399
+ Copyright :copyright: 2014-present [Evan Morikawa](https://twitter.com/e0m) 2013-2014 [Matt Kirk](http://matthewkirk.com/) 2009-11 [Wynn Netherland](http://wynnnetherland.com/) and [contributors](https://github.com/emorikawa/linkedin-oauth2/graphs/contributors). It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file. See [LICENSE](https://github.com/emorikawa/linkedin-oauth2/blob/master/LICENSE) for details.