Skip to content

Commit 2b67f77

Browse files
committed
version 3.19.0
1 parent 3053eda commit 2b67f77

File tree

11 files changed

+2606
-30
lines changed

11 files changed

+2606
-30
lines changed

docs/api-docs/slack_sdk/index.html

Lines changed: 384 additions & 3 deletions
Large diffs are not rendered by default.

docs/api-docs/slack_sdk/version.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ <h1 class="title">Module <code>slack_sdk.version</code></h1>
2828
<span>Expand source code</span>
2929
</summary>
3030
<pre><code class="python">&#34;&#34;&#34;Check the latest version at https://pypi.org/project/slack-sdk/&#34;&#34;&#34;
31-
__version__ = &#34;3.18.5&#34;</code></pre>
31+
__version__ = &#34;3.19.0&#34;</code></pre>
3232
</details>
3333
</section>
3434
<section>

docs/api-docs/slack_sdk/web/async_client.html

Lines changed: 558 additions & 4 deletions
Large diffs are not rendered by default.

docs/api-docs/slack_sdk/web/client.html

Lines changed: 558 additions & 4 deletions
Large diffs are not rendered by default.

docs/api-docs/slack_sdk/web/index.html

Lines changed: 384 additions & 3 deletions
Large diffs are not rendered by default.

docs/api-docs/slack_sdk/web/internal_utils.html

Lines changed: 138 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,18 @@ <h1 class="title">Module <code>slack_sdk.web.internal_utils</code></h1>
2727
<span>Expand source code</span>
2828
</summary>
2929
<pre><code class="python">import json
30+
import logging
3031
import os
3132
import platform
3233
import sys
34+
import urllib
3335
import warnings
36+
from asyncio import Future
37+
from http.client import HTTPResponse
3438
from ssl import SSLContext
3539
from typing import Any, Dict, Optional, Sequence, Union
3640
from urllib.parse import urljoin
41+
from urllib.request import OpenerDirector, ProxyHandler, HTTPSHandler, Request, urlopen
3742

