From d762195704966b097f45bb5b6559d3d950764389 Mon Sep 17 00:00:00 2001 From: wrrrzr Date: Sun, 3 Mar 2024 00:28:10 +0300 Subject: [PATCH 1/6] Add function get_value for FSMContext --- aiogram/fsm/context.py | 3 +++ aiogram/fsm/storage/base.py | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/aiogram/fsm/context.py b/aiogram/fsm/context.py index 53a8ea46..2bae3607 100644 --- a/aiogram/fsm/context.py +++ b/aiogram/fsm/context.py @@ -20,6 +20,9 @@ class FSMContext: async def get_data(self) -> Dict[str, Any]: return await self.storage.get_data(key=self.key) + async def get_value(self, key: str) -> Any: + return await self.storage.get_value(key=self.key, data_key=key) + async def update_data( self, data: Optional[Dict[str, Any]] = None, **kwargs: Any ) -> Dict[str, Any]: diff --git a/aiogram/fsm/storage/base.py b/aiogram/fsm/storage/base.py index 52cb62f2..ddfcacf3 100644 --- a/aiogram/fsm/storage/base.py +++ b/aiogram/fsm/storage/base.py @@ -64,6 +64,17 @@ class BaseStorage(ABC): """ pass + async def get_value(self, key: StorageKey, data_key: str) -> Any: + """ + Get selected value by key in current data + + :param key: storage key + :param data_key: key of selected data + :return: value of current data by key + """ + current_data = await self.get_data(key=key) + return current_data[data_key] + async def update_data(self, key: StorageKey, data: Dict[str, Any]) -> Dict[str, Any]: """ Update date in the storage for key (like dict.update) From da278c8a1dc1ea0a02bd4fc22b2ea3f533c2d977 Mon Sep 17 00:00:00 2001 From: wrrrzr <161970349+wrrrzr@users.noreply.github.com> Date: Wed, 6 Mar 2024 14:24:13 +0300 Subject: [PATCH 2/6] Create 1431.feature.rst --- CHANGES/1431.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 CHANGES/1431.feature.rst diff --git a/CHANGES/1431.feature.rst b/CHANGES/1431.feature.rst new file mode 100644 index 00000000..155a2971 --- /dev/null +++ b/CHANGES/1431.feature.rst @@ -0,0 +1 @@ +Added method :code:`get_value` for class :code:`FSMContext` From 61dfd6078142562320dcbd53f4825fcd6ef50c51 Mon Sep 17 00:00:00 2001 From: wrrrzr Date: Wed, 6 Mar 2024 14:30:57 +0300 Subject: [PATCH 3/6] Update method get_value --- aiogram/fsm/context.py | 4 ++-- aiogram/fsm/storage/base.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aiogram/fsm/context.py b/aiogram/fsm/context.py index 2bae3607..29348c33 100644 --- a/aiogram/fsm/context.py +++ b/aiogram/fsm/context.py @@ -20,8 +20,8 @@ class FSMContext: async def get_data(self) -> Dict[str, Any]: return await self.storage.get_data(key=self.key) - async def get_value(self, key: str) -> Any: - return await self.storage.get_value(key=self.key, data_key=key) + async def get_value(self, key: str, default: Any = None) -> Any: + return await self.storage.get_value(key=self.key, data_key=key, default=default) async def update_data( self, data: Optional[Dict[str, Any]] = None, **kwargs: Any diff --git a/aiogram/fsm/storage/base.py b/aiogram/fsm/storage/base.py index ddfcacf3..1e87b0fb 100644 --- a/aiogram/fsm/storage/base.py +++ b/aiogram/fsm/storage/base.py @@ -64,7 +64,7 @@ class BaseStorage(ABC): """ pass - async def get_value(self, key: StorageKey, data_key: str) -> Any: + async def get_value(self, key: StorageKey, data_key: str, default: Any) -> Any: """ Get selected value by key in current data @@ -73,7 +73,7 @@ class BaseStorage(ABC): :return: value of current data by key """ current_data = await self.get_data(key=key) - return current_data[data_key] + return current_data.get(data_key) async def update_data(self, key: StorageKey, data: Dict[str, Any]) -> Dict[str, Any]: """ From c7a0d75c394313020c6da1f4b75f060b2b6ca9b3 Mon Sep 17 00:00:00 2001 From: wrrrzr Date: Wed, 6 Mar 2024 14:42:02 +0300 Subject: [PATCH 4/6] Fix --- aiogram/fsm/storage/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiogram/fsm/storage/base.py b/aiogram/fsm/storage/base.py index 1e87b0fb..f4eaa800 100644 --- a/aiogram/fsm/storage/base.py +++ b/aiogram/fsm/storage/base.py @@ -64,7 +64,7 @@ class BaseStorage(ABC): """ pass - async def get_value(self, key: StorageKey, data_key: str, default: Any) -> Any: + async def get_value(self, key: StorageKey, data_key: str, default: Any = None) -> Any: """ Get selected value by key in current data @@ -73,7 +73,7 @@ class BaseStorage(ABC): :return: value of current data by key """ current_data = await self.get_data(key=key) - return current_data.get(data_key) + return current_data.get(data_key, default) async def update_data(self, key: StorageKey, data: Dict[str, Any]) -> Dict[str, Any]: """ From 97df4ba3832752acfe9efa04f0ab4f17b327af4c Mon Sep 17 00:00:00 2001 From: wrrrzr Date: Wed, 6 Mar 2024 14:42:19 +0300 Subject: [PATCH 5/6] Test changes --- tests/test_fsm/storage/test_storages.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_fsm/storage/test_storages.py b/tests/test_fsm/storage/test_storages.py index 3558e33d..de9d295f 100644 --- a/tests/test_fsm/storage/test_storages.py +++ b/tests/test_fsm/storage/test_storages.py @@ -43,3 +43,9 @@ class TestStorages: "foo": "bar", "baz": "spam", } + + async def test_get_value(self, bot: MockedBot, storage: BaseStorage, storage_key: StorageKey): + await storage.set_data(key=storage_key, data={"hello": "world"}) + assert await storage.get_value(key=storage_key, data_key="hello") == "world" + assert await storage.get_value(key=storage_key, data_key="12345") is None + assert await storage.get_value(key=storage_key, data_key="qwerty", default=42) == 42 From e4b01dbaf2b3a6d1cfe53f749b4fb5c1a63b09f8 Mon Sep 17 00:00:00 2001 From: wrrrzr <161970349+wrrrzr@users.noreply.github.com> Date: Sat, 9 Mar 2024 18:36:17 +0300 Subject: [PATCH 6/6] Update 1431.feature.rst --- CHANGES/1431.feature.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES/1431.feature.rst b/CHANGES/1431.feature.rst index 155a2971..56085950 100644 --- a/CHANGES/1431.feature.rst +++ b/CHANGES/1431.feature.rst @@ -1 +1,3 @@ Added method :code:`get_value` for class :code:`FSMContext` + +- Added a new function :code:`get_value`, which allows retrieving the value by its name from the :code:`FSMContext`.