From 51b16c7977bad94be22f607441503b70062669a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Murta?= Date: Thu, 4 Feb 2021 23:45:24 +0000 Subject: [PATCH] Fixes several FileNotFound at initialization Added multiple Path.mkdir() when .pfstate, backup, raw and data directories weren't created. Adds try-except clause around functions called in init, so that errors in the early stages are catched to remove already initialized state files. Moves filename definitions to tools using global vars. Removed state.filename = p from main.py introduced when the state filename was changed. `self._save()` removed from `PFState` `__init__` as it's not needed. All setattr already call it. --- main.py | 29 +++++++++++------------------ pfbudget/tools.py | 22 ++++++++++++++++++---- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/main.py b/main.py index 74fd255..aa04e8f 100644 --- a/main.py +++ b/main.py @@ -8,9 +8,6 @@ import pfbudget.report as report import pfbudget.tools as tools -p = ".pfbudget/state" - - class PfBudgetInitialized(Exception): pass @@ -34,7 +31,7 @@ def init(state, args): """ if not state: s = dict( - filename=p, + filename=tools.STATE_FILE, raw_dir=args.raw, data_dir=args.data, raw_files=[], @@ -43,8 +40,15 @@ def init(state, args): last_backup="", last_datadir_backup="", ) - state = tools.pfstate(p, s) - parse(state, args) + try: + state = tools.pfstate(tools.STATE_FILE, s) + parse(state, args) + except Exception as e: + print(e) + if Path(tools.STATE_FILE).is_file(): + print(f"Deleting {tools.STATE_FILE}") + Path(tools.STATE_FILE).unlink() + else: raise PfBudgetInitialized() @@ -244,17 +248,6 @@ if __name__ == "__main__": p_graph.set_defaults(func=graph) p_report.set_defaults(func=f_report) - state = tools.pfstate(p) - state.filename = p + state = tools.pfstate(tools.STATE_FILE) args = parser.parse_args() args.func(state, args) - - # income = [sum(t.value for cat, transactions in months.items() for t in transactions - # if cat in get_income_categories()) for months in monthly_transactions_by_cat] - - # expenses = [] - # for category in expense_categories: - # expense_value = [-sum(t.value for t in month[category]) for month in monthly_transactions_by_cat] - # expenses.extend(expense_value) - - # print("Income: {}, Expenses: {}, Net = {}"".format(sum(income), sum(expenses), sum(income) - sum(expenses))) diff --git a/pfbudget/tools.py b/pfbudget/tools.py index bdedfeb..fe801b5 100644 --- a/pfbudget/tools.py +++ b/pfbudget/tools.py @@ -1,6 +1,7 @@ from pathlib import Path import csv import datetime as dt +import os import pickle import shutil @@ -14,15 +15,24 @@ from .transactions import ( from .parsers import parse_data +DIR = ".pfbudget/" +STATE_FILE = DIR + "state" +BACKUP_DIR = DIR + "backup/" + + def get_filename(t: Transaction): return "{}_{}.csv".format(t.year, t.bank) class PFState: - def __init__(self, filename, *args, **kwargs): + def __init__(self, filename: str, *args, **kwargs): if Path(filename).is_file(): raise FileExistsError("PFState already exists") + if not Path(filename).parent.is_dir(): + Path(filename).parent.mkdir(parents=True) + (Path(filename).parent / "backup/").mkdir(parents=True) + self.filename = filename for d in args: for k in d: @@ -30,7 +40,11 @@ class PFState: for k in kwargs: setattr(self, k, kwargs[k]) - self._save() + if not Path(self.raw_dir).is_dir(): + Path(self.raw_dir).mkdir(parents=True) + + if not Path(self.data_dir).is_dir(): + Path(self.data_dir).mkdir(parents=True) @property def filename(self): @@ -153,7 +167,7 @@ def pfstate(filename, *args, **kwargs): def backup(state: PFState): transactions = load_transactions(state.data_dir) filename = ( - ".pfbudget/backups/" + BACKUP_DIR + "transactions_" + dt.datetime.now().strftime("%Y-%m-%d_%Hh%Mm%Ss") + ".csv" @@ -164,7 +178,7 @@ def backup(state: PFState): def full_backup(state: PFState): - filename = ".pfbudget/backups/" + dt.datetime.now().strftime("%Y-%m-%d_%Hh%Mm%Ss") + filename = BACKUP_DIR + dt.datetime.now().strftime("%Y-%m-%d_%Hh%Mm%Ss") shutil.copytree(state.data_dir, Path(filename)) state.last_datadir_backup = filename