octodoggy 4.6.2

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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/CONTRIBUTING.md +22 -0
  4. data/LICENSE.md +20 -0
  5. data/README.md +714 -0
  6. data/Rakefile +22 -0
  7. data/lib/ext/sawyer/relation.rb +10 -0
  8. data/lib/octokit.rb +59 -0
  9. data/lib/octokit/arguments.rb +14 -0
  10. data/lib/octokit/authentication.rb +82 -0
  11. data/lib/octokit/client.rb +238 -0
  12. data/lib/octokit/client/authorizations.rb +244 -0
  13. data/lib/octokit/client/commit_comments.rb +95 -0
  14. data/lib/octokit/client/commits.rb +239 -0
  15. data/lib/octokit/client/contents.rb +162 -0
  16. data/lib/octokit/client/deployments.rb +62 -0
  17. data/lib/octokit/client/downloads.rb +50 -0
  18. data/lib/octokit/client/emojis.rb +18 -0
  19. data/lib/octokit/client/events.rb +151 -0
  20. data/lib/octokit/client/feeds.rb +33 -0
  21. data/lib/octokit/client/gists.rb +233 -0
  22. data/lib/octokit/client/gitignore.rb +43 -0
  23. data/lib/octokit/client/hooks.rb +297 -0
  24. data/lib/octokit/client/integrations.rb +77 -0
  25. data/lib/octokit/client/issues.rb +321 -0
  26. data/lib/octokit/client/labels.rb +156 -0
  27. data/lib/octokit/client/legacy_search.rb +42 -0
  28. data/lib/octokit/client/licenses.rb +45 -0
  29. data/lib/octokit/client/markdown.rb +27 -0
  30. data/lib/octokit/client/meta.rb +21 -0
  31. data/lib/octokit/client/milestones.rb +87 -0
  32. data/lib/octokit/client/notifications.rb +171 -0
  33. data/lib/octokit/client/objects.rb +141 -0
  34. data/lib/octokit/client/organizations.rb +768 -0
  35. data/lib/octokit/client/pages.rb +63 -0
  36. data/lib/octokit/client/projects.rb +314 -0
  37. data/lib/octokit/client/pub_sub_hubbub.rb +111 -0
  38. data/lib/octokit/client/pull_requests.rb +301 -0
  39. data/lib/octokit/client/rate_limit.rb +54 -0
  40. data/lib/octokit/client/reactions.rb +158 -0
  41. data/lib/octokit/client/refs.rb +118 -0
  42. data/lib/octokit/client/releases.rb +163 -0
  43. data/lib/octokit/client/repositories.rb +654 -0
  44. data/lib/octokit/client/repository_invitations.rb +103 -0
  45. data/lib/octokit/client/reviews.rb +174 -0
  46. data/lib/octokit/client/say.rb +19 -0
  47. data/lib/octokit/client/search.rb +76 -0
  48. data/lib/octokit/client/service_status.rb +38 -0
  49. data/lib/octokit/client/source_import.rb +161 -0
  50. data/lib/octokit/client/stats.rb +105 -0
  51. data/lib/octokit/client/statuses.rb +47 -0
  52. data/lib/octokit/client/traffic.rb +69 -0
  53. data/lib/octokit/client/users.rb +354 -0
  54. data/lib/octokit/configurable.rb +147 -0
  55. data/lib/octokit/connection.rb +199 -0
  56. data/lib/octokit/default.rb +166 -0
  57. data/lib/octokit/enterprise_admin_client.rb +40 -0
  58. data/lib/octokit/enterprise_admin_client/admin_stats.rb +120 -0
  59. data/lib/octokit/enterprise_admin_client/license.rb +18 -0
  60. data/lib/octokit/enterprise_admin_client/orgs.rb +27 -0
  61. data/lib/octokit/enterprise_admin_client/search_indexing.rb +83 -0
  62. data/lib/octokit/enterprise_admin_client/users.rb +128 -0
  63. data/lib/octokit/enterprise_management_console_client.rb +50 -0
  64. data/lib/octokit/enterprise_management_console_client/management_console.rb +176 -0
  65. data/lib/octokit/error.rb +286 -0
  66. data/lib/octokit/gist.rb +36 -0
  67. data/lib/octokit/middleware/follow_redirects.rb +131 -0
  68. data/lib/octokit/organization.rb +17 -0
  69. data/lib/octokit/preview.rb +38 -0
  70. data/lib/octokit/rate_limit.rb +33 -0
  71. data/lib/octokit/repo_arguments.rb +19 -0
  72. data/lib/octokit/repository.rb +93 -0
  73. data/lib/octokit/response/feed_parser.rb +21 -0
  74. data/lib/octokit/response/raise_error.rb +21 -0
  75. data/lib/octokit/user.rb +19 -0
  76. data/lib/octokit/version.rb +17 -0
  77. data/lib/octokit/warnable.rb +17 -0
  78. data/octokit.gemspec +22 -0
  79. metadata +160 -0
