Source code for datconv.filters.pipe
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
General Filter that allows users to run several other filters one after one.
Values returned by configured filters' are combined in following way:
- to get record written (sent to Writer) all filters must set WRITE bit
- to get record repeated at leat one filter must set REPEAT bit
- to get process break at leat one filter must set BREAK bit
- REPEAT bit takes precedence over BREAK bit (i.e. if both are set record is re-evaluated)
"""
# Standard Python Libs
from importlib import import_module
# Datconv packages
from . import SKIP, WRITE, REPEAT, BREAK
Log = None
"""Log variable is automatically set by main datconv script using logging.getLogger method.
Use it for logging messages in need.
"""
[docs]class DCFilter:
"""Please see constructor description for more details."""
def __init__(self, flist, pass_skiped = True):
"""Constructor parameters are usually passed from YAML file as subkeys of Filter:CArg key.
:param flist: list of filters to be run in chain with their parameters;
:param pass_skiped: if it is False, records for which some filter returned SKIP will not be passed to next filters;
For more detailed descriptions see :ref:`conf_template.yaml <filters_conf_template>` file in this module folder.
"""
assert Log is not None
assert isinstance(flist, list)
self._pass_skiped = pass_skiped
self._flist = []
for flt in flist:
flt_path = flt['Module']
flt_carg = flt.get('CArg')
flt_mod = import_module(flt_path)
flt_mod.Log = Log
flt_class = getattr(flt_mod, 'DCFilter')
Log.debug('Adding filter: %s(%s)', flt_path, str(flt_carg))
flt_inst = flt_class(**flt_carg) if flt_carg else flt_class()
self._flist.append(flt_inst)
def setHeader(self, header):
for flt in self._flist:
if hasattr(flt, 'setHeader'):
flt.setHeader(header)
def filterRecord(self, record):
res = WRITE
for flt in self._flist:
ret = flt.filterRecord(record)
if ret & REPEAT:
res |= REPEAT
if ret & BREAK:
res |= BREAK
if not (ret & WRITE):
res &= ~WRITE
if not self._pass_skiped:
break
return res
def setFooter(self, footer):
for flt in self._flist:
if hasattr(flt, 'setFooter'):
flt.setFooter(footer)