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"})