add filter Format in default formatters
This commit is contained in:
parent
6704532ae3
commit
38a99064b0
2 changed files with 43 additions and 38 deletions
|
|
@ -54,15 +54,17 @@ class Filter(_Filter):
|
|||
super(Filter, self).__init__()
|
||||
self.selector = selector
|
||||
|
||||
def __call__(self, item):
|
||||
if isinstance(self.selector, basestring):
|
||||
value = item.xpath(self.selector)
|
||||
elif callable(self.selector):
|
||||
value = self.selector(item)
|
||||
@classmethod
|
||||
def select(cls, selector, item):
|
||||
if isinstance(selector, basestring):
|
||||
return item.xpath(selector)
|
||||
elif callable(selector):
|
||||
return selector(item)
|
||||
else:
|
||||
value = self.selector
|
||||
return selector
|
||||
|
||||
return self.filter(value)
|
||||
def __call__(self, item):
|
||||
return self.filter(self.select(self.selector, item))
|
||||
|
||||
def filter(self, value):
|
||||
"""
|
||||
|
|
@ -85,6 +87,7 @@ class Env(_Filter):
|
|||
def __call__(self, item):
|
||||
return item.env[self.name]
|
||||
|
||||
|
||||
class TableCell(_Filter):
|
||||
"""
|
||||
Used with TableElement, it get the cell value from its name.
|
||||
|
|
@ -119,6 +122,7 @@ class TableCell(_Filter):
|
|||
return self.default
|
||||
raise KeyError('Unable to find column %s' % ' or '.join(self.names))
|
||||
|
||||
|
||||
class CleanText(Filter):
|
||||
"""
|
||||
Get a cleaned text from an element.
|
||||
|
|
@ -152,6 +156,7 @@ class CleanText(Filter):
|
|||
txt = txt.replace(symbol, '')
|
||||
return txt
|
||||
|
||||
|
||||
class CleanDecimal(CleanText):
|
||||
"""
|
||||
Get a cleaned Decimal value from an element.
|
||||
|
|
@ -173,6 +178,7 @@ class CleanDecimal(CleanText):
|
|||
else:
|
||||
raise InvalidOperation(e)
|
||||
|
||||
|
||||
class Attr(Filter):
|
||||
def __init__(self, selector, attr, default=_NO_DEFAULT):
|
||||
super(Attr, self).__init__(selector)
|
||||
|
|
@ -245,6 +251,7 @@ class Regexp(Filter):
|
|||
else:
|
||||
return mobj.expand(self.template)
|
||||
|
||||
|
||||
class Map(Filter):
|
||||
def __init__(self, selector, map_dict, default=_NO_DEFAULT):
|
||||
super(Map, self).__init__(selector)
|
||||
|
|
@ -260,12 +267,14 @@ class Map(Filter):
|
|||
else:
|
||||
raise KeyError('Unable to handle %r' % txt)
|
||||
|
||||
|
||||
class Date(Filter):
|
||||
def filter(self, txt):
|
||||
if empty(txt):
|
||||
return txt
|
||||
return parse_date(txt)
|
||||
|
||||
|
||||
class Time(Filter):
|
||||
klass = datetime.time
|
||||
regexp = re.compile(ur'(?P<hh>\d+):?(?P<mm>\d+)(:(?P<ss>\d+))?')
|
||||
|
|
@ -293,3 +302,24 @@ class Duration(Time):
|
|||
klass = datetime.timedelta
|
||||
regexp = re.compile(ur'((?P<hh>\d+)[:;])?(?P<mm>\d+)[;:](?P<ss>\d+)')
|
||||
kwargs = {'hours': 'hh', 'minutes': 'mm', 'seconds': 'ss'}
|
||||
|
||||
|
||||
class MultiFilter(Filter):
|
||||
def __init__(self, *args):
|
||||
super(MultiFilter, self).__init__(args)
|
||||
|
||||
def __call__(self, item):
|
||||
values = [self.select(selector, item) for selector in self.selector]
|
||||
return self.filter(tuple(values))
|
||||
|
||||
def filter(self, values):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class Format(MultiFilter):
|
||||
def __init__(self, fmt, *args):
|
||||
super(Format, self).__init__(*args)
|
||||
self.fmt = fmt
|
||||
|
||||
def filter(self, values):
|
||||
return self.fmt % values
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue