Skip to content

Commit 56f9dbe

Browse files
committed
feat: add support dataset.max_time_travel_hours
1 parent 83bc768 commit 56f9dbe

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

google/cloud/bigquery/dataset.py

+25-1
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,9 @@ def from_api_repr(cls, resource: dict) -> "AccessEntry":
501501
if len(entry) != 0:
502502
raise ValueError("Entry has unexpected keys remaining.", entry)
503503

504-
return cls(role, entity_type, entity_id)
504+
config = cls(role, entity_type, entity_id)
505+
config._properties = copy.deepcopy(resource)
506+
return config
505507

506508

507509
class Dataset(object):
@@ -525,6 +527,7 @@ class Dataset(object):
525527
"friendly_name": "friendlyName",
526528
"default_encryption_configuration": "defaultEncryptionConfiguration",
527529
"storage_billing_model": "storageBillingModel",
530+
"max_time_travel_hours": "maxTimeTravelHours",
528531
"default_rounding_mode": "defaultRoundingMode",
529532
}
530533

@@ -533,6 +536,27 @@ def __init__(self, dataset_ref) -> None:
533536
dataset_ref = DatasetReference.from_string(dataset_ref)
534537
self._properties = {"datasetReference": dataset_ref.to_api_repr(), "labels": {}}
535538

539+
@property
540+
def max_time_travel_hours(self):
541+
"""
542+
Optional[int]: Defines the time travel window in hours. The value can be from 48 to 168 hours (2 to 7 days).
543+
value must in multiple of 24 hours (48, 72, 96, 120, 144, 168)
544+
The default value is 168 hours if this is not set.
545+
"""
546+
return self._properties.get("maxTimeTravelHours")
547+
548+
@max_time_travel_hours.setter
549+
def max_time_travel_hours(self, hours):
550+
if not isinstance(hours, int):
551+
raise ValueError("Pass the int value")
552+
if hours < 2 * 24 or hours > 7 * 24:
553+
raise ValueError(
554+
"Time Travel Window should be from 48 to 168 hours (2 to 7 days)"
555+
)
556+
if hours % 24 != 0:
557+
raise ValueError("Time Travel Window should be multiple of 24")
558+
self._properties["maxTimeTravelHours"] = hours
559+
536560
@property
537561
def default_rounding_mode(self):
538562
"""Union[str, None]: defaultRoundingMode of the dataset as set by the user

tests/system/test_client.py

+7
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ def test_create_dataset(self):
238238
self.assertEqual(dataset.dataset_id, DATASET_ID)
239239
self.assertEqual(dataset.project, Config.CLIENT.project)
240240

241+
def test_create_dataset_max_time_travel_hours(self):
242+
DATASET_ID = _make_dataset_id("create_ci_dataset")
243+
dataset = self.temp_dataset(DATASET_ID, max_time_travel_hours=24 * 2)
244+
self.assertEqual(int(dataset.max_time_travel_hours), 24 * 2)
245+
241246
def test_get_dataset(self):
242247
dataset_id = _make_dataset_id("get_dataset")
243248
client = Config.CLIENT
@@ -2299,6 +2304,8 @@ def temp_dataset(self, dataset_id, *args, **kwargs):
22992304
dataset = Dataset(dataset_ref)
23002305
if kwargs.get("location"):
23012306
dataset.location = kwargs.get("location")
2307+
if kwargs.get("max_time_travel_hours"):
2308+
dataset.max_time_travel_hours = kwargs.get("max_time_travel_hours")
23022309
if kwargs.get("default_rounding_mode"):
23032310
dataset.default_rounding_mode = kwargs.get("default_rounding_mode")
23042311

tests/unit/test_create_dataset.py

+66
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,69 @@ def test_create_dataset_with_default_rounding_mode_if_value_is_in_possible_value
466466
},
467467
timeout=DEFAULT_TIMEOUT,
468468
)
469+
470+
471+
def test_create_dataset_with_max_time_travel_hours(
472+
PROJECT, DS_ID, LOCATION
473+
):
474+
default_rounding_mode = None
475+
path = "/projects/%s/datasets" % PROJECT
476+
resource = {
477+
"datasetReference": {"projectId": PROJECT, "datasetId": DS_ID},
478+
"etag": "etag",
479+
"id": "{}:{}".format(PROJECT, DS_ID),
480+
"location": LOCATION,
481+
}
482+
client = make_client(location=LOCATION)
483+
conn = client._connection = make_connection(resource)
484+
485+
ds_ref = DatasetReference(PROJECT, DS_ID)
486+
before = Dataset(ds_ref)
487+
before.max_time_travel_hours = 24*3
488+
after = client.create_dataset(before)
489+
490+
assert after.dataset_id == DS_ID
491+
assert after.project == PROJECT
492+
assert after.default_rounding_mode is None
493+
494+
conn.api_request.assert_called_once_with(
495+
method="POST",
496+
path=path,
497+
data={
498+
"datasetReference": {"projectId": PROJECT, "datasetId": DS_ID},
499+
"labels": {},
500+
"location": LOCATION,
501+
"maxTimeTravelHours": 24*3,
502+
},
503+
timeout=DEFAULT_TIMEOUT,
504+
)
505+
506+
507+
def test_create_dataset_with_max_time_travel_hours_not_multiple_of_24(
508+
PROJECT, DS_ID, LOCATION
509+
):
510+
ds_ref = DatasetReference(PROJECT, DS_ID)
511+
dataset = Dataset(ds_ref)
512+
with pytest.raises(ValueError) as e:
513+
dataset.max_time_travel_hours = 50
514+
assert str(e.value) == "Time Travel Window should be multiple of 24"
515+
516+
517+
def test_create_dataset_with_max_time_travel_hours_is_less_than_2_days(
518+
PROJECT, DS_ID, LOCATION
519+
):
520+
ds_ref = DatasetReference(PROJECT, DS_ID)
521+
dataset = Dataset(ds_ref)
522+
with pytest.raises(ValueError) as e:
523+
dataset.max_time_travel_hours = 24
524+
assert str(e.value) == "Time Travel Window should be from 48 to 168 hours (2 to 7 days)"
525+
526+
527+
def test_create_dataset_with_max_time_travel_hours_is_greater_than_7_days(
528+
PROJECT, DS_ID, LOCATION
529+
):
530+
ds_ref = DatasetReference(PROJECT, DS_ID)
531+
dataset = Dataset(ds_ref)
532+
with pytest.raises(ValueError) as e:
533+
dataset.max_time_travel_hours = 24
534+
assert str(e.value) == "Time Travel Window should be from 48 to 168 hours (2 to 7 days)"

0 commit comments

Comments
 (0)