Minor refactor callback_data

This commit is contained in:
Suren Khorenyan 2019-07-20 22:47:23 +03:00
parent 8823c8f22a
commit 61e1015c1e

View file

@ -28,13 +28,13 @@ class CallbackData:
def __init__(self, prefix, *parts, sep=':'): def __init__(self, prefix, *parts, sep=':'):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise TypeError(f"Prefix must be instance of str not {type(prefix).__name__}") raise TypeError(f'Prefix must be instance of str not {type(prefix).__name__}')
elif not prefix: if not prefix:
raise ValueError('Prefix can\'t be empty') raise ValueError("Prefix can't be empty")
elif sep in prefix: if sep in prefix:
raise ValueError(f"Separator '{sep}' can't be used in prefix") raise ValueError(f"Separator {sep!r} can't be used in prefix")
elif not parts: if not parts:
raise TypeError('Parts is not passed!') raise TypeError('Parts were not passed!')
self.prefix = prefix self.prefix = prefix
self.sep = sep self.sep = sep
@ -59,20 +59,20 @@ class CallbackData:
if args: if args:
value = args.pop(0) value = args.pop(0)
else: else:
raise ValueError(f"Value for '{part}' is not passed!") raise ValueError(f'Value for {part!r} was not passed!')
if value is not None and not isinstance(value, str): if value is not None and not isinstance(value, str):
value = str(value) value = str(value)
if not value: if not value:
raise ValueError(f"Value for part {part} can't be empty!'") raise ValueError(f"Value for part {part!r} can't be empty!'")
elif self.sep in value: if self.sep in value:
raise ValueError(f"Symbol defined as separator can't be used in values of parts") raise ValueError(f"Symbol {self.sep!r} is defined as the separator and can't be used in parts' values")
data.append(value) data.append(value)
if args or kwargs: if args or kwargs:
raise TypeError('Too many arguments is passed!') raise TypeError('Too many arguments were passed!')
callback_data = self.sep.join(data) callback_data = self.sep.join(data)
if len(callback_data) > 64: if len(callback_data) > 64:
@ -106,30 +106,31 @@ class CallbackData:
""" """
for key in config.keys(): for key in config.keys():
if key not in self._part_names: if key not in self._part_names:
raise ValueError(f"Invalid field name '{key}'") raise ValueError(f'Invalid field name {key!r}')
return CallbackDataFilter(self, config) return CallbackDataFilter(self, config)
class CallbackDataFilter(Filter): class CallbackDataFilter(Filter):
def __init__(self, factory: CallbackData, config: typing.Dict[str, str]): def __init__(self, factory: CallbackData, config: typing.Dict[str, str]):
self.config = config self.config = config
self.factory = factory self.factory = factory
@classmethod @classmethod
def validate(cls, full_config: typing.Dict[str, typing.Any]): def validate(cls, full_config: typing.Dict[str, typing.Any]):
raise ValueError('That filter can\'t be used in filters factory!') raise ValueError("That filter can't be used in filters factory!")
async def check(self, query: types.CallbackQuery): async def check(self, query: types.CallbackQuery):
try: try:
data = self.factory.parse(query.data) data = self.factory.parse(query.data)
except ValueError: except ValueError:
return False return False
else:
for key, value in self.config.items(): for key, value in self.config.items():
if isinstance(value, (list, tuple, set)): if isinstance(value, (list, tuple, set, frozenset)):
if data.get(key) not in value: if data.get(key) not in value:
return False return False
else: else:
if value != data.get(key): if data.get(key) != value:
return False return False
return {'callback_data': data} return {'callback_data': data}