summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne-Cole <77279425+Wacky404@users.noreply.github.com>2024-12-19 01:06:07 -0600
committerWayne-Cole <77279425+Wacky404@users.noreply.github.com>2024-12-19 01:06:07 -0600
commitfc89c79cf88c47a19a6162aa1d311b26d8376adb (patch)
treea03b22bc4c52d84ee67a27c99854aad8ff2d89d7
parent5b94345217a6461091bfda17de75b7e07bd5e9a3 (diff)
downloadworklogger-fc89c79cf88c47a19a6162aa1d311b26d8376adb.tar.xz
worklogger-fc89c79cf88c47a19a6162aa1d311b26d8376adb.zip
feat: worked on implementing merge subcommand functionality; almost finish
-rw-r--r--src/args_worklogger.py31
-rw-r--r--src/funcs_worklogger.py72
-rw-r--r--src/funcs_worklogger.pyi3
-rwxr-xr-xsrc/worklog17
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)