diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index decfabcd..4ef14d79 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,7 +63,7 @@ jobs: version-file-extraction-pattern: ${{ env.VERSION_EXTRACT_PATTERN }} - name: Setup git credentials - uses: oleksiyrudenko/gha-git-credentials@v2.1.1 + uses: oleksiyrudenko/gha-git-credentials@v2-latest with: name: 'reportportal.io' email: 'support@reportportal.io' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c283e61a..3d2e061a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11' ] + python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11', '3.12' ] steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 17b7ad2b..b7782cf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## [Unreleased] ### Added +- `helpers.to_bool` function, by @HardNorth +- Official `Python 3.12` support, by @HardNorth +### Fixed +- SSL context when certificate is provided, by @JLBIZ +- Log Record pathnames are incorrect on python3.11, by @dagansandler + +## [5.5.6] +### Added - `CONTENT_TYPE_TO_EXTENSIONS` constant in `helpers` module, by @HardNorth ### Fixed - Issue [#228](https://github.com/reportportal/client-Python/issues/228): AttributeError on very large request, by @HardNorth diff --git a/reportportal_client/aio/client.py b/reportportal_client/aio/client.py index c969460f..126f1eca 100644 --- a/reportportal_client/aio/client.py +++ b/reportportal_client/aio/client.py @@ -161,9 +161,9 @@ async def session(self) -> RetryingClientSession: ssl_config = False else: if type(self.verify_ssl) is str: - ssl_config = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH, cafile=self.verify_ssl) + ssl_config = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=self.verify_ssl) else: - ssl_config = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH, cafile=certifi.where()) + ssl_config = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=certifi.where()) connection_params = { 'ssl': ssl_config, diff --git a/reportportal_client/helpers.py b/reportportal_client/helpers.py index 122a9786..d7eb95fe 100644 --- a/reportportal_client/helpers.py +++ b/reportportal_client/helpers.py @@ -477,3 +477,19 @@ def guess_content_type_from_bytes(data: Union[bytes, bytearray, List[int]]) -> s return 'application/pdf' return 'application/octet-stream' + + +def to_bool(value: Optional[Any]) -> Optional[bool]: + """Convert value of any type to boolean or raise ValueError. + + :param value: value to convert + :return: boolean value + :raises ValueError: if value is not boolean + """ + if value is None: + return None + if value in {'TRUE', 'True', 'true', '1', 'Y', 'y', 1, True}: + return True + if value in {'FALSE', 'False', 'false', '0', 'N', 'n', 0, False}: + return False + raise ValueError(f'Invalid boolean value {value}.') diff --git a/reportportal_client/logs/__init__.py b/reportportal_client/logs/__init__.py index c5c7a700..c699bdc7 100644 --- a/reportportal_client/logs/__init__.py +++ b/reportportal_client/logs/__init__.py @@ -58,6 +58,8 @@ def _log(self, level, msg, args, exc_info=None, extra=None, # exception on some versions of IronPython. We trap it here so that # IronPython can use logging. try: + if sys.version_info >= (3, 11): + kwargs.setdefault('stacklevel', 2) if 'stacklevel' in kwargs: fn, lno, func, sinfo = \ self.findCaller(stack_info, kwargs['stacklevel']) diff --git a/setup.py b/setup.py index 85402208..27b3e49d 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ from setuptools import setup, find_packages -__version__ = '5.5.6' +__version__ = '5.5.7' TYPE_STUBS = ['*.pyi'] @@ -45,6 +45,7 @@ def read_file(fname): 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', ], install_requires=read_file('requirements.txt').splitlines(), ) diff --git a/tests/logs/test_rp_logger.py b/tests/logs/test_rp_logger.py index a6beefb1..7ecaaa40 100644 --- a/tests/logs/test_rp_logger.py +++ b/tests/logs/test_rp_logger.py @@ -40,6 +40,7 @@ def test_record_make(logger_handler): logger.info('test_log') record = verify_record(logger_handler) assert not getattr(record, 'attachment') + assert record.pathname == __file__ @mock.patch('reportportal_client.logs.logging.Logger.handle') @@ -86,3 +87,4 @@ def test_stacklevel_record_make(logger_handler): stack_info=inspect.stack(), stacklevel=2) record = verify_record(logger_handler) assert record.stack_info.endswith("logger.error('test_log', exc_info=RuntimeError('test'),") + assert record.pathname == __file__ diff --git a/tests/test_helpers.py b/tests/test_helpers.py index f4c47f29..b5800eb0 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -19,8 +19,7 @@ import pytest from reportportal_client.helpers import ( - gen_attributes, - get_launch_sys_attrs, + gen_attributes, get_launch_sys_attrs, to_bool, verify_value_length, ATTRIBUTE_LENGTH_LIMIT, TRUNCATE_REPLACEMENT, guess_content_type_from_bytes, is_binary ) @@ -134,3 +133,36 @@ def test_binary_content_type_detection(file, expected_type): with open(file, 'rb') as f: content = f.read() assert guess_content_type_from_bytes(content) == expected_type + + +@pytest.mark.parametrize( + 'value, expected_result', + [ + ('TRUE', True), + ('True', True), + ('true', True), + ('Y', True), + ('y', True), + (True, True), + (1, True), + ('1', True), + ('FALSE', False), + ('False', False), + ('false', False), + ('N', False), + ('n', False), + (False, False), + (0, False), + ('0', False), + (None, None), + ] +) +def test_to_bool(value, expected_result): + """Test for validate to_bool() function.""" + assert to_bool(value) == expected_result + + +def test_to_bool_invalid_value(): + """Test for validate to_bool() function exception case.""" + with pytest.raises(ValueError): + to_bool('invalid_value') diff --git a/tox.ini b/tox.ini index 2f8dad03..fbfbada4 100644 --- a/tox.ini +++ b/tox.ini @@ -7,6 +7,7 @@ envlist = py39 py310 py311 + py312 [testenv] deps = @@ -30,3 +31,4 @@ python = 3.9: py39 3.10: py310 3.11: py311 + 3.12: py312