diff options
| -rw-r--r-- | src/__init__.py | 0 | ||||
| -rw-r--r-- | src/__pycache__/args_worklogger.cpython-312.pyc | bin | 0 -> 2223 bytes | |||
| -rw-r--r-- | src/args_worklogger.py | 89 | ||||
| -rw-r--r-- | src/logs/WorkLogger.log | 91 | ||||
| -rw-r--r-- | src/utils/__init__.py | 0 | ||||
| -rw-r--r-- | src/utils/__pycache__/__init__.cpython-312.pyc | bin | 0 -> 158 bytes | |||
| -rw-r--r-- | src/utils/__pycache__/log_util.cpython-312.pyc | bin | 0 -> 1238 bytes | |||
| -rw-r--r-- | src/utils/__pycache__/paths_util.cpython-312.pyc | bin | 0 -> 665 bytes | |||
| -rw-r--r-- | src/utils/log_util.py | 47 | ||||
| -rw-r--r-- | src/utils/paths_util.py | 10 | ||||
| -rw-r--r-- | src/worklog.py | 140 |
11 files changed, 377 insertions, 0 deletions
diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/__init__.py diff --git a/src/__pycache__/args_worklogger.cpython-312.pyc b/src/__pycache__/args_worklogger.cpython-312.pyc Binary files differnew file mode 100644 index 0000000..6f49f37 --- /dev/null +++ b/src/__pycache__/args_worklogger.cpython-312.pyc diff --git a/src/args_worklogger.py b/src/args_worklogger.py new file mode 100644 index 0000000..718f6c1 --- /dev/null +++ b/src/args_worklogger.py @@ -0,0 +1,89 @@ +""" +ARGUMENTS FILE FOR WORKLOGGER +author: Wacky404 +email: wacky404@dev.com +""" +import argparse + +# worklog -j paces -p interconnection -l university -t 2 -s 12:00 am -e 1:00 PM + +parser = argparse.ArgumentParser( + prog='WorkLogger', + description="Log time efficiently, accurately, and reliably " + "directly from the terminal you work in.", +) + +parser.add_argument( + '-c', + '--configure', + action='store_true', + help='check/create directories that will be used in WorkLogger', +) + +parser.add_argument( + '-l', + '--log', + action='store', + default='INFO', # NOTSET=0, DEBUG=10, INFO=20, WARNING=30, ERROR=40, CRITICAL=50 + help='DEBUG: Detailed information for diagnosing problems | ' + 'INFO: Confirmation that things are working | ' + 'WARNING: Indication that something unexpected happened. Program still running | ' + 'ERROR: Not able to perform some function of the program | ' + 'CRITICAL: Serious error, program may be unable to continue running', +) + +parser.add_argument( + '-v', + '--verbose', + action='store_false', + help='turn on/off the verboseness of the program when run', +) + +parser.add_argument( + '-j', + '--job', + action='store', + help='Add a job for the work done, to be logged with your insertion', +) + +parser.add_argument( + '-p', + '--project', + action='store', + help='', +) + +parser.add_argument( + '-loc', + '--location', + action='store', + help='Add a location for the work done, to be logged with your insertion', +) + +parser.add_argument( + '-t', + '--time', + action='store', + default=0 +) + +parser.add_argument( + '-s', + '--start', + action='store', + help='Add a start time for the work done, to be logged with your insertion', +) + +parser.add_argument( + '-e', + '--end', + action='store', + help='Add a end time for the work done, to be logged with your insertion', +) + +parser.add_argument( + '-m', + '--message', + action='store', + help='Add a message to accompany your worklog entry' +) diff --git a/src/logs/WorkLogger.log b/src/logs/WorkLogger.log new file mode 100644 index 0000000..e4b9db2 --- /dev/null +++ b/src/logs/WorkLogger.log @@ -0,0 +1,91 @@ +[DEBUG|worklog|L88] 2024-10-02T12:40:56-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L32] 2024-10-02T12:40:56-0500: Directory ~/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L32] 2024-10-02T12:40:56-0500: Directory ~/Documents/worklogger created +[DEBUG|worklog|L32] 2024-10-02T12:40:56-0500: Directory ~/Documents/GitHub/worklogger created +[INFO|worklog|L64] 2024-10-02T12:40:56-0500: Written paces worklog to ~/Documents/GitHub/worklogger/Output +[INFO|worklog|L64] 2024-10-02T12:40:56-0500: Written paces worklog to ~/Documents/worklogger +[DEBUG|worklog|L88] 2024-10-02T12:48:58-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L32] 2024-10-02T12:48:58-0500: Directory /Users/cole/Documents/GitHub/worklogger/src/~/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L32] 2024-10-02T12:48:58-0500: Directory /Users/cole/Documents/GitHub/worklogger/src/~/Documents/worklogger created +[DEBUG|worklog|L32] 2024-10-02T12:48:58-0500: Directory /Users/cole/Documents/GitHub/worklogger/src/~/Documents/GitHub/worklogger created +[INFO|worklog|L64] 2024-10-02T12:48:58-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/src/~/Documents/GitHub/worklogger/Output +[INFO|worklog|L64] 2024-10-02T12:48:58-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/src/~/Documents/worklogger +[DEBUG|worklog|L88] 2024-10-02T12:49:33-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L87] 2024-10-02T12:58:15-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L87] 2024-10-02T13:00:06-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L87] 2024-10-02T13:01:34-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L87] 2024-10-02T13:05:12-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L87] 2024-10-02T13:13:47-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L87] 2024-10-02T13:15:57-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L87] 2024-10-02T13:19:16-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L31] 2024-10-02T13:19:16-0500: Directory /Users/cole/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L31] 2024-10-02T13:19:16-0500: Directory /Users/cole/Documents/worklogger created +[DEBUG|worklog|L31] 2024-10-02T13:19:16-0500: Directory /Users/cole/Documents/GitHub/worklogger created +[INFO|worklog|L63] 2024-10-02T13:19:16-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L63] 2024-10-02T13:19:16-0500: Written paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L89] 2024-10-02T13:45:28-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L32] 2024-10-02T13:45:28-0500: Directory /Users/cole/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L32] 2024-10-02T13:45:28-0500: Directory /Users/cole/Documents/worklogger created +[DEBUG|worklog|L32] 2024-10-02T13:45:28-0500: Directory /Users/cole/Documents/GitHub/worklogger created +[ERROR|worklog|L125] 2024-10-02T13:45:28-0500: [Errno 17] File exists: '/Users/cole/Documents/GitHub/worklogger/Output/great company.txt' +Traceback (most recent call last): + File "/Users/cole/Documents/GitHub/worklogger/src/worklog.py", line 120, in <module> + with open(filepath, 'x'): + ^^^^^^^^^^^^^^^^^^^ +FileExistsError: [Errno 17] File exists: '/Users/cole/Documents/GitHub/worklogger/Output/great company.txt' +[INFO|worklog|L65] 2024-10-02T13:45:28-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L65] 2024-10-02T13:45:28-0500: Written paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L89] 2024-10-02T13:47:50-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L32] 2024-10-02T13:47:50-0500: Directory /Users/cole/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L32] 2024-10-02T13:47:50-0500: Directory /Users/cole/Documents/worklogger created +[DEBUG|worklog|L32] 2024-10-02T13:47:50-0500: Directory /Users/cole/Documents/GitHub/worklogger created +[ERROR|worklog|L125] 2024-10-02T13:47:50-0500: [Errno 17] File exists: '/Users/cole/Documents/GitHub/worklogger/Output/great company.txt' +Traceback (most recent call last): + File "/Users/cole/Documents/GitHub/worklogger/src/worklog.py", line 120, in <module> + with open(filepath, 'x'): + ^^^^^^^^^^^^^^^^^^^ +FileExistsError: [Errno 17] File exists: '/Users/cole/Documents/GitHub/worklogger/Output/great company.txt' +[INFO|worklog|L65] 2024-10-02T13:47:50-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L65] 2024-10-02T13:47:50-0500: Written paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L89] 2024-10-02T13:55:02-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L32] 2024-10-02T13:55:02-0500: Directory /Users/cole/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L32] 2024-10-02T13:55:02-0500: Directory /Users/cole/Documents/worklogger created +[DEBUG|worklog|L32] 2024-10-02T13:55:02-0500: Directory /Users/cole/Documents/GitHub/worklogger created +[INFO|worklog|L65] 2024-10-02T13:55:02-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L65] 2024-10-02T13:55:02-0500: Written paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L90] 2024-10-02T14:02:05-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L33] 2024-10-02T14:02:05-0500: Directory /Users/cole/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L33] 2024-10-02T14:02:05-0500: Directory /Users/cole/Documents/worklogger created +[DEBUG|worklog|L33] 2024-10-02T14:02:05-0500: Directory /Users/cole/Documents/GitHub/worklogger created +[INFO|worklog|L66] 2024-10-02T14:02:05-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L66] 2024-10-02T14:02:05-0500: Written paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L90] 2024-10-02T14:14:03-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L33] 2024-10-02T14:14:03-0500: Directory /Users/cole/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L33] 2024-10-02T14:14:03-0500: Directory /Users/cole/Documents/worklogger created +[DEBUG|worklog|L33] 2024-10-02T14:14:03-0500: Directory /Users/cole/Documents/GitHub/worklogger created +[INFO|worklog|L66] 2024-10-02T14:14:03-0500: Written PACES worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L66] 2024-10-02T14:14:03-0500: Written PACES worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L92] 2024-10-02T14:16:30-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[DEBUG|worklog|L33] 2024-10-02T14:16:30-0500: Directory /Users/cole/Documents/GitHub/worklogger/Output created +[DEBUG|worklog|L33] 2024-10-02T14:16:30-0500: Directory /Users/cole/Documents/worklogger created +[DEBUG|worklog|L33] 2024-10-02T14:16:30-0500: Directory /Users/cole/Documents/GitHub/worklogger created +[INFO|worklog|L68] 2024-10-02T14:16:30-0500: Written PACES worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L68] 2024-10-02T14:16:30-0500: Written PACES worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L92] 2024-10-02T14:20:54-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[INFO|worklog|L68] 2024-10-02T14:20:54-0500: Written PACES worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L68] 2024-10-02T14:20:54-0500: Written PACES worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L93] 2024-10-02T14:25:12-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[INFO|worklog|L69] 2024-10-02T14:25:12-0500: Written paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L69] 2024-10-02T14:25:12-0500: Written paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L93] 2024-10-02T14:27:30-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[INFO|worklog|L69] 2024-10-02T14:27:30-0500: Written Paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L69] 2024-10-02T14:27:30-0500: Written Paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L96] 2024-10-02T14:32:25-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[INFO|worklog|L72] 2024-10-02T14:32:25-0500: Written Paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L72] 2024-10-02T14:32:25-0500: Written Paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L96] 2024-10-02T14:33:42-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[INFO|worklog|L72] 2024-10-02T14:33:42-0500: Written Paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L72] 2024-10-02T14:33:42-0500: Written Paces worklog to /Users/cole/Documents/worklogger +[DEBUG|worklog|L96] 2024-10-02T14:35:11-0500: Using user config file in /Users/cole/Documents/GitHub/worklogger/src/../.workloggerconfig.json +[INFO|worklog|L72] 2024-10-02T14:35:11-0500: Written Paces worklog to /Users/cole/Documents/GitHub/worklogger/Output +[INFO|worklog|L72] 2024-10-02T14:35:11-0500: Written Paces worklog to /Users/cole/Documents/worklogger diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/utils/__init__.py diff --git a/src/utils/__pycache__/__init__.cpython-312.pyc b/src/utils/__pycache__/__init__.cpython-312.pyc Binary files differnew file mode 100644 index 0000000..20a31d8 --- /dev/null +++ b/src/utils/__pycache__/__init__.cpython-312.pyc diff --git a/src/utils/__pycache__/log_util.cpython-312.pyc b/src/utils/__pycache__/log_util.cpython-312.pyc Binary files differnew file mode 100644 index 0000000..490312e --- /dev/null +++ b/src/utils/__pycache__/log_util.cpython-312.pyc diff --git a/src/utils/__pycache__/paths_util.cpython-312.pyc b/src/utils/__pycache__/paths_util.cpython-312.pyc Binary files differnew file mode 100644 index 0000000..a2e95ae --- /dev/null +++ b/src/utils/__pycache__/paths_util.cpython-312.pyc diff --git a/src/utils/log_util.py b/src/utils/log_util.py new file mode 100644 index 0000000..7c31a32 --- /dev/null +++ b/src/utils/log_util.py @@ -0,0 +1,47 @@ +import logging.config + + +# TODO: can't configure queue_handler easily as of 3.11 python only available on 3.12 +logger = logging.getLogger("WorkLogger") + + +def setup_logging(log_lvl_stdout='WARNING') -> None: + logging_config: dict = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "simple": { + "format": "%(levelname)s: %(message)s", + }, + "detailed": { + "format": "[%(levelname)s|%(module)s|L%(lineno)d] %(asctime)s: %(message)s", + "datefmt": "%Y-%m-%dT%H:%M:%S%z", + }, + }, + "handlers": { + "stdout": { + "class": "logging.StreamHandler", + "level": log_lvl_stdout, + "formatter": "simple", + "stream": "ext://sys.stdout", + }, + "file": { + "class": "logging.handlers.RotatingFileHandler", + "level": "DEBUG", + "formatter": "detailed", + "filename": "logs/WorkLogger.log", + "maxBytes": 5000000, # 5 mb + "backupCount": 5, + }, + }, + "loggers": { + "root": { + "level": "DEBUG", + "handlers": [ + "stdout", + "file", + ], + }, + }, + } + logging.config.dictConfig(logging_config) diff --git a/src/utils/paths_util.py b/src/utils/paths_util.py new file mode 100644 index 0000000..78e3e0e --- /dev/null +++ b/src/utils/paths_util.py @@ -0,0 +1,10 @@ +import os.path as osp +import os +import sys + + +os_home = osp.expanduser("~") +cwd = os.getcwd() +path_to_doc = osp.join(os_home, str('Documents')) +output_dir = osp.join(path_to_doc, str('workloggerOutput')) +log_dir = osp.join(cwd, str('logs')) diff --git a/src/worklog.py b/src/worklog.py new file mode 100644 index 0000000..4638484 --- /dev/null +++ b/src/worklog.py @@ -0,0 +1,140 @@ +from pathlib import Path +from utils.log_util import logger, setup_logging + +from args_worklogger import parser +from utils import paths_util as pu +import logging + +import os.path as osp +import os +import sys +import json +from datetime import timezone +import datetime + +SAVEPATH: Path | str +BACKUPPATH: Path | str +CONFIGPATH: Path | str + +formats: dict = { + "TEXT": '.txt', + "JSON": '.json', +} + +# creates a NameSpace of arguments that were made +args = parser.parse_args() + + +def configure(dir_list: list | None = None) -> None: + if dir_list is not None: + for directory in dir_list: + try: + os.makedirs(name=directory, exist_ok=True) + logger.debug(f"Directory {directory} created") + + except FileExistsError as e: + logger.exception(f"An exception of type {type(e).__name__} occurred. " + f"Details: This is okay, output will save in existing {directory}.") + else: + for directory in [pu.output_dir, pu.log_dir]: + try: + os.makedirs(name=directory, exist_ok=True) + logger.debug(f"Directory {directory} created") + + except FileExistsError as e: + logger.exception(f"An exception of type {type(e).__name__} occurred. " + f"Details: This is okay, output will save in existing {directory}.") + + +def add_log(job=args.job, proj=args.project, loc=args.location, time=args.time, start=args.start, end=args.end, + desc=args.message, file_format=None) -> None: + # TODO: Add in functionality to convert project input arg to key value pair from settings + func_args = locals() + dt = datetime.datetime.now(timezone.utc) + log_str = f"{dt.strftime("%Y-%m-%dT%H:%M:%S%Z")} " + for key, val in func_args.items(): + if key == 'time' and val is not None: + log_str += f"{key}:{val}hrs " + elif key == 'desc' and val is not None: + log_str += f"{key}:'{val}'" + elif val is not None and key != 'file_format': + log_str += f"{key}:{val} " + + job_upper = str(job).upper() + for path in [SAVEPATH, BACKUPPATH]: + if file_format != None: + chosen_job = osp.join(path, f"{job_upper}{file_format}") + else: + chosen_job = osp.join(path, f"{job_upper}.txt") + + with open(chosen_job, 'a') as fd: + fd.write(f"{log_str}\n") + + logger.info(f"Written {func_args['job']} worklog to {path}") + + +if args.configure: + configure() + logger.info("Configuration completed.") + sys.exit() + +numeric_loglevel = getattr(logging, str(args.log).upper()) +if isinstance(numeric_loglevel, int): + setup_logging(numeric_loglevel) +else: + setup_logging() + + +dotfile: list | None = None +if osp.exists(osp.join(os.getcwd(), os.pardir)): + dotfile = list(Path(osp.join(os.getcwd(), os.pardir)).glob( + '**/*.workloggerconfig.json')) + if len(dotfile) > 1: + logger.error( + f"You have {len(dotfile)} config files, using defaults...") + dotfile = None + else: + logger.debug(f"Using user config file in {str(dotfile[0])}") + +settings = None +if dotfile is not None: + with open(dotfile[0], 'r') as fd: + try: + settings = json.load(fd) + except Exception as e: + logger.exception(str(e)) + if args.verbose: + print("There was an error loading your config.") + print("Using defaults") + +if settings is not None: + SAVEPATH = Path(osp.join(osp.expanduser("~"), settings['savepath'])) + BACKUPPATH = Path(osp.join(osp.expanduser("~"), settings['backuppath'])) + CONFIGPATH = Path(osp.join(osp.expanduser("~"), settings['configpath'])) + numeric_loglevel_settings = getattr( + logging, str(settings['loglvl']).upper()) + setup_logging(numeric_loglevel_settings) + dir_list: list = [d for d in [ + SAVEPATH, BACKUPPATH, CONFIGPATH] if not osp.exists(d)] + if len(dir_list) > 0: + configure(dir_list=dir_list) + + +jobs_names = [str(j['name']).upper() for j in settings['jobs']] +try: + for name in jobs_names: + filepath = osp.join(SAVEPATH, f"{name}.txt") + filepath_backup = osp.join(BACKUPPATH, f"{name}.txt") + if not osp.exists(filepath): + with open(filepath, 'x'): + pass + if not osp.exists(filepath_backup): + with open(filepath_backup, 'x'): + pass +except Exception as e: + logger.exception(str(e)) + +if settings is not None: + add_log(file_format=formats[str(settings['fileformat']).upper()]) +else: + add_log() |
