From 52945ce7cd68280a4d9eaf1805a4dd9df0e616f9 Mon Sep 17 00:00:00 2001 From: Gracjan Sadowicz Date: Fri, 17 Apr 2026 16:31:57 +0200 Subject: [PATCH 1/3] RDBC-1057 Issues with Compare Exchange API --- .../compare_exchange/compare_exchange.py | 5 +- .../test_compare_exchange_session_api.py | 74 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 ravendb/tests/issue_tests/test_compare_exchange_session_api.py diff --git a/ravendb/documents/operations/compare_exchange/compare_exchange.py b/ravendb/documents/operations/compare_exchange/compare_exchange.py index dfc0f88d..fa333be9 100644 --- a/ravendb/documents/operations/compare_exchange/compare_exchange.py +++ b/ravendb/documents/operations/compare_exchange/compare_exchange.py @@ -95,7 +95,10 @@ def get_value( else: entity = self.__original_value.value - value = CompareExchangeValue(self._key, self._index, entity) + metadata = ( + self.__original_value.metadata if self.__original_value.has_metadata else None + ) + value = CompareExchangeValue(self._key, self._index, entity, metadata) self.__value = value return value diff --git a/ravendb/tests/issue_tests/test_compare_exchange_session_api.py b/ravendb/tests/issue_tests/test_compare_exchange_session_api.py new file mode 100644 index 00000000..e3a11ebd --- /dev/null +++ b/ravendb/tests/issue_tests/test_compare_exchange_session_api.py @@ -0,0 +1,74 @@ +from ravendb import SessionOptions, TransactionMode +from ravendb.tests.test_base import TestBase, User + + +class TestCompareExchangeSessionApi(TestBase): + def setUp(self): + super().setUp() + + def test_get_compare_exchange_value_returns_metadata(self): + key = "locks/happy-metadata" + options = SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) + + with self.store.open_session(session_options=options) as session: + value = session.advanced.cluster_transaction.create_compare_exchange_value( + key, User(name="Simon") + ) + value.metadata["@expires"] = "2099-01-01T00:00:00.0000000Z" + value.metadata["@created-at"] = "2026-04-15T12:27:51.556568Z" + value.metadata["Custom-Tag"] = "hello" + session.save_changes() + + with self.store.open_session(session_options=options) as session: + got = session.advanced.cluster_transaction.get_compare_exchange_value(key, User) + + self.assertIsNotNone(got) + self.assertEqual("Simon", got.value.name) + self.assertTrue(got.has_metadata) + self.assertEqual("2099-01-01T00:00:00.0000000Z", got.metadata["@expires"]) + self.assertEqual("2026-04-15T12:27:51.556568Z", got.metadata["@created-at"]) + self.assertEqual("hello", got.metadata["Custom-Tag"]) + + def test_delete_compare_exchange_value_removes_item(self): + key = "locks/happy-delete" + options = SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) + + with self.store.open_session(session_options=options) as session: + session.advanced.cluster_transaction.create_compare_exchange_value( + key, User(name="Simon") + ) + session.save_changes() + + with self.store.open_session(session_options=options) as session: + current = session.advanced.cluster_transaction.get_compare_exchange_value(key, User) + self.assertIsNotNone(current) + + session.advanced.cluster_transaction.delete_compare_exchange_value(current) + session.save_changes() + + with self.store.open_session(session_options=options) as session: + after = session.advanced.cluster_transaction.get_compare_exchange_value(key, User) + self.assertIsNone(after) + + def test_delete_compare_exchange_value_by_key_and_index_removes_item(self): + key = "locks/happy-delete-by-key" + options = SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) + + with self.store.open_session(session_options=options) as session: + session.advanced.cluster_transaction.create_compare_exchange_value( + key, User(name="Simon") + ) + session.save_changes() + + with self.store.open_session(session_options=options) as session: + current = session.advanced.cluster_transaction.get_compare_exchange_value(key, User) + self.assertIsNotNone(current) + + session.advanced.cluster_transaction.delete_compare_exchange_value( + current.key, current.index + ) + session.save_changes() + + with self.store.open_session(session_options=options) as session: + after = session.advanced.cluster_transaction.get_compare_exchange_value(key, User) + self.assertIsNone(after) From c41656ddfd26eaddd5086b78413123368fe313cf Mon Sep 17 00:00:00 2001 From: Gracjan Sadowicz Date: Fri, 17 Apr 2026 16:35:46 +0200 Subject: [PATCH 2/3] RDBC-1057 Run black --- .../compare_exchange/compare_exchange.py | 4 +--- .../test_compare_exchange_session_api.py | 16 ++++------------ 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/ravendb/documents/operations/compare_exchange/compare_exchange.py b/ravendb/documents/operations/compare_exchange/compare_exchange.py index fa333be9..e64ec4f3 100644 --- a/ravendb/documents/operations/compare_exchange/compare_exchange.py +++ b/ravendb/documents/operations/compare_exchange/compare_exchange.py @@ -95,9 +95,7 @@ def get_value( else: entity = self.__original_value.value - metadata = ( - self.__original_value.metadata if self.__original_value.has_metadata else None - ) + metadata = self.__original_value.metadata if self.__original_value.has_metadata else None value = CompareExchangeValue(self._key, self._index, entity, metadata) self.__value = value return value diff --git a/ravendb/tests/issue_tests/test_compare_exchange_session_api.py b/ravendb/tests/issue_tests/test_compare_exchange_session_api.py index e3a11ebd..64248f1d 100644 --- a/ravendb/tests/issue_tests/test_compare_exchange_session_api.py +++ b/ravendb/tests/issue_tests/test_compare_exchange_session_api.py @@ -11,9 +11,7 @@ def test_get_compare_exchange_value_returns_metadata(self): options = SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) with self.store.open_session(session_options=options) as session: - value = session.advanced.cluster_transaction.create_compare_exchange_value( - key, User(name="Simon") - ) + value = session.advanced.cluster_transaction.create_compare_exchange_value(key, User(name="Simon")) value.metadata["@expires"] = "2099-01-01T00:00:00.0000000Z" value.metadata["@created-at"] = "2026-04-15T12:27:51.556568Z" value.metadata["Custom-Tag"] = "hello" @@ -34,9 +32,7 @@ def test_delete_compare_exchange_value_removes_item(self): options = SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) with self.store.open_session(session_options=options) as session: - session.advanced.cluster_transaction.create_compare_exchange_value( - key, User(name="Simon") - ) + session.advanced.cluster_transaction.create_compare_exchange_value(key, User(name="Simon")) session.save_changes() with self.store.open_session(session_options=options) as session: @@ -55,18 +51,14 @@ def test_delete_compare_exchange_value_by_key_and_index_removes_item(self): options = SessionOptions(transaction_mode=TransactionMode.CLUSTER_WIDE) with self.store.open_session(session_options=options) as session: - session.advanced.cluster_transaction.create_compare_exchange_value( - key, User(name="Simon") - ) + session.advanced.cluster_transaction.create_compare_exchange_value(key, User(name="Simon")) session.save_changes() with self.store.open_session(session_options=options) as session: current = session.advanced.cluster_transaction.get_compare_exchange_value(key, User) self.assertIsNotNone(current) - session.advanced.cluster_transaction.delete_compare_exchange_value( - current.key, current.index - ) + session.advanced.cluster_transaction.delete_compare_exchange_value(current.key, current.index) session.save_changes() with self.store.open_session(session_options=options) as session: From 80e29f9c3acdd3503c64656799a9b9f866a9d21f Mon Sep 17 00:00:00 2001 From: Gracjan Sadowicz Date: Fri, 17 Apr 2026 16:37:42 +0200 Subject: [PATCH 3/3] RDBC-1057 Bump version for hotfix to 7.2.1.post1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9b977a4d..38c96089 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name="ravendb", packages=find_packages(exclude=["*.tests.*", "tests", "*.tests", "tests.*"]), - version="7.2.1", + version="7.2.1.post1", long_description_content_type="text/markdown", long_description=open("README_pypi.md").read(), description="Python client for RavenDB NoSQL Database",