Update the parse operation

to coordinate with the manager
This commit is contained in:
Luís Murta 2023-01-06 22:05:01 +00:00
parent 55a5b09c45
commit 9500e808de
Signed by: satprog
GPG Key ID: 169EF1BBD7049F94
4 changed files with 35 additions and 47 deletions

View File

@ -16,6 +16,10 @@ if __name__ == "__main__":
params = None params = None
match (op): match (op):
case pfbudget.Operation.Parse:
assert args.keys() >= {"path", "bank", "creditcard"}
params = [args["path"], args["bank"], args["creditcard"]]
case pfbudget.Operation.RequisitionId: case pfbudget.Operation.RequisitionId:
assert args.keys() >= {"name", "country"}, "argparser ill defined" assert args.keys() >= {"name", "country"}, "argparser ill defined"
params = [args["name"][0], args["country"][0]] params = [args["name"][0], args["country"][0]]

View File

@ -86,20 +86,12 @@ def argparser() -> argparse.ArgumentParser:
) )
p_export.set_defaults(func=lambda args: DatabaseClient(args.database).export()) p_export.set_defaults(func=lambda args: DatabaseClient(args.database).export())
""" # Parse from .csv
Parsing parse = subparsers.add_parser("parse")
""" parse.set_defaults(op=Operation.Parse)
p_parse = subparsers.add_parser( parse.add_argument("path", nargs="+", type=str)
"parse", parse.add_argument("--bank", nargs=1, type=str)
description="Parses and adds the requested transactions into the selected database", parse.add_argument("--creditcard", nargs=1, type=str)
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)
""" """
Categorizing Categorizing
@ -209,22 +201,6 @@ def argparser() -> argparse.ArgumentParser:
return parser 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): def graph(args):
"""Plots the transactions over a period of time. """Plots the transactions over a period of time.

View File

@ -1,3 +1,5 @@
from pathlib import Path
from pfbudget.input.input import Input from pfbudget.input.input import Input
from pfbudget.input.nordigen import NordigenInput from pfbudget.input.nordigen import NordigenInput
from pfbudget.input.parsers import parse_data 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.core.categorizer import Categorizer
from pfbudget.utils import convert from pfbudget.utils import convert
from pfbudget.cli.runnable import parse
class Manager: class Manager:
def __init__(self, db: str, verbosity: int = 0, args: dict = {}): def __init__(self, db: str, verbosity: int = 0, args: dict = {}):
@ -34,9 +34,23 @@ class Manager:
match (op): match (op):
case Operation.Init: case Operation.Init:
pass pass
case Operation.Parse: case Operation.Parse:
# TODO this is a monstrosity, remove when possible # Adapter for the parse_data method. Can be refactored.
parse(self, self.args) 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: case Operation.Download:
client = NordigenInput() client = NordigenInput()
@ -44,8 +58,7 @@ class Manager:
client.start = params[0] client.start = params[0]
client.end = params[1] client.end = params[1]
transactions = client.parse() transactions = client.parse()
with self.db.session() as session: self.add_transactions(transactions)
session.add(transactions)
case Operation.Categorize: case Operation.Categorize:
with self.db.session() as session: with self.db.session() as session:
@ -143,14 +156,8 @@ class Manager:
# client = DatabaseClient(self.__db) # client = DatabaseClient(self.__db)
# client.unregister_bank(self.args["bank"][0]) # client.unregister_bank(self.args["bank"][0])
def parser(self, parser: Input): def parse(self, filename: str, args: dict):
transactions = parser.parse() return parse_data(filename, args)
print(transactions)
# self.add_transactions(transactions)
# def parse(self, filename: str):
# transactions = parse_data(filename, self.args)
# self.add_transactions(transactions)
# def transactions() -> list[Transaction]: # def transactions() -> list[Transaction]:
# pass # pass

View File

@ -4,7 +4,8 @@ from importlib import import_module
import datetime as dt import datetime as dt
import yaml 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 from pfbudget.utils import utils
Index = namedtuple( 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")) cfg: dict = yaml.safe_load(open("parsers.yaml"))
assert ( assert (
"Banks" in cfg "Banks" in cfg
@ -157,7 +158,7 @@ class Parser:
category = line[options.category] category = line[options.category]
transaction = Transaction(date, text, bank, value, category) transaction = Transaction(date, text, bank, value, category)
else: else:
transaction = Transaction(date, text, bank, value, options.category) transaction = Transaction(date, text, bank, value)
if options.additional_parser: if options.additional_parser:
func(transaction) func(transaction)