From 5744a6efa9a9c960023a6ac2e89e902d85d1e6a5 Mon Sep 17 00:00:00 2001 From: Andreas Balogh Date: Thu, 14 Mar 2024 22:17:41 +0100 Subject: [PATCH] migrate snippets from gitlab --- .project | 17 ++++++++++++++++ eclipse-main-template.py | 44 ++++++++++++++++++++++++++++++++++++++++ pickle_cache.py | 40 ++++++++++++++++++++++++++++++++++++ python_default_logger.py | 7 +++++++ tk_task_wrapper.py | 24 ++++++++++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 .project create mode 100644 eclipse-main-template.py create mode 100644 pickle_cache.py create mode 100644 python_default_logger.py create mode 100644 tk_task_wrapper.py diff --git a/.project b/.project new file mode 100644 index 0000000..21854f1 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + snippets + + + + + + org.python.pydev.PyDevBuilder + + + + + + org.python.pydev.pythonNature + + diff --git a/eclipse-main-template.py b/eclipse-main-template.py new file mode 100644 index 0000000..b10b412 --- /dev/null +++ b/eclipse-main-template.py @@ -0,0 +1,44 @@ +#!python3 +# Created 5 Jul 2019 Andreas Balogh +# @author: baloan + +""" Module: Main Template """ + +from argparse import ArgumentParser +import logging +import sys +import os + +LOG = logging.getLogger() + + +def cli(argv=None): + # command line interface + if argv is None: + argv = sys.argv + LOG.info("%s %s", os.path.basename(argv[0]), " ".join(argv[1:])) + parser = ArgumentParser(description="Module Template") + parser.add_argument("action", help="mock action verb") + parser.add_argument("--database", help="database connection") + parser.add_argument("--config_file", help="json filepath, not used by mock") + parser.add_argument("--env", default=argparse.SUPPRESS, help="dump environment") + args = parser.parse_args(argv[1:]) + argd = vars(args) + # arguments + for k, v in argd.items(): + print(k, v) + # enviroment + if "env" in argd: + for k, v in os.environ.items(): + print(k, v) + # feature + LOG.info("done") + return 0 + + +if __name__ == "__main__": + logging.Formatter.default_time_format = '%H:%M:%S' + logging.Formatter.default_msec_format = '%s.%03d' + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s [%(process)i] %(levelname).4s %(module)s.%(funcName)s: %(message)s') + sys.exit(cli()) diff --git a/pickle_cache.py b/pickle_cache.py new file mode 100644 index 0000000..2a535f1 --- /dev/null +++ b/pickle_cache.py @@ -0,0 +1,40 @@ +def pickle_cache(mode="auto"): + + def pc_decorator(func): + + def pc_wrapper(*args, **kwargs): + cache_fp = Path(PROXY_DIR, f"{func.__name__}.pickle") + today = dt.date.today() + if cache_fp.exists(): + statinfo = cache_fp.stat() + # (st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime, st_ctime) = statinfo + (_, _, _, _, _, _, _, _, st_mtime, _) = statinfo + mdate = dt.datetime.fromtimestamp(st_mtime).date() + else: + mdate = None + if mode == "auto": + if cache_fp.exists() and mdate == today: + action = "cached" + else: + action = "query" + else: + action = mode + if action == "cached" : + LOG.info(f"{func.__name__}: loading cached data...") + with cache_fp.open("rb") as fh: + rc = pickle.load(fh) + elif action == "query": + LOG.info(f"{func.__name__}: database access...") + rc = func(*args, **kwargs) + if cache_fp.exists() and mdate != today and Path(PROXY_DIR, "Archive").exists(): + archive_fp = Path(PROXY_DIR, "Archive", f"{func.__name__}-{mdate:%Y%m%d}.pickle") + shutil.copy(cache_fp, archive_fp) + with cache_fp.open("wb") as fh: + pickle.dump(rc, fh) + else: + LOG.error(f"{func.__name__}: mode {action} unknown") + return rc + + return pc_wrapper + + return pc_decorator diff --git a/python_default_logger.py b/python_default_logger.py new file mode 100644 index 0000000..2e46ae7 --- /dev/null +++ b/python_default_logger.py @@ -0,0 +1,7 @@ +import logging + +LOG=logging.getLogger() + +logging.Formatter.default_time_format='%H:%M:%S' +logging.Formatter.default_msec_format='%s.%03d' +logging.basicConfig(level=logging.DEBUG, format='%(asctime)s [%(process)i] %(levelname).4s %(module)s.%(funcName)s: %(message)s' diff --git a/tk_task_wrapper.py b/tk_task_wrapper.py new file mode 100644 index 0000000..f89fe3a --- /dev/null +++ b/tk_task_wrapper.py @@ -0,0 +1,24 @@ +def long_running_task(status): + " status decorator " + + def lrt_decorator(func): + + def lrt_wrapper(*args, **kwargs): + self = args[0] + self.lb12["text"] = status + self.bu10.state(['disabled']) + self.bu11.state(['disabled']) + self.update_idletasks() + try: + rc = func(*args, **kwargs) + finally: + # make sure GUI unlocks even after exception + self.lb12["text"] = "Ready." + self.bu10.state(['!disabled']) + self.bu11.state(['!disabled']) + self.update_idletasks() + return rc + + return lrt_wrapper + + return lrt_decorator