You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by el...@apache.org on 2023/02/23 03:24:21 UTC

[airflow] branch main updated: Updated Telegram Provider to ensure compatbility with >=20.0.0 (#28953)

This is an automated email from the ASF dual-hosted git repository.

eladkal pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 644cea14ff Updated Telegram Provider to ensure compatbility with >=20.0.0 (#28953)
644cea14ff is described below

commit 644cea14fff74d34f823b5c52c9dbf5bad33bd52
Author: Max Ho <ma...@alphalab.capital>
AuthorDate: Thu Feb 23 11:24:13 2023 +0800

    Updated Telegram Provider to ensure compatbility with >=20.0.0 (#28953)
    
    * Updated Telegram Provider to ensure compatbility with >=20.0.0
    
    ---------
    
    Co-authored-by: eladkal <45...@users.noreply.github.com>
---
 airflow/providers/telegram/CHANGELOG.rst        | 12 ++++++++++++
 airflow/providers/telegram/hooks/telegram.py    | 10 ++++++----
 airflow/providers/telegram/provider.yaml        |  6 ++----
 docs/spelling_wordlist.txt                      |  1 +
 generated/provider_dependencies.json            |  2 +-
 tests/providers/telegram/hooks/test_telegram.py | 15 ++++++++++-----
 6 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/airflow/providers/telegram/CHANGELOG.rst b/airflow/providers/telegram/CHANGELOG.rst
index dbb6fa7b32..cbd7dd14e5 100644
--- a/airflow/providers/telegram/CHANGELOG.rst
+++ b/airflow/providers/telegram/CHANGELOG.rst
@@ -24,6 +24,18 @@
 Changelog
 ---------
 
+4.0.0
+.....
+
+Breaking changes
+~~~~~~~~~~~~~~~~
+
+In this version, we upgraded the ``python-telegram-bot`` to ``20.0.0`` and above.
+All remains the same except that now the ``get_conn()`` method in ``TelegramHook`` is a coroutine function.
+Refer to `python-telegram-bot transition guide <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Transition-guide-to-Version-20.0#asyncio>`_ for more details.
+
+
+
 3.1.1
 .....
 
diff --git a/airflow/providers/telegram/hooks/telegram.py b/airflow/providers/telegram/hooks/telegram.py
index bf3d18fe65..cbf2cde2af 100644
--- a/airflow/providers/telegram/hooks/telegram.py
+++ b/airflow/providers/telegram/hooks/telegram.py
@@ -18,6 +18,8 @@
 """Hook for Telegram"""
 from __future__ import annotations
 
+import asyncio
+
 import telegram
 import tenacity
 
@@ -67,13 +69,13 @@ class TelegramHook(BaseHook):
         self.chat_id = self.__get_chat_id(chat_id, telegram_conn_id)
         self.connection = self.get_conn()
 
-    def get_conn(self) -> telegram.bot.Bot:
+    def get_conn(self) -> telegram.Bot:
         """
         Returns the telegram bot client
 
         :return: telegram bot client
         """
-        return telegram.bot.Bot(token=self.token)
+        return telegram.Bot(self.token)
 
     def __get_token(self, token: str | None, telegram_conn_id: str | None) -> str:
         """
@@ -126,7 +128,7 @@ class TelegramHook(BaseHook):
         """
         kwargs = {
             "chat_id": self.chat_id,
-            "parse_mode": telegram.parsemode.ParseMode.HTML,
+            "parse_mode": telegram.constants.ParseMode.HTML,
             "disable_web_page_preview": True,
         }
         kwargs.update(api_params)
@@ -137,5 +139,5 @@ class TelegramHook(BaseHook):
         if kwargs["chat_id"] is None:
             raise AirflowException("'chat_id' must be provided for telegram message")
 
-        response = self.connection.send_message(**kwargs)
+        response = asyncio.run(self.connection.send_message(**kwargs))
         self.log.debug(response)
diff --git a/airflow/providers/telegram/provider.yaml b/airflow/providers/telegram/provider.yaml
index a840012a40..922da6caf6 100644
--- a/airflow/providers/telegram/provider.yaml
+++ b/airflow/providers/telegram/provider.yaml
@@ -22,6 +22,7 @@ description: |
     `Telegram <https://telegram.org/>`__
 
 versions:
+  - 4.0.0
   - 3.1.1
   - 3.1.0
   - 3.0.0
@@ -36,10 +37,7 @@ versions:
 
 dependencies:
   - apache-airflow>=2.3.0
-  # The telegram bot 20.0.0 is not yet compatible with our provider as documented in
-  # https://github.com/apache/airflow/issues/28670. This limit should be removed (and likely replaced
-  # with >=20.0.0) once the issue is fixed.
-  - python-telegram-bot>=13.0,<20.0.0
+  - python-telegram-bot>=20.0.0
 
 integrations:
   - integration-name: Telegram
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
index 860da3a8be..d9d4f8bf8f 100644
--- a/docs/spelling_wordlist.txt
+++ b/docs/spelling_wordlist.txt
@@ -290,6 +290,7 @@ ContainerPort
 contentUrl
 contextmgr
 contrib
+coroutine
 coverals
 cp
 cpu
diff --git a/generated/provider_dependencies.json b/generated/provider_dependencies.json
index e4749bf1c2..afc483831c 100644
--- a/generated/provider_dependencies.json
+++ b/generated/provider_dependencies.json
@@ -726,7 +726,7 @@
   "telegram": {
     "deps": [
       "apache-airflow>=2.3.0",
-      "python-telegram-bot>=13.0,<20.0.0"
+      "python-telegram-bot>=20.0.0"
     ],
     "cross-providers-deps": []
   },
diff --git a/tests/providers/telegram/hooks/test_telegram.py b/tests/providers/telegram/hooks/test_telegram.py
index de4722c78f..44e5bdb152 100644
--- a/tests/providers/telegram/hooks/test_telegram.py
+++ b/tests/providers/telegram/hooks/test_telegram.py
@@ -30,6 +30,11 @@ from airflow.utils import db
 TELEGRAM_TOKEN = "dummy token"
 
 
+class AsyncMock(mock.MagicMock):
+    async def __call__(self, *args, **kwargs):
+        return super(AsyncMock, self).__call__(*args, **kwargs)
+
+
 class TestTelegramHook:
     def setup_method(self):
         db.merge_conn(
@@ -90,7 +95,7 @@ class TestTelegramHook:
 
     @mock.patch("airflow.providers.telegram.hooks.telegram.TelegramHook.get_conn")
     def test_should_send_message_if_all_parameters_are_correctly_provided(self, mock_get_conn):
-        mock_get_conn.return_value = mock.Mock(password="some_token")
+        mock_get_conn.return_value = AsyncMock(password="some_token")
 
         hook = TelegramHook(telegram_conn_id="telegram_default")
         hook.send_message({"chat_id": -420913222, "text": "test telegram message"})
@@ -109,7 +114,7 @@ class TestTelegramHook:
 
     @mock.patch("airflow.providers.telegram.hooks.telegram.TelegramHook.get_conn")
     def test_should_send_message_if_chat_id_is_provided_through_constructor(self, mock_get_conn):
-        mock_get_conn.return_value = mock.Mock(password="some_token")
+        mock_get_conn.return_value = AsyncMock(password="some_token")
 
         hook = TelegramHook(telegram_conn_id="telegram_default", chat_id=-420913222)
         hook.send_message({"text": "test telegram message"})
@@ -128,7 +133,7 @@ class TestTelegramHook:
 
     @mock.patch("airflow.providers.telegram.hooks.telegram.TelegramHook.get_conn")
     def test_should_send_message_if_chat_id_is_provided_in_connection(self, mock_get_conn):
-        mock_get_conn.return_value = mock.Mock(password="some_token")
+        mock_get_conn.return_value = AsyncMock(password="some_token")
 
         hook = TelegramHook(telegram_conn_id="telegram-webhook-with-chat_id")
         hook.send_message({"text": "test telegram message"})
@@ -148,7 +153,7 @@ class TestTelegramHook:
     @mock.patch("airflow.providers.telegram.hooks.telegram.TelegramHook.get_conn")
     def test_should_retry_when_any_telegram_error_is_encountered(self, mock_get_conn):
         excepted_retry_count = 5
-        mock_get_conn.return_value = mock.Mock(password="some_token")
+        mock_get_conn.return_value = AsyncMock(password="some_token")
 
         def side_effect(*args, **kwargs):
             raise telegram.error.TelegramError("cosmic rays caused bit flips")
@@ -175,7 +180,7 @@ class TestTelegramHook:
 
     @mock.patch("airflow.providers.telegram.hooks.telegram.TelegramHook.get_conn")
     def test_should_send_message_if_token_is_provided(self, mock_get_conn):
-        mock_get_conn.return_value = mock.Mock(password="some_token")
+        mock_get_conn.return_value = AsyncMock(password="some_token")
 
         hook = TelegramHook(token=TELEGRAM_TOKEN, chat_id=-420913222)
         hook.send_message({"text": "test telegram message"})