diff --git a/bigquery/google/cloud/bigquery/schema.py b/bigquery/google/cloud/bigquery/schema.py index 155ffe9a159a..f619b1cd9f2c 100644 --- a/bigquery/google/cloud/bigquery/schema.py +++ b/bigquery/google/cloud/bigquery/schema.py @@ -56,10 +56,13 @@ def from_api_repr(cls, api_repr): google.cloud.biquery.schema.SchemaField: The ``SchemaField`` object. """ + # Handle optional properties with default values + mode = api_repr.get('mode', 'NULLABLE') + fields = api_repr.get('fields', ()) return cls( field_type=api_repr['type'].upper(), - fields=[cls.from_api_repr(f) for f in api_repr.get('fields', ())], - mode=api_repr['mode'].upper(), + fields=[cls.from_api_repr(f) for f in fields], + mode=mode.upper(), name=api_repr['name'], ) diff --git a/bigquery/tests/unit/test_schema.py b/bigquery/tests/unit/test_schema.py index a5d5ecacd619..1613b4feb465 100644 --- a/bigquery/tests/unit/test_schema.py +++ b/bigquery/tests/unit/test_schema.py @@ -102,6 +102,16 @@ def test_from_api_repr(self): self.assertEqual(field.fields[0].field_type, 'INTEGER') self.assertEqual(field.fields[0].mode, 'NULLABLE') + def test_from_api_repr_defaults(self): + field = self._get_target_class().from_api_repr({ + 'name': 'foo', + 'type': 'record', + }) + self.assertEqual(field.name, 'foo') + self.assertEqual(field.field_type, 'RECORD') + self.assertEqual(field.mode, 'NULLABLE') + self.assertEqual(len(field.fields), 0) + def test_name_property(self): name = 'lemon-ness' schema_field = self._make_one(name, 'INTEGER')