Skip to content

Commit 335e2c4

Browse files
authored
perf: strip proto wrappers in '_helpers.decode_{value,dict}' (#458)
* chore: remove obsolete skip for old Python 3 versions * perf: strip proto wrappers in '_helpers.decode_{value,dict}' Closes #351.
1 parent 2d58ae7 commit 335e2c4

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

google/cloud/firestore_v1/_helpers.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -349,30 +349,35 @@ def decode_value(
349349
NotImplementedError: If the ``value_type`` is ``reference_value``.
350350
ValueError: If the ``value_type`` is unknown.
351351
"""
352-
value_type = value._pb.WhichOneof("value_type")
352+
value_pb = getattr(value, "_pb", value)
353+
value_type = value_pb.WhichOneof("value_type")
353354

354355
if value_type == "null_value":
355356
return None
356357
elif value_type == "boolean_value":
357-
return value.boolean_value
358+
return value_pb.boolean_value
358359
elif value_type == "integer_value":
359-
return value.integer_value
360+
return value_pb.integer_value
360361
elif value_type == "double_value":
361-
return value.double_value
362+
return value_pb.double_value
362363
elif value_type == "timestamp_value":
363-
return DatetimeWithNanoseconds.from_timestamp_pb(value._pb.timestamp_value)
364+
return DatetimeWithNanoseconds.from_timestamp_pb(value_pb.timestamp_value)
364365
elif value_type == "string_value":
365-
return value.string_value
366+
return value_pb.string_value
366367
elif value_type == "bytes_value":
367-
return value.bytes_value
368+
return value_pb.bytes_value
368369
elif value_type == "reference_value":
369-
return reference_value_to_document(value.reference_value, client)
370+
return reference_value_to_document(value_pb.reference_value, client)
370371
elif value_type == "geo_point_value":
371-
return GeoPoint(value.geo_point_value.latitude, value.geo_point_value.longitude)
372+
return GeoPoint(
373+
value_pb.geo_point_value.latitude, value_pb.geo_point_value.longitude
374+
)
372375
elif value_type == "array_value":
373-
return [decode_value(element, client) for element in value.array_value.values]
376+
return [
377+
decode_value(element, client) for element in value_pb.array_value.values
378+
]
374379
elif value_type == "map_value":
375-
return decode_dict(value.map_value.fields, client)
380+
return decode_dict(value_pb.map_value.fields, client)
376381
else:
377382
raise ValueError("Unknown ``value_type``", value_type)
378383

@@ -391,7 +396,9 @@ def decode_dict(value_fields, client) -> dict:
391396
str, bytes, dict, ~google.cloud.Firestore.GeoPoint]]: A dictionary
392397
of native Python values converted from the ``value_fields``.
393398
"""
394-
return {key: decode_value(value, client) for key, value in value_fields.items()}
399+
value_fields_pb = getattr(value_fields, "_pb", value_fields)
400+
401+
return {key: decode_value(value, client) for key, value in value_fields_pb.items()}
395402

396403

397404
def get_doc_id(document_pb, expected_prefix) -> str:

tests/unit/v1/test__helpers.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -618,9 +618,6 @@ def _call_fut(value_fields, client=mock.sentinel.client):
618618

619619
return decode_dict(value_fields, client)
620620

621-
@unittest.skipIf(
622-
(3,) <= sys.version_info < (3, 4, 4), "known datetime bug (bpo-23517) in Python"
623-
)
624621
def test_many_types(self):
625622
from google.protobuf import struct_pb2
626623
from google.protobuf import timestamp_pb2

0 commit comments

Comments
 (0)