diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e5402510..650dca55 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,6 +62,12 @@ jobs: python setup.py sdist bdist_wheel twine upload dist/* + - name: Checkout develop branch + uses: actions/checkout@v2 + with: + ref: 'develop' + fetch-depth: 0 + - name: Update CHANGELOG.md id: changelogUpdate run: | @@ -74,7 +80,6 @@ jobs: mv ${{ env.CHANGE_LOG_FILE }}${{ env.TMP_SUFFIX }} ${{ env.CHANGE_LOG_FILE }} git add ${{ env.CHANGE_LOG_FILE }} git commit -m "Changelog update" - git push - name: Read changelog Entry id: readChangelogEntry @@ -95,12 +100,6 @@ jobs: draft: false prerelease: false - - name: Checkout develop branch - uses: actions/checkout@v2 - with: - ref: 'develop' - fetch-depth: 0 - - name: Merge release branch into develop id: mergeIntoDevelop run: | @@ -111,11 +110,11 @@ jobs: - name: Update version file id: versionFileUpdate run: | - export CURRENT_VERSION_VALUE=`echo '${{ env.CURRENT_VERSION }}' | sed -E 's/(.*)/${{ env.VERSION_REPLACE_PATTERN }}/'` - export NEXT_VERSION_VALUE=`echo '${{ env.NEXT_VERSION }}' | sed -E 's/(.*)/${{ env.VERSION_REPLACE_PATTERN }}/'` + export CURRENT_VERSION_VALUE=`echo '${{ env.CURRENT_VERSION }}' | sed -E "s/(.*)/${{ env.VERSION_REPLACE_PATTERN }}/"` + export NEXT_VERSION_VALUE=`echo '${{ env.NEXT_VERSION }}' | sed -E "s/(.*)/${{ env.VERSION_REPLACE_PATTERN }}/"` sed "s/${CURRENT_VERSION_VALUE}/${NEXT_VERSION_VALUE}/g" ${{ env.VERSION_FILE }} > ${{ env.VERSION_FILE }}${{ env.TMP_SUFFIX }} rm ${{ env.VERSION_FILE }} mv ${{ env.VERSION_FILE }}${{ env.TMP_SUFFIX }} ${{ env.VERSION_FILE }} git add ${{ env.VERSION_FILE }} git commit -m "Version update" - git push origin develop + git push diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e755dae..bf4fdc5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,13 @@ ## [Unreleased] ### Fixed -- Issue [#180](https://github.com/reportportal/client-Python/issues/180): -logger crash on attachments, by @HardNorth +- Issue [#182](https://github.com/reportportal/client-Python/issues/182): logger crash on attachments, by @HardNorth + +## [5.2.1] +### Fixed +- Issue [#180](https://github.com/reportportal/client-Python/issues/180): logger crash on attachments, by @HardNorth ### Changed -- Log processing does not stop on the first error now. +- Log processing does not stop on the first error now, by @HardNorth ## [5.2.0] ### Changed diff --git a/reportportal_client/_local/__init__.py b/reportportal_client/_local/__init__.py index f9ac00cd..c26d6d6e 100644 --- a/reportportal_client/_local/__init__.py +++ b/reportportal_client/_local/__init__.py @@ -13,7 +13,6 @@ """Report Portal client context storing and retrieving module.""" from threading import local - __INSTANCES = local() diff --git a/reportportal_client/_local/__init__.pyi b/reportportal_client/_local/__init__.pyi new file mode 100644 index 00000000..b7b14cb5 --- /dev/null +++ b/reportportal_client/_local/__init__.pyi @@ -0,0 +1,22 @@ +# Copyright (c) 2022 https://reportportal.io . +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + +from typing import Optional + +from reportportal_client.client import RPClient + + +def current() -> Optional[RPClient]: ... + + +def set_current(client: Optional[RPClient]) -> None: ... diff --git a/reportportal_client/logs/__init__.py b/reportportal_client/logs/__init__.py index 8be41d63..0ec11232 100644 --- a/reportportal_client/logs/__init__.py +++ b/reportportal_client/logs/__init__.py @@ -138,7 +138,6 @@ def emit(self, record): Emit function. :param record: a log Record of requests - :return: log ID """ msg = '' @@ -152,10 +151,12 @@ def emit(self, record): for level in self._sorted_levelnos: if level <= record.levelno: rp_client = current() - return rp_client.log( - timestamp(), - msg, - level=self._loglevel_map[level], - attachment=getattr(record, 'attachment'), - item_id=rp_client.current_item() - ) + if rp_client: + rp_client.log( + timestamp(), + msg, + level=self._loglevel_map[level], + attachment=getattr(record, 'attachment'), + item_id=rp_client.current_item() + ) + return diff --git a/reportportal_client/service.py b/reportportal_client/service.py index 7a35a93f..9f374e07 100644 --- a/reportportal_client/service.py +++ b/reportportal_client/service.py @@ -497,7 +497,6 @@ def log(self, time, message, level=None, attachment=None, item_id=None): :param level: :param attachment: files :param item_id: id of item - :return: id of item from response """ data = { "launchUuid": self.launch_id, @@ -509,7 +508,7 @@ def log(self, time, message, level=None, attachment=None, item_id=None): data["itemUuid"] = item_id if attachment: data["attachment"] = attachment - return self._log_batch(data) + self._log_batch(data) def _log_batch(self, log_data, force=False): """ diff --git a/reportportal_client/steps/__init__.py b/reportportal_client/steps/__init__.py index 32777af1..23fc9669 100644 --- a/reportportal_client/steps/__init__.py +++ b/reportportal_client/steps/__init__.py @@ -120,7 +120,7 @@ def __enter__(self): """Enter the runtime context related to this object.""" # Cannot call _local.current() early since it will be initialized # before client put something in there - rp_client = self.client if self.client else current() + rp_client = self.client or current() if not rp_client: return self.__item_id = rp_client.step_reporter \ @@ -138,7 +138,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): """Exit the runtime context related to this object.""" # Cannot call _local.current() early since it will be initialized # before client put something in there - rp_client = self.client if self.client else current() + rp_client = self.client or current() if not rp_client: return # Avoid failure in case if 'rp_client' was 'None' on function start diff --git a/setup.py b/setup.py index aafa0e14..4e5d6e53 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -__version__ = '5.2.1' +__version__ = '5.2.2' with open('requirements.txt') as f: requirements = f.read().splitlines() diff --git a/tests/logs/test_rp_log_handler.py b/tests/logs/test_rp_log_handler.py index f6424aee..e981417d 100644 --- a/tests/logs/test_rp_log_handler.py +++ b/tests/logs/test_rp_log_handler.py @@ -95,3 +95,15 @@ def test_emit_custom_level(mocked_handle): assert mock_client.log.call_count == 1 call_kwargs = mock_client.log.call_args[1] assert call_kwargs['level'] == 'WARN' + + +@mock.patch('reportportal_client.logs.logging.Logger.handle') +def test_emit_null_client_no_error(mocked_handle): + test_message = 'test message' + RPLogger('test_logger').log(30, test_message) + record = mocked_handle.call_args[0][0] + + set_current(None) + + log_handler = RPLogHandler() + log_handler.emit(record) diff --git a/tests/steps/test_steps.py b/tests/steps/test_steps.py index 262e3686..98a853a0 100644 --- a/tests/steps/test_steps.py +++ b/tests/steps/test_steps.py @@ -194,3 +194,12 @@ def test_two_level_nested_step_decorator(rp_client): assert first_id.startswith('post-') assert second_id.startswith('post-') assert first_id != second_id + + +def test_verify_manual_client_bypass_step(rp_client): + set_current(None) + rp_client._item_stack.append(PARENT_STEP_ID) + with step(NESTED_STEP_NAME, rp_client=rp_client): + pass + assert rp_client.session.post.call_count == 1 + assert rp_client.session.put.call_count == 1