Changed run logic to adjust to SQLite db

Removed init and restart functions and writes to state file.
Moved create tables to init method of DBManager and launch from init
command.
Restart removed.
Rearranged order in runnable.py according to sections.

Only init command working since rest of runnable function not updated
at the moment.
This commit is contained in:
Luís Murta 2021-06-03 23:11:52 +01:00
parent 1c2c64f9fe
commit 4d9e8edec8
Signed by: satprog
GPG Key ID: DDF2EFC6179009DC
3 changed files with 56 additions and 95 deletions

View File

@ -27,7 +27,7 @@ args=(sys.stdout,)
class=FileHandler class=FileHandler
level=NOTSET level=NOTSET
formatter=complex formatter=complex
args=('logs/pfbudget.log',) args=('logs/pfbudget.log', 'a',)
[formatter_simple] [formatter_simple]
format=%(asctime)s %(message)s format=%(asctime)s %(message)s

View File

@ -1,9 +1,9 @@
import sqlite3 import csv
import datetime
import logging import logging
import logging.config import logging.config
import pathlib import pathlib
import sqlite3
if not pathlib.Path("logs").is_dir(): if not pathlib.Path("logs").is_dir():
pathlib.Path("logs").mkdir() pathlib.Path("logs").mkdir()
@ -87,17 +87,11 @@ FROM transactions
class DBManager: class DBManager:
"""SQLite DB connection manager""" """SQLite DB connection manager"""
__EXPORT_DIR = "export"
def __init__(self, db): def __init__(self, db):
self.db = db self.db = db
self.__create_tables(
(
("transactions", CREATE_TRANSACTIONS_TABLE),
("vacations", CREATE_VACATIONS_TABLE),
("backups", CREATE_BACKUPS_TABLE),
)
)
def __execute(self, query, params=None): def __execute(self, query, params=None):
ret = None ret = None
try: try:
@ -140,6 +134,19 @@ class DBManager:
logger.info(f"Creating table if it doesn't exist {table_name}") logger.info(f"Creating table if it doesn't exist {table_name}")
self.__execute(query) self.__execute(query)
def query(self, query, params=None):
logger.info(f"Executing {query} with params={params}")
return self.__execute(query, params)
def init(self):
self.__create_tables(
(
("transactions", CREATE_TRANSACTIONS_TABLE),
("vacations", CREATE_VACATIONS_TABLE),
("backups", CREATE_BACKUPS_TABLE),
)
)
def select_all(self): def select_all(self):
logger.info(f"Reading all transactions from {self.db}") logger.info(f"Reading all transactions from {self.db}")
return self.__execute("SELECT * FROM transactions") return self.__execute("SELECT * FROM transactions")
@ -176,6 +183,13 @@ class DBManager:
logger.info(f"Get transactions by {period}") logger.info(f"Get transactions by {period}")
return self.__execute(SELECT_TRANSACTION_BY_PERIOD, period) return self.__execute(SELECT_TRANSACTION_BY_PERIOD, period)
def query(self, query, params=None): def export(self):
logger.info(f"Executing {query} with params={params}") filename = pathlib.Path(
return self.__execute(query, params) "@".join([self.db, datetime.datetime.now().isoformat()])
).with_suffix(".csv")
logger.info(f"Exporting {self.db} into {filename}")
transactions = self.select_all()
if not (dir := pathlib.Path(self.__EXPORT_DIR)).is_dir():
dir.mkdir()
with open(dir / filename, "w", newline="") as f:
csv.writer(f, delimiter="\t").writerows(transactions)

View File

