Skip to content

Commit 6ab8bd2

Browse files
authored
Fix #1261 blocks/attachments as str for chat.* API calls should be clearly supported (#1262)
1 parent ffffc18 commit 6ab8bd2

File tree

5 files changed

+68
-70
lines changed

5 files changed

+68
-70
lines changed

slack_sdk/web/async_client.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,8 +1985,8 @@ async def chat_postEphemeral(
19851985
user: str,
19861986
text: Optional[str] = None,
19871987
as_user: Optional[bool] = None,
1988-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
1989-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
1988+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
1989+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
19901990
thread_ts: Optional[str] = None,
19911991
icon_emoji: Optional[str] = None,
19921992
icon_url: Optional[str] = None,
@@ -2026,8 +2026,8 @@ async def chat_postMessage(
20262026
channel: str,
20272027
text: Optional[str] = None,
20282028
as_user: Optional[bool] = None,
2029-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2030-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2029+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2030+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
20312031
thread_ts: Optional[str] = None,
20322032
reply_broadcast: Optional[bool] = None,
20332033
unfurl_links: Optional[bool] = None,
@@ -2081,8 +2081,8 @@ async def chat_scheduleMessage(
20812081
post_at: Union[str, int],
20822082
text: str,
20832083
as_user: Optional[bool] = None,
2084-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2085-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2084+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2085+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
20862086
thread_ts: Optional[str] = None,
20872087
parse: Optional[str] = None,
20882088
reply_broadcast: Optional[bool] = None,
@@ -2126,7 +2126,7 @@ async def chat_unfurl(
21262126
source: Optional[str] = None,
21272127
unfurl_id: Optional[str] = None,
21282128
unfurls: Dict[str, Dict],
2129-
user_auth_blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2129+
user_auth_blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21302130
user_auth_message: Optional[str] = None,
21312131
user_auth_required: Optional[bool] = None,
21322132
user_auth_url: Optional[str] = None,
@@ -2158,8 +2158,8 @@ async def chat_update(
21582158
channel: str,
21592159
ts: str,
21602160
text: Optional[str] = None,
2161-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2162-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2161+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2162+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21632163
as_user: Optional[bool] = None,
21642164
file_ids: Optional[Union[str, Sequence[str]]] = None,
21652165
link_names: Optional[bool] = None,

slack_sdk/web/client.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1976,8 +1976,8 @@ def chat_postEphemeral(
19761976
user: str,
19771977
text: Optional[str] = None,
19781978
as_user: Optional[bool] = None,
1979-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
1980-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
1979+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
1980+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
19811981
thread_ts: Optional[str] = None,
19821982
icon_emoji: Optional[str] = None,
19831983
icon_url: Optional[str] = None,
@@ -2017,8 +2017,8 @@ def chat_postMessage(
20172017
channel: str,
20182018
text: Optional[str] = None,
20192019
as_user: Optional[bool] = None,
2020-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2021-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2020+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2021+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
20222022
thread_ts: Optional[str] = None,
20232023
reply_broadcast: Optional[bool] = None,
20242024
unfurl_links: Optional[bool] = None,
@@ -2072,8 +2072,8 @@ def chat_scheduleMessage(
20722072
post_at: Union[str, int],
20732073
text: str,
20742074
as_user: Optional[bool] = None,
2075-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2076-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2075+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2076+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
20772077
thread_ts: Optional[str] = None,
20782078
parse: Optional[str] = None,
20792079
reply_broadcast: Optional[bool] = None,
@@ -2117,7 +2117,7 @@ def chat_unfurl(
21172117
source: Optional[str] = None,
21182118
unfurl_id: Optional[str] = None,
21192119
unfurls: Dict[str, Dict],
2120-
user_auth_blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2120+
user_auth_blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21212121
user_auth_message: Optional[str] = None,
21222122
user_auth_required: Optional[bool] = None,
21232123
user_auth_url: Optional[str] = None,
@@ -2149,8 +2149,8 @@ def chat_update(
21492149
channel: str,
21502150
ts: str,
21512151
text: Optional[str] = None,
2152-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2153-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2152+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2153+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21542154
as_user: Optional[bool] = None,
21552155
file_ids: Optional[Union[str, Sequence[str]]] = None,
21562156
link_names: Optional[bool] = None,

slack_sdk/web/internal_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,12 @@ def to_dict(obj: Union[Dict, Block, Attachment, Metadata]):
189189
return obj
190190

191191
blocks = kwargs.get("blocks", None)
192-
if blocks is not None and isinstance(blocks, Sequence):
192+
if blocks is not None and isinstance(blocks, Sequence) and (not isinstance(blocks, str)):
193193
dict_blocks = [to_dict(b) for b in blocks]
194194
kwargs.update({"blocks": dict_blocks})
195195

196196
attachments = kwargs.get("attachments", None)
197-
if attachments is not None and isinstance(attachments, Sequence):
197+
if attachments is not None and isinstance(attachments, Sequence) and (not isinstance(attachments, str)):
198198
dict_attachments = [to_dict(a) for a in attachments]
199199
kwargs.update({"attachments": dict_attachments})
200200

slack_sdk/web/legacy_client.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1987,8 +1987,8 @@ def chat_postEphemeral(
19871987
user: str,
19881988
text: Optional[str] = None,
19891989
as_user: Optional[bool] = None,
1990-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
1991-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
1990+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
1991+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
19921992
thread_ts: Optional[str] = None,
19931993
icon_emoji: Optional[str] = None,
19941994
icon_url: Optional[str] = None,
@@ -2028,8 +2028,8 @@ def chat_postMessage(
20282028
channel: str,
20292029
text: Optional[str] = None,
20302030
as_user: Optional[bool] = None,
2031-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2032-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2031+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2032+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
20332033
thread_ts: Optional[str] = None,
20342034
reply_broadcast: Optional[bool] = None,
20352035
unfurl_links: Optional[bool] = None,
@@ -2083,8 +2083,8 @@ def chat_scheduleMessage(
20832083
post_at: Union[str, int],
20842084
text: str,
20852085
as_user: Optional[bool] = None,
2086-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2087-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2086+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2087+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
20882088
thread_ts: Optional[str] = None,
20892089
parse: Optional[str] = None,
20902090
reply_broadcast: Optional[bool] = None,
@@ -2128,7 +2128,7 @@ def chat_unfurl(
21282128
source: Optional[str] = None,
21292129
unfurl_id: Optional[str] = None,
21302130
unfurls: Dict[str, Dict],
2131-
user_auth_blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2131+
user_auth_blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21322132
user_auth_message: Optional[str] = None,
21332133
user_auth_required: Optional[bool] = None,
21342134
user_auth_url: Optional[str] = None,
@@ -2160,8 +2160,8 @@ def chat_update(
21602160
channel: str,
21612161
ts: str,
21622162
text: Optional[str] = None,
2163-
attachments: Optional[Sequence[Union[Dict, Attachment]]] = None,
2164-
blocks: Optional[Sequence[Union[Dict, Block]]] = None,
2163+
attachments: Optional[Union[str, Sequence[Union[Dict, Attachment]]]] = None,
2164+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21652165
as_user: Optional[bool] = None,
21662166
file_ids: Optional[Union[str, Sequence[str]]] = None,
21672167
link_names: Optional[bool] = None,
Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import unittest
23
from typing import Dict, Sequence, Union
34

@@ -23,44 +24,41 @@ def test_build_unexpected_body_error_message(self):
2324
"""Received a response in a non-JSON format: <!DOCTYPE html><html lang="en"><head><meta charset="utf-8">"""
2425
)
2526

26-
27-
@pytest.mark.parametrize(
28-
"initial_blocks",
29-
[
30-
[Block(block_id="42"), Block(block_id="24")], # list
31-
(
32-
Block(block_id="42"),
33-
Block(block_id="24"),
34-
), # tuple
35-
],
36-
)
37-
def test_can_parse_sequence_of_blocks(initial_blocks: Sequence[Union[Dict, Block]]):
38-
kwargs = {"blocks": initial_blocks}
39-
40-
_parse_web_class_objects(kwargs)
41-
42-
assert kwargs["blocks"]
43-
44-
for block in kwargs["blocks"]:
45-
assert isinstance(block, Dict)
46-
47-
48-
@pytest.mark.parametrize(
49-
"initial_attachments",
50-
[
51-
[Attachment(text="foo"), Attachment(text="bar")], # list
52-
(
53-
Attachment(text="foo"),
54-
Attachment(text="bar"),
55-
), # tuple
56-
],
57-
)
58-
def test_can_parse_sequence_of_attachments(initial_attachments: Sequence[Union[Dict, Attachment]]):
59-
kwargs = {"attachments": initial_attachments}
60-
61-
_parse_web_class_objects(kwargs)
62-
63-
assert kwargs["attachments"]
64-
65-
for attachment in kwargs["attachments"]:
66-
assert isinstance(attachment, Dict)
27+
def test_can_parse_sequence_of_blocks(self):
28+
for blocks in [
29+
[Block(block_id="42"), Block(block_id="24")], # list
30+
(Block(block_id="42"), Block(block_id="24")), # tuple
31+
]:
32+
kwargs = {"blocks": blocks}
33+
_parse_web_class_objects(kwargs)
34+
assert kwargs["blocks"]
35+
for block in kwargs["blocks"]:
36+
assert isinstance(block, Dict)
37+
38+
def test_can_parse_sequence_of_attachments(self):
39+
for attachments in [
40+
[Attachment(text="foo"), Attachment(text="bar")], # list
41+
(
42+
Attachment(text="foo"),
43+
Attachment(text="bar"),
44+
), # tuple
45+
]:
46+
kwargs = {"attachments": attachments}
47+
_parse_web_class_objects(kwargs)
48+
assert kwargs["attachments"]
49+
for attachment in kwargs["attachments"]:
50+
assert isinstance(attachment, Dict)
51+
52+
def test_can_parse_str_blocks(self):
53+
input = json.dumps([Block(block_id="42").to_dict(), Block(block_id="24").to_dict()])
54+
kwargs = {"blocks": input}
55+
_parse_web_class_objects(kwargs)
56+
assert isinstance(kwargs["blocks"], str)
57+
assert input == kwargs["blocks"]
58+
59+
def test_can_parse_str_attachments(self):
60+
input = json.dumps([Attachment(text="foo").to_dict(), Attachment(text="bar").to_dict()])
61+
kwargs = {"attachments": input}
62+
_parse_web_class_objects(kwargs)
63+
assert isinstance(kwargs["attachments"], str)
64+
assert input == kwargs["attachments"]

0 commit comments

Comments
 (0)