From 754fa926c74911270428d7851be980a315763ec1 Mon Sep 17 00:00:00 2001 From: Sebastian Molenda Date: Tue, 29 Mar 2022 12:57:10 +0200 Subject: [PATCH 1/3] Add missing history_with_actions fields --- pubnub/endpoints/fetch_messages.py | 24 ++++++++++++++++++++++++ pubnub/models/consumer/history.py | 5 +++++ 2 files changed, 29 insertions(+) diff --git a/pubnub/endpoints/fetch_messages.py b/pubnub/endpoints/fetch_messages.py index 1365c431..7a250776 100644 --- a/pubnub/endpoints/fetch_messages.py +++ b/pubnub/endpoints/fetch_messages.py @@ -31,6 +31,8 @@ def __init__(self, pubnub): self._count = None self._include_meta = None self._include_message_actions = None + self._include_message_type = None + self._include_uuid = None def channels(self, channels): utils.extend_list(self._channels, channels) @@ -64,6 +66,16 @@ def include_message_actions(self, include_message_actions): self._include_message_actions = include_message_actions return self + def include_message_type(self, include_message_type): + assert isinstance(include_message_type, bool) + self._include_message_type = include_message_type + return self + + def include_uuid(self, include_uuid): + assert isinstance(include_uuid, bool) + self._include_uuid = include_uuid + return self + def custom_params(self): params = {'max': int(self._count)} @@ -76,6 +88,12 @@ def custom_params(self): if self._include_meta is not None: params['include_meta'] = "true" if self._include_meta else "false" + if self._include_message_type is not None: + params['include_message_type'] = "true" if self._include_message_type else "false" + + if self.include_message_actions and self.include_uuid is not None: + params['include_uuid'] = "true" if self._include_uuid else "false" + return params def build_path(self): @@ -108,6 +126,12 @@ def validate_params(self): if self._include_message_actions is None: self._include_message_actions = False + if self._include_message_type is None: + self._include_message_type = False + + if self._include_uuid is None: + self._include_uuid = False + if not self._include_message_actions: if len(self._channels) == 1: if self._count is None or self._count < 1: diff --git a/pubnub/models/consumer/history.py b/pubnub/models/consumer/history.py index 9f8d3b8f..0d64b5a6 100644 --- a/pubnub/models/consumer/history.py +++ b/pubnub/models/consumer/history.py @@ -70,6 +70,11 @@ def from_json(cls, json_input, include_message_actions=False, start_timetoken=No channels[key] = [] for item in entry: message = PNFetchMessageItem(item['message'], item['timetoken']) + if 'uuid' in item: + message.uuid = item['uuid'] + if 'message_type' in item: + message.message_type = item['message_type'] + if 'meta' in item: message.meta = item['meta'] From 37ab538bb5510cf2847c3ae87da1f320944654a6 Mon Sep 17 00:00:00 2001 From: Sebastian Molenda Date: Tue, 29 Mar 2022 22:22:47 +0200 Subject: [PATCH 2/3] Added tests --- pubnub/endpoints/fetch_messages.py | 8 +- .../fetch_messages/include_message_type.yaml | 78 ++++++++++++ .../fetch_messages/include_meta.yaml | 113 ++++++++++++++++++ .../fetch_messages/include_uuid.yaml | 113 ++++++++++++++++++ .../native_sync/test_fetch_messages.py | 63 ++++++++++ 5 files changed, 368 insertions(+), 7 deletions(-) create mode 100644 tests/integrational/fixtures/native_sync/fetch_messages/include_message_type.yaml create mode 100644 tests/integrational/fixtures/native_sync/fetch_messages/include_meta.yaml create mode 100644 tests/integrational/fixtures/native_sync/fetch_messages/include_uuid.yaml diff --git a/pubnub/endpoints/fetch_messages.py b/pubnub/endpoints/fetch_messages.py index 7a250776..14773a4b 100644 --- a/pubnub/endpoints/fetch_messages.py +++ b/pubnub/endpoints/fetch_messages.py @@ -91,7 +91,7 @@ def custom_params(self): if self._include_message_type is not None: params['include_message_type'] = "true" if self._include_message_type else "false" - if self.include_message_actions and self.include_uuid is not None: + if self.include_message_actions and self._include_uuid is not None: params['include_uuid'] = "true" if self._include_uuid else "false" return params @@ -126,12 +126,6 @@ def validate_params(self): if self._include_message_actions is None: self._include_message_actions = False - if self._include_message_type is None: - self._include_message_type = False - - if self._include_uuid is None: - self._include_uuid = False - if not self._include_message_actions: if len(self._channels) == 1: if self._count is None or self._count < 1: diff --git a/tests/integrational/fixtures/native_sync/fetch_messages/include_message_type.yaml b/tests/integrational/fixtures/native_sync/fetch_messages/include_message_type.yaml new file mode 100644 index 00000000..539b02c8 --- /dev/null +++ b/tests/integrational/fixtures/native_sync/fetch_messages/include_message_type.yaml @@ -0,0 +1,78 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/publish/pub-c-739aa0fc-3ed5-472b-af26-aca1b333ec52/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/0/fetch-messages-types/0/%22hey-type%22?seqn=1 + response: + body: + string: '[1,"Sent","16485850413471824"]' + headers: + Access-Control-Allow-Methods: + - GET + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '30' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 20:17:21 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/v3/history-with-actions/sub-key/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/channel/fetch-messages-types?include_message_type=true&include_meta=false&max=25 + response: + body: + string: '{"status": 200, "channels": {"fetch-messages-types": [{"message": "hey-type", + "timetoken": "16485843895487893", "message_type": "1"}]}, "error_message": + "", "error": false}' + headers: + Accept-Ranges: + - bytes + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST, DELETE, OPTIONS + Access-Control-Allow-Origin: + - '*' + Age: + - '0' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '335' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 20:17:22 GMT + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integrational/fixtures/native_sync/fetch_messages/include_meta.yaml b/tests/integrational/fixtures/native_sync/fetch_messages/include_meta.yaml new file mode 100644 index 00000000..dbf60e84 --- /dev/null +++ b/tests/integrational/fixtures/native_sync/fetch_messages/include_meta.yaml @@ -0,0 +1,113 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/publish/pub-c-739aa0fc-3ed5-472b-af26-aca1b333ec52/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/0/fetch-messages-actions-meta-1/0/%22hey-meta%22?meta=%7B%22is-this%22%3A+%22krusty-krab%22%7D&seqn=1 + response: + body: + string: '[1,"Sent","16485817254069189"]' + headers: + Access-Control-Allow-Methods: + - GET + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '30' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 19:22:05 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/publish/pub-c-739aa0fc-3ed5-472b-af26-aca1b333ec52/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/0/fetch-messages-actions-meta-1/0/%22hey-meta%22?meta=%7B%22this-is%22%3A+%22patrick%22%7D&seqn=2 + response: + body: + string: '[1,"Sent","16485817254397299"]' + headers: + Access-Control-Allow-Methods: + - GET + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '30' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 19:22:05 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/v3/history-with-actions/sub-key/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/channel/fetch-messages-actions-meta-1?include_meta=true&max=25 + response: + body: + string: '{"status": 200, "channels": {"fetch-messages-actions-meta-1": [{"message": + "hey-meta", "timetoken": "16485817079213403", "meta": {"is-this": "krusty-krab"}}, + {"message": "hey-meta", "timetoken": "16485817079522020", "meta": {"this-is": + "patrick"}}]}, "error_message": "", "error": false}' + headers: + Accept-Ranges: + - bytes + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST, DELETE, OPTIONS + Access-Control-Allow-Origin: + - '*' + Age: + - '0' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '287' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 19:22:05 GMT + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integrational/fixtures/native_sync/fetch_messages/include_uuid.yaml b/tests/integrational/fixtures/native_sync/fetch_messages/include_uuid.yaml new file mode 100644 index 00000000..afbe36bd --- /dev/null +++ b/tests/integrational/fixtures/native_sync/fetch_messages/include_uuid.yaml @@ -0,0 +1,113 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/publish/pub-c-739aa0fc-3ed5-472b-af26-aca1b333ec52/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/0/fetch-messages-actions-uuid/0/%22hey-uuid-1%22?seqn=1 + response: + body: + string: '[1,"Sent","16485843882209571"]' + headers: + Access-Control-Allow-Methods: + - GET + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '30' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 20:06:28 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/publish/pub-c-739aa0fc-3ed5-472b-af26-aca1b333ec52/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/0/fetch-messages-actions-uuid/0/%22hey-uuid-2%22?seqn=2 + response: + body: + string: '[1,"Sent","16485843882539012"]' + headers: + Access-Control-Allow-Methods: + - GET + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '30' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 20:06:28 GMT + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - PubNub-Python/6.2.0 + method: GET + uri: https://ps.pndsn.com/v3/history-with-actions/sub-key/sub-c-33f55052-190b-11e6-bfbc-02ee2ddab7fe/channel/fetch-messages-actions-uuid?include_meta=false&include_uuid=true&max=25 + response: + body: + string: '{"status": 200, "channels": {"fetch-messages-actions-uuid": [{"message": + "hey-meta-1", "timetoken": "16485839292889892", "uuid": "fetch-messages-uuid-1"}, + {"message": "hey-meta-2", "timetoken": "16485839293220109", "uuid": "fetch-messages-uuid-2"}]}, + "error_message": "", "error": false}' + headers: + Accept-Ranges: + - bytes + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST, DELETE, OPTIONS + Access-Control-Allow-Origin: + - '*' + Age: + - '0' + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Length: + - '475' + Content-Type: + - text/javascript; charset="UTF-8" + Date: + - Tue, 29 Mar 2022 20:06:29 GMT + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integrational/native_sync/test_fetch_messages.py b/tests/integrational/native_sync/test_fetch_messages.py index a75f722f..a279f37b 100644 --- a/tests/integrational/native_sync/test_fetch_messages.py +++ b/tests/integrational/native_sync/test_fetch_messages.py @@ -6,6 +6,7 @@ from tests.helper import pnconf_copy from tests.integrational.vcr_helper import use_cassette_and_stub_time_sleep_native + COUNT = 120 @@ -86,3 +87,65 @@ def test_fetch_messages_actions_return_max_25(self): assert envelope is not None assert isinstance(envelope.result, PNFetchMessagesResult) assert len(envelope.result.channels[ch]) == 25 + + @use_cassette_and_stub_time_sleep_native( + 'tests/integrational/fixtures/native_sync/fetch_messages/include_meta.yaml', + filter_query_parameters=['uuid', 'pnsdk', 'l_pub']) + def test_fetch_messages_actions_include_meta(self): + ch = "fetch-messages-actions-meta-1" + pubnub = PubNub(pnconf_copy()) + pubnub.config.uuid = "fetch-messages-uuid" + + pubnub.publish().channel(ch).message("hey-meta").meta({"is-this": "krusty-krab"}).sync() + pubnub.publish().channel(ch).message("hey-meta").meta({"this-is": "patrick"}).sync() + + envelope = pubnub.fetch_messages().channels(ch).include_message_actions(True).include_meta(True).sync() + + assert envelope is not None + assert isinstance(envelope.result, PNFetchMessagesResult) + history = envelope.result.channels[ch] + assert len(history) == 2 + assert history[0].meta == {"is-this": "krusty-krab"} + assert history[1].meta == {'this-is': 'patrick'} + + @use_cassette_and_stub_time_sleep_native( + 'tests/integrational/fixtures/native_sync/fetch_messages/include_uuid.yaml', + filter_query_parameters=['uuid', 'pnsdk', 'l_pub']) + def test_fetch_messages_actions_include_uuid(self): + ch = "fetch-messages-actions-uuid" + pubnub = PubNub(pnconf_copy()) + uuid1 = "fetch-messages-uuid-1" + uuid2 = "fetch-messages-uuid-2" + + pubnub.config.uuid = uuid1 + pubnub.publish().channel(ch).message("hey-uuid-1").sync() + pubnub.config.uuid = uuid2 + pubnub.publish().channel(ch).message("hey-uuid-2").sync() + time.sleep(1) + envelope = pubnub.fetch_messages().channels(ch).include_message_actions(True).include_uuid(True).sync() + + assert envelope is not None + assert isinstance(envelope.result, PNFetchMessagesResult) + history = envelope.result.channels[ch] + assert len(history) == 2 + assert history[0].uuid == uuid1 + assert history[1].uuid == uuid2 + + @use_cassette_and_stub_time_sleep_native( + 'tests/integrational/fixtures/native_sync/fetch_messages/include_message_type.yaml', + filter_query_parameters=['uuid', 'pnsdk', 'l_pub']) + def test_fetch_messages_actions_include_message_type(self): + ch = "fetch-messages-types" + pubnub = PubNub(pnconf_copy()) + + pubnub.config.uuid = "fetch-message-types" + + pubnub.publish().channel(ch).message("hey-type").sync() + time.sleep(1) + envelope = pubnub.fetch_messages().channels(ch).include_message_actions(True).include_message_type(True).sync() + + assert envelope is not None + assert isinstance(envelope.result, PNFetchMessagesResult) + history = envelope.result.channels[ch] + assert len(history) == 1 + assert history[0].message_type == '1' From 2799d2741256a4dd2c09ccefe3ce801315480eb0 Mon Sep 17 00:00:00 2001 From: Client Engineering Bot <60980775+Client Engineering Bot@users.noreply.github.com> Date: Fri, 1 Apr 2022 08:40:14 +0000 Subject: [PATCH 3/3] PubNub SDK v6.3.0 release. --- .pubnub.yml | 13 +++++++++---- CHANGELOG.md | 6 ++++++ pubnub/pubnub_core.py | 2 +- setup.py | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.pubnub.yml b/.pubnub.yml index 03c13a46..203933a2 100644 --- a/.pubnub.yml +++ b/.pubnub.yml @@ -1,5 +1,5 @@ name: python -version: 6.2.0 +version: 6.3.0 schema: 1 scm: github.com/pubnub/python sdks: @@ -18,7 +18,7 @@ sdks: distributions: - distribution-type: library distribution-repository: package - package-name: pubnub-6.2.0 + package-name: pubnub-6.3.0 location: https://pypi.org/project/pubnub/ supported-platforms: supported-operating-systems: @@ -97,8 +97,8 @@ sdks: - distribution-type: library distribution-repository: git release - package-name: pubnub-6.2.0 - location: https://github.com/pubnub/python/releases/download/v6.2.0/pubnub-6.2.0.tar.gz + package-name: pubnub-6.3.0 + location: https://github.com/pubnub/python/releases/download/v6.3.0/pubnub-6.3.0.tar.gz supported-platforms: supported-operating-systems: Linux: @@ -169,6 +169,11 @@ sdks: license-url: https://github.com/aio-libs/aiohttp/blob/master/LICENSE.txt is-required: Required changelog: + - date: 2022-04-01 + version: v6.3.0 + changes: + - type: feature + text: "Add methods to include additional fields in fetch_messages." - date: 2022-03-21 version: v6.2.0 changes: diff --git a/CHANGELOG.md b/CHANGELOG.md index ebeb14b6..a9e2157d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v6.3.0 +April 01 2022 + +#### Added +- Add methods to include additional fields in fetch_messages. + ## v6.2.0 March 21 2022 diff --git a/pubnub/pubnub_core.py b/pubnub/pubnub_core.py index 11fc57a2..b6b53a92 100644 --- a/pubnub/pubnub_core.py +++ b/pubnub/pubnub_core.py @@ -65,7 +65,7 @@ class PubNubCore: """A base class for PubNub Python API implementations""" - SDK_VERSION = "6.2.0" + SDK_VERSION = "6.3.0" SDK_NAME = "PubNub-Python" TIMESTAMP_DIVIDER = 1000 diff --git a/setup.py b/setup.py index 21923bcb..f044550a 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='pubnub', - version='6.2.0', + version='6.3.0', description='PubNub Real-time push service in the cloud', author='PubNub', author_email='support@pubnub.com',