Move the token creation/renewal code into the NordigenClient and remove external access. The NordigenClient now also takes the DB client in the constructor. While creating the unit test, noticed that the nordigen mocks for downloaded transactions could match the simple transactions mock, thus helping in the online download command. Also created the nordigen.NordigenClient mock, with the used methods mocked and raising a NotImplement when a new endpoint is requested.
277 lines
9.6 KiB
Python
277 lines
9.6 KiB
Python
from pfbudget.cli.argparser import argparser
|
|
from pfbudget.cli.interactive import Interactive
|
|
from pfbudget.common.types import Operation
|
|
from pfbudget.core.manager import Manager
|
|
import pfbudget.db.model as type
|
|
from pfbudget.utils.utils import parse_args_period
|
|
|
|
|
|
if __name__ == "__main__":
|
|
argparser = argparser()
|
|
args = vars(argparser.parse_args())
|
|
|
|
assert "op" in args, "No Operation selected"
|
|
op: Operation = args.pop("op")
|
|
|
|
assert "database" in args, "No database selected"
|
|
db = args.pop("database")
|
|
|
|
assert "verbose" in args, "No verbose level specified"
|
|
verbosity = args.pop("verbose")
|
|
|
|
params = []
|
|
match (op):
|
|
case Operation.ManualCategorization:
|
|
Interactive(Manager(db, verbosity)).start()
|
|
exit()
|
|
|
|
case Operation.Categorize:
|
|
keys = {"no_nulls"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["no_nulls"]]
|
|
|
|
case Operation.Parse:
|
|
keys = {"path", "bank", "creditcard"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["path"], args["bank"], args["creditcard"]]
|
|
|
|
case Operation.RequisitionId:
|
|
keys = {"bank"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["bank"][0]]
|
|
|
|
case Operation.Download:
|
|
keys = {"all", "banks", "interval", "start", "end", "year", "dry_run"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
start, end = parse_args_period(args)
|
|
params = [start, end, args["dry_run"]]
|
|
|
|
if not args["all"]:
|
|
params.append(args["banks"])
|
|
else:
|
|
params.append(None)
|
|
|
|
case Operation.BankAdd:
|
|
keys = {"bank", "bic", "type"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.Bank(
|
|
args["bank"][0],
|
|
args["bic"][0],
|
|
args["type"][0],
|
|
)
|
|
]
|
|
|
|
case Operation.BankMod:
|
|
keys = {"bank", "bic", "type", "remove"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["bic", "type"]
|
|
|
|
param = {"name": args["bank"][0]}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params = [param]
|
|
|
|
case Operation.BankDel:
|
|
assert len(args["bank"]) > 0, "argparser ill defined"
|
|
params = args["bank"]
|
|
|
|
case Operation.PSD2Add:
|
|
keys = {"bank", "bank_id", "requisition_id", "invert"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.Nordigen(
|
|
args["bank"][0],
|
|
args["bank_id"][0] if args["bank_id"] else None,
|
|
args["requisition_id"][0] if args["requisition_id"] else None,
|
|
args["invert"] if args["invert"] else None,
|
|
)
|
|
]
|
|
|
|
case Operation.PSD2Mod:
|
|
keys = {"bank", "bank_id", "requisition_id", "invert", "remove"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["bank_id", "requisition_id"]
|
|
nargs_0 = ["invert"]
|
|
|
|
param = {"name": args["bank"][0]}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: v for k, v in args.items() if k in nargs_0}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params = [param]
|
|
|
|
case Operation.PSD2Del:
|
|
assert len(args["bank"]) > 0, "argparser ill defined"
|
|
params = args["bank"]
|
|
|
|
case Operation.PSD2CountryBanks:
|
|
keys = {"country"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["country"][0]]
|
|
|
|
case Operation.CategoryAdd:
|
|
keys = {"category", "group"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [type.Category(cat, args["group"]) for cat in args["category"]]
|
|
|
|
case Operation.CategoryUpdate:
|
|
keys = {"category", "group"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [{"name": cat, "group": args["group"]} for cat in args["category"]]
|
|
|
|
case Operation.CategoryRemove:
|
|
assert "category" in args, "argparser ill defined"
|
|
|
|
params = args["category"]
|
|
|
|
case Operation.CategorySchedule:
|
|
keys = {"category", "period", "frequency"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.CategorySchedule(
|
|
cat, args["period"][0], args["frequency"][0], None
|
|
)
|
|
for cat in args["category"]
|
|
]
|
|
|
|
case Operation.RuleAdd:
|
|
keys = {
|
|
"category",
|
|
"start",
|
|
"end",
|
|
"description",
|
|
"regex",
|
|
"bank",
|
|
"min",
|
|
"max",
|
|
}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.CategoryRule(
|
|
cat,
|
|
start=args["start"][0] if args["start"] else None,
|
|
end=args["end"][0] if args["end"] else None,
|
|
description=args["description"][0] if args["description"] else None,
|
|
regex=args["regex"][0] if args["regex"] else None,
|
|
bank=args["bank"][0] if args["bank"] else None,
|
|
min=args["min"][0] if args["min"] else None,
|
|
max=args["max"][0] if args["max"] else None,
|
|
)
|
|
for cat in args["category"]
|
|
]
|
|
|
|
case Operation.RuleRemove | Operation.TagRuleRemove:
|
|
keys = {"id"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = args["id"]
|
|
|
|
case Operation.RuleModify:
|
|
keys = {
|
|
"id",
|
|
"category",
|
|
"date",
|
|
"description",
|
|
"bank",
|
|
"min",
|
|
"max",
|
|
"remove",
|
|
}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["category", "date", "description", "regex", "bank", "min", "max"]
|
|
params = []
|
|
for id in args["id"]:
|
|
param = {"id": id}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params.append(param)
|
|
|
|
case Operation.TagAdd:
|
|
keys = {"tag"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [type.Tag(tag) for tag in args["tag"]]
|
|
|
|
case Operation.TagRuleAdd:
|
|
keys = {"tag", "start", "end", "description", "regex", "bank", "min", "max"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [
|
|
type.TagRule(
|
|
tag,
|
|
start=args["start"][0] if args["start"] else None,
|
|
end=args["end"][0] if args["end"] else None,
|
|
description=args["description"][0] if args["description"] else None,
|
|
regex=args["regex"][0] if args["regex"] else None,
|
|
bank=args["bank"][0] if args["bank"] else None,
|
|
min=args["min"][0] if args["min"] else None,
|
|
max=args["max"][0] if args["max"] else None,
|
|
)
|
|
for tag in args["tag"]
|
|
]
|
|
|
|
case Operation.TagRuleModify:
|
|
keys = {"id", "tag", "date", "description", "bank", "min", "max", "remove"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
nargs_1 = ["tag", "date", "description", "regex", "bank", "min", "max"]
|
|
params = []
|
|
for id in args["id"]:
|
|
param = {"id": id}
|
|
param |= {k: v[0] for k, v in args.items() if k in nargs_1 and args[k]}
|
|
param |= {k: None for k in args["remove"] if k in nargs_1}
|
|
|
|
params.append(param)
|
|
|
|
case Operation.GroupAdd:
|
|
assert "group" in args, "argparser ill defined"
|
|
params = [type.CategoryGroup(group) for group in args["group"]]
|
|
|
|
case Operation.GroupRemove:
|
|
assert "group" in args, "argparser ill defined"
|
|
params = args["group"]
|
|
|
|
case Operation.Forge | Operation.Dismantle:
|
|
keys = {"original", "links"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["original"][0], args["links"]]
|
|
|
|
case (
|
|
Operation.Export
|
|
| Operation.Import
|
|
| Operation.ExportBanks
|
|
| Operation.ImportBanks
|
|
| Operation.ExportCategoryRules
|
|
| Operation.ImportCategoryRules
|
|
| Operation.ExportTagRules
|
|
| Operation.ImportTagRules
|
|
| Operation.ExportCategories
|
|
| Operation.ImportCategories
|
|
| Operation.ExportCategoryGroups
|
|
| Operation.ImportCategoryGroups
|
|
):
|
|
keys = {"file", "format"}
|
|
assert args.keys() >= keys, f"missing {args.keys() - keys}"
|
|
|
|
params = [args["file"][0], args["format"][0]]
|
|
|
|
Manager(db, verbosity).action(op, params)
|