From d1b2ef4d59c5ac0aefa472c4f4c4ee9cb06599ba Mon Sep 17 00:00:00 2001 From: Aleksei Atavin Date: Sun, 13 Aug 2023 11:19:57 +0300 Subject: [PATCH] Add gocardless banks cli --- ynab_sync/cli.py | 30 ++++++++++++++++++++++++++---- ynab_sync/gocardless/api.py | 10 +++++++++- ynab_sync/gocardless/models.py | 5 +++++ ynab_sync/logic.py | 5 +++++ 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/ynab_sync/cli.py b/ynab_sync/cli.py index 3d3e26f..18ff186 100644 --- a/ynab_sync/cli.py +++ b/ynab_sync/cli.py @@ -18,9 +18,9 @@ handlers=[logging.StreamHandler(sys.stdout)], ) -from .logic import (get_gocardless_transactions, get_ynab_budget, - get_ynab_budgets, prepare_ynab_transactions, - upload_to_ynab) +from .logic import (get_gocardless_banks, get_gocardless_transactions, + get_ynab_budget, get_ynab_budgets, + prepare_ynab_transactions, upload_to_ynab) @app.command() @@ -85,7 +85,7 @@ def upload( @app.command() def ynab(): - pass + ... @app.command("ynab").command() @@ -123,3 +123,25 @@ def accounts(*, ynab_token: str = "", ynab_budget_id: str = ""): tablefmt="github", ) print(table) + + +@app.command() +def gocardless(): + ... + + +@app.command("gocardless").command() +def banks( + country: str, + *, + gocardless_secret_id: str = "", + gocardless_secret_key: str = "", +): + banks = get_gocardless_banks( + secret_id=gocardless_secret_id, + secret_key=gocardless_secret_key, + country=country, + ) + table = tabulate([(bank.id, bank.name) for bank in banks], headers=["ID", "NAME"]) + + print(table) diff --git a/ynab_sync/gocardless/api.py b/ynab_sync/gocardless/api.py index a40178d..4ff2396 100644 --- a/ynab_sync/gocardless/api.py +++ b/ynab_sync/gocardless/api.py @@ -3,7 +3,7 @@ import requests -from .models import GoCardlessBankAccountData +from .models import GoCardlessBankAccountData, GoCardlessInstitution BASE_URL = "https://bankaccountdata.gocardless.com/api/v2" @@ -67,3 +67,11 @@ def get_transactions( response.raise_for_status() json_data = response.json() return GoCardlessBankAccountData(**json_data) + + def get_banks(self, country: str) -> list[GoCardlessInstitution]: + response = self._requests_session.get( + f"{BASE_URL}/institutions/?country={country}" + ) + response.raise_for_status() + json_data = response.json() + return [GoCardlessInstitution(**institution) for institution in json_data] diff --git a/ynab_sync/gocardless/models.py b/ynab_sync/gocardless/models.py index 732ffe6..8935fb4 100644 --- a/ynab_sync/gocardless/models.py +++ b/ynab_sync/gocardless/models.py @@ -33,3 +33,8 @@ class GoCardlessTransactions(BaseModel): class GoCardlessBankAccountData(BaseModel): transactions: GoCardlessTransactions + + +class GoCardlessInstitution(BaseModel): + id: str + name: str diff --git a/ynab_sync/logic.py b/ynab_sync/logic.py index cdb4bcd..ea5f683 100644 --- a/ynab_sync/logic.py +++ b/ynab_sync/logic.py @@ -107,3 +107,8 @@ def get_ynab_budgets(token: str) -> list[YNABBudget]: def get_ynab_budget(token: str, budget_id: UUID) -> YNABBudget: ynab_api = YnabAPI(access_token=token) return ynab_api.get_budget(budget_id=budget_id) + + +def get_gocardless_banks(secret_id: str, secret_key: str, country: str): + gocardless_api = GoCardLessAPI(secret_id=secret_id, secret_key=secret_key) + return gocardless_api.get_banks(country=country)