diff options
| author | Wayne-Cole <77279425+Wacky404@users.noreply.github.com> | 2024-12-19 01:06:07 -0600 |
|---|---|---|
| committer | Wayne-Cole <77279425+Wacky404@users.noreply.github.com> | 2024-12-19 01:06:07 -0600 |
| commit | fc89c79cf88c47a19a6162aa1d311b26d8376adb (patch) | |
| tree | a03b22bc4c52d84ee67a27c99854aad8ff2d89d7 | |
| parent | 5b94345217a6461091bfda17de75b7e07bd5e9a3 (diff) | |
| download | worklogger-fc89c79cf88c47a19a6162aa1d311b26d8376adb.tar.xz worklogger-fc89c79cf88c47a19a6162aa1d311b26d8376adb.zip | |
feat: worked on implementing merge subcommand functionality; almost finish
| -rw-r--r-- | src/args_worklogger.py | 31 | ||||
| -rw-r--r-- | src/funcs_worklogger.py | 72 | ||||
| -rw-r--r-- | src/funcs_worklogger.pyi | 3 | ||||
| -rwxr-xr-x | src/worklog | 17 |
4 files changed, 57 insertions, 66 deletions
diff --git a/src/args_worklogger.py b/src/args_worklogger.py index 836cc7f..4bb1f54 100644 --- a/src/args_worklogger.py +++ b/src/args_worklogger.py @@ -5,8 +5,19 @@ author: Wacky404 email: wacky404@dev.com """ +from funcs_worklogger import configure import argparse + +class action_configure(argparse.Action): + def __init__(self, option_strings, dest, **kwargs): + return super().__init__(option_strings, dest, nargs=0, default=argparse.SUPPRESS, **kwargs) + + def __call__(self, parser, namespace, values, option_strings, **kwargs): + configure(dir_list=None) + parser.exit() + + parser = argparse.ArgumentParser( prog='WorkLogger', description="Log time efficiently, accurately, and reliably " @@ -16,8 +27,8 @@ parser = argparse.ArgumentParser( parser.add_argument( '-c', '--configure', - action='store_true', - help='check/create directories that will be used in WorkLogger', + action=action_configure, + help='check/create, log & output, directories that will be used in WorkLogger', ) parser.add_argument( @@ -43,7 +54,7 @@ parser.add_argument( parser.add_argument( 'job', action='store', - help='Add a job for the work done, to be logged with your insertion', + help='(required) Add a job for the work done, to be logged with your insertion', ) parser.add_argument( @@ -92,13 +103,13 @@ parser.add_argument( subparsers = parser.add_subparsers(help='subcommand help') parser_merge = subparsers.add_parser( - 'merge', help='Merge Records of a job and specified file extension' + 'merge', + help='Merge Records of a job and specified file extension' ) # Merge Functionality parser_merge.add_argument( - '-ext', - '--extension', + 'extension', action='store', choices=['csv', 'text', 'json'], default='csv', @@ -106,15 +117,9 @@ parser_merge.add_argument( ) parser_merge.add_argument( - '--exttarget', - action='store', - choices=['csv', 'text', 'json'], - help='Target a specific file type to merge into one file' -) - -parser_merge.add_argument( '--delete', action='store_true', + default=False, help='Delete the old individual files that will get merged into one file' ) diff --git a/src/funcs_worklogger.py b/src/funcs_worklogger.py index b645af8..b58efa4 100644 --- a/src/funcs_worklogger.py +++ b/src/funcs_worklogger.py @@ -8,9 +8,9 @@ email: wacky404@dev.com from pprint import pprint from log_util_worklogger import logger -from datetime import timezone +from datetime import timezone, datetime +from pathlib import Path import csv -import datetime import os import os.path as osp import paths_util_worklogger as pu @@ -21,20 +21,17 @@ def configure(dir_list=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}.") + print(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}.") + print(f"An exception of type {type(e).__name__} occurred. " + f"Details: This is okay, output will save in existing {directory}.") def parse(filepath=None): @@ -202,48 +199,39 @@ def add_log(file_format=None, proj_settings=None, savepath=None, backuppath=None logger.info(f"Written {kwargs['job']} worklog to {path}") -def combine_log(specified_ext, target_job, target_extension=None, savepath=None, backuppath=None, delete=False): - # you pick a job then if you want you can choose a specific file type to target for combining into your specified_ext - # TODO: Finish function stopped just before date sorting; getting a data structure prepped for sorting then transformation +def combine_log(target_job, specified_ext, target_extension=None, savepath=None, backuppath=None, delete=False): if target_job is None: logger.info('You must specify a job to run combine_log()') return None - for dir in (savepath, backuppath): - buffer = [] - if osp.exists(dir): - target_extension = target_extension.strip('.') - # only thing affected by this blocks if statement - if target_extension is not None: - files = list(Path(dir).glob( - f'**/{target_job.upper()}.{target_extension}')) - else: - files = list(Path(dir).glob(f'**/{target_job.upper()}')) - logger.debug(f"Found file(s): {files}") - if len(files) < 2: - logger.exception( - f'combine_log() reqs 2 or more files. Found less than 2 of {target_job.upper()}.{target_extension}') - return None + buffer = [] + # changed this from iterating over both dirs; thinking of limiting to one + if osp.exists(savepath): + files = list(Path(savepath).glob(f'**/{target_job.upper()}.**')) + logger.debug(f"Found file(s): {files}") + if len(files) < 2: + logger.exception( + f'combine_log() reqs 2 or more files. Found less than 2 of {target_job.upper()}.*') + return None - for file in files: - buffer.append(*parse(file)) + for file in files: + buffer.extend(parse(file)) - for index, line in enumerate(buffer): - buffer[index] = [index, line] + for index, line in enumerate(buffer): + buffer[index] = [index, line] - for content in buffer: - _entry = content[1].split(' ') - for param in _entry: - param_split = param.split(':') - var, val = param_split[0], param_split[1] if len( - param_split) == 2 else None - # need to sort datetimes ... actually easy - if var == 'timestamp': - buffer[content[0]].append(val) + for content in buffer: + _entry = content[1].split(' ') + buffer[content[0]].append(_entry[0]) + # TODO: Finished sorting logs, now just need to write to target file and delete if needed. + try: buffer.sort(key=lambda x: datetime.strptime( x[2], "%Y-%m-%dT%H:%M:%S%Z")) - pprint(buffer) + except ValueError as e: + logger.exception(f"An exception of type {type(e).__name__} occurred. " + f"Details: {str(e)}") + return None def send_email(sender=None, to=None, subject=None, files=None): diff --git a/src/funcs_worklogger.pyi b/src/funcs_worklogger.pyi index 2a90cb5..4700b68 100644 --- a/src/funcs_worklogger.pyi +++ b/src/funcs_worklogger.pyi @@ -24,8 +24,7 @@ def add_log(file_format: Optional[str], proj_settings: Optional[dict[str, dict]] ... -def combine_log(specified_ext: str, target_file: Path, target_extension: Optional[str], - savepath: Optional[Path], backuppath: Optional[Path], delete: bool = False, **kwargs) -> None: +def combine_log(target_job: str, specified_ext: str, savepath: Optional[Path], backuppath: Optional[Path], delete: bool = False, **kwargs) -> None: """ Combine logs of different file types into one file of a specified type. diff --git a/src/worklog b/src/worklog index b981201..e5903af 100755 --- a/src/worklog +++ b/src/worklog @@ -13,7 +13,7 @@ import os import os.path as osp import logging import paths_util_worklogger as pu -from funcs_worklogger import configure, add_log +from funcs_worklogger import configure, add_log, combine_log from args_worklogger import parser from pathlib import Path from log_util_worklogger import logger, setup_logging @@ -33,13 +33,6 @@ formats: dict = { # creates a NameSpace of arguments that were made args = parser.parse_args() -pprint(args) -sys.exit() - -if args.configure: - configure(dir_list=None) - logger.info("Configuration completed.") - sys.exit() numeric_loglevel = getattr(logging, str(args.log).upper()) if isinstance(numeric_loglevel, int): @@ -90,6 +83,12 @@ else: BACKUPPATH = Path(osp.join(osp.expanduser("~"), "Documents", "worklogger")) +if args.extension: + combine_log(target_job=args.job, specified_ext=args.extension, + delete=args.delete, savepath=SAVEPATH, backuppath=BACKUPPATH) + sys.exit() + + jname_proj: dict[str, dict] = {} if settings is not None: for j in settings['jobs']: @@ -145,8 +144,8 @@ try: except Exception as e: logger.exception(str(e)) -if settings is not None: +if settings is not None: add_log(file_format=formats[str( settings['fileformat']).upper()], proj_settings=jname_proj, savepath=SAVEPATH, backuppath=BACKUPPATH, job=args.job, proj=args.project, loc=args.location, time=args.time, start=args.start, end=args.end, message=args.message) |
