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 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
|
# frozen_string_literal: true
require 'octokit/connection'
require 'octokit/warnable'
require 'octokit/arguments'
require 'octokit/repo_arguments'
require 'octokit/configurable'
require 'octokit/authentication'
require 'octokit/gist'
require 'octokit/rate_limit'
require 'octokit/repository'
require 'octokit/user'
require 'octokit/organization'
require 'octokit/client/actions_artifacts'
require 'octokit/client/actions_secrets'
require 'octokit/client/actions_workflows'
require 'octokit/client/actions_workflow_jobs'
require 'octokit/client/actions_workflow_runs'
require 'octokit/client/apps'
require 'octokit/client/checks'
require 'octokit/client/code_scanning'
require 'octokit/client/codespaces_secrets'
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/dependabot_secrets'
require 'octokit/client/deployments'
require 'octokit/client/environments'
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/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/tokens'
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::Warnable
include Octokit::Client::ActionsArtifacts
include Octokit::Client::ActionsSecrets
include Octokit::Client::Checks
include Octokit::Client::CodeScanning
include Octokit::Client::CodespacesSecrets
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::DependabotSecrets
include Octokit::Client::Deployments
include Octokit::Client::Downloads
include Octokit::Client::Environments
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::ActionsWorkflowJobs
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::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::Tokens
include Octokit::Client::Traffic
include Octokit::Client::Users
# Header keys that can be passed in options hash to {#get},{#head}
CONVENIENCE_HEADERS = Set.new(%i[accept content_type])
def initialize(options = {})
# Use options passed in, but fall back to module defaults
#
# rubocop:disable Style/HashEachMethods
#
# This may look like a `.keys.each` which should be replaced with `#each_key`, but
# this doesn't actually work, since `#keys` is just a method we've defined ourselves.
# The class doesn't fulfill the whole `Enumerable` contract.
Octokit::Configurable.keys.each do |key|
# rubocop:enable Style/HashEachMethods
value = options[key].nil? ? Octokit.instance_variable_get(:"@#{key}") : options[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
if @management_console_password
inspected.gsub! @management_console_password, '*******'
end
inspected.gsub! @bearer_token, '********' if @bearer_token
# Only show last 4 of token, secret
if @access_token
inspected.gsub! @access_token, "#{'*' * 36}#{@access_token[36..]}"
end
if @client_secret
inspected.gsub! @client_secret, "#{'*' * 36}#{@client_secret[36..]}"
end
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)
if key.to_s.empty? || secret.to_s.empty?
raise ApplicationCredentialsRequired, 'client_id and client_secret required'
end
app_client = 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|
http_cache_middleware = http.builder.handlers.delete(Faraday::HttpCache) if Faraday.const_defined?(:HttpCache)
if basic_authenticated?
http.request(*FARADAY_BASIC_AUTH_KEYS, @login, @password)
elsif token_authenticated?
http.request :authorization, 'token', @access_token
elsif bearer_authenticated?
http.request :authorization, 'Bearer', @bearer_token
end
http.builder.handlers.push(http_cache_middleware) unless http_cache_middleware.nil?
http.headers['accept'] = options[:accept] if options.key?(:accept)
end
conn.builder.delete(Octokit::Middleware::FollowRedirects)
conn
end
end
end
|