Exception: Octokit::Error

Inherits:
StandardError
  • Object
show all
Defined in:
lib/octokit/error.rb

Overview

Custom error class for rescuing from all GitHub errors

Direct Known Subclasses

ClientError, ServerError

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(response = nil) ⇒ Error

Returns a new instance of Error.



49
50
51
52
53
# File 'lib/octokit/error.rb', line 49

def initialize(response = nil)
  @response = response
  super(build_error_message)
  build_error_context
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



6
7
8
# File 'lib/octokit/error.rb', line 6

def context
  @context
end

Class Method Details

.error_for_401(headers) ⇒ Object

Returns most appropriate error for 401 HTTP status code rubocop:disable Naming/VariableNumber



65
66
67
68
69
70
71
72
# File 'lib/octokit/error.rb', line 65

def self.error_for_401(headers)
  # rubocop:enbale Naming/VariableNumber
  if Octokit::OneTimePasswordRequired.required_header(headers)
    Octokit::OneTimePasswordRequired
  else
    Octokit::Unauthorized
  end
end

.error_for_403(body) ⇒ Object

Returns most appropriate error for 403 HTTP status code



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
# File 'lib/octokit/error.rb', line 76

def self.error_for_403(body)
  # rubocop:enable Naming/VariableNumber
  case body
  when /rate limit exceeded/i, /exceeded a secondary rate limit/i
    Octokit::TooManyRequests
  when /login attempts exceeded/i
    Octokit::TooManyLoginAttempts
  when /(returns|for) blobs (up to|between) [0-9-]+ MB/i
    Octokit::TooLargeContent
  when /abuse/i
    Octokit::AbuseDetected
  when /repository access blocked/i
    Octokit::RepositoryUnavailable
  when /email address must be verified/i
    Octokit::UnverifiedEmail
  when /account was suspended/i
    Octokit::AccountSuspended
  when /billing issue/i
    Octokit::BillingIssue
  when /Resource protected by organization SAML enforcement/i
    Octokit::SAMLProtected
  when /suspended your access|This installation has been suspended/i
    Octokit::InstallationSuspended
  else
    Octokit::Forbidden
  end
end

.error_for_404(body) ⇒ Object

Return most appropriate error for 404 HTTP status code rubocop:disable Naming/VariableNumber



107
108
109
110
111
112
113
114
# File 'lib/octokit/error.rb', line 107

def self.error_for_404(body)
  # rubocop:enable Naming/VariableNumber
  if body =~ /Branch not protected/i
    Octokit::BranchNotProtected
  else
    Octokit::NotFound
  end
end

.error_for_422(body) ⇒ Object

Return most appropriate error for 422 HTTP status code rubocop:disable Naming/VariableNumber



119
120
121
122
123
124
125
126
127
128
# File 'lib/octokit/error.rb', line 119

def self.error_for_422(body)
  # rubocop:enable Naming/VariableNumber
  if body =~ /PullRequestReviewComment/i && body =~ /(commit_id|end_commit_oid) is not part of the pull request/i
    Octokit::CommitIsNotPartOfPullRequest
  elsif body =~ /Path diff too large/i
    Octokit::PathDiffTooLarge
  else
    Octokit::UnprocessableEntity
  end
end

.from_response(response) ⇒ Octokit::Error

Returns the appropriate Octokit::Error subclass based on status and response message

rubocop:disable Metrics/CyclomaticComplexity

Parameters:

  • response (Hash)

    HTTP response

Returns:



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
# File 'lib/octokit/error.rb', line 14

def self.from_response(response)
  status  = response[:status].to_i
  body    = response[:body].to_s
  headers = response[:response_headers]

  if klass =  case status
              when 400      then Octokit::BadRequest
              when 401      then error_for_401(headers)
              when 403      then error_for_403(body)
              when 404      then error_for_404(body)
              when 405      then Octokit::MethodNotAllowed
              when 406      then Octokit::NotAcceptable
              when 409      then Octokit::Conflict
              when 410      then Octokit::Deprecated
              when 415      then Octokit::UnsupportedMediaType
              when 422      then error_for_422(body)
              when 451      then Octokit::UnavailableForLegalReasons
              when 400..499 then Octokit::ClientError
              when 500      then Octokit::InternalServerError
              when 501      then Octokit::NotImplemented
              when 502      then Octokit::BadGateway
              when 503      then Octokit::ServiceUnavailable
              when 500..599 then Octokit::ServerError
              end
    klass.new(response)
  end
end

Instance Method Details

#build_error_contextObject

rubocop:enable Metrics/CyclomaticComplexity



43
44
45
46
47
# File 'lib/octokit/error.rb', line 43

def build_error_context
  if RATE_LIMITED_ERRORS.include?(self.class)
    @context = Octokit::RateLimit.from_response(@response)
  end
end

#documentation_urlString

Documentation URL returned by the API for some errors

Returns:

  • (String)


58
59
60
# File 'lib/octokit/error.rb', line 58

def documentation_url
  data[:documentation_url] if data.is_a? Hash
end

#errorsArray<Hash>

Array of validation errors

Returns:

  • (Array<Hash>)

    Error info



132
133
134
135
136
137
138
# File 'lib/octokit/error.rb', line 132

def errors
  if data.is_a?(Hash)
    data[:errors] || []
  else
    []
  end
end

#response_bodyString

Body returned by the GitHub server.

Returns:

  • (String)


157
158
159
# File 'lib/octokit/error.rb', line 157

def response_body
  @response[:body]
end

#response_headersHash

Headers returned by the GitHub server.

Returns:

  • (Hash)


150
151
152
# File 'lib/octokit/error.rb', line 150

def response_headers
  @response[:response_headers]
end

#response_statusInteger

Status code returned by the GitHub server.

Returns:

  • (Integer)


143
144
145
# File 'lib/octokit/error.rb', line 143

def response_status
  @response[:status]
end