summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruvok2025-04-18 20:15:37 +0200
committeruvok2025-04-18 20:15:37 +0200
commit45c51fad25bc6e2942e2a15463ca0cd669a840e2 (patch)
tree2049ce206b740f54c4a4fe5d62f7e9abe9dd9890
parent58a5dac33d8fc37158f2190cf6d0501b15644a69 (diff)
Streamline processing
-rw-r--r--ledger_process.py57
1 files changed, 23 insertions, 34 deletions
diff --git a/ledger_process.py b/ledger_process.py
index 08aea10..99e48ba 100644
--- a/ledger_process.py
+++ b/ledger_process.py
@@ -18,37 +18,35 @@ class LedgerProcess:
self.external_wallet: Dict[str, FIFOQueue] = {}
def process_ledger(self, read_actions: List[LedgerAction]):
+ for currency in {ac.asset for ac in read_actions}:
+ self.external_wallet.setdefault(currency, FIFOQueue())
+ self.fifo_queues.setdefault(currency, FIFOQueue())
+
+ # --- Trades
# don't make any assumtptions about ledger sorting
# groupby requires sorted inputs
- actions_sorted = sorted(read_actions, key=lambda a: (a.refid, a.timestamp))
- grouped_actions = groupby(actions_sorted, lambda a: a.refid)
-
- process_after: List[LedgerAction] = []
-
+ trades_sorted = sorted(
+ (ac for ac in read_actions if ac.type == "trade"),
+ key=lambda a: (a.refid, a.timestamp),
+ )
+ grouped_actions = groupby(trades_sorted, lambda a: a.refid)
for refid, actions in grouped_actions:
actions = list(actions)
-
- if len(actions) == 0:
- logger.error("actions is empty")
- continue
- action = actions[0]
-
- # Group trades by refid
- if action.type == "trade":
- self._process_trade(refid, actions)
-
- elif action.asset == "EUR":
- continue
-
- elif action.type == "deposit" or action.type == "withdrawal":
- assert len(actions) == 1
- process_after.append(action)
-
- for action in sorted(process_after, key=lambda a: a.timestamp):
- if action.type == "deposit" and action.asset != "EUR":
+ self._process_trade(refid, actions)
+
+ # --- Deposit/Withdrawal
+ for action in sorted(
+ (
+ ac
+ for ac in read_actions
+ if ac.type in ["deposit", "withdrawal"] and ac.asset != "EUR"
+ ),
+ key=lambda a: a.timestamp,
+ ):
+ if action.type == "deposit":
self._process_deposit(action)
- elif action.type == "withdrawal" and action.asset != "EUR":
+ elif action.type == "withdrawal":
self._process_withdrawal(action)
def _process_deposit(self, action: LedgerAction):
@@ -56,8 +54,6 @@ class LedgerProcess:
assert action.fee >= 0
currency = action.asset
- self.external_wallet.setdefault(currency, FIFOQueue())
- self.fifo_queues.setdefault(currency, FIFOQueue())
t = self.external_wallet[currency].remove(
lambda t: t.amount == action.amount and t.timestamp < action.timestamp
@@ -68,17 +64,11 @@ class LedgerProcess:
t.remove_coins(action.fee)
wallet.add_trade(t)
- # TODO: Sort
-
- logger.error("Don't know how do handle deposits yet.")
-
def _process_withdrawal(self, action: LedgerAction):
assert action.amount < 0
assert action.fee >= 0
currency = action.asset
- self.external_wallet.setdefault(currency, FIFOQueue())
- self.fifo_queues.setdefault(currency, FIFOQueue())
withdraw_total = -action.amount + action.fee
t = self.fifo_queues[currency].remove(
@@ -100,7 +90,6 @@ class LedgerProcess:
eur_fee = Decimal(eur_trade.fee)
crypto_amount = Decimal(crypto_trade.amount)
crypto_fee = Decimal(crypto_trade.fee)
- self.fifo_queues.setdefault(crypto_asset, FIFOQueue())
date_sold = eur_trade.date