diff --git a/.pubnub.yml b/.pubnub.yml index fd5ed533..c69a03b9 100644 --- a/.pubnub.yml +++ b/.pubnub.yml @@ -1,5 +1,5 @@ name: python -version: 10.6.0 +version: 10.6.1 schema: 1 scm: github.com/pubnub/python sdks: @@ -18,7 +18,7 @@ sdks: distributions: - distribution-type: library distribution-repository: package - package-name: pubnub-10.6.0 + package-name: pubnub-10.6.1 location: https://pypi.org/project/pubnub/ supported-platforms: supported-operating-systems: @@ -94,8 +94,8 @@ sdks: - distribution-type: library distribution-repository: git release - package-name: pubnub-10.6.0 - location: https://github.com/pubnub/python/releases/download/10.6.0/pubnub-10.6.0.tar.gz + package-name: pubnub-10.6.1 + location: https://github.com/pubnub/python/releases/download/10.6.1/pubnub-10.6.1.tar.gz supported-platforms: supported-operating-systems: Linux: @@ -169,6 +169,11 @@ sdks: license-url: https://github.com/encode/httpx/blob/master/LICENSE.md is-required: Required changelog: + - date: 2026-02-10 + version: 10.6.1 + changes: + - type: bug + text: "Fix silent serialization failure when publishing non-JSON-serializable objects." - date: 2026-01-29 version: 10.6.0 changes: diff --git a/CHANGELOG.md b/CHANGELOG.md index deff9345..8ed85b60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 10.6.1 +February 10 2026 + +#### Fixed +- Fix silent serialization failure when publishing non-JSON-serializable objects. + ## 10.6.0 January 29 2026 diff --git a/pubnub/enums.py b/pubnub/enums.py index f3235a87..caf40a99 100644 --- a/pubnub/enums.py +++ b/pubnub/enums.py @@ -39,6 +39,7 @@ class PNStatusCategory(Enum): PNInternalExceptionCategory = 17 PNSubscriptionChangedCategory = 18 PNConnectionErrorCategory = 19 + PNSerializationErrorCategory = 20 class PNOperationType(object): diff --git a/pubnub/utils.py b/pubnub/utils.py index 0ddfa417..a532b450 100644 --- a/pubnub/utils.py +++ b/pubnub/utils.py @@ -14,6 +14,7 @@ from pubnub.models.consumer.common import PNStatus from pubnub.errors import PNERR_JSON_NOT_SERIALIZABLE from pubnub.exceptions import PubNubException +from pubnub.models.consumer.pn_error_data import PNErrorData def get_data_for_user(data): @@ -29,10 +30,17 @@ def get_data_for_user(data): def write_value_as_string(data): try: return json.dumps(data) - except TypeError: - raise PubNubException( + except TypeError as e: + exc = PubNubException( + errormsg=str(e), pn_error=PNERR_JSON_NOT_SERIALIZABLE ) + status = PNStatus() + status.category = PNStatusCategory.PNSerializationErrorCategory + status.error = True + status.error_data = PNErrorData(str(exc), exc) + exc.status = status + raise exc def url_encode(data): diff --git a/setup.py b/setup.py index 2ba4cbcd..d765acb9 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='pubnub', - version='10.6.0', + version='10.6.1', description='PubNub Real-time push service in the cloud', author='PubNub', author_email='support@pubnub.com', diff --git a/tests/integrational/asyncio/test_publish_serialization.py b/tests/integrational/asyncio/test_publish_serialization.py new file mode 100644 index 00000000..70a7c099 --- /dev/null +++ b/tests/integrational/asyncio/test_publish_serialization.py @@ -0,0 +1,33 @@ +from datetime import datetime + +import pytest + +from pubnub.enums import PNStatusCategory +from pubnub.exceptions import PubNubAsyncioException +from pubnub.models.consumer.common import PNStatus +from pubnub.models.consumer.pn_error_data import PNErrorData +from pubnub.pubnub_asyncio import PubNubAsyncio +from tests.helper import pnconf_copy + + +@pytest.mark.asyncio +async def test_publish_non_serializable_returns_usable_error(): + pubnub = PubNubAsyncio(pnconf_copy()) + + result = await pubnub.publish().channel("ch1").message({ + "text": "Hello", + "timestamp": datetime.now(), + }).future() + + assert isinstance(result, PubNubAsyncioException) + assert result.is_error() is True + assert isinstance(result.status, PNStatus) + assert result.status.error is True + assert result.status.category == PNStatusCategory.PNSerializationErrorCategory + assert isinstance(result.status.error_data, PNErrorData) + assert str(result) == ( + "Trying to publish not JSON serializable object: " + "Object of type datetime is not JSON serializable" + ) + + await pubnub.stop()