@@ -0,0 +1,22 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :test => :spec
8
+ task :default => :spec
9
+
10
+ namespace :doc do
11
+ begin
12
+ require 'yard'
13
+ YARD::Rake::YardocTask.new do |task|
14
+ task.files = ['README.md', 'LICENSE.md', 'lib/**/*.rb']
15
+ task.options = [
16
+ '--output-dir', 'doc/yard',
17
+ '--markup', 'markdown',
18
+ ]
19
+ end
20
+ rescue LoadError
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ require 'sawyer'
2
+
3
+ patch = Module.new do
4
+ def href(options=nil)
5
+ # Temporary workaround for: https://github.com/octokit/octokit.rb/issues/727
6
+ name.to_s == "ssh" ? @href : super
7
+ end
8
+ end
9
+
10
+ Sawyer::Relation.send(:prepend, patch)
@@ -0,0 +1,59 @@
1
+ require 'octokit/client'
2
+ require 'octokit/enterprise_admin_client'
3
+ require 'octokit/enterprise_management_console_client'
4
+ require 'octokit/default'
5
+
6
+ # Ruby toolkit for the GitHub API
7
+ module Octokit
8
+
9
+ class << self
10
+ include Octokit::Configurable
11
+
12
+ # API client based on configured options {Configurable}
13
+ #
14
+ # @return [Octokit::Client] API wrapper
15
+ def client
16
+ return @client if defined?(@client) && @client.same_options?(options)
17
+ @client = Octokit::Client.new(options)
18
+ end
19
+
20
+ # EnterpriseAdminClient client based on configured options {Configurable}
21
+ #
22
+ # @return [Octokit::EnterpriseAdminClient] API wrapper
23
+ def enterprise_admin_client
24
+ return @enterprise_admin_client if defined?(@enterprise_admin_client) && @enterprise_admin_client.same_options?(options)
25
+ @enterprise_admin_client = Octokit::EnterpriseAdminClient.new(options)
26
+ end
27
+
28
+ # EnterpriseManagementConsoleClient client based on configured options {Configurable}
29
+ #
30
+ # @return [Octokit::EnterpriseManagementConsoleClient] API wrapper
31
+ def enterprise_management_console_client
32
+ return @enterprise_management_console_client if defined?(@enterprise_management_console_client) && @enterprise_management_console_client.same_options?(options)
33
+ @enterprise_management_console_client = Octokit::EnterpriseManagementConsoleClient.new(options)
34
+ end
35
+
36
+ private
37
+
38
+ def respond_to_missing?(method_name, include_private=false)
39
+ client.respond_to?(method_name, include_private) ||
40
+ enterprise_admin_client.respond_to?(method_name, include_private) ||
41
+ enterprise_management_console_client.respond_to?(method_name, include_private)
42
+ end
43
+
44
+ def method_missing(method_name, *args, &block)
45
+ if client.respond_to?(method_name)
46
+ return client.send(method_name, *args, &block)
47
+ elsif enterprise_admin_client.respond_to?(method_name)
48
+ return enterprise_admin_client.send(method_name, *args, &block)
49
+ elsif enterprise_management_console_client.respond_to?(method_name)
50
+ return enterprise_management_console_client.send(method_name, *args, &block)
51
+ end
52
+
53
+ super
54
+ end
55
+
56
+ end
57
+ end
58
+
59
+ Octokit.setup
@@ -0,0 +1,14 @@
1
+ module Octokit
2
+
3
+ # Extracts options from method arguments
4
+ # @private
5
+ class Arguments < Array
6
+ attr_reader :options
7
+
8
+ def initialize(args)
9
+ @options = args.last.is_a?(::Hash) ? args.pop : {}
10
+ super(args)
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,82 @@
1
+ module Octokit
2
+
3
+ # Authentication methods for {Octokit::Client}
4
+ module Authentication
5
+
6
+ # Indicates if the client was supplied Basic Auth
7
+ # username and password
8
+ #
9
+ # @see https://developer.github.com/v3/#authentication
10
+ # @return [Boolean]
11
+ def basic_authenticated?
12
+ !!(@login && @password)
13
+ end
14
+
15
+ # Indicates if the client was supplied an OAuth
16
+ # access token
17
+ #
18
+ # @see https://developer.github.com/v3/#authentication
19
+ # @return [Boolean]
20
+ def token_authenticated?
21
+ !!@access_token
22
+ end
23
+
24
+ # Indicates if the client was supplied a bearer token
25
+ #
26
+ # @see https://developer.github.com/early-access/integrations/authentication/#as-an-integration
27
+ # @return [Boolean]
28
+ def bearer_authenticated?
29
+ !!@bearer_token
30
+ end
31
+
32
+ # Indicates if the client was supplied an OAuth
33
+ # access token or Basic Auth username and password
34
+ #
35
+ # @see https://developer.github.com/v3/#authentication
36
+ # @return [Boolean]
37
+ def user_authenticated?
38
+ basic_authenticated? || token_authenticated?
39
+ end
40
+
41
+ # Indicates if the client has OAuth Application
42
+ # client_id and secret credentials to make anonymous
43
+ # requests at a higher rate limit
44
+ #
45
+ # @see https://developer.github.com/v3/#unauthenticated-rate-limited-requests
46
+ # @return Boolean
47
+ def application_authenticated?
48
+ !!application_authentication
49
+ end
50
+
51
+ private
52
+
53
+ def application_authentication
54
+ if @client_id && @client_secret
55
+ {
56
+ :client_id => @client_id,
57
+ :client_secret => @client_secret
58
+ }
59
+ end
60
+ end
61
+
62
+ def login_from_netrc
63
+ return unless netrc?
64
+
65
+ require 'netrc'
66
+ info = Netrc.read netrc_file
67
+ netrc_host = URI.parse(api_endpoint).host
68
+ creds = info[netrc_host]
69
+ if creds.nil?
70
+ # creds will be nil if there is no netrc for this end point
71
+ octokit_warn "Error loading credentials from netrc file for #{api_endpoint}"
72
+ else
73
+ creds = creds.to_a
74
+ self.login = creds.shift
75
+ self.password = creds.shift
76
+ end
77
+ rescue LoadError
78
+ octokit_warn "Please install netrc gem for .netrc support"
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,238 @@
1
+ require 'octokit/connection'
2
+ require 'octokit/warnable'
3
+ require 'octokit/arguments'
4
+ require 'octokit/repo_arguments'
5
+ require 'octokit/configurable'
6
+ require 'octokit/authentication'
7
+ require 'octokit/gist'
8
+ require 'octokit/rate_limit'
9
+ require 'octokit/repository'
10
+ require 'octokit/user'
11
+ require 'octokit/organization'
12
+ require 'octokit/preview'
13
+ require 'octokit/client/authorizations'
14
+ require 'octokit/client/commits'
15
+ require 'octokit/client/commit_comments'
16
+ require 'octokit/client/contents'
17
+ require 'octokit/client/downloads'
18
+ require 'octokit/client/deployments'
19
+ require 'octokit/client/emojis'
20
+ require 'octokit/client/events'
21
+ require 'octokit/client/feeds'
22
+ require 'octokit/client/gists'
23
+ require 'octokit/client/gitignore'
24
+ require 'octokit/client/hooks'
25
+ require 'octokit/client/integrations'
26
+ require 'octokit/client/issues'
27
+ require 'octokit/client/labels'
28
+ require 'octokit/client/legacy_search'
29
+ require 'octokit/client/licenses'
30
+ require 'octokit/client/meta'
31
+ require 'octokit/client/markdown'
32
+ require 'octokit/client/milestones'
33
+ require 'octokit/client/notifications'
34
+ require 'octokit/client/objects'
35
+ require 'octokit/client/organizations'
36
+ require 'octokit/client/pages'
37
+ require 'octokit/client/projects'
38
+ require 'octokit/client/pub_sub_hubbub'
39
+ require 'octokit/client/pull_requests'
40
+ require 'octokit/client/rate_limit'
41
+ require 'octokit/client/reactions'
42
+ require 'octokit/client/refs'
43
+ require 'octokit/client/releases'
44
+ require 'octokit/client/repositories'
45
+ require 'octokit/client/repository_invitations'
46
+ require 'octokit/client/reviews'
47
+ require 'octokit/client/say'
48
+ require 'octokit/client/search'
49
+ require 'octokit/client/service_status'
50
+ require 'octokit/client/source_import'
51
+ require 'octokit/client/stats'
52
+ require 'octokit/client/statuses'
53
+ require 'octokit/client/traffic'
54
+ require 'octokit/client/users'
55
+ require 'ext/sawyer/relation'
56
+
57
+ module Octokit
58
+
59
+ # Client for the GitHub API
60
+ #
61
+ # @see https://developer.github.com
62
+ class Client
63
+
64
+ include Octokit::Authentication
65
+ include Octokit::Configurable
66
+ include Octokit::Connection
67
+ include Octokit::Preview
68
+ include Octokit::Warnable
69
+ include Octokit::Client::Authorizations
70
+ include Octokit::Client::Commits
71
+ include Octokit::Client::CommitComments
72
+ include Octokit::Client::Contents
73
+ include Octokit::Client::Deployments
74
+ include Octokit::Client::Downloads
75
+ include Octokit::Client::Emojis
76
+ include Octokit::Client::Events
77
+ include Octokit::Client::Feeds
78
+ include Octokit::Client::Gists
79
+ include Octokit::Client::Gitignore
80
+ include Octokit::Client::Hooks
81
+ include Octokit::Client::Integrations
82
+ include Octokit::Client::Issues
83
+ include Octokit::Client::Labels
84
+ include Octokit::Client::LegacySearch
85
+ include Octokit::Client::Licenses
86
+ include Octokit::Client::Meta
87
+ include Octokit::Client::Markdown
88
+ include Octokit::Client::Milestones
89
+ include Octokit::Client::Notifications
90
+ include Octokit::Client::Objects
91
+ include Octokit::Client::Organizations
92
+ include Octokit::Client::Pages
93
+ include Octokit::Client::Projects
94
+ include Octokit::Client::PubSubHubbub
95
+ include Octokit::Client::PullRequests
96
+ include Octokit::Client::RateLimit
97
+ include Octokit::Client::Reactions
98
+ include Octokit::Client::Refs
99
+ include Octokit::Client::Releases
100
+ include Octokit::Client::Repositories
101
+ include Octokit::Client::RepositoryInvitations
102
+ include Octokit::Client::Reviews
103
+ include Octokit::Client::Say
104
+ include Octokit::Client::Search
105
+ include Octokit::Client::ServiceStatus
106
+ include Octokit::Client::SourceImport
107
+ include Octokit::Client::Stats
108
+ include Octokit::Client::Statuses
109
+ include Octokit::Client::Traffic
110
+ include Octokit::Client::Users
111
+
112
+ # Header keys that can be passed in options hash to {#get},{#head}
113
+ CONVENIENCE_HEADERS = Set.new([:accept, :content_type])
114
+
115
+ def initialize(options = {})
116
+ # Use options passed in, but fall back to module defaults
117
+ Octokit::Configurable.keys.each do |key|
118
+ instance_variable_set(:"@#{key}", options[key] || Octokit.instance_variable_get(:"@#{key}"))
119
+ end
120
+
121
+ login_from_netrc unless user_authenticated? || application_authenticated?
122
+ end
123
+
124
+ # Text representation of the client, masking tokens and passwords
125
+ #
126
+ # @return [String]
127
+ def inspect
128
+ inspected = super
129
+
130
+ # mask password
131
+ inspected = inspected.gsub! @password, "*******" if @password
132
+ inspected = inspected.gsub! @management_console_password, "*******" if @management_console_password
133
+ inspected = inspected.gsub! @bearer_token, '********' if @bearer_token
134
+ # Only show last 4 of token, secret
135
+ if @access_token
136
+ inspected = inspected.gsub! @access_token, "#{'*'*36}#{@access_token[36..-1]}"
137
+ end
138
+ if @client_secret
139
+ inspected = inspected.gsub! @client_secret, "#{'*'*36}#{@client_secret[36..-1]}"
140
+ end
141
+
142
+ inspected
143
+ end
144
+
145
+ # Duplicate client using client_id and client_secret as
146
+ # Basic Authentication credentials.
147
+ # @example
148
+ # Octokit.client_id = "foo"
149
+ # Octokit.client_secret = "bar"
150
+ #
151
+ # # GET https://api.github.com/?client_id=foo&client_secret=bar
152
+ # Octokit.get "/"
153
+ #
154
+ # Octokit.client.as_app do |client|
155
+ # # GET https://foo:bar@api.github.com/
156
+ # client.get "/"
157
+ # end
158
+ def as_app(key = client_id, secret = client_secret, &block)
159
+ if key.to_s.empty? || secret.to_s.empty?
160
+ raise ApplicationCredentialsRequired, "client_id and client_secret required"
161
+ end
162
+ app_client = self.dup
163
+ app_client.client_id = app_client.client_secret = nil
164
+ app_client.login = key
165
+ app_client.password = secret
166
+
167
+ yield app_client if block_given?
168
+ end
169
+
170
+ # Set username for authentication
171
+ #
172
+ # @param value [String] GitHub username
173
+ def login=(value)
174
+ reset_agent
175
+ @login = value
176
+ end
177
+
178
+ # Set password for authentication
179
+ #
180
+ # @param value [String] GitHub password
181
+ def password=(value)
182
+ reset_agent
183
+ @password = value
184
+ end
185
+
186
+ # Set OAuth access token for authentication
187
+ #
188
+ # @param value [String] 40 character GitHub OAuth access token
189
+ def access_token=(value)
190
+ reset_agent
191
+ @access_token = value
192
+ end
193
+
194
+ # Set Bearer Token for authentication
195
+ #
196
+ # @param value [String] JWT
197
+ def bearer_token=(value)
198
+ reset_agent
199
+ @bearer_token = value
200
+ end
201
+
202
+ # Set OAuth app client_id
203
+ #
204
+ # @param value [String] 20 character GitHub OAuth app client_id
205
+ def client_id=(value)
206
+ reset_agent
207
+ @client_id = value
208
+ end
209
+
210
+ # Set OAuth app client_secret
211
+ #
212
+ # @param value [String] 40 character GitHub OAuth app client_secret
213
+ def client_secret=(value)
214
+ reset_agent
215
+ @client_secret = value
216
+ end
217
+
218
+ def client_without_redirects(options = {})
219
+ conn_opts = @connection_options
220
+ conn_opts[:url] = @api_endpoint
221
+ conn_opts[:builder] = @middleware.dup if @middleware
222
+ conn_opts[:proxy] = @proxy if @proxy
223
+ conn = Faraday.new(conn_opts) do |http|
224
+ if basic_authenticated?
225
+ http.basic_auth(@login, @password)
226
+ elsif token_authenticated?
227
+ http.authorization 'token', @access_token
228
+ elsif bearer_authenticated?
229
+ http.authorization 'Bearer', @bearer_token
230
+ end
231
+ http.headers['accept'] = options[:accept] if options.key?(:accept)
232
+ end
233
+ conn.builder.delete(Octokit::Middleware::FollowRedirects)
234
+
235
+ conn
236
+ end
237
+ end
238
+ end
@@ -0,0 +1,244 @@
1
+ module Octokit
2
+ class Client
3
+
4
+ # Methods for the Authorizations API
5
+ #
6
+ # @see https://developer.github.com/v3/oauth_authorizations/#oauth-authorizations-api
7
+ module Authorizations
8
+
9
+ # List the authenticated user's authorizations
10
+ #
11
+ # API for users to manage their own tokens.
12
+ # You can only access your own tokens, and only through
13
+ # Basic Authentication.
14
+ #
15
+ # @return [Array<Sawyer::Resource>] A list of authorizations for the authenticated user
16
+ # @see https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations
17
+ # @example List authorizations for user ctshryock
18
+ # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret')
19
+ # client.authorizations
20
+ def authorizations(options = {})
21
+ paginate 'authorizations', options
22
+ end
23
+
24
+ # Get a single authorization for the authenticated user.
25
+ #
26
+ # You can only access your own tokens, and only through
27
+ # Basic Authentication.
28
+ #
29
+ # @return [Sawyer::Resource] A single authorization for the authenticated user
30
+ # @see https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization
31
+ # @example Show authorization for user ctshryock's Travis auth
32
+ # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret')
33
+ # client.authorization(999999)
34
+ def authorization(number, options = {})
35
+ get "authorizations/#{number}", options
36
+ end
37
+
38
+ # Create an authorization for the authenticated user.
39
+ #
40
+ # You can create your own tokens, and only through
41
+ # Basic Authentication.
42
+ #
43
+ # @param options [Hash] A customizable set of options.
44
+ # @option options [Array] :scopes A list of scopes that this authorization is in.
45
+ # @option options [String] :note A note to remind you what the OAuth token is for.
46
+ # @option options [String] :note_url A URL to remind you what app the OAuth token is for.
47
+ # @option options [Boolean] :idempotent If true, will return an existing authorization if one has already been created.
48
+ # @option options [String] :client_id Client Id we received when our application was registered with GitHub.
49
+ # @option options [String] :client_secret Client Secret we received when our application was registered with GitHub.
50
+ #
51
+ # @return [Sawyer::Resource] A single authorization for the authenticated user
52
+ # @see https://developer.github.com/v3/oauth/#scopes Available scopes
53
+ # @see https://developer.github.com/v3/oauth_authorizations/#create-a-new-authorization
54
+ # @see https://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app
55
+ # @example Create a new authorization for user ctshryock's project Zoidberg
56
+ # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret')
57
+ # client.create_authorization({:scopes => ["public_repo", "gist"], :note => "Why not Zoidberg?", :note_url=> "https://en.wikipedia.org/wiki/Zoidberg"})
58
+ # @example Create a new OR return an existing authorization to be used by a specific client for user ctshryock's project Zoidberg
59
+ # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret')
60
+ # client.create_authorization({:idempotent => true, :client_id => 'xxxx', :client_secret => 'yyyy', :scopes => ["user"]})
61
+ def create_authorization(options = {})
62
+ # Techincally we can omit scopes as GitHub has a default, however the
63
+ # API will reject us if we send a POST request with an empty body.
64
+
65
+ if options.delete :idempotent
66
+ client_id, client_secret = fetch_client_id_and_secret(options)
67
+ raise ArgumentError.new("Client ID and Secret required for idempotent authorizations") unless client_id && client_secret
68
+
69
+ if fingerprint = options.delete(:fingerprint)
70
+ put "authorizations/clients/#{client_id}/#{fingerprint}", options.merge(:client_secret => client_secret)
71
+ else
72
+ put "authorizations/clients/#{client_id}", options.merge(:client_secret => client_secret)
73
+ end
74
+
75
+ else
76
+ post 'authorizations', options
77
+ end
78
+ end
79
+
80
+ # Update an authorization for the authenticated user.
81
+ #
82
+ # You can update your own tokens, but only through
83
+ # Basic Authentication.
84
+ #
85
+ # @param options [Hash] A customizable set of options.
86
+ # @option options [Array] :scopes Replace the authorization scopes with these.
87
+ # @option options [Array] :add_scopes A list of scopes to add to this authorization.
88
+ # @option options [Array] :remove_scopes A list of scopes to remove from this authorization.
89
+ # @option options [String] :note A note to remind you what the OAuth token is for.
90
+ # @option options [String] :note_url A URL to remind you what app the OAuth token is for.
91
+ #
92
+ # @return [Sawyer::Resource] A single (updated) authorization for the authenticated user
93
+ # @see https://developer.github.com/v3/oauth_authorizations/#update-an-existing-authorization
94
+ # @see https://developer.github.com/v3/oauth/#scopes for available scopes
95
+ # @example Update the authorization for user ctshryock's project Zoidberg
96
+ # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret')
97
+ # client.update_authorization(999999, {:add_scopes => ["gist", "repo"], :note => "Why not Zoidberg possibly?"})
98
+ def update_authorization(number, options = {})
99
+ patch "authorizations/#{number}", options
100
+ end
101
+
102
+ # Delete an authorization for the authenticated user.
103
+ #
104
+ # You can delete your own tokens, and only through
105
+ # Basic Authentication.
106
+ #
107
+ # @param number [Number] An existing Authorization ID
108
+ #
109
+ # @return [Boolean] Success
110
+ # @see https://developer.github.com/v3/oauth_authorizations/#delete-an-authorization
111
+ # @example Delete an authorization
112
+ # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret')
113
+ # client.delete_authorization(999999)
114
+ def delete_authorization(number, options = {})
115
+ boolean_from_response :delete, "authorizations/#{number}", options
116
+ end
117
+
118
+ # Check scopes for a token
119
+ #
120
+ # @param token [String] GitHub OAuth token
121
+ # @param options [Hash] Header params for request
122
+ # @return [Array<String>] OAuth scopes
123
+ # @see https://developer.github.com/v3/oauth/#scopes
124
+ def scopes(token = @access_token, options = {})
125
+ raise ArgumentError.new("Access token required") if token.nil?
126
+
127
+ auth = { "Authorization" => "token #{token}" }
128
+ headers = (options.delete(:headers) || {}).merge(auth)
129
+
130
+ agent.call(:get, "user", :headers => headers).
131
+ headers['X-OAuth-Scopes'].
132
+ to_s.
133
+ split(',').
134
+ map(&:strip).
135
+ sort
136
+ end
137
+
138
+ # Check if a token is valid.
139
+ #
140
+ # Applications can check if a token is valid without rate limits.
141
+ #
142
+ # @param token [String] 40 character GitHub OAuth access token
143
+ #
144
+ # @return [Sawyer::Resource] A single authorization for the authenticated user
145
+ # @see https://developer.github.com/v3/oauth_authorizations/#check-an-authorization
146
+ # @example
147
+ # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret')
148
+ # client.check_application_authorization('deadbeef1234567890deadbeef987654321')
149
+ def check_application_authorization(token, options = {})
150
+ opts = options.dup
151
+ key = opts.delete(:client_id) || client_id
152
+ secret = opts.delete(:client_secret) || client_secret
153
+
154
+ as_app(key, secret) do |app_client|
155
+ app_client.get "applications/#{client_id}/tokens/#{token}", opts
156
+ end
157
+ end
158
+
159
+ # Reset a token
160
+ #
161
+ # Applications can reset a token without requiring a user to re-authorize.
162
+ #
163
+ # @param token [String] 40 character GitHub OAuth access token
164
+ #
165
+ # @return [Sawyer::Resource] A single authorization for the authenticated user
166
+ # @see https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization
167
+ # @example
168
+ # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret')
169
+ # client.reset_application_authorization('deadbeef1234567890deadbeef987654321')
170
+ def reset_application_authorization(token, options = {})
171
+ opts = options.dup
172
+ key = opts.delete(:client_id) || client_id
173
+ secret = opts.delete(:client_secret) || client_secret
174
+
175
+ as_app(key, secret) do |app_client|
176
+ app_client.post "applications/#{client_id}/tokens/#{token}", opts
177
+ end
178
+ end
179
+
180
+ # Revoke a token
181
+ #
182
+ # Applications can revoke (delete) a token
183
+ #
184
+ # @param token [String] 40 character GitHub OAuth access token
185
+ #
186
+ # @return [Boolean] Result
187
+ # @see https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application
188
+ # @example
189
+ # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret')
190
+ # client.revoke_application_authorization('deadbeef1234567890deadbeef987654321')
191
+ def revoke_application_authorization(token, options = {})
192
+ opts = options.dup
193
+ key = opts.delete(:client_id) || client_id
194
+ secret = opts.delete(:client_secret) || client_secret
195
+
196
+ as_app(key, secret) do |app_client|
197
+ app_client.delete "applications/#{client_id}/tokens/#{token}", opts
198
+
199
+ app_client.last_response.status == 204
200
+ end
201
+ rescue Octokit::NotFound
202
+ false
203
+ end
204
+ alias :delete_application_authorization :revoke_application_authorization
205
+
206
+ # Revoke all tokens for an app
207
+ #
208
+ # Applications can revoke all of their tokens in a single request
209
+ #
210
+ # @deprecated As of January 25th, 2016: https://developer.github.com/changes/2014-04-08-reset-api-tokens/
211
+ # @return [Boolean] false
212
+ def revoke_all_application_authorizations(options = {})
213
+ octokit_warn("Deprecated: If you need to revoke all tokens for your application, you can do so via the settings page for your application.")
214
+ false
215
+ end
216
+
217
+ # Get the URL to authorize a user for an application via the web flow
218
+ #
219
+ # @param app_id [String] Client Id we received when our application was registered with GitHub.
220
+ # @option options [String] :redirect_uri The url to redirect to after authorizing.
221
+ # @option options [String] :scope The scopes to request from the user.
222
+ # @option options [String] :state A random string to protect against CSRF.
223
+ # @return [String] The url to redirect the user to authorize.
224
+ # @see Octokit::Client
225
+ # @see https://developer.github.com/v3/oauth/#web-application-flow
226
+ # @example
227
+ # @client.authorize_url('xxxx')
228
+ def authorize_url(app_id = client_id, options = {})
229
+ if app_id.to_s.empty?
230
+ raise Octokit::ApplicationCredentialsRequired.new "client_id required"
231
+ end
232
+ authorize_url = options.delete(:endpoint) || Octokit.web_endpoint
233
+ authorize_url << "login/oauth/authorize?client_id=#{app_id}"
234
+
235
+ require 'cgi'
236
+ options.each do |key, value|
237
+ authorize_url << "&#{key}=#{CGI.escape value}"
238
+ end
239
+
240
+ authorize_url
241
+ end
242
+ end
243
+ end
244
+ end