From ac47ac4f003b8ecc8314ca63d3926955a1ecc96e Mon Sep 17 00:00:00 2001 From: Hemang Date: Thu, 16 May 2019 12:21:12 +0530 Subject: [PATCH 1/5] expose reserveIds --- datastore/google/cloud/datastore/client.py | 27 ++++++++++++++++++++++ datastore/tests/unit/test_client.py | 23 +++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/datastore/google/cloud/datastore/client.py b/datastore/google/cloud/datastore/client.py index 9cf892aab54d..7affb9a0001f 100644 --- a/datastore/google/cloud/datastore/client.py +++ b/datastore/google/cloud/datastore/client.py @@ -648,3 +648,30 @@ def do_something(entity): if "namespace" not in kwargs: kwargs["namespace"] = self.namespace return Query(self, **kwargs) + + def reserve_ids(self, complete_key, num_ids): + """Prevents the supplied keys' IDs from being auto-allocated by Cloud + Datastore. + + :type complete_key: :class:`google.cloud.datastore.key.Key` + :param complete_key: Partial key to use as base for allocated IDs. + + :type num_ids: int + :param num_ids: The number of IDs to reserve. + + :rtype: list of :class:`google.cloud.datastore.key.Key` + :returns: [] + :raises: :class:`ValueError` if ``incomplete_key`` is not a + partial key. + """ + if complete_key.is_partial: + raise ValueError(("Key is not Complete.", complete_key)) + + complete_key_pb = complete_key.to_protobuf() + complete_key_pbs = [complete_key_pb] * num_ids + + response_pb = self._datastore_api.reserve_ids( + complete_key.project, complete_key_pbs + ) + + return response_pb diff --git a/datastore/tests/unit/test_client.py b/datastore/tests/unit/test_client.py index 05c6f4ddbfd5..ffb8541015da 100644 --- a/datastore/tests/unit/test_client.py +++ b/datastore/tests/unit/test_client.py @@ -860,13 +860,34 @@ def test_allocate_ids_w_partial_key(self): # Check the IDs returned. self.assertEqual([key._id for key in result], list(range(num_ids))) - def test_allocate_ids_with_completed_key(self): + def test_allocate_ids_w_completed_key(self): creds = _make_credentials() client = self._make_one(credentials=creds) COMPLETE_KEY = _Key(self.PROJECT) self.assertRaises(ValueError, client.allocate_ids, COMPLETE_KEY, 2) + def test_reserve_ids_w_completed_key(self): + + num_ids = 2 + creds = _make_credentials() + client = self._make_one(credentials=creds,_use_grpc=False) + COMPLETE_KEY = _Key(self.PROJECT) + alloc_ids = mock.Mock(return_value=None, spec=[]) + ds_api = mock.Mock(reserve_ids=alloc_ids, spec=["reserve_ids"]) + client._datastore_api_internal = ds_api + result = client.reserve_ids(COMPLETE_KEY, num_ids) + + self.assertIsNone(result) + + def test_reserve_ids_w_partial_key(self): + + incomplete_key = _Key(self.PROJECT) + incomplete_key._id = None + creds = _make_credentials() + client = self._make_one(credentials=creds) + self.assertRaises(ValueError, client.reserve_ids, incomplete_key, 2) + def test_key_w_project(self): KIND = "KIND" ID = 1234 From 54729bffed83b7536de84d45a8c316c2432ef54a Mon Sep 17 00:00:00 2001 From: Hemang Date: Tue, 21 May 2019 15:34:24 +0530 Subject: [PATCH 2/5] add few assertion in reserve_ids --- datastore/google/cloud/datastore/client.py | 9 ++++++--- datastore/tests/unit/test_client.py | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/datastore/google/cloud/datastore/client.py b/datastore/google/cloud/datastore/client.py index 7affb9a0001f..eef51d8808dd 100644 --- a/datastore/google/cloud/datastore/client.py +++ b/datastore/google/cloud/datastore/client.py @@ -654,19 +654,22 @@ def reserve_ids(self, complete_key, num_ids): Datastore. :type complete_key: :class:`google.cloud.datastore.key.Key` - :param complete_key: Partial key to use as base for allocated IDs. + :param complete_key: Partial key to use as base for reserved IDs. :type num_ids: int :param num_ids: The number of IDs to reserve. :rtype: list of :class:`google.cloud.datastore.key.Key` :returns: [] - :raises: :class:`ValueError` if ``incomplete_key`` is not a - partial key. + :raises: :class:`ValueError` if `complete_key`` is not a + Complete key. """ if complete_key.is_partial: raise ValueError(("Key is not Complete.", complete_key)) + if not isinstance(num_ids, int): + raise ValueError(("num_ids is not a valid integer.", num_ids)) + complete_key_pb = complete_key.to_protobuf() complete_key_pbs = [complete_key_pb] * num_ids diff --git a/datastore/tests/unit/test_client.py b/datastore/tests/unit/test_client.py index ffb8541015da..3b1b7709ecf4 100644 --- a/datastore/tests/unit/test_client.py +++ b/datastore/tests/unit/test_client.py @@ -876,17 +876,27 @@ def test_reserve_ids_w_completed_key(self): alloc_ids = mock.Mock(return_value=None, spec=[]) ds_api = mock.Mock(reserve_ids=alloc_ids, spec=["reserve_ids"]) client._datastore_api_internal = ds_api + self.assertTrue(not COMPLETE_KEY.is_partial) + self.assertIsInstance(num_ids, int) result = client.reserve_ids(COMPLETE_KEY, num_ids) self.assertIsNone(result) def test_reserve_ids_w_partial_key(self): - + num_ids = 2 incomplete_key = _Key(self.PROJECT) incomplete_key._id = None creds = _make_credentials() client = self._make_one(credentials=creds) - self.assertRaises(ValueError, client.reserve_ids, incomplete_key, 2) + self.assertIsInstance(num_ids, int) + self.assertRaises(ValueError, client.reserve_ids, incomplete_key, num_ids) + + def test_reserve_ids_w_wrong_num_ids(self): + num_ids = "2" + complete_key = _Key(self.PROJECT) + creds = _make_credentials() + client = self._make_one(credentials=creds) + self.assertRaises(ValueError, client.reserve_ids, complete_key, num_ids) def test_key_w_project(self): KIND = "KIND" From 46f1c40f17a710795491d289b53ee57abed5645e Mon Sep 17 00:00:00 2001 From: HemangChothani <50404902+HemangChothani@users.noreply.github.com> Date: Thu, 23 May 2019 11:28:36 +0530 Subject: [PATCH 3/5] Remove extra blank space --- datastore/tests/unit/test_client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/datastore/tests/unit/test_client.py b/datastore/tests/unit/test_client.py index 3b1b7709ecf4..419729e880d2 100644 --- a/datastore/tests/unit/test_client.py +++ b/datastore/tests/unit/test_client.py @@ -868,7 +868,6 @@ def test_allocate_ids_w_completed_key(self): self.assertRaises(ValueError, client.allocate_ids, COMPLETE_KEY, 2) def test_reserve_ids_w_completed_key(self): - num_ids = 2 creds = _make_credentials() client = self._make_one(credentials=creds,_use_grpc=False) From fc997efb2e7ded3ca25f76813435b4594669fe0f Mon Sep 17 00:00:00 2001 From: Hemang Date: Wed, 29 May 2019 17:41:07 +0530 Subject: [PATCH 4/5] changes releted to unittest of reserveid and return type of reserve_ids --- datastore/google/cloud/datastore/client.py | 13 ++++------ datastore/tests/unit/test_client.py | 29 +++++++++++----------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/datastore/google/cloud/datastore/client.py b/datastore/google/cloud/datastore/client.py index eef51d8808dd..e0b034fbc9c7 100644 --- a/datastore/google/cloud/datastore/client.py +++ b/datastore/google/cloud/datastore/client.py @@ -650,8 +650,7 @@ def do_something(entity): return Query(self, **kwargs) def reserve_ids(self, complete_key, num_ids): - """Prevents the supplied keys' IDs from being auto-allocated by Cloud - Datastore. + """Reserve a list of IDs from a complete key. :type complete_key: :class:`google.cloud.datastore.key.Key` :param complete_key: Partial key to use as base for reserved IDs. @@ -659,8 +658,8 @@ def reserve_ids(self, complete_key, num_ids): :type num_ids: int :param num_ids: The number of IDs to reserve. - :rtype: list of :class:`google.cloud.datastore.key.Key` - :returns: [] + :rtype: class:`NoneType` + :returns: None :raises: :class:`ValueError` if `complete_key`` is not a Complete key. """ @@ -673,8 +672,6 @@ def reserve_ids(self, complete_key, num_ids): complete_key_pb = complete_key.to_protobuf() complete_key_pbs = [complete_key_pb] * num_ids - response_pb = self._datastore_api.reserve_ids( - complete_key.project, complete_key_pbs - ) + self._datastore_api.reserve_ids(complete_key.project, complete_key_pbs) - return response_pb + return None diff --git a/datastore/tests/unit/test_client.py b/datastore/tests/unit/test_client.py index 419729e880d2..0b105f89133c 100644 --- a/datastore/tests/unit/test_client.py +++ b/datastore/tests/unit/test_client.py @@ -864,22 +864,22 @@ def test_allocate_ids_w_completed_key(self): creds = _make_credentials() client = self._make_one(credentials=creds) - COMPLETE_KEY = _Key(self.PROJECT) - self.assertRaises(ValueError, client.allocate_ids, COMPLETE_KEY, 2) + complete_key = _Key(self.PROJECT) + self.assertRaises(ValueError, client.allocate_ids, complete_key, 2) def test_reserve_ids_w_completed_key(self): num_ids = 2 creds = _make_credentials() - client = self._make_one(credentials=creds,_use_grpc=False) - COMPLETE_KEY = _Key(self.PROJECT) - alloc_ids = mock.Mock(return_value=None, spec=[]) - ds_api = mock.Mock(reserve_ids=alloc_ids, spec=["reserve_ids"]) + client = self._make_one(credentials=creds, _use_grpc=False) + complete_key = _Key(self.PROJECT) + reserve_ids = mock.Mock(spec=[]) + ds_api = mock.Mock(reserve_ids=reserve_ids, spec=["reserve_ids"]) client._datastore_api_internal = ds_api - self.assertTrue(not COMPLETE_KEY.is_partial) - self.assertIsInstance(num_ids, int) - result = client.reserve_ids(COMPLETE_KEY, num_ids) - - self.assertIsNone(result) + self.assertTrue(not complete_key.is_partial) + client.reserve_ids(complete_key, num_ids) + expected_keys = [complete_key.to_protobuf()] * num_ids + expected_keys = [complete_key.to_protobuf()] * num_ids + reserve_ids.assert_called_once_with(self.PROJECT, expected_keys) def test_reserve_ids_w_partial_key(self): num_ids = 2 @@ -887,15 +887,16 @@ def test_reserve_ids_w_partial_key(self): incomplete_key._id = None creds = _make_credentials() client = self._make_one(credentials=creds) - self.assertIsInstance(num_ids, int) - self.assertRaises(ValueError, client.reserve_ids, incomplete_key, num_ids) + with self.assertRaises(ValueError): + client.reserve_ids(incomplete_key, num_ids) def test_reserve_ids_w_wrong_num_ids(self): num_ids = "2" complete_key = _Key(self.PROJECT) creds = _make_credentials() client = self._make_one(credentials=creds) - self.assertRaises(ValueError, client.reserve_ids, complete_key, num_ids) + with self.assertRaises(ValueError): + client.reserve_ids(complete_key, num_ids) def test_key_w_project(self): KIND = "KIND" From 79e5a816a5f9e85cdba4e3a5f8edf17595828f7c Mon Sep 17 00:00:00 2001 From: Hemang Date: Thu, 30 May 2019 11:27:05 +0530 Subject: [PATCH 5/5] reserver_id mock return default value --- datastore/tests/unit/test_client.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/datastore/tests/unit/test_client.py b/datastore/tests/unit/test_client.py index 0b105f89133c..171a93eda4db 100644 --- a/datastore/tests/unit/test_client.py +++ b/datastore/tests/unit/test_client.py @@ -872,13 +872,12 @@ def test_reserve_ids_w_completed_key(self): creds = _make_credentials() client = self._make_one(credentials=creds, _use_grpc=False) complete_key = _Key(self.PROJECT) - reserve_ids = mock.Mock(spec=[]) + reserve_ids = mock.Mock() ds_api = mock.Mock(reserve_ids=reserve_ids, spec=["reserve_ids"]) client._datastore_api_internal = ds_api self.assertTrue(not complete_key.is_partial) client.reserve_ids(complete_key, num_ids) expected_keys = [complete_key.to_protobuf()] * num_ids - expected_keys = [complete_key.to_protobuf()] * num_ids reserve_ids.assert_called_once_with(self.PROJECT, expected_keys) def test_reserve_ids_w_partial_key(self):