From d843638a496c60f4dbf5147daf31971994797683 Mon Sep 17 00:00:00 2001 From: Harshil <37377066+harshil21@users.noreply.github.com> Date: Fri, 1 Oct 2021 20:02:58 +0400 Subject: [PATCH 1/4] fix @log annotation for pycharm and vscode --- telegram/bot.py | 34 ++++++++++++++++++---------------- tests/test_bot.py | 1 + 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/telegram/bot.py b/telegram/bot.py index b8dc82daad6..5c59c47d441 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -35,6 +35,7 @@ Dict, cast, Sequence, + Any, ) try: @@ -114,22 +115,6 @@ RT = TypeVar('RT') -def log( # skipcq: PY-D0003 - func: Callable[..., RT], *args: object, **kwargs: object # pylint: disable=W0613 -) -> Callable[..., RT]: - logger = logging.getLogger(func.__module__) - - @functools.wraps(func) - def decorator(*args: object, **kwargs: object) -> RT: # pylint: disable=W0613 - logger.debug('Entering: %s', func.__name__) - result = func(*args, **kwargs) - logger.debug(result) - logger.debug('Exiting: %s', func.__name__) - return result - - return decorator - - class Bot(TelegramObject): """This object represents a Telegram Bot. @@ -222,6 +207,23 @@ def __init__( private_key, password=private_key_password, backend=default_backend() ) + # TODO: After https://youtrack.jetbrains.com/issue/PY-50952 is fixed, we can revisit this and + # consider adding Paramspec from typing_extensions to properly fix this. Currently a workaround + def log( # type: ignore[no-untyped-def] # skipcq: PY-D0003 + func: Any, *args, **kwargs # pylint: disable=W0613 + ): + logger = logging.getLogger(func.__module__) + + @functools.wraps(func) + def decorator(*args, **kwargs): # type: ignore[no-untyped-def] # pylint: disable=W0613 + logger.debug('Entering: %s', func.__name__) + result = func(*args, **kwargs) + logger.debug(result) + logger.debug('Exiting: %s', func.__name__) + return result + + return decorator + def _insert_defaults( self, data: Dict[str, object], timeout: ODVInput[float] ) -> Optional[float]: diff --git a/tests/test_bot.py b/tests/test_bot.py index 8cf62962431..90a38a60c12 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -240,6 +240,7 @@ def test_to_dict(self, bot): 'de_list', 'to_dict', 'to_json', + 'log', 'parse_data', 'get_updates', 'getUpdates', From 8951b5ea6a54b5e3bb0682ef3c1ee56aa893cf7f Mon Sep 17 00:00:00 2001 From: Harshil <37377066+harshil21@users.noreply.github.com> Date: Fri, 1 Oct 2021 23:35:53 +0400 Subject: [PATCH 2/4] add @log test --- tests/test_bot.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_bot.py b/tests/test_bot.py index 90a38a60c12..a9d3878844f 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -17,6 +17,7 @@ # You should have received a copy of the GNU Lesser Public License # along with this program. If not, see [http://www.gnu.org/licenses/]. import inspect +import logging import time import datetime as dtm from collections import defaultdict @@ -162,6 +163,13 @@ def test_invalid_token(self, token): with pytest.raises(InvalidToken, match='Invalid token'): Bot(token) + def test_log_decorator(self, bot, caplog): + with caplog.at_level(logging.DEBUG): + bot.get_me() + assert len(caplog.records) == 3 + assert caplog.records[0].getMessage().startswith('Entering: get_me') + assert caplog.records[-1].getMessage().startswith('Exiting: get_me') + @pytest.mark.parametrize( 'acd_in,maxsize,acd', [(True, 1024, True), (False, 1024, False), (0, 0, True), (None, None, True)], From 714a751ad30de2e23c987517d09c1a91396f6617 Mon Sep 17 00:00:00 2001 From: Harshil <37377066+harshil21@users.noreply.github.com> Date: Sun, 3 Oct 2021 19:45:23 +0530 Subject: [PATCH 3/4] address review --- telegram/bot.py | 158 ++++++++++++++++++++++++------------------------ 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/telegram/bot.py b/telegram/bot.py index 5c59c47d441..4aba1f8d4d1 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -209,9 +209,7 @@ def __init__( # TODO: After https://youtrack.jetbrains.com/issue/PY-50952 is fixed, we can revisit this and # consider adding Paramspec from typing_extensions to properly fix this. Currently a workaround - def log( # type: ignore[no-untyped-def] # skipcq: PY-D0003 - func: Any, *args, **kwargs # pylint: disable=W0613 - ): + def _log(func: Any): # type: ignore[no-untyped-def] # skipcq: PY-D0003 logger = logging.getLogger(func.__module__) @functools.wraps(func) @@ -396,7 +394,7 @@ def name(self) -> str: """:obj:`str`: Bot's @username.""" return f'@{self.username}' - @log + @_log def get_me(self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = None) -> User: """A simple method for testing your bot's auth token. Requires no parameters. @@ -421,7 +419,7 @@ def get_me(self, timeout: ODVInput[float] = DEFAULT_NONE, api_kwargs: JSONDict = return self._bot # type: ignore[return-value] - @log + @_log def send_message( self, chat_id: Union[int, str], @@ -493,7 +491,7 @@ def send_message( api_kwargs=api_kwargs, ) - @log + @_log def delete_message( self, chat_id: Union[str, int], @@ -539,7 +537,7 @@ def delete_message( return result # type: ignore[return-value] - @log + @_log def forward_message( self, chat_id: Union[int, str], @@ -589,7 +587,7 @@ def forward_message( api_kwargs=api_kwargs, ) - @log + @_log def send_photo( self, chat_id: Union[int, str], @@ -679,7 +677,7 @@ def send_photo( api_kwargs=api_kwargs, ) - @log + @_log def send_audio( self, chat_id: Union[int, str], @@ -800,7 +798,7 @@ def send_audio( api_kwargs=api_kwargs, ) - @log + @_log def send_document( self, chat_id: Union[int, str], @@ -909,7 +907,7 @@ def send_document( api_kwargs=api_kwargs, ) - @log + @_log def send_sticker( self, chat_id: Union[int, str], @@ -973,7 +971,7 @@ def send_sticker( api_kwargs=api_kwargs, ) - @log + @_log def send_video( self, chat_id: Union[int, str], @@ -1099,7 +1097,7 @@ def send_video( api_kwargs=api_kwargs, ) - @log + @_log def send_video_note( self, chat_id: Union[int, str], @@ -1198,7 +1196,7 @@ def send_video_note( api_kwargs=api_kwargs, ) - @log + @_log def send_animation( self, chat_id: Union[int, str], @@ -1315,7 +1313,7 @@ def send_animation( api_kwargs=api_kwargs, ) - @log + @_log def send_voice( self, chat_id: Union[int, str], @@ -1413,7 +1411,7 @@ def send_voice( api_kwargs=api_kwargs, ) - @log + @_log def send_media_group( self, chat_id: Union[int, str], @@ -1471,7 +1469,7 @@ def send_media_group( return Message.de_list(result, self) # type: ignore - @log + @_log def send_location( self, chat_id: Union[int, str], @@ -1567,7 +1565,7 @@ def send_location( api_kwargs=api_kwargs, ) - @log + @_log def edit_message_live_location( self, chat_id: Union[str, int] = None, @@ -1656,7 +1654,7 @@ def edit_message_live_location( api_kwargs=api_kwargs, ) - @log + @_log def stop_message_live_location( self, chat_id: Union[str, int] = None, @@ -1706,7 +1704,7 @@ def stop_message_live_location( api_kwargs=api_kwargs, ) - @log + @_log def send_venue( self, chat_id: Union[int, str], @@ -1818,7 +1816,7 @@ def send_venue( api_kwargs=api_kwargs, ) - @log + @_log def send_contact( self, chat_id: Union[int, str], @@ -1904,7 +1902,7 @@ def send_contact( api_kwargs=api_kwargs, ) - @log + @_log def send_game( self, chat_id: Union[int, str], @@ -1957,7 +1955,7 @@ def send_game( api_kwargs=api_kwargs, ) - @log + @_log def send_chat_action( self, chat_id: Union[str, int], @@ -2052,7 +2050,7 @@ def _effective_inline_results( # pylint: disable=R0201 return effective_results, next_offset - @log + @_log def answer_inline_query( self, inline_query_id: str, @@ -2186,7 +2184,7 @@ def _set_defaults(res): api_kwargs=api_kwargs, ) - @log + @_log def get_user_profile_photos( self, user_id: Union[str, int], @@ -2227,7 +2225,7 @@ def get_user_profile_photos( return UserProfilePhotos.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def get_file( self, file_id: Union[ @@ -2287,7 +2285,7 @@ def get_file( return File.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def ban_chat_member( self, chat_id: Union[str, int], @@ -2350,7 +2348,7 @@ def ban_chat_member( return result # type: ignore[return-value] - @log + @_log def unban_chat_member( self, chat_id: Union[str, int], @@ -2394,7 +2392,7 @@ def unban_chat_member( return result # type: ignore[return-value] - @log + @_log def answer_callback_query( self, callback_query_id: str, @@ -2457,7 +2455,7 @@ def answer_callback_query( return result # type: ignore[return-value] - @log + @_log def edit_message_text( self, text: str, @@ -2529,7 +2527,7 @@ def edit_message_text( api_kwargs=api_kwargs, ) - @log + @_log def edit_message_caption( self, chat_id: Union[str, int] = None, @@ -2604,7 +2602,7 @@ def edit_message_caption( api_kwargs=api_kwargs, ) - @log + @_log def edit_message_media( self, media: 'InputMedia', @@ -2670,7 +2668,7 @@ def edit_message_media( api_kwargs=api_kwargs, ) - @log + @_log def edit_message_reply_markup( self, chat_id: Union[str, int] = None, @@ -2731,7 +2729,7 @@ def edit_message_reply_markup( api_kwargs=api_kwargs, ) - @log + @_log def get_updates( self, offset: int = None, @@ -2815,7 +2813,7 @@ def get_updates( return Update.de_list(result, self) # type: ignore[return-value] - @log + @_log def set_webhook( self, url: str, @@ -2906,7 +2904,7 @@ def set_webhook( return result # type: ignore[return-value] - @log + @_log def delete_webhook( self, timeout: ODVInput[float] = DEFAULT_NONE, @@ -2942,7 +2940,7 @@ def delete_webhook( return result # type: ignore[return-value] - @log + @_log def leave_chat( self, chat_id: Union[str, int], @@ -2973,7 +2971,7 @@ def leave_chat( return result # type: ignore[return-value] - @log + @_log def get_chat( self, chat_id: Union[str, int], @@ -3006,7 +3004,7 @@ def get_chat( return Chat.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def get_chat_administrators( self, chat_id: Union[str, int], @@ -3041,7 +3039,7 @@ def get_chat_administrators( return ChatMember.de_list(result, self) # type: ignore - @log + @_log def get_chat_member_count( self, chat_id: Union[str, int], @@ -3074,7 +3072,7 @@ def get_chat_member_count( return result # type: ignore[return-value] - @log + @_log def get_chat_member( self, chat_id: Union[str, int], @@ -3107,7 +3105,7 @@ def get_chat_member( return ChatMember.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def set_chat_sticker_set( self, chat_id: Union[str, int], @@ -3140,7 +3138,7 @@ def set_chat_sticker_set( return result # type: ignore[return-value] - @log + @_log def delete_chat_sticker_set( self, chat_id: Union[str, int], @@ -3193,7 +3191,7 @@ def get_webhook_info( return WebhookInfo.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def set_game_score( self, user_id: Union[int, str], @@ -3257,7 +3255,7 @@ def set_game_score( api_kwargs=api_kwargs, ) - @log + @_log def get_game_high_scores( self, user_id: Union[int, str], @@ -3310,7 +3308,7 @@ def get_game_high_scores( return GameHighScore.de_list(result, self) # type: ignore - @log + @_log def send_invoice( self, chat_id: Union[int, str], @@ -3489,7 +3487,7 @@ def send_invoice( api_kwargs=api_kwargs, ) - @log + @_log def answer_shipping_query( # pylint: disable=C0103 self, shipping_query_id: str, @@ -3558,7 +3556,7 @@ def answer_shipping_query( # pylint: disable=C0103 return result # type: ignore[return-value] - @log + @_log def answer_pre_checkout_query( # pylint: disable=C0103 self, pre_checkout_query_id: str, @@ -3617,7 +3615,7 @@ def answer_pre_checkout_query( # pylint: disable=C0103 return result # type: ignore[return-value] - @log + @_log def restrict_chat_member( self, chat_id: Union[str, int], @@ -3678,7 +3676,7 @@ def restrict_chat_member( return result # type: ignore[return-value] - @log + @_log def promote_chat_member( self, chat_id: Union[str, int], @@ -3780,7 +3778,7 @@ def promote_chat_member( return result # type: ignore[return-value] - @log + @_log def set_chat_permissions( self, chat_id: Union[str, int], @@ -3816,7 +3814,7 @@ def set_chat_permissions( return result # type: ignore[return-value] - @log + @_log def set_chat_administrator_custom_title( self, chat_id: Union[int, str], @@ -3856,7 +3854,7 @@ def set_chat_administrator_custom_title( return result # type: ignore[return-value] - @log + @_log def export_chat_invite_link( self, chat_id: Union[str, int], @@ -3897,7 +3895,7 @@ def export_chat_invite_link( return result # type: ignore[return-value] - @log + @_log def create_chat_invite_link( self, chat_id: Union[str, int], @@ -3953,7 +3951,7 @@ def create_chat_invite_link( return ChatInviteLink.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def edit_chat_invite_link( self, chat_id: Union[str, int], @@ -4008,7 +4006,7 @@ def edit_chat_invite_link( return ChatInviteLink.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def revoke_chat_invite_link( self, chat_id: Union[str, int], @@ -4046,7 +4044,7 @@ def revoke_chat_invite_link( return ChatInviteLink.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def set_chat_photo( self, chat_id: Union[str, int], @@ -4085,7 +4083,7 @@ def set_chat_photo( return result # type: ignore[return-value] - @log + @_log def delete_chat_photo( self, chat_id: Union[str, int], @@ -4119,7 +4117,7 @@ def delete_chat_photo( return result # type: ignore[return-value] - @log + @_log def set_chat_title( self, chat_id: Union[str, int], @@ -4155,7 +4153,7 @@ def set_chat_title( return result # type: ignore[return-value] - @log + @_log def set_chat_description( self, chat_id: Union[str, int], @@ -4194,7 +4192,7 @@ def set_chat_description( return result # type: ignore[return-value] - @log + @_log def pin_chat_message( self, chat_id: Union[str, int], @@ -4239,7 +4237,7 @@ def pin_chat_message( 'pinChatMessage', data, timeout=timeout, api_kwargs=api_kwargs ) - @log + @_log def unpin_chat_message( self, chat_id: Union[str, int], @@ -4280,7 +4278,7 @@ def unpin_chat_message( 'unpinChatMessage', data, timeout=timeout, api_kwargs=api_kwargs ) - @log + @_log def unpin_all_chat_messages( self, chat_id: Union[str, int], @@ -4315,7 +4313,7 @@ def unpin_all_chat_messages( 'unpinAllChatMessages', data, timeout=timeout, api_kwargs=api_kwargs ) - @log + @_log def get_sticker_set( self, name: str, @@ -4345,7 +4343,7 @@ def get_sticker_set( return StickerSet.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def upload_sticker_file( self, user_id: Union[str, int], @@ -4390,7 +4388,7 @@ def upload_sticker_file( return File.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def create_new_sticker_set( self, user_id: Union[str, int], @@ -4479,7 +4477,7 @@ def create_new_sticker_set( return result # type: ignore[return-value] - @log + @_log def add_sticker_to_set( self, user_id: Union[str, int], @@ -4559,7 +4557,7 @@ def add_sticker_to_set( return result # type: ignore[return-value] - @log + @_log def set_sticker_position_in_set( self, sticker: str, @@ -4593,7 +4591,7 @@ def set_sticker_position_in_set( return result # type: ignore[return-value] - @log + @_log def delete_sticker_from_set( self, sticker: str, @@ -4623,7 +4621,7 @@ def delete_sticker_from_set( return result # type: ignore[return-value] - @log + @_log def set_sticker_set_thumb( self, name: str, @@ -4675,7 +4673,7 @@ def set_sticker_set_thumb( return result # type: ignore[return-value] - @log + @_log def set_passport_data_errors( self, user_id: Union[str, int], @@ -4716,7 +4714,7 @@ def set_passport_data_errors( return result # type: ignore[return-value] - @log + @_log def send_poll( self, chat_id: Union[int, str], @@ -4837,7 +4835,7 @@ def send_poll( api_kwargs=api_kwargs, ) - @log + @_log def stop_poll( self, chat_id: Union[int, str], @@ -4883,7 +4881,7 @@ def stop_poll( return Poll.de_json(result, self) # type: ignore[return-value, arg-type] - @log + @_log def send_dice( self, chat_id: Union[int, str], @@ -4948,7 +4946,7 @@ def send_dice( api_kwargs=api_kwargs, ) - @log + @_log def get_my_commands( self, timeout: ODVInput[float] = DEFAULT_NONE, @@ -4996,7 +4994,7 @@ def get_my_commands( return BotCommand.de_list(result, self) # type: ignore[return-value,arg-type] - @log + @_log def set_my_commands( self, commands: List[Union[BotCommand, Tuple[str, str]]], @@ -5052,7 +5050,7 @@ def set_my_commands( return result # type: ignore[return-value] - @log + @_log def delete_my_commands( self, scope: BotCommandScope = None, @@ -5099,7 +5097,7 @@ def delete_my_commands( return result # type: ignore[return-value] - @log + @_log def log_out(self, timeout: ODVInput[float] = DEFAULT_NONE) -> bool: """ Use this method to log out from the cloud Bot API server before launching the bot locally. @@ -5122,7 +5120,7 @@ def log_out(self, timeout: ODVInput[float] = DEFAULT_NONE) -> bool: """ return self._post('logOut', timeout=timeout) # type: ignore[return-value] - @log + @_log def close(self, timeout: ODVInput[float] = DEFAULT_NONE) -> bool: """ Use this method to close the bot instance before moving it from one local server to @@ -5144,7 +5142,7 @@ def close(self, timeout: ODVInput[float] = DEFAULT_NONE) -> bool: """ return self._post('close', timeout=timeout) # type: ignore[return-value] - @log + @_log def copy_message( self, chat_id: Union[int, str], From 628d798c13aa855a8bc1e8b64293e7dacf50832c Mon Sep 17 00:00:00 2001 From: Hinrich Mahler <22366557+Bibo-Joshi@users.noreply.github.com> Date: Sun, 3 Oct 2021 19:12:47 +0200 Subject: [PATCH 4/4] Removing one @_log --- telegram/bot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/telegram/bot.py b/telegram/bot.py index aa01cd404c7..d2ed9eff05a 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -2026,7 +2026,6 @@ def _effective_inline_results( # pylint: disable=R0201 return effective_results, next_offset - @_log @no_type_check # mypy doesn't play too well with hasattr def _insert_defaults_for_ilq_results( # pylint: disable=R0201 self, res: 'InlineQueryResult'