From 808e665eb8cb501a5b360914ecf56b930c95dc75 Mon Sep 17 00:00:00 2001 From: Niloth P <20315308+Niloth-p@users.noreply.github.com> Date: Fri, 19 Jul 2024 12:41:44 +0530 Subject: [PATCH] refactor: helper/views/messages: Use a dataclass instead of a TypedDict. If the dataclass is chosen, we could squash this commit. If the TypeDict is chosen, we could drop this commit. --- tests/ui_tools/test_popups.py | 26 +++++++++----------------- zulipterminal/helper.py | 4 +++- zulipterminal/ui_tools/messages.py | 8 ++++---- zulipterminal/ui_tools/views.py | 19 ++++++++----------- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/tests/ui_tools/test_popups.py b/tests/ui_tools/test_popups.py index 90ce1ec050..9da37a3a7d 100644 --- a/tests/ui_tools/test_popups.py +++ b/tests/ui_tools/test_popups.py @@ -47,12 +47,7 @@ @pytest.fixture def message_info_content() -> MessageInfoPopupContent: - return MessageInfoPopupContent( - message=Message(), - topic_links=OrderedDict(), - message_links=OrderedDict(), - time_mentions=list(), - ) + return MessageInfoPopupContent(Message(), OrderedDict(), OrderedDict(), list()) class TestPopUpConfirmationView: @@ -519,7 +514,7 @@ def mock_external_classes( # the message data currently, message_fixture is not used to avoid # adding extra test runs unnecessarily. self.message_info_content = message_info_content - self.message_info_content["message"] = Message(id=1) + self.message_info_content.message = Message(id=1) self.full_rendered_message = FullRenderedMsgView( controller=self.controller, title="Full Rendered Message", @@ -595,7 +590,7 @@ def mock_external_classes( # the message data currently, message_fixture is not used to avoid # adding extra test runs unnecessarily. self.message_info_content = message_info_content - self.message_info_content["message"] = Message(id=1) + self.message_info_content.message = Message(id=1) self.full_raw_message = FullRawMsgView( controller=self.controller, title="Full Raw Message", @@ -662,7 +657,7 @@ def mock_external_classes( # the message data currently, message_fixture is not used to avoid # adding extra test runs unnecessarily. self.message_info_content = message_info_content - self.message_info_content["message"] = Message(id=1) + self.message_info_content.message = Message(id=1) self.edit_history_view = EditHistoryView( controller=self.controller, title="Edit History", @@ -674,7 +669,7 @@ def test_init(self) -> None: assert self.edit_history_view.title == "Edit History" assert self.edit_history_view.message_info_content == self.message_info_content self.controller.model.fetch_message_history.assert_called_once_with( - message_id=self.message_info_content["message"]["id"], + message_id=self.message_info_content.message["id"], ) @pytest.mark.parametrize("key", keys_for_command("MSG_INFO")) @@ -981,7 +976,7 @@ def mock_external_classes( "Tue Mar 13 10:55:37", ] self.message_info_content = message_info_content - self.message_info_content["message"] = message_fixture + self.message_info_content.message = message_fixture self.msg_info_view = MsgInfoView( self.controller, "Message Information", @@ -995,10 +990,7 @@ def test_pop_up_info_order(self, message_fixture: Message) -> None: topic_links = OrderedDict([("https://bar.com", ("topic", 1, True))]) message_links = OrderedDict([("image.jpg", ("image", 1, True))]) message_info_content = MessageInfoPopupContent( - message=message_fixture, - topic_links=topic_links, - message_links=message_links, - time_mentions=list(), + message_fixture, topic_links, message_links, list() ) msg_info_view = MsgInfoView( self.controller, @@ -1192,8 +1184,8 @@ def test_height_reactions( to_vary_in_each_message: Message, message_info_content: MessageInfoPopupContent, ) -> None: - message_info_content["message"] = message_fixture - message_info_content["message"].update(to_vary_in_each_message) + message_info_content.message = message_fixture + message_info_content.message.update(to_vary_in_each_message) self.msg_info_view = MsgInfoView( self.controller, "Message Information", message_info_content ) diff --git a/zulipterminal/helper.py b/zulipterminal/helper.py index 4d2d6cb30e..071903ec0c 100644 --- a/zulipterminal/helper.py +++ b/zulipterminal/helper.py @@ -7,6 +7,7 @@ import time from collections import defaultdict from contextlib import contextmanager +from dataclasses import dataclass from functools import partial, wraps from itertools import chain, combinations from re import ASCII, MULTILINE, findall, match @@ -57,7 +58,8 @@ class StreamData(TypedDict): description: str -class MessageInfoPopupContent(TypedDict): +@dataclass +class MessageInfoPopupContent: message: Message topic_links: Dict[str, Tuple[str, int, bool]] message_links: Dict[str, Tuple[str, int, bool]] diff --git a/zulipterminal/ui_tools/messages.py b/zulipterminal/ui_tools/messages.py index 3c47120548..b1e5bb6ef0 100644 --- a/zulipterminal/ui_tools/messages.py +++ b/zulipterminal/ui_tools/messages.py @@ -1122,10 +1122,10 @@ def keypress(self, size: urwid_Size, key: str) -> Optional[str]: elif is_command_key("MSG_INFO", key): self.model.controller.show_msg_info( MessageInfoPopupContent( - message=self.message, - topic_links=self.topic_links, - message_links=self.message_links, - time_mentions=self.time_mentions, + self.message, + self.topic_links, + self.message_links, + self.time_mentions, ) ) elif is_command_key("ADD_REACTION", key): diff --git a/zulipterminal/ui_tools/views.py b/zulipterminal/ui_tools/views.py index 6c9f77eff7..c8f18264b7 100644 --- a/zulipterminal/ui_tools/views.py +++ b/zulipterminal/ui_tools/views.py @@ -1578,10 +1578,10 @@ def __init__( message_info_content: MessageInfoPopupContent, ) -> None: self.message_info_content = message_info_content - self.msg = message_info_content["message"] - self.topic_links = message_info_content["topic_links"] - self.message_links = message_info_content["message_links"] - self.time_mentions = message_info_content["time_mentions"] + self.msg = message_info_content.message + self.topic_links = message_info_content.topic_links + self.message_links = message_info_content.message_links + self.time_mentions = message_info_content.time_mentions self.server_url = controller.model.server_url date_and_time = controller.model.formatted_local_time( self.msg["timestamp"], show_seconds=True, show_year=True @@ -1721,10 +1721,7 @@ def create_link_buttons( def keypress(self, size: urwid_Size, key: str) -> str: message_info_content = MessageInfoPopupContent( - message=self.msg, - topic_links=self.topic_links, - message_links=self.message_links, - time_mentions=self.time_mentions, + self.msg, self.topic_links, self.message_links, self.time_mentions ) if is_command_key("EDIT_HISTORY", key) and self.show_edit_history_label: self.controller.show_edit_history(message_info_content) @@ -1789,7 +1786,7 @@ def __init__( ) -> None: self.controller = controller self.message_info_content = message_info_content - self.message = message_info_content["message"] + self.message = message_info_content.message width = 64 widgets: List[Any] = [] @@ -1897,7 +1894,7 @@ def __init__( ) -> None: self.controller = controller self.message_info_content = message_info_content - self.message = message_info_content["message"] + self.message = message_info_content.message max_cols, max_rows = controller.maximum_popup_dimensions() # Get rendered message @@ -1931,7 +1928,7 @@ def __init__( ) -> None: self.controller = controller self.message_info_content = message_info_content - self.message = message_info_content["message"] + self.message = message_info_content.message max_cols, max_rows = controller.maximum_popup_dimensions() # Get rendered message header and footer