summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne-Cole <77279425+Wacky404@users.noreply.github.com>2025-01-15 21:25:38 -0600
committerWayne-Cole <77279425+Wacky404@users.noreply.github.com>2025-01-15 21:25:38 -0600
commit20ec14565bd52225547ab55665a058587783f561 (patch)
tree95b99225b6ebb68f5ee4d45b9d0ea4e5b349ff58
parent2a298dfcb458839db7bde1f403d608006b9bc8ca (diff)
downloadworklogger-20ec14565bd52225547ab55665a058587783f561.tar.xz
worklogger-20ec14565bd52225547ab55665a058587783f561.zip
feat: finished main application just have to add tests and email feature
-rw-r--r--src/args_worklogger.py2
-rw-r--r--src/funcs_worklogger.py68
-rw-r--r--src/test/test_args.py40
-rw-r--r--src/utils/log_util_worklogger.py (renamed from src/log_util_worklogger.py)0
-rw-r--r--src/utils/paths_util_worklogger.py (renamed from src/paths_util_worklogger.py)0
-rwxr-xr-xsrc/worklog8
-rw-r--r--test/__init__.py (renamed from src/test/__init__.py)0
-rw-r--r--test/test_args.py74
-rw-r--r--test/test_functions.py (renamed from src/test/test_functions.py)0
9 files changed, 127 insertions, 65 deletions
diff --git a/src/args_worklogger.py b/src/args_worklogger.py
index a6afea7..2ab2bc4 100644
--- a/src/args_worklogger.py
+++ b/src/args_worklogger.py
@@ -4,7 +4,7 @@ ARGUMENTS FILE FOR WORKLOGGER
author: Wacky404 <wacky404@dev.com>
"""
-from funcs_worklogger import configure
+from src.funcs_worklogger import configure
import argparse
diff --git a/src/funcs_worklogger.py b/src/funcs_worklogger.py
index b18ae1a..0c1161e 100644
--- a/src/funcs_worklogger.py
+++ b/src/funcs_worklogger.py
@@ -5,15 +5,16 @@ IMPLEMENTATION FILE FOR WORKLOGGER
author: Wacky404 <wacky404@dev.com>
"""
-from log_util_worklogger import logger
+from src.utils.log_util_worklogger import logger
from datetime import timezone, datetime
from pathlib import Path
-import paths_util_worklogger as pu
+import src.utils.paths_util_worklogger as pu
import os.path as osp
import json
import csv
import os
import sys
+import copy
TIME_FORMAT = "%Y-%m-%dT%H:%M:%S%Z"
@@ -53,7 +54,7 @@ def _prep_write(format, s_log, p_settings, _dt, k_args):
return s_log, None, None
- elif format == '.csv':
+ elif format == '.csv' or format == '.json':
cp_kwargs = {
'timestamp': f"{dt.strftime(TIME_FORMAT)}"
}
@@ -109,6 +110,13 @@ def _write_file(p_save, p_backup, format, j_upper, len_file, _cp_kwargs, _log_st
fd, fieldnames=_field_names)
for _kwarg in _cp_kwargs:
csv_writer.writerow(_kwarg)
+ elif format == '.json' and len_file == 0 or len_file == None:
+ with open(chosen_job, 'w') as fd:
+ json.dump(['job', _cp_kwargs], fd, indent=4)
+ elif format == '.json' and len_file >= 1:
+ with open(chosen_job, 'a') as fd:
+ fd_data = json.load(fd)
+ json.dump(fd_data, fd, indent=4)
else:
with open(chosen_job, 'a') as fd:
for _log in _log_str:
@@ -159,23 +167,24 @@ def parse(filepath):
elif val:
csv_log += f"{key}:{val},"
- lines.append(csv_log)
+ lines.append(csv_log.rstrip())
return lines
elif ext == '.json':
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]},"
+ fd_data = json.load(fd)
+ for json_ele in fd_data['job']:
+ json_log = ''
+ for key, val in json_ele.items():
+ if key == 'timestamp':
+ json_log += f"{val},"
+ elif key == 'job':
+ json_log += f"{key}:{val},"
+ elif val:
+ json_log += f"{key}:{val},"
- lines.append(line_str)
+ lines.append(json_log.rstrip())
return lines
@@ -212,7 +221,8 @@ def add_log(file_format=None, proj_settings=None, savepath=None, backuppath=None
"Do you want to add an end time for the last entry? (Y/n) ")
if add_endtime == 'Y':
insert_time = input("End Time: ")
- with open(chosen_job, 'a') as fd:
+ # worklog TEST -p Name -loc remote -s now -m "this is a test!"
+ with open(chosen_job, 'a+') as fd:
if file_format == '.txt':
if insert_time.lower() == 'now':
fd.write(
@@ -223,12 +233,28 @@ def add_log(file_format=None, proj_settings=None, savepath=None, backuppath=None
elif file_format == '.csv':
csv_writer = csv.DictWriter(
fd, fieldnames=['timestamp'] + [x if x != 'message' else 'desc' for x in kwargs.keys()])
- if insert_time == 'now':
+ if insert_time.lower() == 'now':
csv_writer.writerow(
{'timestamp': f"{dt.strftime(TIME_FORMAT)}", 'job': kwargs['job'], 'end': f"{dt.strftime("'%H:%M'")}"})
else:
csv_writer.writerow(
{'timestamp': f"{dt.strftime(TIME_FORMAT)}", 'job': kwargs['job'], 'end': f"{insert_time}"})
+ elif file_format == '.json':
+ fd_data = json.load(fd)
+ _deepkwargs = copy.deepcopy(kwargs)
+ _deepkwargs['desc'] = _deepkwargs.pop(
+ 'message', None
+ )
+ if insert_time.lower() == 'now':
+ _deepkwargs['end'] = insert_time
+ else:
+ continue
+
+ fd_data["job"].append(_deepkwargs)
+ file.seek(0)
+
+ json.dump(fd_data, fd, indent=4)
+
break
elif add_endtime == 'n':
@@ -269,8 +295,8 @@ 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_json_logs = []
+ if specified_ext == '.csv' or specified_ext == '.json':
for log in buffer:
# buffer contains index, log line, dt stamp
_log = {}
@@ -292,10 +318,12 @@ def combine_log(target_job, specified_ext, target_extension=None, savepath=None,
if val is not None:
_log[var] = val
- csv_logs.append(_log)
+ csv_json_logs.append(_log)
_write_file(p_save=savepath, p_backup=None, format=specified_ext, j_upper=target_job.upper(),
- len_file=None, _cp_kwargs=csv_logs, _log_str=[x[1] for x in buffer],
+ len_file=None, _cp_kwargs=csv_json_logs if csv_json_logs else [],
+ _log_str=[x[1]
+ for x in buffer] if specified_ext == '.txt' else [],
_field_names=['timestamp', 'job', 'proj', 'loc', 'time', 'start', 'end', 'desc'])
if delete:
diff --git a/src/test/test_args.py b/src/test/test_args.py
deleted file mode 100644
index 0858b1f..0000000
--- a/src/test/test_args.py
+++ /dev/null
@@ -1,40 +0,0 @@
-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/log_util_worklogger.py b/src/utils/log_util_worklogger.py
index 9fdbd6a..9fdbd6a 100644
--- a/src/log_util_worklogger.py
+++ b/src/utils/log_util_worklogger.py
diff --git a/src/paths_util_worklogger.py b/src/utils/paths_util_worklogger.py
index b2b6ee8..b2b6ee8 100644
--- a/src/paths_util_worklogger.py
+++ b/src/utils/paths_util_worklogger.py
diff --git a/src/worklog b/src/worklog
index de2981f..3926680 100755
--- a/src/worklog
+++ b/src/worklog
@@ -9,11 +9,11 @@ import sys
import os
import os.path as osp
import logging
-import paths_util_worklogger as pu
-from funcs_worklogger import configure, add_log, combine_log
-from args_worklogger import parser
+import src.utils.paths_util_worklogger as pu
+from src.funcs_worklogger import configure, add_log, combine_log
+from src.args_worklogger import parser
from pathlib import Path
-from log_util_worklogger import logger, setup_logging
+from src.util.log_util_worklogger import logger, setup_logging
from typing import Optional
diff --git a/src/test/__init__.py b/test/__init__.py
index e69de29..e69de29 100644
--- a/src/test/__init__.py
+++ b/test/__init__.py
diff --git a/test/test_args.py b/test/test_args.py
new file mode 100644
index 0000000..9ca0110
--- /dev/null
+++ b/test/test_args.py
@@ -0,0 +1,74 @@
+# TODO: Don't forget to strftime the fake dates for my TIME_FORMAT
+from src.args_worklogger import parser
+from argparse import Namespace
+import subprocess
+import os
+import unittest
+import random
+
+
+TIME_FORMAT = "%Y-%m-%dT%H:%M:%S%Z"
+FIELDS = ["timestamp", "job", "proj", "loc", "time", "start", "end", "desc"]
+
+
+class TestArgs(unittest.TestCase):
+ fields = ''
+ for x in FIELDS:
+ if x == 'start' or x == 'end':
+ continue
+ fields += f'{x},'
+ cmd = f'fake -n {random.randint(50, 100)} date,job,word,word,time,sentence -f json -c ' + fields
+ print(cmd)
+ data = subprocess.getoutput(cmd)
+ print(data)
+
+ 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', 'text', 'json']
+ for file in _filetypes:
+ _flags = _flags = parser.parse_args(
+ [
+ 'test_job',
+ 'merge', f'{file}',
+ '--delete'
+ ]
+
+ )
+ print(_flags)
+ self.assertIsInstance(_flags, Namespace)
+ _flagsDict = vars(_flags)
+ self.assertIsInstance(_flagsDict, dict)
+ self.assertEqual(True, _flagsDict['delete'])
+
+ for file in _filetypes:
+ _flags = parser.parse_args(
+ [
+ 'test_job',
+ 'merge', f'{file}'
+ ]
+ )
+ 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/test/test_functions.py
index 97f80fb..97f80fb 100644
--- a/src/test/test_functions.py
+++ b/test/test_functions.py