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"], [])
Example #14
0
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)