Skip to content

Commit

Permalink
Merge pull request #38 from nijel/transactions
Browse files Browse the repository at this point in the history
feat: add transactions API to fetch last transactions and account info
  • Loading branch information
honzajavorek authored Jan 6, 2025
2 parents a3d3ca9 + 67c1710 commit 0aa6dc1
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 14 deletions.
20 changes: 20 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ Listing transactions within a period:
'transaction_id': 'XXXXXXXXXX'
}
Getting transactions with account information in one request:

.. code:: python
>>> client.transactions('2013-01-20', '2013-03-20')
(
{'currency': 'CZK', 'account_number_full': 'XXXXXXXXXX/2010', 'balance': 42.00, 'account_number': 'XXXXXXXXXX', 'bank_code': '2010'},
'transactions': <generator object _parse_transactions at 0x170c190>
)
Listing transactions from a single account statement:

.. code:: python
Expand All @@ -74,6 +84,16 @@ Listing the latest transactions:
>>> client.last() # return transactions added from last listing
>>> client.last(from_id='...') # sets cursor to given transaction_id and returns following transactions
>>> client.last(from_date='2013-03-01') # sets cursor to given date and returns following transactions
Getting the latest transactions with account information in one request:

.. code:: python
>>> client.last_transactions()
(
{'currency': 'CZK', 'account_number_full': 'XXXXXXXXXX/2010', 'balance': 42.00, 'account_number': 'XXXXXXXXXX', 'bank_code': '2010'},
'transactions': <generator object _parse_transactions at 0x170c190>
)
Conflict Error
--------------
Expand Down
51 changes: 37 additions & 14 deletions fiobank.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from __future__ import annotations

import re
import warnings
from collections.abc import Generator
from datetime import date, datetime
from decimal import Decimal
from typing import Any, Callable, Generator
from typing import Any, Callable

import requests
from tenacity import (
Expand Down Expand Up @@ -197,25 +200,34 @@ def info(self) -> dict:
return self._parse_info(data)
raise ValueError("No data available")

def period(
self, from_date: "date | datetime | str", to_date: "date | datetime | str"
) -> Generator[dict, None, None]:
if data := self._request(
def _fetch_period(
self, from_date: str | date | datetime, to_date: str | date | datetime
) -> dict:
return self._request(
"periods", from_date=coerce_date(from_date), to_date=coerce_date(to_date)
):
return self._parse_transactions(data)
)

def period(
self, from_date: str | date | datetime, to_date: str | date | datetime
) -> Generator[dict]:
data = self._fetch_period(from_date, to_date)
return self._parse_transactions(data)

def transactions(
self, from_date: str | date | datetime, to_date: str | date | datetime
) -> tuple[dict, Generator[dict]]:
if data := self._fetch_period(from_date, to_date):
return (self._parse_info(data), self._parse_transactions(data))
raise ValueError("No data available")

def statement(self, year: int, number: int) -> Generator[dict, None, None]:
def statement(self, year, number):
if data := self._request("by-id", year=year, number=number):
return self._parse_transactions(data)
raise ValueError("No data available")

def last(
self,
from_id: "int | None" = None,
from_date: "date | datetime | str | None" = None,
) -> Generator[dict, None, None]:
def _fetch_last(
self, from_id: str | None = None, from_date: str | date | datetime | None = None
) -> dict:
if from_id and from_date:
raise ValueError("Only one constraint is allowed.")

Expand All @@ -225,5 +237,16 @@ def last(
self._request("set-last-date", from_date=coerce_date(from_date))

if data := self._request("last"):
return self._parse_transactions(data)
return data
raise ValueError("No data available")

def last(
self, from_id: str | None = None, from_date: str | date | datetime | None = None
) -> Generator[dict]:
return self._parse_transactions(self._fetch_last(from_id, from_date))

def last_transactions(
self, from_id: str | None = None, from_date: str | date | datetime | None = None
) -> tuple[dict, Generator[dict]]:
data = self._fetch_last(from_id, from_date)
return (self._parse_info(data), self._parse_transactions(data))
29 changes: 29 additions & 0 deletions tests/test_fiobank.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,35 @@ def test_transactions_integration(client_float, method, args, kwargs):
assert count > 0


@pytest.mark.parametrize(
"args,kwargs",
[
([date(2016, 8, 4), date(2016, 8, 30)], {}),
(["2016-08-04", "2016-08-30"], {}),
],
)
def test_transactions(client_decimal, args, kwargs):
info, transactions = client_decimal.transactions(*args, **kwargs)
transaction = next(transactions)
assert transaction["amount"] == Decimal("-130.0")
assert info["balance"] == Decimal("2060.52")


@pytest.mark.parametrize(
"args,kwargs",
[
([], {"from_id": 308}),
([], {"from_date": date(2016, 8, 4)}),
([], {"from_date": "2016-08-04"}),
],
)
def test_last_transactions(client_decimal, args, kwargs):
info, transactions = client_decimal.last_transactions(*args, **kwargs)
transaction = next(transactions)
assert transaction["amount"] == Decimal("-130.0")
assert info["balance"] == Decimal("2060.52")


def test_period_coerces_date(transactions_json):
client = FioBank("...")

Expand Down

0 comments on commit 0aa6dc1

Please sign in to comment.