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

121 lines
4 KiB
Python

import warnings
from plaid.api import (
Accounts,
AssetReport,
Auth,
Categories,
CreditDetails,
DepositSwitch,
Holdings,
Identity,
Income,
Institutions,
InvestmentTransactions,
Item,
Liabilities,
LinkToken,
PaymentInitiation,
Processor,
Sandbox,
Transactions,
Webhooks,
)
from plaid.internal.requester import DEFAULT_TIMEOUT, post_request
from plaid.internal.utils import urljoin
class Client(object):
'''
Python Plaid API client.
See official documentation at: https://plaid.com/docs.
All of the endpoints documented under the ``plaid.api``
module may be called from a ``plaid.Client`` instance.
'''
def __init__(self,
client_id=None,
secret=None,
environment=None,
suppress_warnings=False,
timeout=DEFAULT_TIMEOUT,
api_version=None,
client_app=None):
'''
Initialize a client with credentials.
:param str client_id: Your Plaid client ID
:arg str secret: Your Plaid secret
:arg str environment: One of ``sandbox``,
``development``, or ``production``.
:arg bool suppress_warnings: Suppress Plaid warnings.
:arg int timeout: Timeout for API requests.
:arg str api_version: API version to use for requests
:arg str client_app: Internal header to include
in requests
'''
self.client_id = client_id
self.secret = secret
self.environment = environment
self.suppress_warnings = suppress_warnings
self.timeout = timeout
self.api_version = api_version
self.client_app = client_app
if self.environment == 'development' and not self.suppress_warnings:
warnings.warn('''
Development is not intended for production usage.
Swap out url for https://production.plaid.com
via Client.config before switching to production
''')
# Mirror the HTTP API hierarchy
self.Accounts = Accounts(self)
self.AssetReport = AssetReport(self)
self.Auth = Auth(self)
self.Categories = Categories(self)
self.CreditDetails = CreditDetails(self)
self.DepositSwitch = DepositSwitch(self)
self.Holdings = Holdings(self)
self.Identity = Identity(self)
self.Income = Income(self)
self.Institutions = Institutions(self)
self.InvestmentTransactions = InvestmentTransactions(self)
self.Item = Item(self)
self.Liabilities = Liabilities(self)
self.LinkToken = LinkToken(self)
self.PaymentInitiation = PaymentInitiation(self)
self.Processor = Processor(self)
self.Sandbox = Sandbox(self)
self.Transactions = Transactions(self)
self.Webhooks = Webhooks(self)
def post(self, path, data, is_json=True):
'''Make a post request with client_id and secret key.'''
post_data = {
'client_id': self.client_id,
'secret': self.secret,
}
post_data.update(data)
return self._post(path, post_data, is_json)
def post_public(self, path, data, is_json=True):
'''Make a post request requiring no auth.'''
return self._post(path, data, is_json)
def _post(self, path, data, is_json):
headers = {}
if self.api_version is not None:
headers['Plaid-Version'] = self.api_version
if self.client_app is not None:
headers['Plaid-Client-App'] = self.client_app
return post_request(
urljoin('https://' + self.environment + '.plaid.com', path),
data=data,
timeout=self.timeout,
is_json=is_json,
headers=headers,
)