import csv
import io
from dataclasses import dataclass
from datetime import datetime
from pathlib import Path
from typing import Iterator
import petl as etl
[docs]@dataclass
class ReportViewer:
"""Data viewer for reports saved on disc"""
path: str
def __getitem__(self, item):
if isinstance(item, int):
item = slice(item, item + 1)
return list(etl.fromcsv(self.path, delimiter=',')[item])
[docs] def distinct(self, *columns):
return list(
etl.fromcsv(self.path, delimiter=',').cut(columns).distinct(key=columns, count='count')
)
[docs]@dataclass
class Report(ReportViewer):
"""Report metadata DTO"""
when_saved: datetime
[docs]def save_csv(path: str, data: Iterator):
"""
Utility function to save data to a CSV file.
"""
print(f'---> Saving: {Path(path)}')
with io.open(path, 'w', newline='\n') as csvfile:
writer = csv.writer(csvfile)
for row in data:
writer.writerow(row)
[docs]def save_report(directory: str, data: Iterator, timestamp_fmt='%Y-%m-%d-%H%M%S') -> Report:
"""
Utility function create a report file with timestamp in the name
"""
now = datetime.now()
timestamp = now.strftime(timestamp_fmt)
path = Path(f'{directory}/sw-people-{timestamp}.csv').absolute()
if not path.parent.exists():
raise ValueError(f'Directory does not exist: {path.parent}')
save_csv(path=path, data=data)
return Report(when_saved=now, path=path)