Skip to content

Commit c2418cb

Browse files
committed
Replacing uses of HasField with _has_field in datastore.
1 parent fdd9c5f commit c2418cb

5 files changed

Lines changed: 36 additions & 24 deletions

File tree

gcloud/datastore/connection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import os
1818

19+
from gcloud._helpers import _has_field
1920
from gcloud import connection
2021
from gcloud.environment_vars import GCD_HOST
2122
from gcloud.exceptions import make_exception
@@ -397,7 +398,7 @@ def _prepare_key_for_request(key_pb): # pragma: NO COVER copied from helpers
397398
:returns: A key which will be added to a request. It will be the
398399
original if nothing needs to be changed.
399400
"""
400-
if key_pb.partition_id.HasField('dataset_id'):
401+
if _has_field(key_pb.partition_id, 'dataset_id'):
401402
new_key_pb = _entity_pb2.Key()
402403
new_key_pb.CopyFrom(key_pb)
403404
new_key_pb.partition_id.ClearField('dataset_id')

gcloud/datastore/helpers.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import six
2424

2525
from gcloud._helpers import _datetime_from_microseconds
26+
from gcloud._helpers import _has_field
2627
from gcloud._helpers import _microseconds_from_datetime
2728
from gcloud.datastore import _entity_pb2
2829
from gcloud.datastore.entity import Entity
@@ -109,7 +110,7 @@ def _get_meaning(value_pb, is_list=False):
109110
if all_meanings:
110111
raise ValueError('Different meanings set on values '
111112
'within a list_value')
112-
elif value_pb.HasField('meaning'):
113+
elif _has_field(value_pb, 'meaning'):
113114
meaning = value_pb.meaning
114115

115116
return meaning
@@ -128,7 +129,7 @@ def entity_from_protobuf(pb):
128129
:returns: The entity derived from the protobuf.
129130
"""
130131
key = None
131-
if pb.HasField('key'):
132+
if _has_field(pb, 'key'):
132133
key = key_from_protobuf(pb.key)
133134

134135
entity_props = {}
@@ -232,18 +233,18 @@ def key_from_protobuf(pb):
232233
path_args = []
233234
for element in pb.path_element:
234235
path_args.append(element.kind)
235-
if element.HasField('id'):
236+
if _has_field(element, 'id'):
236237
path_args.append(element.id)
237238
# This is safe: we expect proto objects returned will only have
238239
# one of `name` or `id` set.
239-
if element.HasField('name'):
240+
if _has_field(element, 'name'):
240241
path_args.append(element.name)
241242

242243
dataset_id = None
243-
if pb.partition_id.HasField('dataset_id'):
244+
if _has_field(pb.partition_id, 'dataset_id'):
244245
dataset_id = pb.partition_id.dataset_id
245246
namespace = None
246-
if pb.partition_id.HasField('namespace'):
247+
if _has_field(pb.partition_id, 'namespace'):
247248
namespace = pb.partition_id.namespace
248249

249250
return Key(*path_args, namespace=namespace, dataset_id=dataset_id)
@@ -323,29 +324,29 @@ def _get_value_from_value_pb(value_pb):
323324
:returns: The value provided by the Protobuf.
324325
"""
325326
result = None
326-
if value_pb.HasField('timestamp_microseconds_value'):
327+
if _has_field(value_pb, 'timestamp_microseconds_value'):
327328
microseconds = value_pb.timestamp_microseconds_value
328329
result = _datetime_from_microseconds(microseconds)
329330

330-
elif value_pb.HasField('key_value'):
331+
elif _has_field(value_pb, 'key_value'):
331332
result = key_from_protobuf(value_pb.key_value)
332333

333-
elif value_pb.HasField('boolean_value'):
334+
elif _has_field(value_pb, 'boolean_value'):
334335
result = value_pb.boolean_value
335336

336-
elif value_pb.HasField('double_value'):
337+
elif _has_field(value_pb, 'double_value'):
337338
result = value_pb.double_value
338339

339-
elif value_pb.HasField('integer_value'):
340+
elif _has_field(value_pb, 'integer_value'):
340341
result = value_pb.integer_value
341342

342-
elif value_pb.HasField('string_value'):
343+
elif _has_field(value_pb, 'string_value'):
343344
result = value_pb.string_value
344345

345-
elif value_pb.HasField('blob_value'):
346+
elif _has_field(value_pb, 'blob_value'):
346347
result = value_pb.blob_value
347348

348-
elif value_pb.HasField('entity_value'):
349+
elif _has_field(value_pb, 'entity_value'):
349350
result = entity_from_protobuf(value_pb.entity_value)
350351

351352
elif value_pb.list_value:
@@ -401,7 +402,7 @@ def _prepare_key_for_request(key_pb):
401402
:returns: A key which will be added to a request. It will be the
402403
original if nothing needs to be changed.
403404
"""
404-
if key_pb.partition_id.HasField('dataset_id'):
405+
if _has_field(key_pb.partition_id, 'dataset_id'):
405406
# We remove the dataset_id from the protobuf. This is because
406407
# the backend fails a request if the key contains un-prefixed
407408
# dataset ID. The backend fails because requests to

gcloud/datastore/test_connection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,8 @@ def request(self, **kw):
898898

899899

