diff options
| author | Wayne-Cole <77279425+Wacky404@users.noreply.github.com> | 2025-01-14 00:09:31 -0600 |
|---|---|---|
| committer | Wayne-Cole <77279425+Wacky404@users.noreply.github.com> | 2025-01-14 00:09:31 -0600 |
| commit | 2a298dfcb458839db7bde1f403d608006b9bc8ca (patch) | |
| tree | 093364f906a9858a54fcf3f2502356179c21dfff /src | |
| parent | c1c80b0021a1787916635281ed35b0ebfb54e709 (diff) | |
| download | worklogger-2a298dfcb458839db7bde1f403d608006b9bc8ca.tar.xz worklogger-2a298dfcb458839db7bde1f403d608006b9bc8ca.zip | |
feat: implementing tests and json file configuration into functions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/args_worklogger.py | 4 | ||||
| -rw-r--r-- | src/funcs_worklogger.py | 42 | ||||
| -rw-r--r-- | src/log_util_worklogger.py | 3 | ||||
| -rw-r--r-- | src/paths_util_worklogger.py | 3 | ||||
| -rw-r--r-- | src/stubs/__init__.pyi | 0 | ||||
| -rw-r--r-- | src/stubs/funcs_worklogger.pyi (renamed from src/funcs_worklogger.pyi) | 17 | ||||
| -rw-r--r-- | src/test/__init__.py | 0 | ||||
| -rw-r--r-- | src/test/test_args.py | 40 | ||||
| -rw-r--r-- | src/test/test_functions.py | 35 | ||||
| -rwxr-xr-x | src/worklog | 54 |
10 files changed, 134 insertions, 64 deletions
diff --git a/src/args_worklogger.py b/src/args_worklogger.py index c2bf923..a6afea7 100644 --- a/src/args_worklogger.py +++ b/src/args_worklogger.py @@ -1,8 +1,7 @@ #!/opt/homebrew/bin/python3 """ ARGUMENTS FILE FOR WORKLOGGER -author: Wacky404 -email: wacky404@dev.com +author: Wacky404 <wacky404@dev.com> """ from funcs_worklogger import configure @@ -53,7 +52,6 @@ parser.add_argument( version='%(prog)s 1.0' ) - parser.add_argument( 'job', action='store', diff --git a/src/funcs_worklogger.py b/src/funcs_worklogger.py index 6a16b7d..b18ae1a 100644 --- a/src/funcs_worklogger.py +++ b/src/funcs_worklogger.py @@ -2,8 +2,7 @@ """ IMPLEMENTATION FILE FOR WORKLOGGER -author: Wacky404 -email: wacky404@dev.com +author: Wacky404 <wacky404@dev.com> """ from log_util_worklogger import logger @@ -11,11 +10,14 @@ from datetime import timezone, datetime from pathlib import Path import paths_util_worklogger as pu import os.path as osp +import json import csv import os +import sys TIME_FORMAT = "%Y-%m-%dT%H:%M:%S%Z" +FIELDS = ["timestamp", "job", "proj", "loc", "time", "start", "end", "desc"] def _prep_write(format, s_log, p_settings, _dt, k_args): @@ -159,10 +161,23 @@ def parse(filepath): lines.append(csv_log) - return lines - # TODO: Make the parser for json, once I figure out json structure + return lines elif ext == '.json': - pass + lines = [] + with open(filepath, 'r') as fd: + _lines = fd.readlines() + for l in _lines: + line_str = '' + line = json.loads(l) + print(type(line)) + print(line.keys()) + for col in FIELDS: + if col in line.keys(): + line_str += f"{col}:{line[col]}," + + lines.append(line_str) + + return lines def add_log(file_format=None, proj_settings=None, savepath=None, backuppath=None, **kwargs): @@ -226,13 +241,8 @@ def add_log(file_format=None, proj_settings=None, savepath=None, backuppath=None 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 - - buffer = [] - # changed this from iterating over both dirs; thinking of limiting to one if osp.exists(savepath): + buffer = [] files = list(Path(savepath).glob(f'**/{target_job.upper()}.**')) logger.debug(f"Found file(s): {files}") if len(files) < 2: @@ -259,12 +269,18 @@ def combine_log(target_job, specified_ext, target_extension=None, savepath=None, f"Details: {str(e)}") return None + csv_logs = [] if specified_ext == '.csv': - csv_logs = [] for log in buffer: # buffer contains index, log line, dt stamp _log = {} - split_log = log[1].split(',') + _pos = str(log[1]).rfind("'") + if _pos != -1: + split_log = log[1][:_pos + 1].split(',') + split_log[-1] = split_log[-1] + logt[1][_pos:] + print(split_log) + else: + split_log = log[1].split(',') for index, param in enumerate(split_log): if index == 0: _log['timestamp'] = param diff --git a/src/log_util_worklogger.py b/src/log_util_worklogger.py index 9e89f89..9fdbd6a 100644 --- a/src/log_util_worklogger.py +++ b/src/log_util_worklogger.py @@ -1,8 +1,7 @@ #!/opt/homebrew/bin/python3 """ LOGGER SETUP FILE FOR WORKLOGGER -author: Wacky404 -email: wacky404@dev.com +author: Wacky404 <wacky404@dev.com> """ import logging.config diff --git a/src/paths_util_worklogger.py b/src/paths_util_worklogger.py index eb6bf81..b2b6ee8 100644 --- a/src/paths_util_worklogger.py +++ b/src/paths_util_worklogger.py @@ -1,8 +1,7 @@ #!/opt/homebrew/bin/python3 """ FILEPATHS FILE FOR WORKLOGGER -author: Wacky404 -email: wacky404@dev.com +author: Wacky404 <wacky404@dev.com> """ from pathlib import Path diff --git a/src/stubs/__init__.pyi b/src/stubs/__init__.pyi new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/stubs/__init__.pyi diff --git a/src/funcs_worklogger.pyi b/src/stubs/funcs_worklogger.pyi index 1cd2bd5..49f0d73 100644 --- a/src/funcs_worklogger.pyi +++ b/src/stubs/funcs_worklogger.pyi @@ -1,7 +1,6 @@ """ INTERFACE FILE FOR WORKLOGGER -author: Wacky404 -email: wacky404@dev.com +author: Wacky404 <wacky404@dev.com> """ from argparse import Namespace @@ -13,28 +12,28 @@ def _prep_write(format: str, s_log: str, p_settings: dict, _dt, k_args: dict) -> """ """ - ... + pass def _write_file(p_save: Optional[Path], p_backup: Optional[Path], format: str, j_upper: str, len_file: int, _cp_kwargs: list[dict], _log_str: list[str], _field_names: list[str]) -> None: """ """ - ... + pass def configure(dir_list: Optional[list]) -> None: """ """ - ... + pass def add_log(file_format: Optional[str], proj_settings: Optional[dict[str, dict]], savepath: Optional[Path], backuppath: Optional[Path], **kwargs) -> None: """ """ - ... + pass def combine_log(target_job: str, specified_ext: str, savepath: Optional[Path], backuppath: Optional[Path], delete: bool = False, **kwargs) -> None: @@ -42,7 +41,7 @@ def combine_log(target_job: str, specified_ext: str, savepath: Optional[Path], b Combine logs of different file types into one file of a specified type. """ - ... + pass def parse(filepath: Optional[Path]) -> list: @@ -50,11 +49,11 @@ def parse(filepath: Optional[Path]) -> list: """ """ - ... + pass def send_email(sender: str, to: str, subject: str, files: list[str | Path]) -> None: """ """ - ... + raise NotImplementedError() diff --git a/src/test/__init__.py b/src/test/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/test/__init__.py diff --git a/src/test/test_args.py b/src/test/test_args.py new file mode 100644 index 0000000..0858b1f --- /dev/null +++ b/src/test/test_args.py @@ -0,0 +1,40 @@ +from args_worklogger import parser +from argparse import Namespace +import unittest + + +class TestArgs(unittest.TestCase): + def test_argsbase(self): + _flags = parser.parse_args( + "'not so great company' -p govwork -loc remote -t 1 -s now -m 'testing again, does this work'" + ) + self.assertIsInstance(_flags, Namespace) + _flagsDict = vars(_flags) + self.assertIsInstance(_flagsDict, dict) + + def test_argsmerge(self): + _filetypes = ['csv', 'txt', 'json'] + for file in _filetypes: + _flags = _flags = parser.parse_args( + f"'test_job' merge {file} --delete" + ) + print(_flags) + self.assertIsInstance(_flags, Namespace) + _flagsDict = vars(_flags) + self.assertIsInstance(_flagsDict, dict) + self.assertEqual(True, _flagsDict['delete']) + + _flags = parser.parse_args( + "'test_job' merge txt" + ) + self.assertIsInstance(_flags, Namespace) + _flagsDict = vars(_flags) + self.assertIsInstance(_flagsDict, dict) + self.assertEqual(False, _flagsDict['delete']) + + def test_argsemail(self): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/src/test/test_functions.py b/src/test/test_functions.py new file mode 100644 index 0000000..97f80fb --- /dev/null +++ b/src/test/test_functions.py @@ -0,0 +1,35 @@ +from funcs_worklogger import configure, parse, add_log, combine_log, send_email +import unittest +import subprocess +import csv +import json + + +class TestFunctions(unittest.TestCase): + data_csv = subprocess.getoutput( + ["fake -n 50 'date_this_year, company, user_name, address, pyint, text' -f csv -c timestamp,job,proj,loc,time,message"] + ) + print(data_csv) + data_json = subprocess.getoutput( + ["fake -n 50 'date_this_year, company, user_name, address, pyint, text' -f json -c timestamp,job,proj,loc,time,message"] + ) + print(data_json) + + def test_configure(self): + pass + + def test_parse(self): + pass + + def test_add_log(self): + pass + + def test_combine_log(self): + pass + + def test_send_email(self): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/src/worklog b/src/worklog index 47b7ef7..de2981f 100755 --- a/src/worklog +++ b/src/worklog @@ -1,8 +1,7 @@ #!/opt/homebrew/bin/python3 """ MAIN FILE FOR WORKLOGGER -author: Wacky404 -email: wacky404@dev.com +author: Wacky404 <wacky404@dev.com> """ import json @@ -17,8 +16,6 @@ from pathlib import Path from log_util_worklogger import logger, setup_logging from typing import Optional -from pprint import pprint - SAVEPATH: Path | str BACKUPPATH: Path | str @@ -40,6 +37,7 @@ else: dotfile: list | None = None +# this will change once this moves to another directory; depends on install path if osp.exists(osp.join(os.getcwd(), os.pardir)): dotfile = list(Path(osp.join(osp.expanduser('~'), ".config")).glob( '**/*.workloggerconfig.json')) @@ -62,16 +60,19 @@ if dotfile is not None: 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") + logger.error( + "There was an error loading your config. Using defaults.") if settings is not None: SAVEPATH = Path(osp.join(osp.expanduser("~"), settings['savepath'])) BACKUPPATH = Path(osp.join(osp.expanduser("~"), settings['backuppath'])) - numeric_loglevel_settings = getattr( - logging, str(settings['loglvl']).upper()) - setup_logging(numeric_loglevel_settings) + try: + numeric_loglevel_settings = getattr( + logging, str(settings['loglvl']).upper()) + setup_logging(numeric_loglevel_settings) + except Exception as e: + logger.exception(str(e)) + dir_list: list = [d for d in [ SAVEPATH, BACKUPPATH] if not osp.exists(d)] if len(dir_list) > 0: @@ -107,12 +108,10 @@ if settings is not None: settings['fileformat']).upper()]}") filepath_backup = osp.join(BACKUPPATH, f"{str(args.job).upper()}{formats[str( settings['fileformat']).upper()]}") - if not osp.exists(filepath): - with open(filepath, 'x'): - pass - if not osp.exists(filepath): - with open(filepath_backup, 'x'): - pass + for _path in [filepath, filepath_backup]: + if not osp.exists(_path): + with open(_path, 'x'): + pass except Exception as e: logger.exception(str(e)) @@ -120,28 +119,13 @@ else: try: filepath = osp.join(SAVEPATH, f"{str(args.job).upper()}.txt") filepath_backup = osp.join(BACKUPPATH, f"{str(args.job).upper()}.txt") - if not osp.exists(filepath): - with open(filepath, 'x'): - pass - if not osp.exists(filepath): - with open(filepath_backup, 'x'): - pass + for _path in [filepath, filepath_backup]: + if not osp.exists(_path): + with open(_path, 'x'): + pass except Exception as e: logger.exception(str(e)) -try: - for name in jname_proj.keys(): - 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( |
