/
client.rb
253 lines (234 loc) · 8.09 KB
/
client.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
require 'octokit/connection'
require 'octokit/warnable'
require 'octokit/arguments'
require 'octokit/repo_arguments'
require 'octokit/authentication'
require 'octokit/gist'
require 'octokit/rate_limit'
require 'octokit/repository'
require 'octokit/user'
require 'octokit/organization'
require 'octokit/preview'
require 'octokit/client/actions_secrets'
require 'octokit/client/actions_workflows'
require 'octokit/client/actions_workflow_runs'
require 'octokit/client/apps'
require 'octokit/client/authorizations'
require 'octokit/client/checks'
require 'octokit/client/commits'
require 'octokit/client/commit_comments'
require 'octokit/client/commit_pulls'
require 'octokit/client/commit_branches'
require 'octokit/client/community_profile'
require 'octokit/client/contents'
require 'octokit/client/downloads'
require 'octokit/client/deployments'
require 'octokit/client/emojis'
require 'octokit/client/events'
require 'octokit/client/feeds'
require 'octokit/client/gists'
require 'octokit/client/gitignore'
require 'octokit/client/hooks'
require 'octokit/client/issues'
require 'octokit/client/labels'
require 'octokit/client/legacy_search'
require 'octokit/client/licenses'
require 'octokit/client/meta'
require 'octokit/client/markdown'
require 'octokit/client/marketplace'
require 'octokit/client/milestones'
require 'octokit/client/notifications'
require 'octokit/client/oauth_applications'
require 'octokit/client/objects'
require 'octokit/client/organizations'
require 'octokit/client/pages'
require 'octokit/client/projects'
require 'octokit/client/pub_sub_hubbub'
require 'octokit/client/pull_requests'
require 'octokit/client/rate_limit'
require 'octokit/client/reactions'
require 'octokit/client/refs'
require 'octokit/client/releases'
require 'octokit/client/repositories'
require 'octokit/client/repository_invitations'
require 'octokit/client/reviews'
require 'octokit/client/say'
require 'octokit/client/search'
require 'octokit/client/service_status'
require 'octokit/client/source_import'
require 'octokit/client/stats'
require 'octokit/client/statuses'
require 'octokit/client/traffic'
require 'octokit/client/users'
require 'ext/sawyer/relation'
module Octokit
# Client for the GitHub API
#
# @see https://developer.github.com
class Client
include Octokit::Authentication
include Octokit::Configurable
include Octokit::Connection
include Octokit::Preview
include Octokit::Warnable
include Octokit::Client::ActionsSecrets
include Octokit::Client::Authorizations
include Octokit::Client::Checks
include Octokit::Client::Commits
include Octokit::Client::CommitComments
include Octokit::Client::CommitPulls
include Octokit::Client::CommitBranches
include Octokit::Client::CommunityProfile
include Octokit::Client::Contents
include Octokit::Client::Deployments
include Octokit::Client::Downloads
include Octokit::Client::Emojis
include Octokit::Client::Events
include Octokit::Client::Feeds
include Octokit::Client::Gists
include Octokit::Client::Gitignore
include Octokit::Client::Hooks
include Octokit::Client::ActionsWorkflows
include Octokit::Client::ActionsWorkflowRuns
include Octokit::Client::Apps
include Octokit::Client::Issues
include Octokit::Client::Labels
include Octokit::Client::LegacySearch
include Octokit::Client::Licenses
include Octokit::Client::Meta
include Octokit::Client::Markdown
include Octokit::Client::Marketplace
include Octokit::Client::Milestones
include Octokit::Client::Notifications
include Octokit::Client::OauthApplications
include Octokit::Client::Objects
include Octokit::Client::Organizations
include Octokit::Client::Pages
include Octokit::Client::Projects
include Octokit::Client::PubSubHubbub
include Octokit::Client::PullRequests
include Octokit::Client::RateLimit
include Octokit::Client::Reactions
include Octokit::Client::Refs
include Octokit::Client::Releases
include Octokit::Client::Repositories
include Octokit::Client::RepositoryInvitations
include Octokit::Client::Reviews
include Octokit::Client::Say
include Octokit::Client::Search
include Octokit::Client::ServiceStatus
include Octokit::Client::SourceImport
include Octokit::Client::Stats
include Octokit::Client::Statuses
include Octokit::Client::Traffic
include Octokit::Client::Users
# Header keys that can be passed in options hash to {#get},{#head}
CONVENIENCE_HEADERS = Set.new([:accept, :content_type])
def initialize(options = {})
# Use options passed in, but fall back to module defaults
Octokit::Configurable.keys.each do |key|
value = options.key?(key) ? options[key] : Octokit.instance_variable_get(:"@#{key}")
instance_variable_set(:"@#{key}", value)
end
login_from_netrc unless user_authenticated? || application_authenticated?
end
# Text representation of the client, masking tokens and passwords
#
# @return [String]
def inspect
inspected = super
# mask password
inspected.gsub! @password, '*******' if @password
inspected.gsub! @management_console_password, '*******' if @management_console_password
inspected.gsub! @bearer_token, '********' if @bearer_token
# Only show last 4 of token, secret
inspected.gsub! @access_token, "#{'*'*36}#{@access_token[36..-1]}" if @access_token
inspected.gsub! @client_secret, "#{'*'*36}#{@client_secret[36..-1]}" if @client_secret
inspected
end
# Duplicate client using client_id and client_secret as
# Basic Authentication credentials.
# @example
# Octokit.client_id = "foo"
# Octokit.client_secret = "bar"
#
# # GET https://api.github.com/?client_id=foo&client_secret=bar
# Octokit.get "/"
#
# Octokit.client.as_app do |client|
# # GET https://foo:bar@api.github.com/
# client.get "/"
# end
def as_app(key = client_id, secret = client_secret, &block)
if key.to_s.empty? || secret.to_s.empty?
raise ApplicationCredentialsRequired, "client_id and client_secret required"
end
app_client = self.dup
app_client.client_id = app_client.client_secret = nil
app_client.login = key
app_client.password = secret
yield app_client if block_given?
end
# Set username for authentication
#
# @param value [String] GitHub username
def login=(value)
reset_agent
@login = value
end
# Set password for authentication
#
# @param value [String] GitHub password
def password=(value)
reset_agent
@password = value
end
# Set OAuth access token for authentication
#
# @param value [String] 40 character GitHub OAuth access token
def access_token=(value)
reset_agent
@access_token = value
end
# Set Bearer Token for authentication
#
# @param value [String] JWT
def bearer_token=(value)
reset_agent
@bearer_token = value
end
# Set OAuth app client_id
#
# @param value [String] 20 character GitHub OAuth app client_id
def client_id=(value)
reset_agent
@client_id = value
end
# Set OAuth app client_secret
#
# @param value [String] 40 character GitHub OAuth app client_secret
def client_secret=(value)
reset_agent
@client_secret = value
end
def client_without_redirects(options = {})
conn_opts = @connection_options
conn_opts[:url] = @api_endpoint
conn_opts[:builder] = @middleware.dup if @middleware
conn_opts[:proxy] = @proxy if @proxy
conn_opts[:ssl] = { :verify_mode => @ssl_verify_mode } if @ssl_verify_mode
conn = Faraday.new(conn_opts) do |http|
if basic_authenticated?
http.basic_auth(@login, @password)
elsif token_authenticated?
http.authorization 'token', @access_token
elsif bearer_authenticated?
http.authorization 'Bearer', @bearer_token
end
http.headers['accept'] = options[:accept] if options.key?(:accept)
end
conn.builder.delete(Octokit::Middleware::FollowRedirects)
conn
end
end
end