#!/usr/bin/env python3 from collections import namedtuple, defaultdict from datetime import datetime from decimal import Decimal from util import UTCTZ, KSTTZ class ObjEntry(namedtuple('ModifiedEntry', ('bucket', 'path', 'etags', 'modified', )) ): def __new__(cls, *args, **kwargs): item = super(ObjEntry, cls).__new__(cls, *args, **kwargs) return item def params(self, bucket, path): if (self.bucket, self.path) != (bucket, path): return () if self.etags is not None: yield ('IfNoneMatch', self.etags) if self.modified is not None: yield ('IfModifiedSince', self.modified) class Cost(namedtuple('Cost', ('amount', 'currency', 'service', 'type', 'start', 'end' )) ): __slots__ = () def __new__(cls, *args, **kwargs): argdict = defaultdict(lambda: None) argdict.update(**kwargs) parse_date = lambda item: datetime.strptime(item, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=UTCTZ).astimezone(KSTTZ) args = ( (Decimal(argdict['lineItem/BlendedCost']) if argdict['lineItem/BlendedCost'] else None), (argdict['lineItem/CurrencyCode'] if argdict['lineItem/CurrencyCode'] else None), (argdict['product/ProductName'] if argdict['product/ProductName'] else None), (argdict['lineItem/UsageType'] if argdict['lineItem/UsageType'] else None), (parse_date(argdict['lineItem/UsageStartDate']) if argdict['lineItem/UsageStartDate'] else None), (parse_date(argdict['lineItem/UsageEndDate']) if argdict['lineItem/UsageEndDate'] else None) ) item = super(Cost, cls).__new__(cls, *args) return item @property def key(self): return CostSummery(self.currency, self.service, self.type) class CostSubItem(namedtuple('CostSubItem', ('currency', 'service', )) ): __slots__ = () def __new__(cls, *args): item = super(CostSubItem, cls).__new__(cls, *args) return item class CostSummery(namedtuple('CostSummery', ('currency', 'service', 'type' )) ): __slots__ = () def __new__(cls, *args): item = super(CostSummery, cls).__new__(cls, *args) return item @property def key(self): return CostSubItem(self.currency, self.service)