Skip to content

Commit a8169a4

Browse files
jbatswast
authored andcommitted
bigquery: remove client from Dataset (#4018)
1 parent 97f4e1c commit a8169a4

File tree

7 files changed

+49
-87
lines changed

7 files changed

+49
-87
lines changed

bigquery/google/cloud/bigquery/client.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def create_dataset(self, dataset):
190190
path = '/projects/%s/datasets' % (dataset.project,)
191191
api_response = self._connection.api_request(
192192
method='POST', path=path, data=dataset._build_resource())
193-
return Dataset.from_api_repr(api_response, self)
193+
return Dataset.from_api_repr(api_response)
194194

195195
def get_dataset(self, dataset_ref):
196196
"""Fetch the dataset referenced by ``dataset_ref``
@@ -204,7 +204,7 @@ def get_dataset(self, dataset_ref):
204204
"""
205205
api_response = self._connection.api_request(
206206
method='GET', path=dataset_ref.path)
207-
return Dataset.from_api_repr(api_response, self)
207+
return Dataset.from_api_repr(api_response)
208208

209209
def get_table(self, table_ref):
210210
"""Fetch the table referenced by ``table_ref``
@@ -262,7 +262,7 @@ def update_dataset(self, dataset, fields):
262262
headers = None
263263
api_response = self._connection.api_request(
264264
method='PATCH', path=path, data=partial, headers=headers)
265-
return Dataset.from_api_repr(api_response, self)
265+
return Dataset.from_api_repr(api_response)
266266

267267
def list_dataset_tables(self, dataset, max_results=None, page_token=None):
268268
"""List tables in the dataset.
@@ -622,7 +622,7 @@ def _item_to_dataset(iterator, resource):
622622
:rtype: :class:`.Dataset`
623623
:returns: The next dataset in the page.
624624
"""
625-
return Dataset.from_api_repr(resource, iterator.client)
625+
return Dataset.from_api_repr(resource)
626626

627627

628628
def _item_to_job(iterator, resource):

bigquery/google/cloud/bigquery/dataset.py

+8-19
Original file line numberDiff line numberDiff line change
@@ -157,38 +157,31 @@ class Dataset(object):
157157
:type dataset_id: str
158158
:param dataset_id: the ID of the dataset
159159
160-
:type client: :class:`google.cloud.bigquery.client.Client`
161-
:param client: (Optional) A client which holds credentials and project
162-
configuration for the dataset (which requires a project).
163-
164160
:type access_entries: list of :class:`AccessEntry`
165161
:param access_entries: roles granted to entities for this dataset
166162
167163
:type project: str
168-
:param project: (Optional) project ID for the dataset (defaults to
169-
the project of the client).
164+
:param project: (Optional) project ID for the dataset.
170165
"""
171166

172167
_access_entries = None
173168

174169
def __init__(self,
175170
dataset_id,
176-
client=None,
177171
access_entries=(),
178172
project=None):
179173
self._dataset_id = dataset_id
180-
self._client = client
181174
self._properties = {}
182175
# Let the @property do validation.
183176
self.access_entries = access_entries
184-
self._project = project or (client and client.project)
177+
self._project = project
185178

186179
@property
187180
def project(self):
188181
"""Project bound to the dataset.
189182
190183
:rtype: str
191-
:returns: the project (derived from the client).
184+
:returns: the project.
192185
"""
193186
return self._project
194187

@@ -373,25 +366,21 @@ def location(self, value):
373366
self._properties['location'] = value
374367

375368
@classmethod
376-
def from_api_repr(cls, resource, client):
369+
def from_api_repr(cls, resource):
377370
"""Factory: construct a dataset given its API representation
378371
379372
:type resource: dict
380373
:param resource: dataset resource representation returned from the API
381374
382-
:type client: :class:`google.cloud.bigquery.client.Client`
383-
:param client: Client which holds credentials and project
384-
configuration for the dataset.
385-
386375
:rtype: :class:`google.cloud.bigquery.dataset.Dataset`
387376
:returns: Dataset parsed from ``resource``.
388377
"""
389-
if ('datasetReference' not in resource or
390-
'datasetId' not in resource['datasetReference']):
378+
dsr = resource.get('datasetReference')
379+
if dsr is None or 'datasetId' not in dsr:
391380
raise KeyError('Resource lacks required identity information:'
392381
'["datasetReference"]["datasetId"]')
393-
dataset_id = resource['datasetReference']['datasetId']
394-
dataset = cls(dataset_id, client=client)
382+
dataset_id = dsr['datasetId']
383+
dataset = cls(dataset_id, project=dsr['projectId'])
395384
dataset._set_properties(resource)
396385
return dataset
397386

bigquery/google/cloud/bigquery/job.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,8 @@ def from_api_repr(cls, resource, client):
842842
"""
843843
job_id, config = cls._get_resource_config(resource)
844844
dest_config = config['destinationTable']
845-
dataset = Dataset(dest_config['datasetId'], client)
845+
dataset = Dataset(dest_config['datasetId'],
846+
project=dest_config['projectId'])
846847
table_ref = TableReference(dataset, dest_config['tableId'])
847848
destination = Table(table_ref, client=client)
848849
source_urls = config.get('sourceUris', ())
@@ -958,7 +959,8 @@ def from_api_repr(cls, resource, client):
958959
"""
959960
job_id, config = cls._get_resource_config(resource)
960961
dest_config = config['destinationTable']
961-
dataset = Dataset(dest_config['datasetId'], client)
962+
dataset = Dataset(dest_config['datasetId'],
963+
project=dest_config['projectId'])
962964
table_ref = TableReference(dataset, dest_config['tableId'])
963965
destination = Table(table_ref, client=client)
964966
sources = []
@@ -970,7 +972,8 @@ def from_api_repr(cls, resource, client):
970972
"Resource missing 'sourceTables' / 'sourceTable'")
971973
source_configs = [single]
972974
for source_config in source_configs:
973-
dataset = Dataset(source_config['datasetId'], client)
975+
dataset = Dataset(source_config['datasetId'],
976+
project=source_config['projectId'])
974977
table_ref = TableReference(dataset, source_config['tableId'])
975978
sources.append(Table(table_ref, client=client))
976979
job = cls(job_id, destination, sources, client=client)
@@ -1423,17 +1426,16 @@ def _copy_configuration_properties(self, configuration):
14231426
dest_local = self._destination_table_resource()
14241427
if dest_remote != dest_local:
14251428
project = dest_remote['projectId']
1426-
dataset = Dataset(
1427-
dest_remote['datasetId'], self._client, project=project)
1429+
dataset = Dataset(dest_remote['datasetId'], project=project)
14281430
self.destination = dataset.table(dest_remote['tableId'])
14291431

