From 68a9df92227b76b754fe3723679af37eb4e324cb Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Wed, 9 Oct 2019 20:03:48 +0300 Subject: [PATCH] Create OrderedHelper --- aiogram/utils/helper.py | 36 +++++++++++++++++++++++++++++++++ tests/test_utils/test_helper.py | 22 ++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 tests/test_utils/test_helper.py diff --git a/aiogram/utils/helper.py b/aiogram/utils/helper.py index 443a2ffe..735afe5d 100644 --- a/aiogram/utils/helper.py +++ b/aiogram/utils/helper.py @@ -13,6 +13,9 @@ Example: >>> print(MyHelper.all()) <<< ['barItem', 'bazItem', 'fooItem', 'lorem'] """ +from typing import List + +PROPS_KEYS_ATTR_NAME = '_props_keys' class Helper: @@ -191,3 +194,36 @@ class ItemsList(list): return self __iadd__ = __add__ = __rand__ = __and__ = __ror__ = __or__ = add + + +class OrderedHelperMeta(type): + + def __new__(mcs, name, bases, namespace, **kwargs): + cls = super().__new__(mcs, name, bases, namespace) + + props_keys = [] + + for prop_name in (name for name, prop in namespace.items() if isinstance(prop, (Item, ListItem))): + props_keys.append(prop_name) + + setattr(cls, PROPS_KEYS_ATTR_NAME, props_keys) + + return cls + + +class OrderedHelper(metaclass=OrderedHelperMeta): + mode = '' + + @classmethod + def all(cls) -> List[str]: + """ + Get all Items values + """ + result = [] + for name in getattr(cls, PROPS_KEYS_ATTR_NAME, []): + value = getattr(cls, name) + if isinstance(value, ItemsList): + result.append(value[0]) + else: + result.append(value) + return result diff --git a/tests/test_utils/test_helper.py b/tests/test_utils/test_helper.py new file mode 100644 index 00000000..d202d289 --- /dev/null +++ b/tests/test_utils/test_helper.py @@ -0,0 +1,22 @@ +from aiogram.utils.helper import OrderedHelper, Item, ListItem + + +class TestOrderedHelper: + + def test_items_are_ordered(self): + class Helper(OrderedHelper): + A = Item() + D = Item() + C = Item() + B = Item() + + assert Helper.all() == ['A', 'D', 'C', 'B'] + + def test_list_items_are_ordered(self): + class Helper(OrderedHelper): + A = ListItem() + D = ListItem() + C = ListItem() + B = ListItem() + + assert Helper.all() == ['A', 'D', 'C', 'B']