def process(self, element, schemas): """Enforce the datatypes of the input schema on the element data.""" key_name = element[0] elements = element[1] schema = schemas[key_name] for elem in elements: resource_data = elem.get('resource', {}).get('data', {}) if resource_data: bigquery_schema.enforce_schema_data_types(elem, schema) yield (key_name, elem)
def test_addtional_properties_repeated_record(self): schema = [{ 'name': 'property_1', 'field_type': 'RECORD', 'description': 'description-1', 'mode': 'REPEATED', 'fields': [{ 'name': 'name', 'field_type': 'STRING', 'description': 'additionalProperties name', 'mode': 'NULLABLE' }, { 'name': 'value', 'field_type': 'RECORD', 'description': 'description-1.', 'mode': 'NULLABLE', 'fields': [{ 'name': 'property_2', 'field_type': 'STRING', 'description': 'description-2.', 'mode': 'NULLABLE' }] }] }] self.assertEqual( bigquery_schema.enforce_schema_data_types( { 'property_1': { 'key1': { 'property_2': 'a' }, 'key2': { 'property_2': 'b' } } }, schema), { 'property_1': [{ 'name': 'key1', 'value': { 'property_2': 'a' } }, { 'name': 'key2', 'value': { 'property_2': 'b' } }] })
def test_enforce_schema_data_types(self): schema = [{ 'name': 'property_1', 'field_type': 'NUMERIC', 'mode': 'NULLABLE' }, { 'name': 'property_2', 'field_type': 'STRING', 'mode': 'NULLABLE' }, { 'name': 'property_3', 'field_type': 'DATE', 'mode': 'NULLABLE' }, { 'name': 'property_4', 'field_type': 'DATETIME', 'mode': 'NULLABLE' }, { 'name': 'property_5', 'field_type': 'BOOL', 'mode': 'NULLABLE' }, { 'name': 'property_6', 'field_type': 'NUMERIC', 'mode': 'REPEATED' }, { 'name': 'property_7', 'field_type': 'RECORD', 'mode': 'REPEATED', 'fields': [{ 'name': 'property_1', 'field_type': 'NUMERIC', 'mode': 'NULLABLE' }, { 'name': 'property_2', 'field_type': 'STRING', 'mode': 'NULLABLE' }] }] self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_1': '333'}, schema), {'property_1': 333}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_1': 333}, schema), {'property_1': 333}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_1': 'notanumber'}, schema), {}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_2': 33}, schema), {'property_2': '33'}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_2': 'astring'}, schema), {'property_2': 'astring'}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_3': '2019-01-01'}, schema), {'property_3': '2019-01-01'}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_3': 'invaliddate'}, schema), {}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_4': '2019-01-01T00:01:00'}, schema), {'property_4': '2019-01-01T00:01:00'}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_4': 'invalid'}, schema), {}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_5': False}, schema), {'property_5': False}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_5': 'True'}, schema), {'property_5': True}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_5': 0}, schema), {'property_5': False}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_6': 33}, schema), {'property_6': [33]}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_6': '33'}, schema), {'property_6': [33]}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_6': {'33'}}, schema), {}) self.assertEqual( bigquery_schema.enforce_schema_data_types({'property_6': [33]}, schema), {'property_6': [33]}) self.assertEqual( bigquery_schema.enforce_schema_data_types( { 'property_7': [{ 'property_1': 'invalid', 'property_2': 'valid' }] }, schema), {'property_7': [{ 'property_2': 'valid' }]}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_7': [{ 'property_1': 'invalid' }]}, schema), {}) self.assertEqual( bigquery_schema.enforce_schema_data_types( {'property_7': [{ 'property_1': 'invalid' }, 33]}, schema), {})