14301432
def_ds = configuration.get('defaultDataset')
14311433
if def_ds is None:
14321434
if self.default_dataset is not None:
14331435
del self.default_dataset
14341436
else:
1435-
project = def_ds['projectId']
1436-
self.default_dataset = Dataset(def_ds['datasetId'], self._client)
1437+
self.default_dataset = Dataset(def_ds['datasetId'],
1438+
project=def_ds['projectId'])
14371439

14381440
udf_resources = []
14391441
for udf_mapping in configuration.get(self._UDF_KEY, ()):
@@ -1579,7 +1581,6 @@ def referenced_tables(self):
15791581
if the query has not yet completed.
15801582
"""
15811583
tables = []
1582-
client = self._require_client(None)
15831584
datasets_by_project_name = {}
15841585

15851586
for table in self._job_statistics().get('referencedTables', ()):
@@ -1589,7 +1590,7 @@ def referenced_tables(self):
15891590
ds_name = table['datasetId']
15901591
t_dataset = datasets_by_project_name.get((t_project, ds_name))
15911592
if t_dataset is None:
1592-
t_dataset = Dataset(ds_name, client, project=t_project)
1593+
t_dataset = Dataset(ds_name, project=t_project)
15931594
datasets_by_project_name[(t_project, ds_name)] = t_dataset
15941595

15951596
t_name = table['tableId']

bigquery/tests/system.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,12 @@ def test_create_dataset(self):
117117

118118
self.assertTrue(_dataset_exists(dataset))
119119
self.assertEqual(dataset.dataset_id, DATASET_ID)
120+
self.assertEqual(dataset.project, Config.CLIENT.project)
120121

121122
def test_get_dataset(self):
122123
DATASET_ID = _make_dataset_id('get_dataset')
123124
client = Config.CLIENT
124-
dataset_arg = Dataset(DATASET_ID)
125+
dataset_arg = Dataset(DATASET_ID, project=client.project)
125126
dataset_arg.friendly_name = 'Friendly'
126127
dataset_arg.description = 'Description'
127128
dataset = retry_403(client.create_dataset)(dataset_arg)
@@ -1195,7 +1196,7 @@ def test_dump_table_w_public_data(self):
11951196
DATASET_ID = 'samples'
11961197
TABLE_NAME = 'natality'
11971198

1198-
dataset = Dataset(DATASET_ID, Config.CLIENT, project=PUBLIC)
1199+
dataset = Dataset(DATASET_ID, project=PUBLIC)
11991200
table_ref = dataset.table(TABLE_NAME)
12001201
table = Config.CLIENT.get_table(table_ref)
12011202
self._fetch_single_page(table)

bigquery/tests/unit/test_dataset.py

+20-49
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,9 @@ def _verify_resource_properties(self, dataset, resource):
210210
self.assertEqual(dataset.access_entries, [])
211211

212212
def test_ctor_defaults(self):
213-
client = _Client(self.PROJECT)
214-
dataset = self._make_one(self.DS_ID, client)
213+
dataset = self._make_one(self.DS_ID, project=self.PROJECT)
215214
self.assertEqual(dataset.dataset_id, self.DS_ID)
216-
self.assertIs(dataset._client, client)
217-
self.assertEqual(dataset.project, client.project)
215+
self.assertEqual(dataset.project, self.PROJECT)
218216
self.assertEqual(
219217
dataset.path,
220218
'/projects/%s/datasets/%s' % (self.PROJECT, self.DS_ID))
@@ -238,12 +236,10 @@ def test_ctor_explicit(self):
238236
bharney = AccessEntry('OWNER', 'userByEmail', '[email protected]')
239237
entries = [phred, bharney]
240238
OTHER_PROJECT = 'foo-bar-123'
241-
client = _Client(self.PROJECT)
242-
dataset = self._make_one(self.DS_ID, client,
239+
dataset = self._make_one(self.DS_ID,
243240
access_entries=entries,
244241
project=OTHER_PROJECT)
245242
self.assertEqual(dataset.dataset_id, self.DS_ID)
246-
self.assertIs(dataset._client, client)
247243
self.assertEqual(dataset.project, OTHER_PROJECT)
248244
self.assertEqual(
249245
dataset.path,
@@ -262,89 +258,76 @@ def test_ctor_explicit(self):
262258
self.assertIsNone(dataset.location)
263259

264260
def test_access_entries_setter_non_list(self):
265-
client = _Client(self.PROJECT)
266-
dataset = self._make_one(self.DS_ID, client)
261+
dataset = self._make_one(self.DS_ID)
267262
with self.assertRaises(TypeError):
268263
dataset.access_entries = object()
269264

270265
def test_access_entries_setter_invalid_field(self):
271266
from google.cloud.bigquery.dataset import AccessEntry
272267

273-
client = _Client(self.PROJECT)
274-
dataset = self._make_one(self.DS_ID, client)
268+
dataset = self._make_one(self.DS_ID)
275269
phred = AccessEntry('OWNER', 'userByEmail', '[email protected]')
276270
with self.assertRaises(ValueError):
277271
dataset.access_entries = [phred, object()]
278272

279273
def test_access_entries_setter(self):
280274
from google.cloud.bigquery.dataset import AccessEntry
281275

282-
client = _Client(self.PROJECT)
283-
dataset = self._make_one(self.DS_ID, client)
276+
dataset = self._make_one(self.DS_ID)
284277
phred = AccessEntry('OWNER', 'userByEmail', '[email protected]')
285278
bharney = AccessEntry('OWNER', 'userByEmail', '[email protected]')
286279
dataset.access_entries = [phred, bharney]
287280
self.assertEqual(dataset.access_entries, [phred, bharney])
288281

289282
def test_default_table_expiration_ms_setter_bad_value(self):
290-
client = _Client(self.PROJECT)
291-
dataset = self._make_one(self.DS_ID, client)
283+
dataset = self._make_one(self.DS_ID)
292284
with self.assertRaises(ValueError):
293285
dataset.default_table_expiration_ms = 'bogus'
294286

295287
def test_default_table_expiration_ms_setter(self):
296-
client = _Client(self.PROJECT)
297-
dataset = self._make_one(self.DS_ID, client)
288+
dataset = self._make_one(self.DS_ID)
298289
dataset.default_table_expiration_ms = 12345
299290
self.assertEqual(dataset.default_table_expiration_ms, 12345)
300291

301292
def test_description_setter_bad_value(self):
302-
client = _Client(self.PROJECT)
303-
dataset = self._make_one(self.DS_ID, client)
293+
dataset = self._make_one(self.DS_ID)
304294
with self.assertRaises(ValueError):
305295
dataset.description = 12345
306296

307297
def test_description_setter(self):
308-
client = _Client(self.PROJECT)
309-
dataset = self._make_one(self.DS_ID, client)
298+
dataset = self._make_one(self.DS_ID)
310299
dataset.description = 'DESCRIPTION'
311300
self.assertEqual(dataset.description, 'DESCRIPTION')
312301

313302
def test_friendly_name_setter_bad_value(self):
314-
client = _Client(self.PROJECT)
315-
dataset = self._make_one(self.DS_ID, client)
303+
dataset = self._make_one(self.DS_ID)
316304
with self.assertRaises(ValueError):
317305
dataset.friendly_name = 12345
318306

319307
def test_friendly_name_setter(self):
320-
client = _Client(self.PROJECT)
321-
dataset = self._make_one(self.DS_ID, client)
308+
dataset = self._make_one(self.DS_ID)
322309
dataset.friendly_name = 'FRIENDLY'
323310
self.assertEqual(dataset.friendly_name, 'FRIENDLY')
324311

325312
def test_location_setter_bad_value(self):
326-
client = _Client(self.PROJECT)
327-
dataset = self._make_one(self.DS_ID, client)
313+
dataset = self._make_one(self.DS_ID)
328314
with self.assertRaises(ValueError):
329315
dataset.location = 12345
330316

331317
def test_location_setter(self):
332-
client = _Client(self.PROJECT)
333-
dataset = self._make_one(self.DS_ID, client)
318+
dataset = self._make_one(self.DS_ID)
334319
dataset.location = 'LOCATION'
335320
self.assertEqual(dataset.location, 'LOCATION')
336321

337322
def test_from_api_repr_missing_identity(self):
338323
self._setUpConstants()
339-
client = _Client(self.PROJECT)
340324
RESOURCE = {}
341325
klass = self._get_target_class()
342326
with self.assertRaises(KeyError):
343-
klass.from_api_repr(RESOURCE, client=client)
327+
klass.from_api_repr(RESOURCE)
344328

345329
def test_from_api_repr_bare(self):
346330
self._setUpConstants()
347-
client = _Client(self.PROJECT)
348331
RESOURCE = {
349332
'id': '%s:%s' % (self.PROJECT, self.DS_ID),
350333
'datasetReference': {
@@ -353,24 +336,20 @@ def test_from_api_repr_bare(self):
353336
}
354337
}
355338
klass = self._get_target_class()
356-
dataset = klass.from_api_repr(RESOURCE, client=client)
357-
self.assertIs(dataset._client, client)
339+
dataset = klass.from_api_repr(RESOURCE)
358340
self._verify_resource_properties(dataset, RESOURCE)
359341

360342
def test_from_api_repr_w_properties(self):
361-
client = _Client(self.PROJECT)
362343
RESOURCE = self._makeResource()
363344
klass = self._get_target_class()
364-
dataset = klass.from_api_repr(RESOURCE, client=client)
365-
self.assertIs(dataset._client, client)
345+
dataset = klass.from_api_repr(RESOURCE)
366346
self._verify_resource_properties(dataset, RESOURCE)
367347

368348
def test__parse_access_entries_w_unknown_entity_type(self):
369349
ACCESS = [
370350
{'role': 'READER', 'unknown': 'UNKNOWN'},
371351
]
372-
client = _Client(self.PROJECT)
373-
dataset = self._make_one(self.DS_ID, client=client)
352+
dataset = self._make_one(self.DS_ID)
374353
with self.assertRaises(ValueError):
375354
dataset._parse_access_entries(ACCESS)
376355

@@ -383,24 +362,16 @@ def test__parse_access_entries_w_extra_keys(self):
383362
'userByEmail': USER_EMAIL,
384363
},
385364
]
386-
client = _Client(self.PROJECT)
387-
dataset = self._make_one(self.DS_ID, client=client)
365+
dataset = self._make_one(self.DS_ID)
388366
with self.assertRaises(ValueError):
389367
dataset._parse_access_entries(ACCESS)
390368

391369
def test_table(self):
392370
from google.cloud.bigquery.table import TableReference
393371

394-
client = _Client(project=self.PROJECT)
395-
dataset = self._make_one(self.DS_ID, client=client)
372+
dataset = self._make_one(self.DS_ID, project=self.PROJECT)
396373
table = dataset.table('table_id')
397374
self.assertIsInstance(table, TableReference)
398375
self.assertEqual(table.table_id, 'table_id')
399376
self.assertEqual(table.dataset_id, self.DS_ID)
400377
self.assertEqual(table.project, self.PROJECT)
401-
402-
403-
class _Client(object):
404-
405-
def __init__(self, project='project'):
406-
self.project = project

0 commit comments

Comments
 (0)