frappe/env/lib/python3.12/site-packages/plaid/errors.py

180 lines
5.2 KiB
Python
Raw Permalink Normal View History

class BaseError(Exception):
'''
A base error class.
:ivar str message: A developer-friendly error message. Not
safe for programmatic use.
:ivar str type: A broad categorization of the error,
corresponding to the error class.
:ivar str code: An error code for programmatic use.
:ivar str display_message: A user-friendly error message. Not safe
for programmatic use. May be None.
'''
def __init__(
self,
message,
type,
code,
display_message,
):
super(BaseError, self).__init__(message)
# In Python 3, the Exception class does not expose a `message`
# attribute so we need to set it explicitly. See
# https://www.python.org/dev/peps/pep-0352/#retracted-ideas.
self.message = message
self.type = type
self.code = code
self.display_message = display_message
class PlaidError(BaseError):
'''
A Plaid API error.
:ivar str message: A developer-friendly error message. Not
safe for programmatic use.
:ivar str type: A broad categorization of the error,
corresponding to the error class.
:ivar str code: An error code for programmatic use.
:ivar str display_message: A user-friendly error message. Not safe
for programmatic use. May be None.
:ivar str request_id: A unique id returned for all server
responses.
:ivar list causes: A list of reasons explaining why the
error happened.
'''
def __init__(
self,
message,
type,
code,
display_message,
request_id="",
causes=None,
):
super(PlaidError, self).__init__(
message,
type,
code,
display_message,
)
self.request_id = request_id
self.causes = [
PlaidCause(
cause['error_message'],
cause['error_type'],
cause['error_code'],
cause.get('display_message', ''),
cause['item_id'],
) for cause in causes or []
]
@staticmethod
def from_response(response):
'''
Create an error of the right class from an API response.
:param response dict Response JSON
'''
cls = PLAID_ERROR_TYPE_MAP.get(response['error_type'], PlaidError)
return cls(response['error_message'],
response['error_type'],
response['error_code'],
response['display_message'],
response['request_id'],
response.get('causes'))
class PlaidCause(BaseError):
'''
A cause of a Plaid error.
:ivar str message: A developer-friendly error message. Not
safe for programmatic use.
:ivar str type: A broad categorization of the error,
corresponding to the error class.
:ivar str code: An error code for programmatic use.
:ivar str display_message: A user-friendly error message. Not safe
for programmatic use. May be None.
:ivar str item_id: The item ID.
'''
def __init__(
self,
message,
type,
code,
display_message,
item_id,
):
super(PlaidCause, self).__init__(
message,
type,
code,
display_message,
)
self.item_id = item_id
class InvalidRequestError(PlaidError):
'''The request is malformed and cannot be processed.'''
pass
class InvalidInputError(PlaidError):
'''The request is correctly formatted, but the values are incorrect.'''
pass
class RateLimitExceededError(PlaidError):
'''The request is valid but has exceeded established rate limits.'''
pass
class APIError(PlaidError):
'''Planned maintenance or an API internal server error.'''
pass
class ItemError(PlaidError):
'''There is invalid information about an item or it is not supported.'''
pass
class InstitutionError(PlaidError):
'''There are errors for the requested financial institution.'''
pass
class AuthError(PlaidError):
'''There are errors with verifying or pulling auth numbers data.'''
pass
class AssetReportError(PlaidError):
'''There are errors with creating the asset report.'''
pass
PLAID_ERROR_TYPE_MAP = {
'INSTITUTION_ERROR': InstitutionError,
'INVALID_REQUEST': InvalidRequestError,
'INVALID_INPUT': InvalidInputError,
'RATE_LIMIT_EXCEEDED': RateLimitExceededError,
'API_ERROR': APIError,
'ITEM_ERROR': ItemError,
'AUTH_ERROR': AuthError,
'ASSET_REPORT_ERROR': AssetReportError,
}