Skip to content

Commit 0aa6dc1

Browse files
authored
Merge pull request #38 from nijel/transactions
feat: add transactions API to fetch last transactions and account info
2 parents a3d3ca9 + 67c1710 commit 0aa6dc1

File tree

3 files changed

+86
-14
lines changed

3 files changed

+86
-14
lines changed

README.rst

+20
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ Listing transactions within a period:
6161
'transaction_id': 'XXXXXXXXXX'
6262
}
6363
64+
Getting transactions with account information in one request:
65+
66+
.. code:: python
67+
68+
>>> client.transactions('2013-01-20', '2013-03-20')
69+
(
70+
{'currency': 'CZK', 'account_number_full': 'XXXXXXXXXX/2010', 'balance': 42.00, 'account_number': 'XXXXXXXXXX', 'bank_code': '2010'},
71+
'transactions': <generator object _parse_transactions at 0x170c190>
72+
)
73+
6474
Listing transactions from a single account statement:
6575

6676
.. code:: python
@@ -74,6 +84,16 @@ Listing the latest transactions:
7484
>>> client.last() # return transactions added from last listing
7585
>>> client.last(from_id='...') # sets cursor to given transaction_id and returns following transactions
7686
>>> client.last(from_date='2013-03-01') # sets cursor to given date and returns following transactions
87+
88+
Getting the latest transactions with account information in one request:
89+
90+
.. code:: python
91+
92+
>>> client.last_transactions()
93+
(
94+
{'currency': 'CZK', 'account_number_full': 'XXXXXXXXXX/2010', 'balance': 42.00, 'account_number': 'XXXXXXXXXX', 'bank_code': '2010'},
95+
'transactions': <generator object _parse_transactions at 0x170c190>
96+
)
7797
7898
Conflict Error
7999
--------------

fiobank.py

+37-14
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from __future__ import annotations
2+
13
import re
24
import warnings
5+
from collections.abc import Generator
36
from datetime import date, datetime
47
from decimal import Decimal
5-
from typing import Any, Callable, Generator
8+
from typing import Any, Callable
69

710
import requests
811
from tenacity import (
@@ -197,25 +200,34 @@ def info(self) -> dict:
197200
return self._parse_info(data)
198201
raise ValueError("No data available")
199202

200-
def period(
201-
self, from_date: "date | datetime | str", to_date: "date | datetime | str"
202-
) -> Generator[dict, None, None]:
203-
if data := self._request(
203+
def _fetch_period(
204+
self, from_date: str | date | datetime, to_date: str | date | datetime
205+
) -> dict:
206+
return self._request(
204207
"periods", from_date=coerce_date(from_date), to_date=coerce_date(to_date)
205-
):
206-
return self._parse_transactions(data)
208+
)
209+
210+
def period(
211+
self, from_date: str | date | datetime, to_date: str | date | datetime
212+
) -> Generator[dict]:
213+
data = self._fetch_period(from_date, to_date)
214+
return self._parse_transactions(data)
215+
216+
def transactions(
217+
self, from_date: str | date | datetime, to_date: str | date | datetime
218+
) -> tuple[dict, Generator[dict]]:
219+
if data := self._fetch_period(from_date, to_date):
220+
return (self._parse_info(data), self._parse_transactions(data))
207221
raise ValueError("No data available")
208222

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

214-
def last(
215-
self,
216-
from_id: "int | None" = None,
217-
from_date: "date | datetime | str | None" = None,
218-
) -> Generator[dict, None, None]:
228+
def _fetch_last(
229+
self, from_id: str | None = None, from_date: str | date | datetime | None = None
230+
) -> dict:
219231
if from_id and from_date:
220232
raise ValueError("Only one constraint is allowed.")
221233

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

227239
if data := self._request("last"):
228-
return self._parse_transactions(data)
240+
return data
229241
raise ValueError("No data available")
242+
243+
def last(
244+
self, from_id: str | None = None, from_date: str | date | datetime | None = None
245+
) -> Generator[dict]:
246+
return self._parse_transactions(self._fetch_last(from_id, from_date))
247+
248+
def last_transactions(
249+
self, from_id: str | None = None, from_date: str | date | datetime | None = None
250+
) -> tuple[dict, Generator[dict]]:
251+
data = self._fetch_last(from_id, from_date)
252+
return (self._parse_info(data), self._parse_transactions(data))

tests/test_fiobank.py

+29
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,35 @@ def test_transactions_integration(client_float, method, args, kwargs):
201201
assert count > 0
202202

203203

204+
@pytest.mark.parametrize(
205+
"args,kwargs",
206+
[
207+
([date(2016, 8, 4), date(2016, 8, 30)], {}),
208+
(["2016-08-04", "2016-08-30"], {}),
209+
],
210+
)
211+
def test_transactions(client_decimal, args, kwargs):
212+
info, transactions = client_decimal.transactions(*args, **kwargs)
213+
transaction = next(transactions)
214+
assert transaction["amount"] == Decimal("-130.0")
215+
assert info["balance"] == Decimal("2060.52")
216+
217+
218+
@pytest.mark.parametrize(
219+
"args,kwargs",
220+
[
221+
([], {"from_id": 308}),
222+
([], {"from_date": date(2016, 8, 4)}),
223+
([], {"from_date": "2016-08-04"}),
224+
],
225+
)
226+
def test_last_transactions(client_decimal, args, kwargs):
227+
info, transactions = client_decimal.last_transactions(*args, **kwargs)
228+
transaction = next(transactions)
229+
assert transaction["amount"] == Decimal("-130.0")
230+
assert info["balance"] == Decimal("2060.52")
231+
232+
204233
def test_period_coerces_date(transactions_json):
205234
client = FioBank("...")
206235

0 commit comments

Comments
 (0)