diff --git a/bigquery/google/cloud/bigquery/_helpers.py b/bigquery/google/cloud/bigquery/_helpers.py index 2d763109e745..77964e233fc3 100644 --- a/bigquery/google/cloud/bigquery/_helpers.py +++ b/bigquery/google/cloud/bigquery/_helpers.py @@ -367,6 +367,12 @@ def _time_to_json(value): _SCALAR_VALUE_TO_JSON_PARAM['TIMESTAMP'] = _timestamp_to_json_parameter +def _snake_to_camel_case(value): + """Convert snake case string to camel case.""" + words = value.split('_') + return words[0] + ''.join(map(str.capitalize, words[1:])) + + class _ApiResourceProperty(object): """Base property implementation. diff --git a/bigquery/google/cloud/bigquery/client.py b/bigquery/google/cloud/bigquery/client.py index dedfe21135c1..fdd18878664f 100644 --- a/bigquery/google/cloud/bigquery/client.py +++ b/bigquery/google/cloud/bigquery/client.py @@ -47,6 +47,7 @@ from google.cloud.bigquery._helpers import _field_to_index_mapping from google.cloud.bigquery._helpers import _SCALAR_VALUE_TO_JSON_ROW from google.cloud.bigquery._helpers import DEFAULT_RETRY +from google.cloud.bigquery._helpers import _snake_to_camel_case _DEFAULT_CHUNKSIZE = 1048576 # 1024 * 1024 B = 1 MB @@ -340,9 +341,7 @@ def update_dataset(self, dataset, fields, retry=DEFAULT_RETRY): api_field = 'access' else: attr = getattr(dataset, f) - # snake case to camel case - words = f.split('_') - api_field = words[0] + ''.join(map(str.capitalize, words[1:])) + api_field = _snake_to_camel_case(f) partial[api_field] = attr if dataset.etag is not None: headers = {'If-Match': dataset.etag} diff --git a/bigquery/google/cloud/bigquery/table.py b/bigquery/google/cloud/bigquery/table.py index b75af6802014..2b9dea02d34e 100644 --- a/bigquery/google/cloud/bigquery/table.py +++ b/bigquery/google/cloud/bigquery/table.py @@ -22,6 +22,7 @@ from google.cloud._helpers import _datetime_from_microseconds from google.cloud._helpers import _millis_from_datetime +from google.cloud.bigquery._helpers import _snake_to_camel_case from google.cloud.bigquery.schema import SchemaField from google.cloud.bigquery.schema import _build_schema_resource from google.cloud.bigquery.schema import _parse_schema_resource @@ -705,11 +706,7 @@ def _build_resource(self, filter_fields): if f in self.custom_resource_fields: self.custom_resource_fields[f](self, resource) else: - # TODO(alixh) refactor to use in both Table and Dataset - # snake case to camel case - words = f.split('_') - api_field = words[0] + ''.join( - map(str.capitalize, words[1:])) + api_field = _snake_to_camel_case(f) resource[api_field] = getattr(self, f) return resource diff --git a/bigquery/tests/unit/test__helpers.py b/bigquery/tests/unit/test__helpers.py index f37d39a4f823..15a62107c645 100644 --- a/bigquery/tests/unit/test__helpers.py +++ b/bigquery/tests/unit/test__helpers.py @@ -749,6 +749,20 @@ def test_w_datetime(self): self.assertEqual(self._call_fut(when), '12:13:41') +class Test_snake_to_camel_case(unittest.TestCase): + + def _call_fut(self, value): + from google.cloud.bigquery._helpers import _snake_to_camel_case + + return _snake_to_camel_case(value) + + def test_w_snake_case_string(self): + self.assertEqual(self._call_fut('friendly_name'), 'friendlyName') + + def test_w_camel_case_string(self): + self.assertEqual(self._call_fut('friendlyName'), 'friendlyName') + + class Test_TypedApiResourceProperty(unittest.TestCase): @staticmethod