Source code for hmrc.plugins.csv
"""CSV data formats"""
from contextlib import contextmanager
import csv
from dataclasses import dataclass
from datetime import date, datetime
from typing import ClassVar
from parsedatetime import Calendar
from .tabular import (TabularTypeParser, TabularDataClass, TabularCommand,
TabularVatReturn, TabularVatSubmitCommand,
tabulardataclass)
__all__ = [
'CsvTypeParser',
'CsvDataClass',
'CsvVatReturn',
'CsvCommand',
'CsvVatSubmitCommand',
]
[docs]@dataclass
class CsvTypeParser(TabularTypeParser):
"""CSV type parser"""
calendar: ClassVar[Calendar] = Calendar()
"""Calendar object used for date parsing"""
def __post_init__(self):
if self.parse is None:
if issubclass(self.pytype, datetime):
self.parse = self.parse_datetime
elif issubclass(self.pytype, date):
self.parse = self.parse_date
super().__post_init__()
[docs] @classmethod
def parse_datetime(cls, value):
"""Parse datetime from CSV value"""
timestamp, ret = cls.calendar.parseDT(value)
if not ret:
raise ValueError("Invalid date: '%s'" % value)
return timestamp
[docs] @classmethod
def parse_date(cls, value):
"""Parse date from CSV value"""
return cls.parse_datetime(value).date()
[docs]class CsvDataClass(TabularDataClass):
"""CSV data class"""
TypeParser = CsvTypeParser
[docs]@tabulardataclass
class CsvVatReturn(CsvDataClass, TabularVatReturn):
"""VAT return from CSV data"""
[docs]class CsvCommand(TabularCommand):
"""CSV file command"""
[docs] @classmethod
def init_parser(cls, parser):
super().init_parser(parser)
parser.add_argument('filename', help="CSV file")
[docs] @contextmanager
def data(self):
with open(self.args.filename, encoding='utf8') as f:
yield csv.reader(f)
[docs]class CsvVatSubmitCommand(CsvCommand, TabularVatSubmitCommand):
"""Submit VAT return(s) from CSV file"""
Row = CsvVatReturn