From 9500e808de000f354b9a3a98d6a44be357dacf73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Murta?= Date: Fri, 6 Jan 2023 22:05:01 +0000 Subject: [PATCH] Update the parse operation to coordinate with the manager --- pfbudget/__main__.py | 4 ++++ pfbudget/cli/runnable.py | 36 ++++++------------------------------ pfbudget/core/manager.py | 35 +++++++++++++++++++++-------------- pfbudget/input/parsers.py | 7 ++++--- 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/pfbudget/__main__.py b/pfbudget/__main__.py index 4cb673a..9e1f45d 100644 --- a/pfbudget/__main__.py +++ b/pfbudget/__main__.py @@ -16,6 +16,10 @@ if __name__ == "__main__": params = None match (op): + case pfbudget.Operation.Parse: + assert args.keys() >= {"path", "bank", "creditcard"} + params = [args["path"], args["bank"], args["creditcard"]] + case pfbudget.Operation.RequisitionId: assert args.keys() >= {"name", "country"}, "argparser ill defined" params = [args["name"][0], args["country"][0]] diff --git a/pfbudget/cli/runnable.py b/pfbudget/cli/runnable.py index 5f797a8..230e611 100644 --- a/pfbudget/cli/runnable.py +++ b/pfbudget/cli/runnable.py @@ -86,20 +86,12 @@ def argparser() -> argparse.ArgumentParser: ) p_export.set_defaults(func=lambda args: DatabaseClient(args.database).export()) - """ - Parsing - """ - p_parse = subparsers.add_parser( - "parse", - description="Parses and adds the requested transactions into the selected database", - parents=[universal], - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - ) - p_parse.add_argument("path", nargs="+", type=str) - p_parse.add_argument("--bank", nargs=1, type=str) - p_parse.add_argument("--creditcard", nargs=1, type=str) - p_parse.add_argument("--category", nargs=1, type=int) - p_parse.set_defaults(command=Operation.Parse) + # Parse from .csv + parse = subparsers.add_parser("parse") + parse.set_defaults(op=Operation.Parse) + parse.add_argument("path", nargs="+", type=str) + parse.add_argument("--bank", nargs=1, type=str) + parse.add_argument("--creditcard", nargs=1, type=str) """ Categorizing @@ -209,22 +201,6 @@ def argparser() -> argparse.ArgumentParser: return parser -def parse(manager, args): - """Parses the contents of the path in args to the selected database. - - Args: - args (dict): argparse variables - """ - for path in args.path: - if (dir := Path(path)).is_dir(): - for file in dir.iterdir(): - manager.parse(file, vars(args)) - elif Path(path).is_file(): - manager.parse(path, vars(args)) - else: - raise FileNotFoundError - - def graph(args): """Plots the transactions over a period of time. diff --git a/pfbudget/core/manager.py b/pfbudget/core/manager.py index 48aa835..ff2af96 100644 --- a/pfbudget/core/manager.py +++ b/pfbudget/core/manager.py @@ -1,3 +1,5 @@ +from pathlib import Path + from pfbudget.input.input import Input from pfbudget.input.nordigen import NordigenInput from pfbudget.input.parsers import parse_data @@ -17,8 +19,6 @@ from pfbudget.common.types import Operation from pfbudget.core.categorizer import Categorizer from pfbudget.utils import convert -from pfbudget.cli.runnable import parse - class Manager: def __init__(self, db: str, verbosity: int = 0, args: dict = {}): @@ -34,9 +34,23 @@ class Manager: match (op): case Operation.Init: pass + case Operation.Parse: - # TODO this is a monstrosity, remove when possible - parse(self, self.args) + # Adapter for the parse_data method. Can be refactored. + args = {"bank": params[1], "creditcard": params[2], "category": None} + transactions = [] + for path in params[0]: + if (dir := Path(path)).is_dir(): + for file in dir.iterdir(): + transactions.extend(self.parse(file, args)) + elif Path(path).is_file(): + transactions.extend(self.parse(path, args)) + else: + raise FileNotFoundError(path) + + print(transactions) + if len(transactions) > 0 and input("Commit? (y/n)") == "y": + self.add_transactions(sorted(transactions)) case Operation.Download: client = NordigenInput() @@ -44,8 +58,7 @@ class Manager: client.start = params[0] client.end = params[1] transactions = client.parse() - with self.db.session() as session: - session.add(transactions) + self.add_transactions(transactions) case Operation.Categorize: with self.db.session() as session: @@ -143,14 +156,8 @@ class Manager: # client = DatabaseClient(self.__db) # client.unregister_bank(self.args["bank"][0]) - def parser(self, parser: Input): - transactions = parser.parse() - print(transactions) - # self.add_transactions(transactions) - - # def parse(self, filename: str): - # transactions = parse_data(filename, self.args) - # self.add_transactions(transactions) + def parse(self, filename: str, args: dict): + return parse_data(filename, args) # def transactions() -> list[Transaction]: # pass diff --git a/pfbudget/input/parsers.py b/pfbudget/input/parsers.py index 22bd888..facacf8 100644 --- a/pfbudget/input/parsers.py +++ b/pfbudget/input/parsers.py @@ -4,7 +4,8 @@ from importlib import import_module import datetime as dt import yaml -from pfbudget.common.types import NoBankSelected, Transaction, Transactions +from pfbudget.common.types import NoBankSelected +from pfbudget.db.model import Transaction from pfbudget.utils import utils Index = namedtuple( @@ -43,7 +44,7 @@ Options = namedtuple( ) -def parse_data(filename: str, args: dict) -> Transactions: +def parse_data(filename: str, args: dict) -> list[Transaction]: cfg: dict = yaml.safe_load(open("parsers.yaml")) assert ( "Banks" in cfg @@ -157,7 +158,7 @@ class Parser: category = line[options.category] transaction = Transaction(date, text, bank, value, category) else: - transaction = Transaction(date, text, bank, value, options.category) + transaction = Transaction(date, text, bank, value) if options.additional_parser: func(transaction)