900900
def _compare_key_pb_after_request(test, key_before, key_after):
901-
test.assertFalse(key_after.partition_id.HasField('dataset_id'))
901+
from gcloud._helpers import _has_field
902+
test.assertFalse(_has_field(key_after.partition_id, 'dataset_id'))
902903
test.assertEqual(key_before.partition_id.namespace,
903904
key_after.partition_id.namespace)
904905
test.assertEqual(len(key_before.path_element),

gcloud/datastore/test_helpers.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,16 @@ def _callFUT(self, entity):
159159
return entity_to_protobuf(entity)
160160

161161
def _compareEntityProto(self, entity_pb1, entity_pb2):
162+
from gcloud._helpers import _has_field
163+
162164
import operator
163165
self.assertEqual(entity_pb1.key, entity_pb2.key)
164166
name_getter = operator.attrgetter('name')
165167
prop_list1 = sorted(entity_pb1.property, key=name_getter)
166168
prop_list2 = sorted(entity_pb2.property, key=name_getter)
167169
self.assertEqual(len(prop_list1), len(prop_list2))
168170
for val1, val2 in zip(prop_list1, prop_list2):
169-
if val1.value.HasField('entity_value'):
171+
if _has_field(val1.value, 'entity_value'):
170172
self.assertEqual(val1.name, val2.name)
171173
self.assertEqual(val1.value.meaning, val2.value.meaning)
172174
self._compareEntityProto(val1.value.entity_value,
@@ -728,6 +730,8 @@ def test_prefixed(self):
728730
self.assertEqual(PREFIXED, result)
729731

730732
def test_unprefixed_bogus_key_miss(self):
733+
from gcloud._helpers import _has_field
734+
731735
UNPREFIXED = 'DATASET'
732736
PREFIX = 's~'
733737
CONNECTION = _Connection(PREFIX, from_missing=False)
@@ -743,12 +747,14 @@ def test_unprefixed_bogus_key_miss(self):
743747
self.assertEqual(len(path_element), 1)
744748
self.assertEqual(path_element[0].kind, '__MissingLookupKind')
745749
self.assertEqual(path_element[0].id, 1)
746-
self.assertFalse(path_element[0].HasField('name'))
750+
self.assertFalse(_has_field(path_element[0], 'name'))
747751

748752
PREFIXED = PREFIX + UNPREFIXED
749753
self.assertEqual(result, PREFIXED)
750754

751755
def test_unprefixed_bogus_key_hit(self):
756+
from gcloud._helpers import _has_field
757+
752758
UNPREFIXED = 'DATASET'
753759
PREFIX = 'e~'
754760
CONNECTION = _Connection(PREFIX, from_missing=True)
@@ -763,7 +769,7 @@ def test_unprefixed_bogus_key_hit(self):
763769
self.assertEqual(len(path_element), 1)
764770
self.assertEqual(path_element[0].kind, '__MissingLookupKind')
765771
self.assertEqual(path_element[0].id, 1)
766-
self.assertFalse(path_element[0].HasField('name'))
772+
self.assertFalse(_has_field(path_element[0], 'name'))
767773

768774
PREFIXED = PREFIX + UNPREFIXED
769775
self.assertEqual(result, PREFIXED)

gcloud/datastore/test_key.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ def test_completed_key_on_complete(self):
333333
self.assertRaises(ValueError, key.completed_key, 5678)
334334

335335
def test_to_protobuf_defaults(self):
336+
from gcloud._helpers import _has_field
336337
from gcloud.datastore._entity_pb2 import Key as KeyPB
337338
_KIND = 'KIND'
338339
key = self._makeOne(_KIND, dataset_id=self._DEFAULT_DATASET)
@@ -342,15 +343,15 @@ def test_to_protobuf_defaults(self):
342343
# Check partition ID.
343344
self.assertEqual(pb.partition_id.dataset_id, self._DEFAULT_DATASET)
344345
self.assertEqual(pb.partition_id.namespace, '')
345-
self.assertFalse(pb.partition_id.HasField('namespace'))
346+
self.assertFalse(_has_field(pb.partition_id, 'namespace'))
346347

347348
# Check the element PB matches the partial key and kind.
348349
elem, = list(pb.path_element)
349350
self.assertEqual(elem.kind, _KIND)
350351
self.assertEqual(elem.name, '')
351-
self.assertFalse(elem.HasField('name'))
352+
self.assertFalse(_has_field(elem, 'name'))
352353
self.assertEqual(elem.id, 0)
353-
self.assertFalse(elem.HasField('id'))
354+
self.assertFalse(_has_field(elem, 'id'))
354355

355356
def test_to_protobuf_w_explicit_dataset_id(self):
356357
_DATASET = 'DATASET-ALT'
@@ -381,12 +382,14 @@ def test_to_protobuf_w_explicit_path(self):
381382
self.assertEqual(elems[1].id, _ID)
382383

383384
def test_to_protobuf_w_no_kind(self):
385+
from gcloud._helpers import _has_field
386+
384387
key = self._makeOne('KIND', dataset_id=self._DEFAULT_DATASET)
385388
# Force the 'kind' to be unset. Maybe `to_protobuf` should fail
386389
# on this? The backend certainly will.
387390
key._path[-1].pop('kind')
388391
pb = key.to_protobuf()
389-
self.assertFalse(pb.path_element[0].HasField('kind'))
392+
self.assertFalse(_has_field(pb.path_element[0], 'kind'))
390393

391394
def test_is_partial_no_name_or_id(self):
392395
key = self._makeOne('KIND', dataset_id=self._DEFAULT_DATASET)

0 commit comments

Comments
 (0)