89 lines
2.8 KiB
Python
Executable File
89 lines
2.8 KiB
Python
Executable File
#!/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)
|