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
data/.autotest DELETED
@@ -1,14 +0,0 @@
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
data/.document DELETED
@@ -1,5 +0,0 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
data/.gemtest DELETED
File without changes
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --color
@@ -1 +0,0 @@
1
- linkedin-oauth2
@@ -1 +0,0 @@
1
- ruby-1.9.3-p429
@@ -1,121 +0,0 @@
1
- # LinkedIn
2
-
3
- Oauth 2.0 Ruby wrapper for the [LinkedIn API](http://developer.linkedin.com). Heavily inspired by [pengwynn/linkedin](https://github.com/pengwynn/linkedin)'s Oauth 1.0 Linkedin API interface. Most methods are the same as pengwynn/linkedin's gem, but major terminology changes make this incompatible.
4
-
5
- Travis CI : [![Build Status](https://secure.travis-ci.org/emorikawa/linkedin-oauth2.png)](http://travis-ci.org/emorikawa/linkedin-oauth2)
6
-
7
- ## Installation
8
-
9
- [sudo] gem install linkedin-oauth2
10
-
11
- ## Usage
12
-
13
- ### Authenticate Overview
14
-
15
- LinkedIn's API uses OAuth 2.0 for authentication. Luckily, this gem hides most of the gory details from you.
16
-
17
- The gory details can be found [here](https://developer.linkedin.com/documents/authentication)
18
-
19
- For legacy support of LinkedIn's OAuth 1.0a api, refer to the [pengwynn/linkedin](https://github.com/pengwynn/linkedin) gem.
20
-
21
- Basically, you need 3 things to start using LinkedIn's API:
22
-
23
- 1. Your application's `client_id` aka **API Key**
24
- 1. Your application's `client_secret` aka **Secret Key**
25
- 1. An `access_token` from a user who authorized your app.
26
-
27
- ### If you already have a user's `access_token`
28
- Then you have already authenticated! Encoded within that access token are
29
- all of the permissions you have on a given user. Assuming you requested
30
- the appropriate permissions, you can read their profile, grab connections,
31
- etc.
32
-
33
- client = LinkedIn::Client.new("<your client_id>",
34
- "<your client_secret>",
35
- "<user access_token>")
36
- client.profile
37
-
38
- You may also use the `set_access_token` method.
39
-
40
- client.set_access_token("<user access_token>", options)
41
-
42
- ### If you need to fetch an `access_token` for a user.
43
- There are 4 steps:
44
-
45
- 1. Setup a client using your application's `client_id` and `client_secret`
46
-
47
- client = LinkedIn::Client.new('your_client_id', 'your_client_secret')
48
-
49
- 2. Get the `authorize_url` to bring up the page that will ask a user
50
- to verify permissions & grant you access.
51
-
52
- authorize_url = client.authorize_url
53
-
54
- 3. Once a user signs in to your OAuth 2.0 box, you will get an
55
- `auth_code` aka **code**. (Check in url you were directed to after a
56
- successful auth). Use this **auth code** to request the
57
- **access token**.
58
-
59
- access_token = client.request_access_token("<auth_code from last step>")
60
-
61
- 4. Once you have an `access_token`, you can request profile information or
62
- anything else you have permissions for.
63
-
64
- client.profile
65
-
66
- ### Profile examples
67
- ```ruby
68
- # get the profile for the authenticated user
69
- client.profile
70
-
71
- # get a profile for someone found in network via ID
72
- client.profile(:id => 'gNma67_AdI')
73
-
74
- # get a profile for someone via their public profile url
75
- client.profile(:url => 'http://www.linkedin.com/in/netherland')
76
- ```
77
-
78
-
79
- More examples in the [examples folder](http://github.com/pengwynn/linkedin/blob/master/examples).
80
-
81
- 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).
82
-
83
- 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).
84
-
85
- ## Migration from OAuth 1.0a to OAuth 2.0
86
- ### Overall changes
87
- * The term `consumer` is now referred to as the `client`
88
- * The terms `token`, `consumer token`, or `consumer key` in OAuth 1.0 are now referred to as **`client_id`** in OAuth 2.0
89
- * The terms `secret`, or `consumer secret` in OAuth 1.0 are now referred to as **`client_secret`** in OAuth 2.0
90
- * In OAuth 1.0 there is both an `auth token` and an `auth secret`. OAuth 2.0 combines these into a single `access token`.
91
- * The terms `auth token`, `auth key`, `auth secret`, `access secret`, `access token`, or `access key` have all been collapsed and are now referred to as the **`access token`**.
92
- * `require` `linkedin-oauth2` instead of `linkedin`
93
- * Removed proxy options
94
-
95
- ### Gem api changes
96
- * In general, any place that said "consumer" now says "client"
97
- * The `authorize_from_request` method has been deprecated. Instead
98
- navigate to the url from `authorize_url` then enter the returned code
99
- into the `request_access_token` method.
100
- * The `authorize_from_access` method has been deprecated. Instead
101
- initialize the `LinkedIn::Client.new` with the `access_token`.
102
- `client = Linkedin::Client.new(client_id, client_secret, access_token)`
103
-
104
-
105
- ## Note on Patches/Pull Requests
106
-
107
- * Fork the project.
108
- * Make your feature addition or bug fix.
109
- * Add tests for it. This is important so I don't break it in a
110
- future version unintentionally.
111
- * Commit, do not mess with rakefile, version, or history.
112
- (if you want to have your own version, that is fine but
113
- bump version in a commit by itself I can ignore when I pull)
114
- * Send me a pull request. Bonus points for topic branches.
115
-
116
- ## Testing
117
- Run `bundle install`
118
-
119
- ## Copyright
120
-
121
- Copyright (c) 2013 [Evan Morikawa](https://twitter.com/E0M). See LICENSE for details.
@@ -1,94 +0,0 @@
1
- # Changelog
2
-
3
- # OAuth 2.0 Versions
4
-
5
- ## 0.1.0 - July 15, 2013
6
-
7
- * Migrated API over to use Linkedin's OAuth 2.0
8
-
9
- # OAuth 1.0 Legacy Versions Via pengwynn/linkedin
10
-
11
- ## 0.4.0 - May 30, 2013
12
-
13
- * Add capability to ask for desired permissions from linked in api
14
- * Add option to specify a proxy
15
- * Bump hashie version
16
- * fix the permission param passing
17
- * fix to be able to pass the permission scope
18
- * Manipulating comments/likes for network_updates ('shares')
19
- * Methods to work with comments/likes for share
20
- * Added a method to get a user's shares
21
- * Added current user's shares as an option (client.shares)
22
- * Readme Typos
23
-
24
-
25
-
26
- ## 0.2.x - March x, 2010
27
-
28
- * Removed Crack as a dependency, Nokogiri FTW
29
-
30
- ## 0.2.1 - March 1, 2010
31
-
32
- * Big dependency clean up, only OAuth and Nokogiri are really needed.
33
-
34
- * Use Nokogiri for xml generation (thanks Leonid Shevtsov - leonid-shevtsov)
35
-
36
- * Like and Likes supported
37
-
38
- * Escape querystring args
39
-
40
- * General coding cleanup
41
-
42
- * Added Languages, Skills, Publications, Patents and Phone Numbers (thanks Tadas Tamošauskas - medwezys)
43
-
44
- * Extra fields added to profile (thanks Tadas Tamošauskas - medwezys)
45
-
46
- * public\_profile\_field added to Profile (thanks troysteinbauer)
47
-
48
- * Added recommendations (thanks Erol)
49
-
50
- * Added current-share
51
-
52
- * Added default\_profile\__fields config option
53
-
54
- ## 0.1.7 - February 5, 2010
55
-
56
- * New group join status support JGRP from Terry Ray
57
-
58
- ## 0.1.6 - January 20, 2010
59
-
60
- * Fixed bug with network status update connection collections - thanks Terry Ray
61
-
62
- ## 0.1.5 - January 13, 2010
63
-
64
- * Added education and profile fields missing from updated LinkedIn docs
65
-
66
- ## 0.1.4 - January 13, 2010
67
-
68
- * Applied patch for position end month/year from @holman
69
-
70
- ## 0.1.3 - December 24, 2009
71
-
72
- * Added configure block for easier initialization of consumer token, secret
73
-
74
- ## 0.1.1 - December 8, 2009
75
-
76
- * Applied patch from [nfo](http://github.com/nfo) to fix error handling
77
-
78
- ## 0.1.0 - November 25, 2009
79
-
80
- * Network updates API support
81
-
82
- * Search API support
83
-
84
- * Updates API support
85
-
86
- ## 0.0.2 - November 25, 2009
87
-
88
- * Swapped out Crack for ROXML for prettier object access
89
-
90
- * Added more tests for Profile API
91
-
92
- ## 0.0.1 - November 24, 2009
93
-
94
- * Initial release
@@ -1,16 +0,0 @@
1
- require 'rubygems'
2
- require 'linkedin'
3
-
4
- # get your api keys at https://www.linkedin.com/secure/developer
5
- client = LinkedIn::Client.new('your_client_id', 'your_client_secret')
6
-
7
- # Get a url that you can enter into the browser to connect a user's
8
- # account to your client_id and client_secret.
9
- authorize_url = client.authorize_url
10
-
11
- # Record the 'code' param (check the url bar) then use it to request the
12
- # access_token.
13
- access_token = client.request_access_token("<auth_code from last step>")
14
-
15
- # Once you've initialized the access_token, you can call any api method
16
- client.profile
@@ -1,12 +0,0 @@
1
- # AUTHENTICATE FIRST found in examples/authenticate.rb
2
-
3
- # client is a LinkedIn::Client
4
-
5
- # get network updates for the authenticated user
6
- client.network_updates
7
-
8
- # get profile picture changes
9
- client.network_updates(:type => 'PICT')
10
-
11
- # view connections for the currently authenticated user
12
- client.connections
@@ -1,18 +0,0 @@
1
- # AUTHENTICATE FIRST found in examples/authenticate.rb
2
-
3
- # client is a LinkedIn::Client
4
-
5
- # get the profile for the authenticated user
6
- client.profile
7
-
8
- # get a profile for someone found in network via ID
9
- client.profile(:id => 'gNma67_AdI')
10
-
11
- # get a profile for someone via their public profile url
12
- client.profile(:url => 'http://www.linkedin.com/in/netherland')
13
-
14
- # provides the ability to access authenticated user's company field in the profile
15
- user = client.profile(:fields => %w(positions))
16
- companies = user.positions.all.map{|t| t.company}
17
- # Example: most recent company can be accessed via companies[0]
18
-
@@ -1,69 +0,0 @@
1
- require "rubygems"
2
- require "haml"
3
- require "sinatra"
4
- require "linkedin"
5
-
6
- enable :sessions
7
-
8
- helpers do
9
- def login?
10
- !session[:atoken].nil?
11
- end
12
-
13
- def profile
14
- linkedin_client.profile unless session[:atoken].nil?
15
- end
16
-
17
- def connections
18
- linkedin_client.connections unless session[:atoken].nil?
19
- end
20
-
21
- private
22
- def linkedin_client
23
- client = LinkedIn::Client.new(settings.api, settings.secret, session[:atoken])
24
- client
25
- end
26
-
27
- end
28
-
29
- configure do
30
- # get your api keys at https://www.linkedin.com/secure/developer
31
- set :api, "your_api_key"
32
- set :secret, "your_secret"
33
- end
34
-
35
- get "/" do
36
- haml :index
37
- end
38
-
39
- get "/auth" do
40
- client = LinkedIn::Client.new(settings.api, settings.secret)
41
- authorize_url = client.authorize_url(redirect_uri: "http://#{request.host}:#{request.port}/auth/callback")
42
- redirect authorize_url
43
- end
44
-
45
- get "/auth/logout" do
46
- session[:atoken] = nil
47
- redirect "/"
48
- end
49
-
50
- get "/auth/callback" do
51
- client = LinkedIn::Client.new(settings.api, settings.secret)
52
- code = params[:code]
53
- session[:atoken] = client.request_access_token(code, redirect_uri: "/")
54
- redirect "/"
55
- end
56
-
57
-
58
- __END__
59
- @@index
60
- -if login?
61
- %p Welcome #{profile.first_name}!
62
- %a{:href => "/auth/logout"} Logout
63
- %p= profile.headline
64
- %br
65
- %div= "You have #{connections.total} connections!"
66
- -connections.all.each do |c|
67
- %div= "#{c.first_name} #{c.last_name} - #{c.headline}"
68
- -else
69
- %a{:href => "/auth"} Login using LinkedIn
@@ -1,6 +0,0 @@
1
- # AUTHENTICATE FIRST found in examples/authenticate.rb
2
-
3
- # client is a LinkedIn::Client
4
-
5
- # update status for the authenticated user
6
- client.add_share(:comment => 'is playing with the LinkedIn Ruby gem')
@@ -1,123 +0,0 @@
1
- module LinkedIn
2
- module Api
3
-
4
- module QueryMethods
5
-
6
- def profile(options={})
7
- path = person_path(options)
8
- simple_query(path, options)
9
- end
10
-
11
- def connections(options={})
12
- path = "#{person_path(options)}/connections"
13
- simple_query(path, options)
14
- end
15
-
16
- def network_updates(options={})
17
- path = "#{person_path(options)}/network/updates"
18
- simple_query(path, options)
19
- end
20
-
21
- def company(options = {})
22
- path = company_path(options)
23
- simple_query(path, options)
24
- end
25
-
26
- def job(options = {})
27
- path = jobs_path(options)
28
- simple_query(path, options)
29
- end
30
-
31
- def job_bookmarks(options = {})
32
- path = "#{person_path(options)}/job-bookmarks"
33
- simple_query(path, options)
34
- end
35
-
36
- def job_suggestions(options = {})
37
- path = "#{person_path(options)}/suggestions/job-suggestions"
38
- simple_query(path, options)
39
- end
40
-
41
- def group_memberships(options = {})
42
- path = "#{person_path(options)}/group-memberships"
43
- simple_query(path, options)
44
- end
45
-
46
- def shares(options={})
47
- path = "#{person_path(options)}/network/updates?type=SHAR&scope=self"
48
- simple_query(path, options)
49
- end
50
-
51
- def share_comments(update_key, options={})
52
- path = "#{person_path(options)}/network/updates/key=#{update_key}/update-comments"
53
- simple_query(path, options)
54
- end
55
-
56
- def share_likes(update_key, options={})
57
- path = "#{person_path(options)}/network/updates/key=#{update_key}/likes"
58
- simple_query(path, options)
59
- end
60
-
61
- private
62
-
63
- def simple_query(path, options={})
64
- fields = options.delete(:fields) || LinkedIn.default_profile_fields
65
-
66
- if options.delete(:public)
67
- path +=":public"
68
- elsif fields
69
- path +=":(#{fields.map{ |f| f.to_s.gsub("_","-") }.join(',')})"
70
- end
71
-
72
- headers = options.delete(:headers) || {}
73
-
74
- params = to_query(options)
75
- path += "?#{params}" if !params.empty?
76
-
77
- Mash.from_json(get(path, headers))
78
- end
79
-
80
- def person_path(options)
81
- path = "/people"
82
- if id = options.delete(:id)
83
- if id.is_a? Array
84
- path += "::(#{id.join(",")})"
85
- else
86
- path += "/id=#{id}"
87
- end
88
- elsif url = options.delete(:url)
89
- path += "/url=#{CGI.escape(url)}"
90
- else
91
- path += "/~"
92
- end
93
- end
94
-
95
- def company_path(options)
96
- path = "/companies"
97
-
98
- if domain = options.delete(:domain)
99
- path += "?email-domain=#{CGI.escape(domain)}"
100
- elsif id = options.delete(:id)
101
- path += "/id=#{id}"
102
- elsif url = options.delete(:url)
103
- path += "/url=#{CGI.escape(url)}"
104
- elsif name = options.delete(:name)
105
- path += "/universal-name=#{CGI.escape(name)}"
106
- else
107
- path += "/~"
108
- end
109
- end
110
-
111
- def jobs_path(options)
112
- path = "/jobs"
113
- if id = options.delete(:id)
114
- path += "/id=#{id}"
115
- else
116
- path += "/~"
117
- end
118
- end
119
-
120
- end
121
-
122
- end
123
- end