summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWayne-Cole <77279425+Wacky404@users.noreply.github.com>2025-01-14 00:09:31 -0600
committerWayne-Cole <77279425+Wacky404@users.noreply.github.com>2025-01-14 00:09:31 -0600
commit2a298dfcb458839db7bde1f403d608006b9bc8ca (patch)
tree093364f906a9858a54fcf3f2502356179c21dfff /src
parentc1c80b0021a1787916635281ed35b0ebfb54e709 (diff)
downloadworklogger-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.py4
-rw-r--r--src/funcs_worklogger.py42
-rw-r--r--src/log_util_worklogger.py3
-rw-r--r--src/paths_util_worklogger.py3
-rw-r--r--src/stubs/__init__.pyi0
-rw-r--r--src/stubs/funcs_worklogger.pyi (renamed from src/funcs_worklogger.pyi)17
-rw-r--r--src/test/__init__.py0
-rw-r--r--src/test/test_args.py40
-rw-r--r--src/test/test_functions.py35
-rwxr-xr-xsrc/worklog54
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(