From 806bf258e4674cb056d92fa65b0cc77e1eca285c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Murta?= Date: Wed, 9 Sep 2020 21:09:51 +0100 Subject: [PATCH] Multiple fixes on the addition of new raw files The initialize function has been updated with a new possible option for a new raw file, where the Last Accessed date changed the content hadn't. Also removes sort() when using extend() on a list as it doesn't work correctly. Categorization code moved to if False statement to add posterior toggle behaviour. New transaction print added (.desc()) which prints the description of a transaction instead of its category to help on the manual categorization. Raw files now on raw dir instead of .raw It now also accepts empty lines and # at the start for comments on data files. TODO these are overwritten whenever the data files are updated. --- categories.py | 2 +- main.py | 39 ++++++++++++++++++++++++--------------- transaction.py | 7 ++++++- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/categories.py b/categories.py index 66f60ce..bb1b970 100644 --- a/categories.py +++ b/categories.py @@ -52,7 +52,7 @@ class Categories: and transaction.category != Travel().name ): new_category = input( - f"{transaction} already has a {transaction.category} assigned. Would you like " + f"{transaction.desc()} already has a {transaction.category} assigned. Would you like " f"to change it to {category.name}? (Y/N) " ) correct_answer = False diff --git a/main.py b/main.py index 3067300..0de06e0 100644 --- a/main.py +++ b/main.py @@ -40,11 +40,14 @@ def initialize(raw_dir, data_dir, restart=False): logging.debug("no .raw.pickle found") updated_trs, update = dict(), False - prompt = " has been modified since last update. Do you want to update the data files? (Yes/No)" + prompt = " has been modified since last update. Do you want to update the data files? (Yes/Update/No)" for rf in Path(raw_dir).iterdir(): if rf.name in rfs and rfs[rf.name][0] == rf.stat().st_mtime: logging.debug(f"{rf.name} hasn't been modified since last access") - elif rf.name not in rfs or input(f"{rf.name}" + prompt).lower() == "yes": + elif ( + rf.name not in rfs + or (answer := input(f"{rf.name}" + prompt).lower()) == "yes" + ): trs = Parser.parse_csv(rf) updated_trs[rf.name] = trs try: @@ -53,6 +56,11 @@ def initialize(raw_dir, data_dir, restart=False): rfs[rf.name] = [rf.stat().st_mtime, []] update = True logging.info(f"{rf.name} parsed") + elif answer == "update": + rfs[rf.name][0] = rf.stat().st_mtime + update = True + else: # prompt = no + update = True if update: for rf_name, updated_trs in updated_trs.items(): @@ -66,7 +74,8 @@ def initialize(raw_dir, data_dir, restart=False): rem_trs = [tr for tr in rfs[rf_name][1] if tr not in trs] if new_trs: - dfs[filename].extend(new_trs).sort() + dfs[filename].extend(new_trs) + dfs[filename].sort() for rem in rem_trs: dfs[filename].remove(rem) @@ -95,7 +104,7 @@ def manual_categorization(trs): trs.sort_by_bank() for i, transaction in enumerate(trs): if not transaction.category: - category = input(f"{transaction} category: ") + category = input(f"{transaction.desc()} category: ") if category == "stop": break if category: @@ -106,9 +115,9 @@ def manual_categorization(trs): if __name__ == "__main__": - logging.basicConfig(level=logging.DEBUG) + # logging.basicConfig(level=logging.DEBUG) - datafiles = initialize(".raw", "data", restart=False) + datafiles = initialize("raw", "data", restart=False) transactions = Transactions() for file in datafiles.values(): @@ -121,15 +130,15 @@ if __name__ == "__main__": # if transaction.category in reprocess: # transaction.category = '' - # Categories.categorize(transactions) - # - # manual_categorization(transactions) - # - # for f, file in datafiles.items(): - # file_transactions = [t for t in transactions if t in file] - # Tr.write_transactions(Path("data") / f, file_transactions) - # - Tr.write_transactions("transactions.csv", transactions) + if False: + Categories.categorize(transactions) + manual_categorization(transactions) + + for f, file in datafiles.items(): + file_transactions = [t for t in transactions if t in file] + Tr.write_transactions(Path("data") / f, file_transactions) + + Tr.write_transactions("transactions.csv", transactions) monthly_transactions = transactions.get_transactions_by_month( start=date(2020, 1, 1), end=date(2020, 8, 31) diff --git a/transaction.py b/transaction.py index 9b38bfd..62eab01 100644 --- a/transaction.py +++ b/transaction.py @@ -37,7 +37,7 @@ class Transaction: def read_transactions(file, encoding="utf-8"): with open(file, newline="", encoding=encoding) as f: r = reader(f, delimiter="\t") - transactions = [Transaction(row) for row in r] + transactions = [Transaction(row) for row in r if row and row[0][0] != "#"] return transactions @staticmethod @@ -89,6 +89,11 @@ class Transaction: def __ge__(self, other): return self.date >= other.date + def desc(self): + return "{} {} {}€ ({})".format( + self.date.strftime("%d/%m/%y"), self.description, self.value, self.bank + ) + def __repr__(self): return "{} {} {}€ ({})".format( self.date.strftime("%d/%m/%y"), self.category, self.value, self.bank