This is an automated email from the ASF dual-hosted git repository.
potiuk 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 75ecaffa5f adding support for snippet type in slack api (#43305)
75ecaffa5f is described below
commit 75ecaffa5fa6884729243083a487f33187ed3c66
Author: Bowrna <[email protected]>
AuthorDate: Fri Oct 25 01:52:23 2024 +0530
adding support for snippet type in slack api (#43305)
* adding support for snippet type in slack api
* static fix
---
providers/src/airflow/providers/slack/hooks/slack.py | 8 +++++---
.../src/airflow/providers/slack/operators/slack.py | 5 +++++
providers/tests/slack/hooks/test_slack.py | 14 ++++++++++----
providers/tests/slack/operators/test_slack.py | 17 +++++++++++++++--
4 files changed, 35 insertions(+), 9 deletions(-)
diff --git a/providers/src/airflow/providers/slack/hooks/slack.py
b/providers/src/airflow/providers/slack/hooks/slack.py
index f0193a437e..3c69623013 100644
--- a/providers/src/airflow/providers/slack/hooks/slack.py
+++ b/providers/src/airflow/providers/slack/hooks/slack.py
@@ -203,6 +203,7 @@ class SlackHook(BaseHook):
filetype: str | None = None,
initial_comment: str | None = None,
title: str | None = None,
+ **kwargs,
) -> SlackResponse:
"""
Create or upload an existing file.
@@ -295,7 +296,8 @@ class SlackHook(BaseHook):
filename: str | None = None,
initial_comment: str | None = None,
title: str | None = None,
- filetype: str | None = None,
+ snippet_type: str | None = None,
+ **kwargs,
) -> list[SlackResponse]:
"""
Smooth transition between ``send_file`` and ``send_file_v2`` methods.
@@ -308,7 +310,7 @@ class SlackHook(BaseHook):
:param filename: Displayed filename.
:param initial_comment: The message text introducing the file in
specified ``channels``.
:param title: Title of the file.
- :param filetype: A file type identifier.
+ :param snippet_type: Syntax type for the content being uploaded.
"""
if not exactly_one(file, content):
raise ValueError("Either `file` or `content` must be provided, not
both.")
@@ -318,7 +320,7 @@ class SlackHook(BaseHook):
else:
file_uploads = {"content": content, "filename": filename}
- file_uploads.update({"title": title, "snippet_type": filetype})
+ file_uploads.update({"title": title, "snippet_type": snippet_type})
if channels:
if isinstance(channels, str):
diff --git a/providers/src/airflow/providers/slack/operators/slack.py
b/providers/src/airflow/providers/slack/operators/slack.py
index 64be693af6..88644726e2 100644
--- a/providers/src/airflow/providers/slack/operators/slack.py
+++ b/providers/src/airflow/providers/slack/operators/slack.py
@@ -209,6 +209,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
:param filetype: slack filetype. (templated) See:
https://api.slack.com/types/file#file_types
:param content: file content. (templated)
:param title: title of file. (templated)
+ :param snippet_type: Syntax type for the snippet being uploaded.(templated)
:param method_version: The version of the method of Slack SDK Client to be
used, either "v1" or "v2".
"""
@@ -219,6 +220,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
"filetype",
"content",
"title",
+ "snippet_type",
)
ui_color = "#44BEDF"
@@ -232,6 +234,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
title: str | None = None,
method_version: Literal["v1", "v2"] = "v2",
channel: str | Sequence[str] | None | ArgNotSet = NOTSET,
+ snippet_type: str | None = None,
**kwargs,
) -> None:
if channel is not NOTSET:
@@ -253,6 +256,7 @@ class SlackAPIFileOperator(SlackAPIOperator):
self.content = content
self.title = title
self.method_version = method_version
+ self.snippet_type = snippet_type
@property
def _method_resolver(self):
@@ -269,4 +273,5 @@ class SlackAPIFileOperator(SlackAPIOperator):
content=self.content,
initial_comment=self.initial_comment,
title=self.title,
+ snippet_type=self.snippet_type,
)
diff --git a/providers/tests/slack/hooks/test_slack.py
b/providers/tests/slack/hooks/test_slack.py
index 35dfa5200b..10e5a094e9 100644
--- a/providers/tests/slack/hooks/test_slack.py
+++ b/providers/tests/slack/hooks/test_slack.py
@@ -533,7 +533,10 @@ class TestSlackHook:
@pytest.mark.parametrize("filename", [None, "foo.bar"])
@pytest.mark.parametrize("channel", [None, "#random"])
@pytest.mark.parametrize("filetype", [None, "auto"])
- def test_send_file_v1_to_v2_content(self, initial_comment, title,
filename, channel, filetype):
+ @pytest.mark.parametrize("snippet_type", [None, "text"])
+ def test_send_file_v1_to_v2_content(
+ self, initial_comment, title, filename, channel, filetype, snippet_type
+ ):
hook = SlackHook(slack_conn_id=SLACK_API_DEFAULT_CONN_ID)
with mock.patch.object(SlackHook, "send_file_v2") as
mocked_send_file_v2:
hook.send_file_v1_to_v2(
@@ -543,6 +546,7 @@ class TestSlackHook:
initial_comment=initial_comment,
title=title,
filetype=filetype,
+ snippet_type=snippet_type,
)
mocked_send_file_v2.assert_called_once_with(
channel_id=channel,
@@ -550,7 +554,7 @@ class TestSlackHook:
"content": '{"foo": "bar"}',
"filename": filename,
"title": title,
- "snippet_type": filetype,
+ "snippet_type": snippet_type,
},
initial_comment=initial_comment,
)
@@ -560,7 +564,8 @@ class TestSlackHook:
@pytest.mark.parametrize("filename", [None, "foo.bar"])
@pytest.mark.parametrize("channel", [None, "#random"])
@pytest.mark.parametrize("filetype", [None, "auto"])
- def test_send_file_v1_to_v2_file(self, initial_comment, title, filename,
channel, filetype):
+ @pytest.mark.parametrize("snippet_type", [None, "text"])
+ def test_send_file_v1_to_v2_file(self, initial_comment, title, filename,
channel, filetype, snippet_type):
hook = SlackHook(slack_conn_id=SLACK_API_DEFAULT_CONN_ID)
with mock.patch.object(SlackHook, "send_file_v2") as
mocked_send_file_v2:
hook.send_file_v1_to_v2(
@@ -570,6 +575,7 @@ class TestSlackHook:
initial_comment=initial_comment,
title=title,
filetype=filetype,
+ snippet_type=snippet_type,
)
mocked_send_file_v2.assert_called_once_with(
channel_id=channel,
@@ -577,7 +583,7 @@ class TestSlackHook:
"file": "/foo/bar/spam.egg",
"filename": filename or "spam.egg",
"title": title,
- "snippet_type": filetype,
+ "snippet_type": snippet_type,
},
initial_comment=initial_comment,
)
diff --git a/providers/tests/slack/operators/test_slack.py
b/providers/tests/slack/operators/test_slack.py
index f3b02839a3..7f2d316387 100644
--- a/providers/tests/slack/operators/test_slack.py
+++ b/providers/tests/slack/operators/test_slack.py
@@ -201,6 +201,7 @@ class TestSlackAPIFileOperator:
self.test_content = "This is a test text file!"
self.test_api_params = {"key": "value"}
self.expected_method = "files.upload"
+ self.test_snippet_type = "text"
def __construct_operator(self, test_slack_conn_id, test_api_params=None):
return SlackAPIFileOperator(
@@ -212,6 +213,7 @@ class TestSlackAPIFileOperator:
filetype=self.test_filetype,
content=self.test_content,
api_params=test_api_params,
+ snippet_type=self.test_snippet_type,
)
def test_init_with_valid_params(self):
@@ -226,6 +228,7 @@ class TestSlackAPIFileOperator:
assert slack_api_post_operator.filename == self.filename
assert slack_api_post_operator.filetype == self.test_filetype
assert slack_api_post_operator.content == self.test_content
+ assert slack_api_post_operator.snippet_type == self.test_snippet_type
assert not hasattr(slack_api_post_operator, "token")
@pytest.mark.parametrize("initial_comment", [None, "foo-bar"])
@@ -237,7 +240,10 @@ class TestSlackAPIFileOperator:
pytest.param("v2", "send_file_v1_to_v2", id="v2"),
],
)
- def test_api_call_params_with_content_args(self, initial_comment, title,
method_version, method_name):
+ @pytest.mark.parametrize("snippet_type", [None, "text"])
+ def test_api_call_params_with_content_args(
+ self, initial_comment, title, method_version, method_name, snippet_type
+ ):
op = SlackAPIFileOperator(
task_id="slack",
slack_conn_id=SLACK_API_TEST_CONNECTION_ID,
@@ -246,6 +252,7 @@ class TestSlackAPIFileOperator:
initial_comment=initial_comment,
title=title,
method_version=method_version,
+ snippet_type=snippet_type,
)
with
mock.patch(f"airflow.providers.slack.operators.slack.SlackHook.{method_name}")
as mock_send_file:
op.execute({})
@@ -256,6 +263,7 @@ class TestSlackAPIFileOperator:
filetype=None,
initial_comment=initial_comment,
title=title,
+ snippet_type=snippet_type,
)
@pytest.mark.parametrize("initial_comment", [None, "foo-bar"])
@@ -267,7 +275,10 @@ class TestSlackAPIFileOperator:
pytest.param("v2", "send_file_v1_to_v2", id="v2"),
],
)
- def test_api_call_params_with_file_args(self, initial_comment, title,
method_version, method_name):
+ @pytest.mark.parametrize("snippet_type", [None, "text"])
+ def test_api_call_params_with_file_args(
+ self, initial_comment, title, method_version, method_name, snippet_type
+ ):
op = SlackAPIFileOperator(
task_id="slack",
slack_conn_id=SLACK_API_TEST_CONNECTION_ID,
@@ -276,6 +287,7 @@ class TestSlackAPIFileOperator:
initial_comment=initial_comment,
title=title,
method_version=method_version,
+ snippet_type=snippet_type,
)
with
mock.patch(f"airflow.providers.slack.operators.slack.SlackHook.{method_name}")
as mock_send_file:
op.execute({})
@@ -286,6 +298,7 @@ class TestSlackAPIFileOperator:
filetype=None,
initial_comment=initial_comment,
title=title,
+ snippet_type=snippet_type,
)
def test_channel_deprecated(self):