From d8bdce8398e45486bddad5fccac1245d309bde61 Mon Sep 17 00:00:00 2001 From: JeremyTubongbanua Date: Mon, 21 Sep 2026 10:51:32 -0400 Subject: [PATCH 1/3] fix: verbbuilder.py --- at_client/util/verbbuilder.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/at_client/util/verbbuilder.py b/at_client/util/verbbuilder.py index b74341f..6f752e8 100644 --- a/at_client/util/verbbuilder.py +++ b/at_client/util/verbbuilder.py @@ -185,7 +185,7 @@ def set_metadata(self, metadata): return self def with_at_key(self, at_key, value): - self.set_key_name(at_key.name) + self.set_key_name(at_key.get_fully_qualified_key_name()) self.set_shared_by(str(at_key.shared_by)) if at_key.shared_with and str(at_key.shared_with): self.set_shared_with(str(at_key.shared_with)) @@ -276,7 +276,7 @@ def set_type(self, type): return self def with_at_key(self, at_key, type): - self.set_key_name(at_key.name) + self.set_key_name(at_key.get_fully_qualified_key_name()) self.set_shared_by(str(at_key.shared_by)) if at_key.shared_with is not None and at_key.shared_with: self.set_shared_with(str(at_key.shared_with)) @@ -333,7 +333,7 @@ def set_type(self, type): return self def with_shared_key(self, shared_key, type): - self.set_key_name(shared_key.name) + self.set_key_name(shared_key.get_fully_qualified_key_name()) self.set_shared_with(str(shared_key.shared_with)) self.set_type(type) return self @@ -383,7 +383,7 @@ def set_bypass_cache(self, bypass_cache): return self def with_at_key(self, at_key, type): - self.set_key_name(at_key.name) + self.set_key_name(at_key.get_fully_qualified_key_name()) self.set_shared_by(str(at_key.shared_by)) self.set_type(type) return self @@ -440,7 +440,7 @@ def set_is_cached(self, is_cached): return self def with_at_key(self, at_key): - self.set_key_name(at_key.name) + self.set_key_name(at_key.get_fully_qualified_key_name()) self.set_shared_by(str(at_key.shared_by)) if at_key.shared_with and not str(at_key.shared_with).strip() == "": self.set_shared_with(str(at_key.shared_with)) From 05cce9d0bb6adb1f768d70d25ed02787c21a4804 Mon Sep 17 00:00:00 2001 From: JeremyTubongbanua Date: Mon, 21 Sep 2026 17:48:26 -0400 Subject: [PATCH 2/3] fix: NotifyVerbBuilder symmetry with Dart SDK --- at_client/util/verbbuilder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/at_client/util/verbbuilder.py b/at_client/util/verbbuilder.py index 6f752e8..1e929d2 100644 --- a/at_client/util/verbbuilder.py +++ b/at_client/util/verbbuilder.py @@ -543,7 +543,7 @@ def set_session_id(self, session_id): return self def with_at_key(self, at_key, encrypted_value, operation=OperationEnum.UPDATE, session_id=None): - self.set_key_name(at_key.name) + self.set_key_name(at_key.get_fully_qualified_key_name()) self.set_shared_by(str(at_key.shared_by)) self.set_shared_with(str(at_key.shared_with)) self.set_is_hidden(at_key.metadata.is_hidden) @@ -551,7 +551,7 @@ def with_at_key(self, at_key, encrypted_value, operation=OperationEnum.UPDATE, s self.set_is_cached(at_key.metadata.is_cached) self.set_metadata(at_key.metadata) self.set_value(encrypted_value) - self.set_namespace(at_key.namespace) + self.set_namespace(None) self.set_session_id(session_id) self.operation = operation if self.message_type is None: From c1f8e8560cbcf32e2a3f993fbb341e091c28fece Mon Sep 17 00:00:00 2001 From: JeremyTubongbanua Date: Mon, 21 Sep 2026 17:48:38 -0400 Subject: [PATCH 3/3] test: update verbbuilder_test.py to be symmetric with Dart SDK --- test/verbbuilder_test.py | 52 +++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/test/verbbuilder_test.py b/test/verbbuilder_test.py index b79ea42..c23e7c6 100644 --- a/test/verbbuilder_test.py +++ b/test/verbbuilder_test.py @@ -328,47 +328,67 @@ def test_delete_verb_builder(self): self.assertEqual("delete:@bob:test@alice", command) + def test_namespaced_at_key_verb_builders(self): + alice = AtSign("@alice") + bob = AtSign("@bob") + public_key = PublicKey("publickey", alice).set_namespace("mynamespace") + shared_key = SharedKey("sharedkey", alice, bob).set_namespace("mynamespace") + + command = UpdateVerbBuilder().with_at_key(public_key, "value").build() + self.assertEqual("update:public:publickey.mynamespace@alice value", command) + + command = LlookupVerbBuilder().with_at_key(shared_key, LlookupVerbBuilder.Type.NONE).build() + self.assertEqual("llookup:@bob:sharedkey.mynamespace@alice", command) + + command = LookupVerbBuilder().with_shared_key(shared_key, LookupVerbBuilder.Type.NONE).build() + self.assertEqual("lookup:sharedkey.mynamespace@bob", command) + + command = PlookupVerbBuilder().with_at_key(public_key, PlookupVerbBuilder.Type.NONE).build() + self.assertEqual("plookup:publickey.mynamespace@alice", command) + + command = DeleteVerbBuilder().with_at_key(shared_key).build() + self.assertEqual("delete:@bob:sharedkey.mynamespace@alice", command) + + command = NotifyVerbBuilder().with_at_key(shared_key, "value").build() + command_without_id = re.sub(r'\bid:[^:]*:', '', command) + self.assertEqual("notify:update:isEncrypted:true:@bob:sharedkey.mynamespace@alice:value", command_without_id) + def test_notify_verb_builder(self): # with a shared key, no metadata and no namespace sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")) command = NotifyVerbBuilder().with_at_key(sk, "valuevaluevalue").build() command_without_id = re.sub(r'\bid:[^:]*:', '', command) - print(command_without_id) - self.assertRegex(command_without_id, "notify:update:isEncrypted:true:@bob:test@alice:valuevaluevalue") + self.assertEqual("notify:update:isEncrypted:true:@bob:test@alice:valuevaluevalue", command_without_id) #with a shared key, metadata and no namespace sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")) - metadata = Metadata(ttl="1000", ttr="-1") + metadata = Metadata(ttl=1000, ttr=-1) sk.metadata = metadata command = NotifyVerbBuilder().with_at_key(sk, "valuevaluevalue").build() command_without_id = re.sub(r'\bid:[^:]*:', '', command) - self.assertRegex(command_without_id, "notify:update:ttl:1000:ttr:-1:isEncrypted:true:@bob:test@alice:valuevaluevalue") + self.assertEqual("notify:update:ttl:1000:ttr:-1:isEncrypted:true:@bob:test@alice:valuevaluevalue", command_without_id) #with a shared key, no metadata and namespace - sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")) - sk.namespace = ".dave" + sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")).set_namespace("dave") command = NotifyVerbBuilder().with_at_key(sk, "valuevaluevalue").build() command_without_id = re.sub(r'\bid:[^:]*:', '', command) - self.assertRegex(command_without_id, "notify:update:isEncrypted:true:@bob:test.dave@alice:valuevaluevalue") + self.assertEqual("notify:update:isEncrypted:true:@bob:test.dave@alice:valuevaluevalue", command_without_id) #with a shared key, metadata and namespace - sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")) - metadata = Metadata(ttl="1000", ttr="-1") + sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")).set_namespace("dave") + metadata = Metadata(ttl=1000, ttr=-1) sk.metadata = metadata - sk.namespace = ".dave" command = NotifyVerbBuilder().with_at_key(sk, "valuevaluevalue").build() command_without_id = re.sub(r'\bid:[^:]*:', '', command) - self.assertRegex(command_without_id, "notify:update:ttl:1000:ttr:-1:isEncrypted:true:@bob:test.dave@alice:valuevaluevalue") - + self.assertEqual("notify:update:ttl:1000:ttr:-1:isEncrypted:true:@bob:test.dave@alice:valuevaluevalue", command_without_id) #with a shared key, with metadata and namespace (no caching) - sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")) - metadata = Metadata(ttln="1000") + sk = SharedKey("test", AtSign("@alice"), AtSign("@bob")).set_namespace("dave") + metadata = Metadata(ttln=1000) sk.metadata = metadata - sk.namespace = ".dave" command = NotifyVerbBuilder().with_at_key(sk, "valuevaluevalue").build() command_without_id = re.sub(r'\bid:[^:]*:', '', command) - self.assertRegex(command_without_id, "notify:update:ttln:1000:isEncrypted:true:@bob:test.dave@alice:valuevaluevalue") + self.assertEqual("notify:update:ttln:1000:isEncrypted:true:@bob:test.dave@alice:valuevaluevalue", command_without_id) if __name__ == '__main__': unittest.main()