summaryrefslogtreecommitdiffstats
path: root/filter_manager.py
diff options
context:
space:
mode:
authorJan Pokorný <jpokorny@redhat.com>2013-11-18 11:14:43 +0100
committerJan Pokorný <jpokorny@redhat.com>2013-11-18 11:14:43 +0100
commitb182bb2e0a9266b313112d507e9803e5ef2de387 (patch)
treef348cb4d1b254d2e7fa8cc61a1f82d3b4a2e9e99 /filter_manager.py
downloadclufter-b182bb2e0a9266b313112d507e9803e5ef2de387.tar.gz
clufter-b182bb2e0a9266b313112d507e9803e5ef2de387.tar.xz
clufter-b182bb2e0a9266b313112d507e9803e5ef2de387.zip
Initial commit
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
Diffstat (limited to 'filter_manager.py')
-rw-r--r--filter_manager.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/filter_manager.py b/filter_manager.py
new file mode 100644
index 0000000..f5a13fe
--- /dev/null
+++ b/filter_manager.py
@@ -0,0 +1,57 @@
+# -*- coding: UTF-8 -*-
+# Copyright 2012 Red Hat, Inc.
+# Part of clufter project
+# Licensed under GPLv2 (a copy included | http://gnu.org/licenses/gpl-2.0.txt)
+"""Filter manager"""
+__author__ = "Jan Pokorný <jpokorny at redhat dot com>"
+
+import logging
+
+from .filter import filters
+
+log = logging.getLogger(__name__)
+
+
+class FilterManager(object):
+ """Class responsible to manage filters and filtering itself"""
+ def __init__(self, fmt_mgr, registry=filters, paths=(), filters={}):
+ self._registry = registry
+ filters = dict(registry.discover(paths), **filters)
+ log.debug("Filters before resolving: {0}"
+ .format(filters))
+ self._filters = self._resolve(fmt_mgr.formats, filters)
+
+ @staticmethod
+ def _resolve(formats, filters):
+ for flt_name, flt_cls in filters.items():
+ in_format = formats.get(flt_cls.in_format)
+ out_format = formats.get(flt_cls.out_format)
+ if in_format is not None and out_format is not None:
+ log.debug("Resolve at `{0}' filter: `{1}' -> {2},"
+ " `{3}' -> {4}"
+ .format(flt_name, flt_cls.in_format, in_format,
+ flt_cls.out_format, out_format))
+ filters[flt_name] = flt_cls(in_format, out_format)
+ continue
+ # drop the filter if cannot resolve either format
+ if not in_format:
+ log.warning("Resolve at `{0}' filter: `{1}' input format fail"
+ .format(flt_name, flt_cls.in_format))
+ if not out_format:
+ log.warning("Resolve at `{0}' filter: `{1}' output format fail"
+ .format(flt_name, flt_cls.out_format))
+ filters.pop(flt_name)
+ return filters
+
+ @property
+ def filters(self):
+ return self._filters.copy()
+
+ @property
+ def registry(self):
+ return self._registry
+
+ def __call__(self, which, in_decl, **kwargs):
+ flt = self._filters[which]
+ in_obj = flt.in_format(*in_decl)
+ return flt(in_obj, **kwargs)