diff --git a/README.rst b/README.rst index 63c980b..90661be 100644 --- a/README.rst +++ b/README.rst @@ -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': + ) + Listing transactions from a single account statement: .. code:: python @@ -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': + ) Conflict Error -------------- diff --git a/fiobank.py b/fiobank.py index 0ce50db..eca1413 100644 --- a/fiobank.py +++ b/fiobank.py @@ -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 ( @@ -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.") @@ -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)) diff --git a/tests/test_fiobank.py b/tests/test_fiobank.py index d5021aa..aadc0fb 100644 --- a/tests/test_fiobank.py +++ b/tests/test_fiobank.py @@ -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("...")