Coverage for testrail_api_reporter/utils/csv_parser.py: 100%
53 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-30 15:44 +0200
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-30 15:44 +0200
1# -*- coding: utf-8 -*-
2""" CSV parser for TestRail API Reporter """
4import csv
5from datetime import datetime
6from os.path import exists
7from typing import List
9from .logger_config import setup_logger, DEFAULT_LOGGING_LEVEL
12class CSVParser:
13 """Parser for CSV files"""
15 def __init__(self, filename=None, logger=None, log_level=DEFAULT_LOGGING_LEVEL):
16 """
17 Default init
19 :param filename: filename for csv file
20 :param logger: logger object, optional
21 :param log_level: logging level, optional, by default is logging.DEBUG
22 """
23 if not logger:
24 self.___logger = setup_logger(name="CSVParser", log_file="CSVParser.log", level=log_level)
25 else:
26 self.___logger = logger
27 self.___logger.debug("Initializing CSV Parser")
28 self.__filename = filename
30 def save_history_data(self, filename=None, report=None):
31 """
32 Save history data to CSV
34 :param filename: file name of output file, required
35 :param report: report with distribution in CaseStat format
36 :return:
37 """
38 filename = filename if filename else self.__filename
39 if not filename:
40 raise ValueError("Filename for save report data is not provided, save history data aborted!")
41 if not report:
42 raise ValueError("Report couldn't be found, save history data aborted!")
43 date = datetime.today().strftime("%Y-%m-%d")
44 last_date = ""
45 mode = "r" if exists(filename) else "w"
46 with open(filename, mode, encoding="utf-8") as csvfile:
47 if mode == "r":
48 for row in reversed(list(csv.reader(csvfile))):
49 last_date = f"{row[0]}-{row[1]}-{row[2]}"
50 break
51 if last_date != date:
52 self.___logger.debug("Last date in file: %s for %s", filename, last_date)
53 with open(filename, "a+", newline="", encoding="utf-8") as csvfile:
54 writer = csv.writer(csvfile, delimiter=",", quotechar="|", quoting=csv.QUOTE_MINIMAL)
56 writer.writerow(
57 [
58 datetime.today().strftime("%Y"),
59 datetime.today().strftime("%m"),
60 datetime.today().strftime("%d"),
61 report.get_total(),
62 report.get_automated(),
63 report.get_not_automated(),
64 report.get_not_applicable(),
65 ]
66 )
67 else:
68 self.___logger.debug("Data already stored for today, skipping save")
70 def load_history_data(self, filename=None) -> List:
71 """
72 Load history data to CSV
74 :param filename: file name of output file, required
75 :return: list with results
76 """
77 filename = filename if filename else self.__filename
78 if not filename:
79 raise ValueError("Filename for load report data is not provided, save history data aborted!")
80 timestamps = []
81 totals = []
82 automated = []
83 not_automated = []
84 nas = []
85 self.___logger.debug("Loading history data from %s", filename)
86 try:
87 with open(filename, "r", encoding="utf-8") as csvfile:
88 for row in csv.reader(csvfile):
89 timestamps.append(datetime(year=int(row[0]), month=int(row[1]), day=int(row[2])))
90 totals.append(row[3])
91 automated.append(row[4])
92 not_automated.append(row[5])
93 nas.append(row[6])
94 except FileNotFoundError:
95 raise ValueError(f"Can't open report file '{filename}', load history data aborted!") from FileNotFoundError
96 return [timestamps, totals, automated, not_automated, nas]