@ -2,12 +2,14 @@ from pathlib import Path
import argparse import argparse
import datetime as dt import datetime as dt
from .database import DBManager
from .graph import discrete, monthly from .graph import discrete, monthly
from .state import pfstate
from .transactions import load_transactions, save_transactions from .transactions import load_transactions, save_transactions
from . import report from . import report
from . import tools from . import tools
DEFAULT_DB = "data.db"
class PfBudgetInitialized(Exception): class PfBudgetInitialized(Exception):
pass pass
@ -21,18 +23,31 @@ class DataFileMissing(Exception):
pass pass
def get_argparser(): def argparser():
parser = argparse.ArgumentParser(description="does cool finance stuff") parser = argparse.ArgumentParser(description="does cool finance stuff")
parser.add_argument("--db", help="select current database", default=DEFAULT_DB)
parser.add_argument("-q", "--quiet", help="quiet") parser.add_argument("-q", "--quiet", help="quiet")
parser.add_argument("--version")
subparsers = parser.add_subparsers( subparsers = parser.add_subparsers(
dest="task", required=True, help="sub-command help" dest="command", required=True, help="sub-command help"
) )
"""
Init
"""
p_init = subparsers.add_parser("init", help="init help") p_init = subparsers.add_parser("init", help="init help")
p_restart = subparsers.add_parser("restart", help="restart help") p_init.set_defaults(func=lambda args: DBManager(args.db))
p_backup = subparsers.add_parser("backup", help="backup help")
"""
Exporting
"""
p_export = subparsers.add_parser("export", help="export help")
p_export.set_defaults(func=lambda args: DBManager(args.db).export())
p_parse = subparsers.add_parser("parse", help="parse help") p_parse = subparsers.add_parser("parse", help="parse help")
# p_restart = subparsers.add_parser("restart", help="restart help")
p_vacation = subparsers.add_parser( p_vacation = subparsers.add_parser(
"vacation", help="vacation help format: [YYYY/MM/DD]" "vacation", help="vacation help format: [YYYY/MM/DD]"
) )
@ -40,20 +55,11 @@ def get_argparser():
p_report = subparsers.add_parser("report", help="report help") p_report = subparsers.add_parser("report", help="report help")
p_status = subparsers.add_parser("status", help="status help") p_status = subparsers.add_parser("status", help="status help")
p_init.add_argument("raw", help="the raw data dir") # p_restart.add_argument("--raw", help="new raw data dir")
p_init.add_argument("data", help="the parsed data dir") # p_restart.add_argument("--data", help="new parsed data dir")
p_restart.add_argument("--raw", help="new raw data dir") # p_export.add_argument("option", type=str, choices=["single", "all", "restore"], nargs="?", default="single",
p_restart.add_argument("--data", help="new parsed data dir") # help="backup option help")
p_backup.add_argument(
"option",
type=str,
choices=["single", "all", "restore"],
nargs="?",
default="single",
help="backup option help",
)
subparser_vacation = p_vacation.add_subparsers( subparser_vacation = p_vacation.add_subparsers(
dest="option", required=True, help="vacation suboption help" dest="option", required=True, help="vacation suboption help"
@ -85,10 +91,8 @@ def get_argparser():
p_graph_interval.add_argument("--end", type=str, nargs=1, help="graph end date") p_graph_interval.add_argument("--end", type=str, nargs=1, help="graph end date")
p_graph_interval.add_argument("--year", type=str, nargs=1, help="graph year") p_graph_interval.add_argument("--year", type=str, nargs=1, help="graph year")
p_init.set_defaults(func=init)
p_restart.set_defaults(func=restart)
p_backup.set_defaults(func=backup)
p_parse.set_defaults(func=parse) p_parse.set_defaults(func=parse)
# p_restart.set_defaults(func=restart)
p_vacation.set_defaults(func=vacation) p_vacation.set_defaults(func=vacation)
p_status.set_defaults(func=status) p_status.set_defaults(func=status)
p_graph.set_defaults(func=graph) p_graph.set_defaults(func=graph)
@ -97,43 +101,6 @@ def get_argparser():
return parser return parser
def init(state, args):
"""Initialization
Creates the state file which stores the internal state of the program
for later use.
Calls parse, that parses all raw files into the data directory.
Args:
state (PFState): Internal state of the program
args (dict): argparse variables
Raises:
PfBudgetInitialized: Raised when there's already an initialized state
"""
if not state:
s = dict(
filename=tools.STATE_FILE,
raw_dir=args.raw,
data_dir=args.data,
raw_files=[],
data_files=[],
vacations=[],
last_backup="",
last_datadir_backup="",
)
try:
state = 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(f"{Path(tools.STATE_FILE)} already exists")
def restart(state, args): def restart(state, args):
"""Restart """Restart
@ -167,23 +134,6 @@ def restart(state, args):
raise PfBudgetNotInitialized(f"{Path(tools.STATE_FILE)} doesn't exist") raise PfBudgetNotInitialized(f"{Path(tools.STATE_FILE)} doesn't exist")
def backup(state, args):
"""Backup
Saves all transactions on transactions_#.csv
Args:
state (PFState): Internal state of the program
args (dict): argparse variables
"""
if args.option == "single":
tools.backup(state)
elif args.option == "all":
tools.full_backup(state)
elif args.option == "restore":
tools.restore(state)
def parse(state, args): def parse(state, args):
"""Parser """Parser
@ -299,8 +249,5 @@ def f_report(state, args):
def run(): def run():
parser = get_argparser() args = argparser().parse_args()
args = parser.parse_args() args.func(args)
state = pfstate(tools.STATE_FILE)
args.func(state, args)