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.
This commit is contained in:
Luís Murta 2021-02-04 23:45:24 +00:00
parent 647af8be5b
commit 51b16c7977
Signed by: satprog
GPG Key ID: DDF2EFC6179009DC
2 changed files with 29 additions and 22 deletions

29
main.py
View File

@ -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)))

View File

@ -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