3843
from slack_sdk import version
3944
from slack_sdk.errors import SlackRequestError
@@ -326,7 +331,139 @@ <h1 class="title">Module <code>slack_sdk.web.internal_utils</code></h1>
326331
# &gt;&gt;&gt; json.dumps(d)
327332
# &#39;{&#34;a&#34;: null, &#34;b&#34;: 123}&#39;
328333
#
329-
return {k: v for k, v in d.items() if v is not None}</code></pre>
334+
return {k: v for k, v in d.items() if v is not None}
335+
336+
337+
def _to_v2_file_upload_item(upload_file: Dict[str, Any]) -&gt; Dict[str, Optional[Any]]:
338+
file = upload_file.get(&#34;file&#34;)
339+
content = upload_file.get(&#34;content&#34;)
340+
data: Optional[bytes] = None
341+
if file is not None:
342+
if isinstance(file, str): # filepath
343+
with open(file.encode(&#34;utf-8&#34;, &#34;ignore&#34;), &#34;rb&#34;) as readable:
344+
data = readable.read()
345+
else:
346+
data = file
347+
elif content is not None:
348+
if isinstance(content, str): # filepath
349+
data = content.encode(&#34;utf-8&#34;)
350+
elif isinstance(content, bytes):
351+
data = content
352+
else:
353+
raise SlackRequestError(&#34;The given content must be either filepath as str or data as bytes&#34;)
354+
355+
filename = upload_file.get(&#34;filename&#34;)
356+
if upload_file.get(&#34;filename&#34;) is None and isinstance(file, str):
357+
# use the local filename if filename is missing
358+
if upload_file.get(&#34;filename&#34;) is None:
359+
filename = file.split(os.path.sep)[-1]
360+
else:
361+
filename = &#34;Uploaded file&#34;
362+
363+
title = upload_file.get(&#34;title&#34;, &#34;Uploaded file&#34;)
364+
if data is None:
365+
raise SlackRequestError(f&#34;File content not found for filename: {filename}, title: {title}&#34;)
366+
367+
return {
368+
&#34;filename&#34;: filename,
369+
&#34;data&#34;: data,
370+
&#34;length&#34;: len(data),
371+
&#34;title&#34;: title,
372+
&#34;alt_txt&#34;: upload_file.get(&#34;alt_txt&#34;),
373+
&#34;snippet_type&#34;: upload_file.get(&#34;snippet_type&#34;),
374+
}
375+
376+
377+
def _upload_file_via_v2_url(
378+
url: str,
379+
data: bytes,
380+
timeout: int,
381+
logger: logging.Logger,
382+
proxy: Optional[str] = None,
383+
ssl: Optional[SSLContext] = None,
384+
) -&gt; Dict[str, Any]:
385+
opener: Optional[OpenerDirector] = None
386+
if proxy is not None:
387+
if isinstance(proxy, str):
388+
opener = urllib.request.build_opener(
389+
ProxyHandler({&#34;http&#34;: proxy, &#34;https&#34;: proxy}),
390+
HTTPSHandler(context=ssl),
391+
)
392+
else:
393+
raise SlackRequestError(f&#34;Invalid proxy detected: {proxy} must be a str value&#34;)
394+
395+
resp: Optional[HTTPResponse] = None
396+
req: Request = Request(method=&#34;POST&#34;, url=url, data=data, headers={})
397+
if opener:
398+
resp = opener.open(req, timeout=timeout)
399+
else:
400+
resp = urlopen(req, context=ssl, timeout=timeout) # skipcq: BAN-B310
401+
402+
charset = resp.headers.get_content_charset() or &#34;utf-8&#34;
403+
body: str = resp.read().decode(charset) # read the response body here
404+
if logger.level &lt;= logging.DEBUG:
405+
message = (
406+
&#34;Received the following response - &#34;,
407+
f&#34;status: {resp.status}, &#34; f&#34;headers: {dict(resp.headers)}, &#34; f&#34;body: {body}&#34;,
408+
)
409+
logger.debug(message)
410+
411+
return {&#34;status&#34;: resp.status, &#34;headers&#34;: resp.headers, &#34;body&#34;: body}
412+
413+
414+
def _validate_for_legacy_client(
415+
response: Union[&#34;SlackResponse&#34;, Future], # noqa: F821
416+
) -&gt; None: # type: ignore
417+
# Only LegacyWebClient can return this union type
418+
if isinstance(response, Future):
419+
message = (
420+
&#34;Sorry! This SDK does not support run_async=True option for this API calls. &#34;
421+
&#34;Please migrate to AsyncWebClient, which is a new and stable way to go.&#34;
422+
)
423+
raise SlackRequestError(message)
424+
425+
426+
def _attach_full_file_metadata(
427+
client, # type: ignore
428+
token_as_arg: Optional[str],
429+
completion: Union[&#34;SlackResponse&#34;, Future], # noqa: F821
430+
) -&gt; None:
431+
_validate_for_legacy_client(completion)
432+
_completion: Any = completion # just for satisfying pytype
433+
# fetch all the file metadata for backward-compatibility
434+
for f in _completion.get(&#34;files&#34;):
435+
full_info = client.files_info(
436+
file=f.get(&#34;id&#34;),
437+
token=token_as_arg,
438+
)
439+
f.update(full_info[&#34;file&#34;])
440+
if len(_completion.get(&#34;files&#34;)) == 1:
441+
_completion.data[&#34;file&#34;] = _completion.get(&#34;files&#34;)[0]
442+
443+
444+
async def _attach_full_file_metadata_async(
445+
client, # type: ignore
446+
token_as_arg: Optional[str],
447+
completion: &#34;SlackResponse&#34;, # noqa: F821
448+
) -&gt; None:
449+
# fetch all the file metadata for backward-compatibility
450+
for f in completion.get(&#34;files&#34;):
451+
full_info = await client.files_info(
452+
file=f.get(&#34;id&#34;),
453+
token=token_as_arg,
454+
)
455+
f.update(full_info[&#34;file&#34;])
456+
if len(completion.get(&#34;files&#34;)) == 1:
457+
completion.data[&#34;file&#34;] = completion.get(&#34;files&#34;)[0]
458+
459+
460+
def _print_files_upload_v2_suggestion():
461+
message = (
462+
&#34;client.files_upload() may cause some issues like timeouts for relatively large files. &#34;
463+
&#34;Our latest recommendation is to use client.files_upload_v2(), &#34;
464+
&#34;which is mostly compatible and much stabler, instead.&#34;
465+
)
466+
warnings.warn(message)</code></pre>
330467
</details>
331468
</section>
332469
<section>

0 commit comments

Comments
 (0)