filters config

This commit is contained in:
Alex Root Junior 2018-03-19 01:25:39 +02:00
parent 8d7a00204d
commit 3ff2cbb4ec
2 changed files with 63 additions and 29 deletions

View file

@ -265,7 +265,7 @@ class Dispatcher:
if relax: if relax:
await asyncio.sleep(relax) await asyncio.sleep(relax)
finally: finally:
self._close_waiter.set_result(None) self._close_waiter._set_result(None)
log.warning('Polling is stopped.') log.warning('Polling is stopped.')
async def _process_polling_updates(self, updates): async def _process_polling_updates(self, updates):

View file

@ -1,6 +1,8 @@
import asyncio import asyncio
import copy
import inspect import inspect
import re import re
import typing
from ..types import ContentType from ..types import ContentType
from ..utils import context from ..utils import context
@ -19,7 +21,7 @@ class FiltersFactory:
return tuple(filter(lambda item: item[-1], self._filters)) return tuple(filter(lambda item: item[-1], self._filters))
def bind(self, filter_, *args, default=False, with_dispatcher=False): def bind(self, filter_, *args, default=False, with_dispatcher=False):
self._filters.append((filter_, args, with_dispatcher, default)) self._filters.append(FilterConfig(self._dispatcher, filter_, default=default, with_dispatcher=with_dispatcher))
def unbind(self, filter_): def unbind(self, filter_):
for item in self._filters: for item in self._filters:
@ -49,32 +51,8 @@ class FiltersFactory:
filters.extend(args) filters.extend(args)
# Registered filters filters # Registered filters filters
for filter_, args_list, with_dispatcher, default in self._filters: for filterconfig in self._filters:
config = {} pass
accept = True
for item in args_list:
value = kwargs.pop(item, None)
if value is None:
accept = False
break
config[item] = value
if accept:
if with_dispatcher:
config['dispatcher'] = self._dispatcher
filters.append(filter_(**config))
used.append(filter_)
elif default:
if filter_ not in used:
used.append(filter_)
if isinstance(filter_, Filter):
if with_dispatcher:
filters.append(filter_(dispatcher=self._dispatcher))
else:
filters.append(filter_())
# Not registered filters # Not registered filters
for key, filter_ in kwargs.items(): for key, filter_ in kwargs.items():
@ -87,6 +65,61 @@ class FiltersFactory:
return filters return filters
class FilterConfig:
def __init__(self, dispatcher, filter_: typing.Callable,
default: bool = False, with_dispatcher: bool = False,
args: typing.Union[tuple, set, list] = ()):
self.dispatcher = dispatcher
self.filter = filter_
self.default = default
self.with_dispatcher = with_dispatcher
self.args = args
def _check_list(self, config):
result = {}
accept = True
for item in self.args:
value = config.pop(item, None)
if value is None:
accept = False
break
result[item] = value
return accept or self.default, result
def _check_dict(self, config):
result = {}
accept = True
for key, type_ in self.args:
value = config.pop(key, None)
if value is None:
accept = False
break
if type_ is bool:
return accept or self.default, result
def check(self, config):
if isinstance(config, dict):
return self._check_dict(config)
else:
return self._check_list(config)
def parse(self, config):
pass
def configure(self, config=None):
if config is None:
config = {}
if self.with_dispatcher:
if config:
config = copy.deepcopy(config)
config['dispatcher'] = self.dispatcher
return self.filter(**config)
async def check_filter(filter_, args): async def check_filter(filter_, args):
""" """
Helper for executing filter Helper for executing filter
@ -127,7 +160,8 @@ class Filter:
""" """
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
pass self._args = args
self._kwargs = kwargs
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
return self.check(*args, **kwargs) return self.check(*args, **kwargs)