Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-slack-sdk for openSUSE:Factory checked in at 2024-06-10 17:37:49 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-slack-sdk (Old) and /work/SRC/openSUSE:Factory/.python-slack-sdk.new.19518 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-slack-sdk" Mon Jun 10 17:37:49 2024 rev:11 rq:1179640 version:3.27.2 Changes: -------- --- /work/SRC/openSUSE:Factory/python-slack-sdk/python-slack-sdk.changes 2024-03-06 23:05:40.395798092 +0100 +++ /work/SRC/openSUSE:Factory/.python-slack-sdk.new.19518/python-slack-sdk.changes 2024-06-10 17:38:04.751942806 +0200 @@ -1,0 +2,9 @@ +Mon Jun 10 07:58:03 UTC 2024 - Dirk Müller <dmuel...@suse.com> + +- update to 3.27.2: + * #1498 Fix #1496 Async client uses blocking call when + uploading file with v + * #1492 Fix #1468 `RichTextElement.elements` items are never + promoted to a proper Python object type + +------------------------------------------------------------------- Old: ---- slack-sdk-3.27.1.tar.gz New: ---- slack-sdk-3.27.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-slack-sdk.spec ++++++ --- /var/tmp/diff_new_pack.0xlxtT/_old 2024-06-10 17:38:05.763980243 +0200 +++ /var/tmp/diff_new_pack.0xlxtT/_new 2024-06-10 17:38:05.767980391 +0200 @@ -17,7 +17,7 @@ Name: python-slack-sdk -Version: 3.27.1 +Version: 3.27.2 Release: 0 Summary: Python SDKs for the Slack API License: MIT ++++++ slack-sdk-3.27.1.tar.gz -> slack-sdk-3.27.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/.github/dependabot.yml new/python-slack-sdk-3.27.2/.github/dependabot.yml --- old/python-slack-sdk-3.27.1/.github/dependabot.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-slack-sdk-3.27.2/.github/dependabot.yml 2024-05-16 04:54:21.000000000 +0200 @@ -0,0 +1,14 @@ +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "monthly" + open-pull-requests-limit: 5 + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/.github/workflows/ci-build.yml new/python-slack-sdk-3.27.2/.github/workflows/ci-build.yml --- old/python-slack-sdk-3.27.1/.github/workflows/ci-build.yml 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/.github/workflows/ci-build.yml 2024-05-16 04:54:21.000000000 +0200 @@ -26,11 +26,12 @@ env: PYTHON_SLACK_SDK_MOCK_SERVER_MODE: 'threading' CI_LARGE_SOCKET_MODE_PAYLOAD_TESTING_DISABLED: '1' + CI_UNSTABLE_TESTS_SKIP_ENABLED: '1' FORCE_COLOR: '1' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: pip @@ -53,7 +54,7 @@ python setup.py unit_tests --test-target tests/slack_sdk/oauth/state_store/test_sqlalchemy.py - name: Run codecov (only 3.9) if: startsWith(matrix.python-version, '3.9') - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} # python setup.py validate generates the coverage file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/.github/workflows/pytype.yml new/python-slack-sdk-3.27.2/.github/workflows/pytype.yml --- old/python-slack-sdk-3.27.1/.github/workflows/pytype.yml 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/.github/workflows/pytype.yml 2024-05-16 04:54:21.000000000 +0200 @@ -13,9 +13,9 @@ matrix: python-version: ['3.9'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/.github/workflows/triage-issues.yml new/python-slack-sdk-3.27.2/.github/workflows/triage-issues.yml --- old/python-slack-sdk-3.27.1/.github/workflows/triage-issues.yml 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/.github/workflows/triage-issues.yml 2024-05-16 04:54:21.000000000 +0200 @@ -17,7 +17,7 @@ stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v4.0.0 + - uses: actions/stale@v9.0.0 with: days-before-issue-stale: 30 days-before-issue-close: 10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/index.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/index.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/index.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/index.html 2024-05-16 04:54:21.000000000 +0200 @@ -3814,7 +3814,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -3822,9 +3822,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -10963,7 +10963,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -10971,9 +10971,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/models/blocks/block_elements.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/models/blocks/block_elements.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/models/blocks/block_elements.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/models/blocks/block_elements.html 2024-05-16 04:54:21.000000000 +0200 @@ -1896,7 +1896,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.style = style self.indent = indent self.offset = offset @@ -1919,7 +1919,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.border = border @@ -1938,7 +1938,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) class RichTextSectionElement(RichTextElement): @@ -1956,7 +1956,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) class RichTextElementParts: @@ -5350,7 +5350,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.style = style self.indent = indent self.offset = offset @@ -5425,7 +5425,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.border = border</code></pre> </details> <h3>Ancestors</h3> @@ -5496,7 +5496,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements</code></pre> + self.elements = BlockElement.parse_all(elements)</code></pre> </details> <h3>Ancestors</h3> <ul class="hlist"> @@ -5566,7 +5566,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements</code></pre> + self.elements = BlockElement.parse_all(elements)</code></pre> </details> <h3>Ancestors</h3> <ul class="hlist"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/models/blocks/index.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/models/blocks/index.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/models/blocks/index.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/models/blocks/index.html 2024-05-16 04:54:21.000000000 +0200 @@ -5464,7 +5464,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.style = style self.indent = indent self.offset = offset @@ -5539,7 +5539,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.border = border</code></pre> </details> <h3>Ancestors</h3> @@ -5610,7 +5610,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements</code></pre> + self.elements = BlockElement.parse_all(elements)</code></pre> </details> <h3>Ancestors</h3> <ul class="hlist"> @@ -5680,7 +5680,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements</code></pre> + self.elements = BlockElement.parse_all(elements)</code></pre> </details> <h3>Ancestors</h3> <ul class="hlist"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/version.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/version.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/version.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/version.html 2024-05-16 04:54:21.000000000 +0200 @@ -28,7 +28,7 @@ <span>Expand source code</span> </summary> <pre><code class="python">"""Check the latest version at https://pypi.org/project/slack-sdk/""" -__version__ = "3.27.1"</code></pre> +__version__ = "3.27.2"</code></pre> </details> </section> <section> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/async_base_client.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/async_base_client.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/async_base_client.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/async_base_client.html 2024-05-16 04:54:21.000000000 +0200 @@ -39,6 +39,7 @@ ) # type: ignore from .async_slack_response import AsyncSlackResponse from .deprecation import show_deprecation_warning_if_any +from .file_upload_v2_result import FileUploadV2Result from .internal_utils import ( convert_bool_to_0_or_1, _build_req_args, @@ -241,6 +242,31 @@ api_url=api_url, req_args=req_args, retry_handlers=self.retry_handlers, + ) + + async def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + """Upload a file using the issued upload URL""" + result = await _request_with_session( + current_session=self.session, + timeout=timeout, + logger=logger, + http_verb="POST", + api_url=url, + req_args={"data": data, "proxy": proxy, "ssl": ssl}, + retry_handlers=self.retry_handlers, + ) + return FileUploadV2Result( + status=result.get("status_code"), + body=result.get("body"), )</code></pre> </details> </section> @@ -453,6 +479,31 @@ api_url=api_url, req_args=req_args, retry_handlers=self.retry_handlers, + ) + + async def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + """Upload a file using the issued upload URL""" + result = await _request_with_session( + current_session=self.session, + timeout=timeout, + logger=logger, + http_verb="POST", + api_url=url, + req_args={"data": data, "proxy": proxy, "ssl": ssl}, + retry_handlers=self.retry_handlers, + ) + return FileUploadV2Result( + status=result.get("status_code"), + body=result.get("body"), )</code></pre> </details> <h3>Subclasses</h3> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/async_client.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/async_client.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/async_client.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/async_client.html 2024-05-16 04:54:21.000000000 +0200 @@ -52,7 +52,6 @@ _warn_if_text_or_attachment_fallback_is_missing, _remove_none_values, _to_v2_file_upload_item, - _upload_file_via_v2_url, _validate_for_legacy_client, _print_files_upload_v2_suggestion, ) @@ -3613,7 +3612,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = await self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -3621,9 +3620,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -8781,7 +8780,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = await self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -8789,9 +8788,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -15930,7 +15929,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = await self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -15938,9 +15937,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/async_internal_utils.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/async_internal_utils.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/async_internal_utils.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/async_internal_utils.html 2024-05-16 04:54:21.000000000 +0200 @@ -136,7 +136,7 @@ try: async with session.request(http_verb, api_url, **req_args) as res: - data: Union[dict, bytes] = {} + data: Union[dict, bytes, str] = {} if res.content_type == "application/gzip": # admin.analytics.getFile data = await res.read() @@ -145,6 +145,14 @@ headers=res.headers, data=data, ) + elif res.content_type == "text/plain": + # https://files.slack.com/upload/v1/... + data = await res.text() + retry_response = RetryHttpResponse( + status_code=res.status, + headers=res.headers, + data=data, + ) else: try: data = await res.json() @@ -171,7 +179,9 @@ ) if logger.level <= logging.DEBUG: - body = data if isinstance(data, dict) else "(binary)" + body = "(binary)" + if isinstance(data, dict) or isinstance(data, str): + body = data logger.debug( "Received the following response - " f"status: {res.status}, " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/base_client.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/base_client.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/base_client.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/base_client.html 2024-05-16 04:54:21.000000000 +0200 @@ -50,12 +50,14 @@ from slack_sdk.errors import SlackRequestError from .deprecation import show_deprecation_warning_if_any +from .file_upload_v2_result import FileUploadV2Result from .internal_utils import ( convert_bool_to_0_or_1, get_user_agent, _get_url, _build_req_args, _build_unexpected_body_error_message, + _upload_file_via_v2_url, ) from .slack_response import SlackResponse from slack_sdk.http_retry import default_retry_handlers @@ -589,10 +591,34 @@ if has_json: headers.update({"Content-Type": "application/json;charset=utf-8"}) if has_files: - # will be set afterwards + # will be set afterward headers.pop("Content-Type", None) return headers + def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + """Upload a file using the issued upload URL""" + result = _upload_file_via_v2_url( + url=url, + data=data, + logger=logger, + timeout=timeout, + proxy=proxy, + ssl=ssl, + ) + return FileUploadV2Result( + status=result.get("status"), + body=result.get("body"), + ) + # ================================================================= @staticmethod @@ -1173,10 +1199,34 @@ if has_json: headers.update({"Content-Type": "application/json;charset=utf-8"}) if has_files: - # will be set afterwards + # will be set afterward headers.pop("Content-Type", None) return headers + def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + """Upload a file using the issued upload URL""" + result = _upload_file_via_v2_url( + url=url, + data=data, + logger=logger, + timeout=timeout, + proxy=proxy, + ssl=ssl, + ) + return FileUploadV2Result( + status=result.get("status"), + body=result.get("body"), + ) + # ================================================================= @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/client.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/client.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/client.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/client.html 2024-05-16 04:54:21.000000000 +0200 @@ -43,7 +43,6 @@ _warn_if_text_or_attachment_fallback_is_missing, _remove_none_values, _to_v2_file_upload_item, - _upload_file_via_v2_url, _validate_for_legacy_client, _print_files_upload_v2_suggestion, ) @@ -3604,7 +3603,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -3612,9 +3611,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -8772,7 +8771,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -8780,9 +8779,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -15921,7 +15920,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -15929,9 +15928,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/file_upload_v2_result.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/file_upload_v2_result.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/file_upload_v2_result.html 1970-01-01 01:00:00.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/file_upload_v2_result.html 2024-05-16 04:54:21.000000000 +0200 @@ -0,0 +1,109 @@ +<!doctype html> +<html lang="en"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" /> +<meta name="generator" content="pdoc 0.10.0" /> +<title>slack_sdk.web.file_upload_v2_result API documentation</title> +<meta name="description" content="" /> +<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin> +<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin> +<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin> +<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word} h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span :first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.vers ionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style> +<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style> +<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style> +<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script> +<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script> +</head> +<body> +<main> +<article id="content"> +<header> +<h1 class="title">Module <code>slack_sdk.web.file_upload_v2_result</code></h1> +</header> +<section id="section-intro"> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">class FileUploadV2Result: + status: int + body: str + + def __init__(self, status: int, body: str): + self.status = status + self.body = body</code></pre> +</details> +</section> +<section> +</section> +<section> +</section> +<section> +</section> +<section> +<h2 class="section-title" id="header-classes">Classes</h2> +<dl> +<dt id="slack_sdk.web.file_upload_v2_result.FileUploadV2Result"><code class="flex name class"> +<span>class <span class="ident">FileUploadV2Result</span></span> +<span>(</span><span>status: int, body: str)</span> +</code></dt> +<dd> +<div class="desc"></div> +<details class="source"> +<summary> +<span>Expand source code</span> +</summary> +<pre><code class="python">class FileUploadV2Result: + status: int + body: str + + def __init__(self, status: int, body: str): + self.status = status + self.body = body</code></pre> +</details> +<h3>Class variables</h3> +<dl> +<dt id="slack_sdk.web.file_upload_v2_result.FileUploadV2Result.body"><code class="name">var <span class="ident">body</span> : str</code></dt> +<dd> +<div class="desc"></div> +</dd> +<dt id="slack_sdk.web.file_upload_v2_result.FileUploadV2Result.status"><code class="name">var <span class="ident">status</span> : int</code></dt> +<dd> +<div class="desc"></div> +</dd> +</dl> +</dd> +</dl> +</section> +</article> +<nav id="sidebar"> +<h1>Index</h1> +<div class="toc"> +<ul></ul> +</div> +<ul id="index"> +<li><h3>Super-module</h3> +<ul> +<li><code><a title="slack_sdk.web" href="index.html">slack_sdk.web</a></code></li> +</ul> +</li> +<li><h3><a href="#header-classes">Classes</a></h3> +<ul> +<li> +<h4><code><a title="slack_sdk.web.file_upload_v2_result.FileUploadV2Result" href="#slack_sdk.web.file_upload_v2_result.FileUploadV2Result">FileUploadV2Result</a></code></h4> +<ul class=""> +<li><code><a title="slack_sdk.web.file_upload_v2_result.FileUploadV2Result.body" href="#slack_sdk.web.file_upload_v2_result.FileUploadV2Result.body">body</a></code></li> +<li><code><a title="slack_sdk.web.file_upload_v2_result.FileUploadV2Result.status" href="#slack_sdk.web.file_upload_v2_result.FileUploadV2Result.status">status</a></code></li> +</ul> +</li> +</ul> +</li> +</ul> +</nav> +</main> +<footer id="footer"> +<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p> +</footer> +</body> +</html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/index.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/index.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/index.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/index.html 2024-05-16 04:54:21.000000000 +0200 @@ -71,6 +71,10 @@ <dd> <div class="desc"></div> </dd> +<dt><code class="name"><a title="slack_sdk.web.file_upload_v2_result" href="file_upload_v2_result.html">slack_sdk.web.file_upload_v2_result</a></code></dt> +<dd> +<div class="desc"></div> +</dd> <dt><code class="name"><a title="slack_sdk.web.internal_utils" href="internal_utils.html">slack_sdk.web.internal_utils</a></code></dt> <dd> <div class="desc"></div> @@ -4025,7 +4029,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -4033,9 +4037,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -11174,7 +11178,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -11182,9 +11186,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -13663,6 +13667,7 @@ <li><code><a title="slack_sdk.web.base_client" href="base_client.html">slack_sdk.web.base_client</a></code></li> <li><code><a title="slack_sdk.web.client" href="client.html">slack_sdk.web.client</a></code></li> <li><code><a title="slack_sdk.web.deprecation" href="deprecation.html">slack_sdk.web.deprecation</a></code></li> +<li><code><a title="slack_sdk.web.file_upload_v2_result" href="file_upload_v2_result.html">slack_sdk.web.file_upload_v2_result</a></code></li> <li><code><a title="slack_sdk.web.internal_utils" href="internal_utils.html">slack_sdk.web.internal_utils</a></code></li> <li><code><a title="slack_sdk.web.legacy_base_client" href="legacy_base_client.html">slack_sdk.web.legacy_base_client</a></code></li> <li><code><a title="slack_sdk.web.legacy_client" href="legacy_client.html">slack_sdk.web.legacy_client</a></code></li> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/internal_utils.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/internal_utils.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/internal_utils.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/internal_utils.html 2024-05-16 04:54:21.000000000 +0200 @@ -405,6 +405,9 @@ else: raise SlackRequestError(f"Invalid proxy detected: {proxy} must be a str value") + if logger.level <= logging.DEBUG: + logger.debug(f"Sending a request: POST {url}") + resp: Optional[HTTPResponse] = None req: Request = Request(method="POST", url=url, data=data, headers={}) if opener: @@ -416,8 +419,10 @@ body: str = resp.read().decode(charset) # read the response body here if logger.level <= logging.DEBUG: message = ( - "Received the following response - ", - f"status: {resp.status}, " f"headers: {dict(resp.headers)}, " f"body: {body}", + "Received the following response - " + f"status: {resp.status}, " + f"headers: {dict(resp.headers)}, " + f"body: {body}" ) logger.debug(message) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/legacy_base_client.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/legacy_base_client.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/legacy_base_client.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/legacy_base_client.html 2024-05-16 04:54:21.000000000 +0200 @@ -55,12 +55,14 @@ from slack_sdk.errors import SlackRequestError from .async_internal_utils import _files_to_data, _get_event_loop, _request_with_session from .deprecation import show_deprecation_warning_if_any +from .file_upload_v2_result import FileUploadV2Result from .internal_utils import ( convert_bool_to_0_or_1, get_user_agent, _get_url, _build_req_args, _build_unexpected_body_error_message, + _upload_file_via_v2_url, ) from .legacy_slack_response import LegacySlackResponse as SlackResponse from ..proxy_env_variable_loader import load_http_proxy_from_env @@ -550,10 +552,33 @@ if has_json: headers.update({"Content-Type": "application/json;charset=utf-8"}) if has_files: - # will be set afterwards + # will be set afterward headers.pop("Content-Type", None) return headers + def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + result = _upload_file_via_v2_url( + url=url, + data=data, + logger=logger, + timeout=timeout, + proxy=proxy, + ssl=ssl, + ) + return FileUploadV2Result( + status=result.get("status"), + body=result.get("body"), + ) + # ================================================================= @staticmethod @@ -1091,10 +1116,33 @@ if has_json: headers.update({"Content-Type": "application/json;charset=utf-8"}) if has_files: - # will be set afterwards + # will be set afterward headers.pop("Content-Type", None) return headers + def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + result = _upload_file_via_v2_url( + url=url, + data=data, + logger=logger, + timeout=timeout, + proxy=proxy, + ssl=ssl, + ) + return FileUploadV2Result( + status=result.get("status"), + body=result.get("body"), + ) + # ================================================================= @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/legacy_client.html new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/legacy_client.html --- old/python-slack-sdk-3.27.1/docs/api-docs/slack_sdk/web/legacy_client.html 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/docs/api-docs/slack_sdk/web/legacy_client.html 2024-05-16 04:54:21.000000000 +0200 @@ -53,7 +53,6 @@ _warn_if_text_or_attachment_fallback_is_missing, _remove_none_values, _to_v2_file_upload_item, - _upload_file_via_v2_url, _validate_for_legacy_client, _print_files_upload_v2_suggestion, ) @@ -3614,7 +3613,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -3622,9 +3621,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -8782,7 +8781,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -8790,9 +8789,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" @@ -15931,7 +15930,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -15939,9 +15938,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/requirements/optional.txt new/python-slack-sdk-3.27.2/requirements/optional.txt --- old/python-slack-sdk-3.27.1/requirements/optional.txt 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/requirements/optional.txt 2024-05-16 04:54:21.000000000 +0200 @@ -12,6 +12,5 @@ SQLAlchemy>=1.4,<3 # Socket Mode # websockets 9 is not compatible with Python 3.10 -websockets>=9.1,<10; python_version=="3.6" -websockets>=10,<11; python_version>"3.6" +websockets>=9.1,<13 websocket-client>=1,<2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/requirements/testing.txt new/python-slack-sdk-3.27.2/requirements/testing.txt --- old/python-slack-sdk-3.27.1/requirements/testing.txt 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/requirements/testing.txt 2024-05-16 04:54:21.000000000 +0200 @@ -1,11 +1,11 @@ # pip install -r requirements/testing.txt aiohttp<4 # used for a WebSocket server mock -pytest>=7.0.1,<8 +pytest>=7.0.1,<9 pytest-asyncio<1 # for async -pytest-cov>=2,<3 +pytest-cov>=2,<6 # while flake8 5.x have issues with Python 3.12, flake8 6.x requires Python >= 3.8.1, # so 5.x should be kept in order to stay compatible with Python 3.6/3.7 -flake8>=5.0.4,<7 +flake8>=5.0.4,<8 # Don't change this version without running CI builds; # The latest version may not be available for older Python runtime black>=22.8.0; python_version=="3.6" @@ -15,6 +15,4 @@ # used only under slack_sdk/*_store boto3<=2 # For AWS tests -moto==4.0.13; python_version=="3.6" -moto<5; python_version=="3.7" -moto<6 +moto>=4.0.13,<6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/setup.py new/python-slack-sdk-3.27.2/setup.py --- old/python-slack-sdk-3.27.1/setup.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/setup.py 2024-05-16 04:54:21.000000000 +0200 @@ -79,6 +79,11 @@ async_source, ) async_source = re.sub( + r" self._upload_file\(", + " await self._upload_file(", + async_source, + ) + async_source = re.sub( r" self.files_completeUploadExternal\(", " await self.files_completeUploadExternal(", async_source, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/models/blocks/block_elements.py new/python-slack-sdk-3.27.2/slack_sdk/models/blocks/block_elements.py --- old/python-slack-sdk-3.27.1/slack_sdk/models/blocks/block_elements.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/models/blocks/block_elements.py 2024-05-16 04:54:21.000000000 +0200 @@ -1868,7 +1868,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.style = style self.indent = indent self.offset = offset @@ -1891,7 +1891,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) self.border = border @@ -1910,7 +1910,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) class RichTextSectionElement(RichTextElement): @@ -1928,7 +1928,7 @@ ): super().__init__(type=self.type) show_unknown_key_warning(self, others) - self.elements = elements + self.elements = BlockElement.parse_all(elements) class RichTextElementParts: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/version.py new/python-slack-sdk-3.27.2/slack_sdk/version.py --- old/python-slack-sdk-3.27.1/slack_sdk/version.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/version.py 2024-05-16 04:54:21.000000000 +0200 @@ -1,2 +1,2 @@ """Check the latest version at https://pypi.org/project/slack-sdk/""" -__version__ = "3.27.1" +__version__ = "3.27.2" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/async_base_client.py new/python-slack-sdk-3.27.2/slack_sdk/web/async_base_client.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/async_base_client.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/async_base_client.py 2024-05-16 04:54:21.000000000 +0200 @@ -11,6 +11,7 @@ ) # type: ignore from .async_slack_response import AsyncSlackResponse from .deprecation import show_deprecation_warning_if_any +from .file_upload_v2_result import FileUploadV2Result from .internal_utils import ( convert_bool_to_0_or_1, _build_req_args, @@ -214,3 +215,28 @@ req_args=req_args, retry_handlers=self.retry_handlers, ) + + async def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + """Upload a file using the issued upload URL""" + result = await _request_with_session( + current_session=self.session, + timeout=timeout, + logger=logger, + http_verb="POST", + api_url=url, + req_args={"data": data, "proxy": proxy, "ssl": ssl}, + retry_handlers=self.retry_handlers, + ) + return FileUploadV2Result( + status=result.get("status_code"), + body=result.get("body"), + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/async_client.py new/python-slack-sdk-3.27.2/slack_sdk/web/async_client.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/async_client.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/async_client.py 2024-05-16 04:54:21.000000000 +0200 @@ -23,7 +23,6 @@ _warn_if_text_or_attachment_fallback_is_missing, _remove_none_values, _to_v2_file_upload_item, - _upload_file_via_v2_url, _validate_for_legacy_client, _print_files_upload_v2_suggestion, ) @@ -3584,7 +3583,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = await self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -3592,9 +3591,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/async_internal_utils.py new/python-slack-sdk-3.27.2/slack_sdk/web/async_internal_utils.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/async_internal_utils.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/async_internal_utils.py 2024-05-16 04:54:21.000000000 +0200 @@ -108,7 +108,7 @@ try: async with session.request(http_verb, api_url, **req_args) as res: - data: Union[dict, bytes] = {} + data: Union[dict, bytes, str] = {} if res.content_type == "application/gzip": # admin.analytics.getFile data = await res.read() @@ -117,6 +117,14 @@ headers=res.headers, data=data, ) + elif res.content_type == "text/plain": + # https://files.slack.com/upload/v1/... + data = await res.text() + retry_response = RetryHttpResponse( + status_code=res.status, + headers=res.headers, + data=data, + ) else: try: data = await res.json() @@ -143,7 +151,9 @@ ) if logger.level <= logging.DEBUG: - body = data if isinstance(data, dict) else "(binary)" + body = "(binary)" + if isinstance(data, dict) or isinstance(data, str): + body = data logger.debug( "Received the following response - " f"status: {res.status}, " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/base_client.py new/python-slack-sdk-3.27.2/slack_sdk/web/base_client.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/base_client.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/base_client.py 2024-05-16 04:54:21.000000000 +0200 @@ -21,12 +21,14 @@ from slack_sdk.errors import SlackRequestError from .deprecation import show_deprecation_warning_if_any +from .file_upload_v2_result import FileUploadV2Result from .internal_utils import ( convert_bool_to_0_or_1, get_user_agent, _get_url, _build_req_args, _build_unexpected_body_error_message, + _upload_file_via_v2_url, ) from .slack_response import SlackResponse from slack_sdk.http_retry import default_retry_handlers @@ -560,10 +562,34 @@ if has_json: headers.update({"Content-Type": "application/json;charset=utf-8"}) if has_files: - # will be set afterwards + # will be set afterward headers.pop("Content-Type", None) return headers + def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + """Upload a file using the issued upload URL""" + result = _upload_file_via_v2_url( + url=url, + data=data, + logger=logger, + timeout=timeout, + proxy=proxy, + ssl=ssl, + ) + return FileUploadV2Result( + status=result.get("status"), + body=result.get("body"), + ) + # ================================================================= @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/client.py new/python-slack-sdk-3.27.2/slack_sdk/web/client.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/client.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/client.py 2024-05-16 04:54:21.000000000 +0200 @@ -14,7 +14,6 @@ _warn_if_text_or_attachment_fallback_is_missing, _remove_none_values, _to_v2_file_upload_item, - _upload_file_via_v2_url, _validate_for_legacy_client, _print_files_upload_v2_suggestion, ) @@ -3575,7 +3574,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -3583,9 +3582,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/file_upload_v2_result.py new/python-slack-sdk-3.27.2/slack_sdk/web/file_upload_v2_result.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/file_upload_v2_result.py 1970-01-01 01:00:00.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/file_upload_v2_result.py 2024-05-16 04:54:21.000000000 +0200 @@ -0,0 +1,7 @@ +class FileUploadV2Result: + status: int + body: str + + def __init__(self, status: int, body: str): + self.status = status + self.body = body diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/internal_utils.py new/python-slack-sdk-3.27.2/slack_sdk/web/internal_utils.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/internal_utils.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/internal_utils.py 2024-05-16 04:54:21.000000000 +0200 @@ -377,6 +377,9 @@ else: raise SlackRequestError(f"Invalid proxy detected: {proxy} must be a str value") + if logger.level <= logging.DEBUG: + logger.debug(f"Sending a request: POST {url}") + resp: Optional[HTTPResponse] = None req: Request = Request(method="POST", url=url, data=data, headers={}) if opener: @@ -388,8 +391,10 @@ body: str = resp.read().decode(charset) # read the response body here if logger.level <= logging.DEBUG: message = ( - "Received the following response - ", - f"status: {resp.status}, " f"headers: {dict(resp.headers)}, " f"body: {body}", + "Received the following response - " + f"status: {resp.status}, " + f"headers: {dict(resp.headers)}, " + f"body: {body}" ) logger.debug(message) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/legacy_base_client.py new/python-slack-sdk-3.27.2/slack_sdk/web/legacy_base_client.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/legacy_base_client.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/legacy_base_client.py 2024-05-16 04:54:21.000000000 +0200 @@ -26,12 +26,14 @@ from slack_sdk.errors import SlackRequestError from .async_internal_utils import _files_to_data, _get_event_loop, _request_with_session from .deprecation import show_deprecation_warning_if_any +from .file_upload_v2_result import FileUploadV2Result from .internal_utils import ( convert_bool_to_0_or_1, get_user_agent, _get_url, _build_req_args, _build_unexpected_body_error_message, + _upload_file_via_v2_url, ) from .legacy_slack_response import LegacySlackResponse as SlackResponse from ..proxy_env_variable_loader import load_http_proxy_from_env @@ -521,10 +523,33 @@ if has_json: headers.update({"Content-Type": "application/json;charset=utf-8"}) if has_files: - # will be set afterwards + # will be set afterward headers.pop("Content-Type", None) return headers + def _upload_file( + self, + *, + url: str, + data: bytes, + logger: logging.Logger, + timeout: int, + proxy: Optional[str], + ssl: Optional[SSLContext], + ) -> FileUploadV2Result: + result = _upload_file_via_v2_url( + url=url, + data=data, + logger=logger, + timeout=timeout, + proxy=proxy, + ssl=ssl, + ) + return FileUploadV2Result( + status=result.get("status"), + body=result.get("body"), + ) + # ================================================================= @staticmethod diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/slack_sdk/web/legacy_client.py new/python-slack-sdk-3.27.2/slack_sdk/web/legacy_client.py --- old/python-slack-sdk-3.27.1/slack_sdk/web/legacy_client.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/slack_sdk/web/legacy_client.py 2024-05-16 04:54:21.000000000 +0200 @@ -25,7 +25,6 @@ _warn_if_text_or_attachment_fallback_is_missing, _remove_none_values, _to_v2_file_upload_item, - _upload_file_via_v2_url, _validate_for_legacy_client, _print_files_upload_v2_suggestion, ) @@ -3586,7 +3585,7 @@ # step2: "https://files.slack.com/upload/v1/..." per file for f in files: - upload_result = _upload_file_via_v2_url( + upload_result = self._upload_file( url=f["upload_url"], data=f["data"], logger=self._logger, @@ -3594,9 +3593,9 @@ proxy=self.proxy, ssl=self.ssl, ) - if upload_result.get("status") != 200: - status = upload_result.get("status") - body = upload_result.get("body") + if upload_result.status != 200: + status = upload_result.status + body = upload_result.body message = ( "Failed to upload a file " f"(status: {status}, body: {body}, filename: {f.get('filename')}, title: {f.get('title')})" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/tests/slack_sdk/models/test_blocks.py new/python-slack-sdk-3.27.2/tests/slack_sdk/models/test_blocks.py --- old/python-slack-sdk-3.27.1/tests/slack_sdk/models/test_blocks.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/tests/slack_sdk/models/test_blocks.py 2024-05-16 04:54:21.000000000 +0200 @@ -1083,3 +1083,38 @@ ], ) self.assertDictEqual(dict_block, class_block.to_dict()) + + def test_elements_are_parsed(self): + dict_block = { + "type": "rich_text", + "elements": [ + { + "type": "rich_text_section", + "elements": [{"type": "text", "text": "Hello there, I am a basic rich text block!"}], + }, + { + "type": "rich_text_quote", + "elements": [{"type": "text", "text": "this is very important"}], + }, + { + "type": "rich_text_preformatted", + "elements": [{"type": "text", "text": 'print("Hello world")'}], + }, + { + "type": "rich_text_list", + "elements": [ + {"type": "rich_text_section", "elements": [{"type": "text", "text": "a"}]}, + ], + }, + ], + } + block = RichTextBlock(**dict_block) + self.assertIsInstance(block.elements[0], RichTextSectionElement) + self.assertIsInstance(block.elements[0].elements[0], RichTextElementParts.Text) + self.assertIsInstance(block.elements[1], RichTextQuoteElement) + self.assertIsInstance(block.elements[1].elements[0], RichTextElementParts.Text) + self.assertIsInstance(block.elements[2], RichTextPreformattedElement) + self.assertIsInstance(block.elements[2].elements[0], RichTextElementParts.Text) + self.assertIsInstance(block.elements[3], RichTextListElement) + self.assertIsInstance(block.elements[3].elements[0], RichTextSectionElement) + self.assertIsInstance(block.elements[3].elements[0].elements[0], RichTextElementParts.Text) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/tests/slack_sdk/socket_mode/test_interactions_builtin.py new/python-slack-sdk-3.27.2/tests/slack_sdk/socket_mode/test_interactions_builtin.py --- old/python-slack-sdk-3.27.1/tests/slack_sdk/socket_mode/test_interactions_builtin.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/tests/slack_sdk/socket_mode/test_interactions_builtin.py 2024-05-16 04:54:21.000000000 +0200 @@ -13,7 +13,6 @@ from slack_sdk import WebClient from slack_sdk.socket_mode import SocketModeClient -from tests.helpers import is_ci_unstable_test_skip_enabled from tests.slack_sdk.socket_mode.mock_socket_mode_server import ( start_socket_mode_server, socket_mode_envelopes, @@ -48,9 +47,6 @@ pass def test_interactions(self): - if is_ci_unstable_test_skip_enabled(): - return - default_recursion_limit = sys.getrecursionlimit() # will restore later # This built-in WebSocket client internally has recursive method calls of _fetch_messages method. # In this test, the method calls can result in the following error when giving a quite small buffer size. @@ -135,8 +131,6 @@ self.logger.info(f"Passed with buffer size: {buffer_size_list}") def test_send_message_while_disconnection(self): - if is_ci_unstable_test_skip_enabled(): - return t = Thread(target=start_socket_mode_server(self, 3011)) t.daemon = True t.start() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/tests/slack_sdk/socket_mode/test_interactions_websocket_client.py new/python-slack-sdk-3.27.2/tests/slack_sdk/socket_mode/test_interactions_websocket_client.py --- old/python-slack-sdk-3.27.1/tests/slack_sdk/socket_mode/test_interactions_websocket_client.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/tests/slack_sdk/socket_mode/test_interactions_websocket_client.py 2024-05-16 04:54:21.000000000 +0200 @@ -38,8 +38,6 @@ cleanup_mock_web_api_server(self) def test_interactions(self): - if is_ci_unstable_test_skip_enabled(): - return t = Thread(target=start_socket_mode_server(self, 3012)) t.daemon = True t.start() @@ -100,6 +98,7 @@ def test_send_message_while_disconnection(self): if is_ci_unstable_test_skip_enabled(): + # this test tends to fail on the GitHub Actions platform return t = Thread(target=start_socket_mode_server(self, 3012)) t.daemon = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/tests/slack_sdk_async/socket_mode/test_interactions_aiohttp.py new/python-slack-sdk-3.27.2/tests/slack_sdk_async/socket_mode/test_interactions_aiohttp.py --- old/python-slack-sdk-3.27.1/tests/slack_sdk_async/socket_mode/test_interactions_aiohttp.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/tests/slack_sdk_async/socket_mode/test_interactions_aiohttp.py 2024-05-16 04:54:21.000000000 +0200 @@ -14,7 +14,6 @@ from slack_sdk.socket_mode.aiohttp import SocketModeClient from slack_sdk.web.async_client import AsyncWebClient -from tests.helpers import is_ci_unstable_test_skip_enabled from tests.slack_sdk.socket_mode.mock_socket_mode_server import ( start_socket_mode_server, start_socket_mode_server_with_disconnection, @@ -44,8 +43,6 @@ @async_test async def test_interactions(self): - if is_ci_unstable_test_skip_enabled(): - return t = Thread(target=start_socket_mode_server(self, 3001)) t.daemon = True t.start() @@ -108,8 +105,6 @@ @async_test async def test_interactions_with_disconnection(self): - if is_ci_unstable_test_skip_enabled(): - return t = Thread(target=start_socket_mode_server_with_disconnection(self, 3001)) t.daemon = True t.start() @@ -196,8 +191,6 @@ @async_test async def test_send_message_while_disconnection(self): - if is_ci_unstable_test_skip_enabled(): - return t = Thread(target=start_socket_mode_server(self, 3001)) t.daemon = True t.start() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-slack-sdk-3.27.1/tests/slack_sdk_async/socket_mode/test_interactions_websockets.py new/python-slack-sdk-3.27.2/tests/slack_sdk_async/socket_mode/test_interactions_websockets.py --- old/python-slack-sdk-3.27.1/tests/slack_sdk_async/socket_mode/test_interactions_websockets.py 2024-02-28 03:09:42.000000000 +0100 +++ new/python-slack-sdk-3.27.2/tests/slack_sdk_async/socket_mode/test_interactions_websockets.py 2024-05-16 04:54:21.000000000 +0200 @@ -42,8 +42,6 @@ @async_test async def test_interactions(self): - if is_ci_unstable_test_skip_enabled(): - return t = Thread(target=start_socket_mode_server(self, 3002)) t.daemon = True t.start() @@ -109,6 +107,7 @@ @async_test async def test_send_message_while_disconnection(self): if is_ci_unstable_test_skip_enabled(): + # this test tends to fail on the GitHub Actions platform return t = Thread(target=start_socket_mode_server(self, 3001)) t.daemon = True