def _compareEntityProto(self, entity_pb1, entity_pb2): from google.cloud.datastore.helpers import _property_tuples self.assertEqual(entity_pb1.key, entity_pb2.key) value_list1 = sorted(_property_tuples(entity_pb1)) value_list2 = sorted(_property_tuples(entity_pb2)) self.assertEqual(len(value_list1), len(value_list2)) for pair1, pair2 in zip(value_list1, value_list2): name1, val1 = pair1 name2, val2 = pair2 self.assertEqual(name1, name2) if val1.HasField('entity_value'): # Message field (Entity) self.assertEqual(val1.meaning, val2.meaning) self._compareEntityProto(val1.entity_value, val2.entity_value) else: self.assertEqual(val1, val2)
def object_from_protobuf(pb, model_type=None): """Factory method for creating a python object based on a protobuf. The protobuf should be one returned from the Cloud Datastore Protobuf API. :type pb: :class:`.entity_pb2.Entity` :param pb: The Protobuf representing the entity. :rtype: :class:`google.cloud.datastore.entity.Entity` :returns: The entity derived from the protobuf. """ key = None if pb.HasField("key"): # Message field (Key) key = CustomIterator.key_from_protobuf(pb.key) key._type = SubclassMap.get()[key.kind] entity_props = {} for prop_name, value_pb in helpers._property_tuples(pb): value = CustomIterator._get_value_from_value_pb(value_pb) entity_props[prop_name] = value obj = model_type._dotted_dict_to_object(entity_props, key) return obj
def _compare_entity_proto(self, entity_pb1, entity_pb2): from google.cloud.datastore.helpers import _property_tuples self.assertEqual(entity_pb1.key, entity_pb2.key) value_list1 = sorted(_property_tuples(entity_pb1)) value_list2 = sorted(_property_tuples(entity_pb2)) self.assertEqual(len(value_list1), len(value_list2)) for pair1, pair2 in zip(value_list1, value_list2): name1, val1 = pair1 name2, val2 = pair2 self.assertEqual(name1, name2) if val1.HasField("entity_value"): # Message field (Entity) self.assertEqual(val1.meaning, val2.meaning) self._compare_entity_proto(val1.entity_value, val2.entity_value) else: self.assertEqual(val1, val2)
def test_put_multi_no_batch_w_partial_key(self): from google.cloud.datastore_v1.proto import datastore_pb2 from google.cloud.datastore.helpers import _property_tuples entity = _Entity(foo=u'bar') key = entity.key = _Key(self.PROJECT) key._id = None creds = _make_credentials() client = self._make_one(credentials=creds) key_pb = _make_key(234) ds_api = _make_datastore_api(key_pb) client._datastore_api_internal = ds_api result = client.put_multi([entity]) self.assertIsNone(result) self.assertEqual(ds_api.commit.call_count, 1) _, positional, keyword = ds_api.commit.mock_calls[0] self.assertEqual(keyword, {'transaction': None}) self.assertEqual(len(positional), 3) self.assertEqual(positional[0], self.PROJECT) self.assertEqual( positional[1], datastore_pb2.CommitRequest.NON_TRANSACTIONAL) mutations = positional[2] mutated_entity = _mutated_pb(self, mutations, 'insert') self.assertEqual(mutated_entity.key, key.to_protobuf()) prop_list = list(_property_tuples(mutated_entity)) self.assertTrue(len(prop_list), 1) name, value_pb = prop_list[0] self.assertEqual(name, 'foo') self.assertEqual(value_pb.string_value, u'bar')
def test_put_entity_w_completed_key(self): from google.cloud.datastore.helpers import _property_tuples project = "PROJECT" properties = { "foo": "bar", "baz": "qux", "spam": [1, 2, 3], "frotz": [] } client = _Client(project) batch = self._make_one(client) entity = _Entity(properties) entity.exclude_from_indexes = ("baz", "spam") key = entity.key = _Key(project) batch.begin() batch.put(entity) mutated_entity = _mutated_pb(self, batch.mutations, "upsert") self.assertEqual(mutated_entity.key, key._key) prop_dict = dict(_property_tuples(mutated_entity)) self.assertEqual(len(prop_dict), 4) self.assertFalse(prop_dict["foo"].exclude_from_indexes) self.assertTrue(prop_dict["baz"].exclude_from_indexes) self.assertFalse(prop_dict["spam"].exclude_from_indexes) spam_values = prop_dict["spam"].array_value.values self.assertTrue(spam_values[0].exclude_from_indexes) self.assertTrue(spam_values[1].exclude_from_indexes) self.assertTrue(spam_values[2].exclude_from_indexes) self.assertTrue("frotz" in prop_dict)
def test_put_entity_w_completed_key(self): from google.cloud.datastore.helpers import _property_tuples project = "PROJECT" properties = {"foo": "bar", "baz": "qux", "spam": [1, 2, 3], "frotz": []} client = _Client(project) batch = self._make_one(client) entity = _Entity(properties) entity.exclude_from_indexes = ("baz", "spam") key = entity.key = _Key(project) batch.begin() batch.put(entity) mutated_entity = _mutated_pb(self, batch.mutations, "upsert") self.assertEqual(mutated_entity.key, key._key) prop_dict = dict(_property_tuples(mutated_entity)) self.assertEqual(len(prop_dict), 4) self.assertFalse(prop_dict["foo"].exclude_from_indexes) self.assertTrue(prop_dict["baz"].exclude_from_indexes) self.assertFalse(prop_dict["spam"].exclude_from_indexes) spam_values = prop_dict["spam"].array_value.values self.assertTrue(spam_values[0].exclude_from_indexes) self.assertTrue(spam_values[1].exclude_from_indexes) self.assertTrue(spam_values[2].exclude_from_indexes) self.assertTrue("frotz" in prop_dict)
def test_put_entity_w_completed_key(self): from google.cloud.datastore.helpers import _property_tuples project = 'PROJECT' properties = { 'foo': 'bar', 'baz': 'qux', 'spam': [1, 2, 3], 'frotz': [], } client = _Client(project) batch = self._make_one(client) entity = _Entity(properties) entity.exclude_from_indexes = ('baz', 'spam') key = entity.key = _Key(project) batch.begin() batch.put(entity) mutated_entity = _mutated_pb(self, batch.mutations, 'upsert') self.assertEqual(mutated_entity.key, key._key) prop_dict = dict(_property_tuples(mutated_entity)) self.assertEqual(len(prop_dict), 4) self.assertFalse(prop_dict['foo'].exclude_from_indexes) self.assertTrue(prop_dict['baz'].exclude_from_indexes) self.assertFalse(prop_dict['spam'].exclude_from_indexes) spam_values = prop_dict['spam'].array_value.values self.assertTrue(spam_values[0].exclude_from_indexes) self.assertTrue(spam_values[1].exclude_from_indexes) self.assertTrue(spam_values[2].exclude_from_indexes) self.assertTrue('frotz' in prop_dict)
def test_put_entity_w_completed_key(self): from google.cloud.datastore.helpers import _property_tuples _PROJECT = 'PROJECT' _PROPERTIES = { 'foo': 'bar', 'baz': 'qux', 'spam': [1, 2, 3], 'frotz': [], # will be ignored } connection = _Connection() client = _Client(_PROJECT, connection) batch = self._makeOne(client) entity = _Entity(_PROPERTIES) entity.exclude_from_indexes = ('baz', 'spam') key = entity.key = _Key(_PROJECT) batch.begin() batch.put(entity) mutated_entity = _mutated_pb(self, batch.mutations, 'upsert') self.assertEqual(mutated_entity.key, key._key) prop_dict = dict(_property_tuples(mutated_entity)) self.assertEqual(len(prop_dict), 3) self.assertFalse(prop_dict['foo'].exclude_from_indexes) self.assertTrue(prop_dict['baz'].exclude_from_indexes) self.assertFalse(prop_dict['spam'].exclude_from_indexes) spam_values = prop_dict['spam'].array_value.values self.assertTrue(spam_values[0].exclude_from_indexes) self.assertTrue(spam_values[1].exclude_from_indexes) self.assertTrue(spam_values[2].exclude_from_indexes) self.assertFalse('frotz' in prop_dict)
def test_put_multi_no_batch_w_partial_key(self): from google.cloud.datastore.helpers import _property_tuples entity = _Entity(foo=u'bar') key = entity.key = _Key(self.PROJECT) key._id = None creds = _make_credentials() client = self._make_one(credentials=creds) client._connection._commit.append([_KeyPB(key)]) result = client.put_multi([entity]) self.assertIsNone(result) self.assertEqual(len(client._connection._commit_cw), 1) (project, commit_req, transaction_id) = client._connection._commit_cw[0] self.assertEqual(project, self.PROJECT) mutated_entity = _mutated_pb(self, commit_req.mutations, 'insert') self.assertEqual(mutated_entity.key, key.to_protobuf()) prop_list = list(_property_tuples(mutated_entity)) self.assertTrue(len(prop_list), 1) name, value_pb = prop_list[0] self.assertEqual(name, 'foo') self.assertEqual(value_pb.string_value, u'bar') self.assertIsNone(transaction_id)
def test_put_multi_no_batch_w_partial_key(self): from google.cloud.datastore.helpers import _property_tuples entity = _Entity(foo=u'bar') key = entity.key = _Key(self.PROJECT) key._id = None creds = object() client = self._makeOne(credentials=creds) client.connection._commit.append([_KeyPB(key)]) result = client.put_multi([entity]) self.assertIsNone(result) self.assertEqual(len(client.connection._commit_cw), 1) (project, commit_req, transaction_id) = client.connection._commit_cw[0] self.assertEqual(project, self.PROJECT) mutated_entity = _mutated_pb(self, commit_req.mutations, 'insert') self.assertEqual(mutated_entity.key, key.to_protobuf()) prop_list = list(_property_tuples(mutated_entity)) self.assertTrue(len(prop_list), 1) name, value_pb = prop_list[0] self.assertEqual(name, 'foo') self.assertEqual(value_pb.string_value, u'bar') self.assertIsNone(transaction_id)
def test_put_entity_w_completed_key(self): from google.cloud.datastore.helpers import _property_tuples _PROJECT = 'PROJECT' _PROPERTIES = { 'foo': 'bar', 'baz': 'qux', 'spam': [1, 2, 3], 'frotz': [], # will be ignored } connection = _Connection() client = _Client(_PROJECT, connection) batch = self._makeOne(client) entity = _Entity(_PROPERTIES) entity.exclude_from_indexes = ('baz', 'spam') key = entity.key = _Key(_PROJECT) batch.put(entity) mutated_entity = _mutated_pb(self, batch.mutations, 'upsert') self.assertEqual(mutated_entity.key, key._key) prop_dict = dict(_property_tuples(mutated_entity)) self.assertEqual(len(prop_dict), 3) self.assertFalse(prop_dict['foo'].exclude_from_indexes) self.assertTrue(prop_dict['baz'].exclude_from_indexes) self.assertFalse(prop_dict['spam'].exclude_from_indexes) spam_values = prop_dict['spam'].array_value.values self.assertTrue(spam_values[0].exclude_from_indexes) self.assertTrue(spam_values[1].exclude_from_indexes) self.assertTrue(spam_values[2].exclude_from_indexes) self.assertFalse('frotz' in prop_dict)
def test_entity_empty_wo_key(self): from google.cloud.datastore.entity import Entity from google.cloud.datastore.helpers import _property_tuples pb = self._makePB() entity = Entity() self._call_fut(pb, entity) value = pb.entity_value self.assertEqual(value.key.SerializeToString(), b'') self.assertEqual(len(list(_property_tuples(value))), 0)
def test_entity_empty_wo_key(self): from google.cloud.datastore.entity import Entity from google.cloud.datastore.helpers import _property_tuples pb = self._makePB() entity = Entity() self._call_fut(pb, entity) value = pb.entity_value self.assertEqual(value.key.SerializeToString(), b"") self.assertEqual(len(list(_property_tuples(value))), 0)
def test_entity_w_key(self): from google.cloud.datastore.entity import Entity from google.cloud.datastore.helpers import _property_tuples from google.cloud.datastore.key import Key name = 'foo' value = u'Foo' pb = self._makePB() key = Key('KIND', 123, project='PROJECT') entity = Entity(key=key) entity[name] = value self._call_fut(pb, entity) entity_pb = pb.entity_value self.assertEqual(entity_pb.key, key.to_protobuf()) prop_dict = dict(_property_tuples(entity_pb)) self.assertEqual(len(prop_dict), 1) self.assertEqual(list(prop_dict.keys()), [name]) self.assertEqual(prop_dict[name].string_value, value)
def test_entity_w_key(self): from google.cloud.datastore.entity import Entity from google.cloud.datastore.helpers import _property_tuples from google.cloud.datastore.key import Key name = "foo" value = u"Foo" pb = self._makePB() key = Key("KIND", 123, project="PROJECT") entity = Entity(key=key) entity[name] = value self._call_fut(pb, entity) entity_pb = pb.entity_value self.assertEqual(entity_pb.key, key.to_protobuf()) prop_dict = dict(_property_tuples(entity_pb)) self.assertEqual(len(prop_dict), 1) self.assertEqual(list(prop_dict.keys()), [name]) self.assertEqual(prop_dict[name].string_value, value)
def test_put_multi_existing_batch_w_completed_key(self): from google.cloud.datastore.helpers import _property_tuples creds = _make_credentials() client = self._make_one(credentials=creds) entity = _Entity(foo=u'bar') key = entity.key = _Key(self.PROJECT) with _NoCommitBatch(client) as CURR_BATCH: result = client.put_multi([entity]) self.assertIsNone(result) mutated_entity = _mutated_pb(self, CURR_BATCH.mutations, 'upsert') self.assertEqual(mutated_entity.key, key.to_protobuf()) prop_list = list(_property_tuples(mutated_entity)) self.assertTrue(len(prop_list), 1) name, value_pb = prop_list[0] self.assertEqual(name, 'foo') self.assertEqual(value_pb.string_value, u'bar')
def test_put_multi_existing_batch_w_completed_key(self): from google.cloud.datastore.helpers import _property_tuples creds = object() client = self._makeOne(credentials=creds) entity = _Entity(foo=u'bar') key = entity.key = _Key(self.PROJECT) with _NoCommitBatch(client) as CURR_BATCH: result = client.put_multi([entity]) self.assertIsNone(result) mutated_entity = _mutated_pb(self, CURR_BATCH.mutations, 'upsert') self.assertEqual(mutated_entity.key, key.to_protobuf()) prop_list = list(_property_tuples(mutated_entity)) self.assertTrue(len(prop_list), 1) name, value_pb = prop_list[0] self.assertEqual(name, 'foo') self.assertEqual(value_pb.string_value, u'bar')
def _call_fut(self, entity_pb): from google.cloud.datastore.helpers import _property_tuples return _property_tuples(entity_pb)