def test_dict_to_entity(self): from google.cloud.datastore_v1.types import entity as entity_pb2 from google.cloud.datastore.entity import Entity entity = Entity() entity["a"] = {"b": u"c"} entity_pb = self._call_fut(entity) expected_pb = entity_pb2.Entity( properties={ "a": entity_pb2.Value(entity_value=entity_pb2.Entity( properties={"b": entity_pb2.Value(string_value="c")})) }) self.assertEqual(entity_pb, expected_pb)
def test_null(self): from google.protobuf import struct_pb2 from google.cloud.datastore_v1.types import entity as entity_pb2 value = entity_pb2.Value(null_value=struct_pb2.NULL_VALUE) result = self._call_fut(value._pb) self.assertIsNone(result)
def test_single(self): from google.cloud.datastore_v1.types import entity as entity_pb2 value_pb = entity_pb2.Value() value_pb.meaning = meaning = 22 value_pb.string_value = u"hi" result = self._call_fut(value_pb) self.assertEqual(meaning, result)
def test_empty_array_value(self): from google.cloud.datastore_v1.types import entity as entity_pb2 value_pb = entity_pb2.Value() value_pb._pb.array_value.values.add() value_pb._pb.array_value.values.pop() result = self._call_fut(value_pb, is_list=True) self.assertEqual(None, result)
def test_key(self): from google.cloud.datastore_v1.types import entity as entity_pb2 from google.cloud.datastore.key import Key value = entity_pb2.Value() expected = Key("KIND", 1234, project="PROJECT").to_protobuf() value.key_value._pb.CopyFrom(expected._pb) found = self._call_fut(value._pb) self.assertEqual(found.to_protobuf(), expected)
def test_it(self): from google.cloud.datastore_v1.types import entity as entity_pb2 entity_pb = entity_pb2.Entity() name = "foo" result = self._call_fut(entity_pb, name) self.assertIsInstance(result, type(entity_pb2.Value()._pb)) self.assertEqual(len(entity_pb._pb.properties), 1) self.assertEqual(entity_pb._pb.properties[name], result)
def test_array(self): from google.cloud.datastore_v1.types import entity as entity_pb2 value = entity_pb2.Value() array_pb = value.array_value.values item_pb = array_pb._pb.add() item_pb.string_value = "Foo" item_pb = array_pb._pb.add() item_pb.string_value = "Bar" items = self._call_fut(value._pb) self.assertEqual(items, ["Foo", "Bar"])
def test_datetime(self): import calendar import datetime from google.cloud._helpers import UTC from google.cloud.datastore_v1.types import entity as entity_pb2 micros = 4375 utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC) value = entity_pb2.Value() value._pb.timestamp_value.seconds = calendar.timegm(utc.timetuple()) value._pb.timestamp_value.nanos = 1000 * micros self.assertEqual(self._call_fut(value._pb), utc)
def test_dict_to_entity_recursive(self): from google.cloud.datastore_v1.types import entity as entity_pb2 from google.cloud.datastore.entity import Entity entity = Entity() entity["a"] = {"b": {"c": {"d": 1.25}, "e": True}, "f": 10} entity_pb = self._call_fut(entity) b_entity_pb = entity_pb2.Entity( properties={ "c": entity_pb2.Value(entity_value=entity_pb2.Entity( properties={"d": entity_pb2.Value(double_value=1.25)})), "e": entity_pb2.Value(boolean_value=True), }) expected_pb = entity_pb2.Entity( properties={ "a": entity_pb2.Value(entity_value=entity_pb2.Entity( properties={ "b": entity_pb2.Value(entity_value=b_entity_pb), "f": entity_pb2.Value(integer_value=10), })) }) self.assertEqual(entity_pb, expected_pb)
def test_geo_point(self): from google.type import latlng_pb2 from google.cloud.datastore_v1.types import entity as entity_pb2 from google.cloud.datastore.helpers import GeoPoint lat = -3.14 lng = 13.37 geo_pt_pb = latlng_pb2.LatLng(latitude=lat, longitude=lng) value = entity_pb2.Value(geo_point_value=geo_pt_pb) result = self._call_fut(value._pb) self.assertIsInstance(result, GeoPoint) self.assertEqual(result.latitude, lat) self.assertEqual(result.longitude, lng)
def test_array_value_meaning_partially_unset(self): from google.cloud.datastore_v1.types import entity as entity_pb2 value_pb = entity_pb2.Value() meaning1 = 9 sub_value_pb1 = value_pb._pb.array_value.values.add() sub_value_pb2 = value_pb._pb.array_value.values.add() sub_value_pb1.meaning = meaning1 sub_value_pb1.string_value = u"hi" sub_value_pb2.string_value = u"bye" result = self._call_fut(value_pb, is_list=True) self.assertEqual(result, [meaning1, None])
def test_entity(self): from google.cloud.datastore_v1.types import entity as entity_pb2 from google.cloud.datastore.entity import Entity from google.cloud.datastore.helpers import _new_value_pb value = entity_pb2.Value() entity_pb = value.entity_value entity_pb._pb.key.path.add(kind="KIND") entity_pb.key.partition_id.project_id = "PROJECT" value_pb = _new_value_pb(entity_pb, "foo") value_pb.string_value = "Foo" entity = self._call_fut(value._pb) self.assertIsInstance(entity, Entity) self.assertEqual(entity["foo"], "Foo")
def test_index_mismatch_ignores_empty_list(self): from google.cloud.datastore_v1.types import entity as entity_pb2 _PROJECT = "PROJECT" _KIND = "KIND" _ID = 1234 array_val_pb = entity_pb2.Value(array_value=entity_pb2.ArrayValue( values=[])) entity_pb = entity_pb2.Entity(properties={"baz": array_val_pb}) entity_pb.key.partition_id.project_id = _PROJECT entity_pb.key._pb.path.add(kind=_KIND, id=_ID) entity = self._call_fut(entity_pb._pb) entity_dict = dict(entity) self.assertEqual(entity_dict["baz"], [])
def _get_value_from_value_pb(value): """Given a protobuf for a Value, get the correct value. The Cloud Datastore Protobuf API returns a Property Protobuf which has one value set and the rest blank. This function retrieves the the one value provided. Some work is done to coerce the return value into a more useful type (particularly in the case of a timestamp value, or a key value). :type value_pb: :class:`.entity_pb2.Value` :param value_pb: The Value Protobuf. :rtype: object :returns: The value provided by the Protobuf. :raises: :class:`ValueError <exceptions.ValueError>` if no value type has been set. """ if not getattr(value, "_pb", False): # Coerce raw pb type into proto-plus pythonic type. value = entity_pb2.Value(value) value_type = value._pb.WhichOneof("value_type") if value_type == "timestamp_value": result = value.timestamp_value elif value_type == "key_value": result = key_from_protobuf(value.key_value) elif value_type == "boolean_value": result = value.boolean_value elif value_type == "double_value": result = value.double_value elif value_type == "integer_value": result = value.integer_value elif value_type == "string_value": result = value.string_value elif value_type == "blob_value": result = value.blob_value elif value_type == "entity_value": result = entity_from_protobuf(value.entity_value) elif value_type == "array_value": result = [ _get_value_from_value_pb(value) for value in value._pb.array_value.values ] elif value_type == "geo_point_value": result = GeoPoint( value.geo_point_value.latitude, value.geo_point_value.longitude, ) elif value_type == "null_value": result = None else: raise ValueError("Value protobuf did not have any value set") return result
def _makePB(self, attr_name, attr_value): from google.cloud.datastore_v1.types import entity as entity_pb2 value = entity_pb2.Value() setattr(value._pb, attr_name, attr_value) return value
def _makePB(self): from google.cloud.datastore_v1.types import entity as entity_pb2 return entity_pb2.Value()._pb
def test_unknown(self): from google.cloud.datastore_v1.types import entity as entity_pb2 value = entity_pb2.Value() with self.assertRaises(ValueError): self._call_fut(value._pb)
def test_no_meaning(self): from google.cloud.datastore_v1.types import entity as entity_pb2 value_pb = entity_pb2.Value() result = self._call_fut(value_pb) self.assertIsNone(result)