69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
import json
|
|
import os
|
|
import sys
|
|
import time
|
|
from datetime import datetime
|
|
from typing import Any, Dict, Union
|
|
|
|
|
|
class ReportManager:
|
|
"""Abstracts interaction with the regression tests file"""
|
|
|
|
def __init__(self, filename: str):
|
|
self.filename = filename
|
|
self.start_time = time.time()
|
|
self.load()
|
|
|
|
def load(self) -> None:
|
|
try:
|
|
with open(self.filename, "r") as f:
|
|
file_content = (
|
|
f.read().strip()
|
|
) # read the content and remove any leading/trailing whitespace
|
|
if file_content: # if file is not empty, load the json
|
|
data = json.loads(file_content)
|
|
self.tests = {k: data[k] for k in sorted(data)}
|
|
data = self.replace_backslash(data)
|
|
else: # if file is empty, assign an empty dictionary
|
|
self.tests = {}
|
|
except FileNotFoundError:
|
|
self.tests = {}
|
|
except json.decoder.JSONDecodeError: # If JSON is invalid
|
|
self.tests = {}
|
|
self.save()
|
|
|
|
def save(self) -> None:
|
|
with open(self.filename, "w") as f:
|
|
json.dump(self.tests, f, indent=4)
|
|
|
|
def add_test(self, test_name: str, test_details: dict) -> None:
|
|
self.tests[test_name] = test_details
|
|
self.save()
|
|
|
|
def remove_test(self, test_name: str) -> None:
|
|
if test_name in self.tests:
|
|
del self.tests[test_name]
|
|
self.save()
|
|
|
|
def end_info_report(self, config: Dict[str, Any]) -> None:
|
|
command = " ".join(sys.argv)
|
|
self.tests = {
|
|
"command": command.split(os.sep)[-1],
|
|
"completion_time": datetime.now().strftime("%Y-%m-%d-%H:%M"),
|
|
"time_elapsed": str(round(time.time() - self.start_time, 2)) + " seconds",
|
|
"tests": self.tests,
|
|
"config": config,
|
|
}
|
|
|
|
self.save()
|
|
|
|
def replace_backslash(self, value: str) -> Union[str, list[str], dict]:
|
|
if isinstance(value, str):
|
|
return value.replace("\\\\", "/") # escape \ with \\
|
|
elif isinstance(value, list):
|
|
return [self.replace_backslash(i) for i in value]
|
|
elif isinstance(value, dict):
|
|
return {k: self.replace_backslash(v) for k, v in value.items()}
|
|
else:
|
|
return value
|