diff --git a/kaggle_object_tests.py b/kaggle_object_tests.py index 40eacb3..a1e51ff 100644 --- a/kaggle_object_tests.py +++ b/kaggle_object_tests.py @@ -25,6 +25,8 @@ AccessBehavior, GetKernelListDetailsRequest, ) +from kagglesdk.kaggle_object import TimeDeltaSerializer +from kagglesdk.kernels.types.kernels_api_service import ApiGetAcceleratorQuotaStatisticsResponse Selector = ListCompetitionsRequest.Selector @@ -570,5 +572,31 @@ def test_oneof(self): self.assertEqual("90%", operation.progress) +class TimeDeltaSerializerTests(unittest.TestCase): + + def test_whole_second_duration(self): + self.assertEqual(TimeDeltaSerializer._from_dict_value("0s"), datetime.timedelta(0)) + self.assertEqual( + TimeDeltaSerializer._from_dict_value("151s"), + datetime.timedelta(seconds=151), + ) + + def test_fractional_second_duration(self): + self.assertEqual( + TimeDeltaSerializer._from_dict_value("151.500s"), + datetime.timedelta(seconds=151, microseconds=500000), + ) + + def test_quota_response_deserializes_whole_second_durations(self): + response = ApiGetAcceleratorQuotaStatisticsResponse.from_json( + '{"gpuQuota":{"timeUsed":"0s","totalTimeAllowed":"151s"}}' + ) + self.assertEqual(response.gpu_quota.time_used, datetime.timedelta(0)) + self.assertEqual( + response.gpu_quota.total_time_allowed, + datetime.timedelta(seconds=151), + ) + + if __name__ == "__main__": unittest.main() diff --git a/kagglesdk/kaggle_object.py b/kagglesdk/kaggle_object.py index 6f050e8..299276b 100644 --- a/kagglesdk/kaggle_object.py +++ b/kagglesdk/kaggle_object.py @@ -179,7 +179,10 @@ def _nanos_to_str(nanos): @staticmethod def _from_dict_value(value): - (seconds, nanosRaw) = value.rstrip("s").split(".") + raw_value = value.rstrip("s") + if "." not in raw_value: + return timedelta(seconds=int(raw_value)) + seconds, nanosRaw = raw_value.split(".", 1) nanos = int(nanosRaw) * TimeDeltaSerializer.SUBSECOND_SCALING_FACTORS[len(nanosRaw)] return timedelta(seconds=int(seconds), microseconds=int(int(nanos) / 1000))