Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions kaggle_object_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,36 @@ def test_quota_response_deserializes_whole_second_durations(self):
datetime.timedelta(seconds=151),
)

def test_days_duration_serialization(self):
# timedelta of 30 hours (days=1, seconds=21600) should serialize to 108000s, not 21600s
d = datetime.timedelta(seconds=108000)
self.assertEqual(TimeDeltaSerializer._to_dict_value(d), "108000s")

def test_fractional_second_serialization(self):
d = datetime.timedelta(seconds=11247, microseconds=735000)
self.assertEqual(TimeDeltaSerializer._to_dict_value(d), "11247.735s")

def test_subsecond_padding_serialization(self):
d_ms = datetime.timedelta(microseconds=5000)
self.assertEqual(TimeDeltaSerializer._to_dict_value(d_ms), "0.005s")
d_us = datetime.timedelta(microseconds=7)
self.assertEqual(TimeDeltaSerializer._to_dict_value(d_us), "0.000007s")

def test_round_trip_serialization(self):
cases = [
datetime.timedelta(0),
datetime.timedelta(seconds=151),
datetime.timedelta(seconds=108000),
datetime.timedelta(seconds=11247, microseconds=735000),
datetime.timedelta(microseconds=5000),
datetime.timedelta(microseconds=7),
datetime.timedelta(days=3, seconds=14, microseconds=123456),
]
for d in cases:
serialized = TimeDeltaSerializer._to_dict_value(d)
deserialized = TimeDeltaSerializer._from_dict_value(serialized)
self.assertEqual(d, deserialized)


if __name__ == "__main__":
unittest.main()
16 changes: 9 additions & 7 deletions kagglesdk/kaggle_object.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,13 @@ def __init__(self):

@staticmethod
def _to_dict_value(delta):
seconds = delta.seconds
nanos_str = TimeDeltaSerializer._nanos_to_str(delta.microseconds * 1000)
total_us = (delta.days * 86400 + delta.seconds) * 1_000_000 + delta.microseconds
sign = "-" if total_us < 0 else ""
seconds, micros = divmod(abs(total_us), 1_000_000)
nanos_str = TimeDeltaSerializer._nanos_to_str(micros * 1000)
if nanos_str is None:
return "{}s".format(seconds)
return "{}.{}s".format(seconds, nanos_str)
return "{}{}s".format(sign, seconds)
return "{}{}.{}s".format(sign, seconds, nanos_str)

@staticmethod
def _nanos_to_str(nanos):
Expand All @@ -178,11 +180,11 @@ def _nanos_to_str(nanos):
if nanos < 0:
nanos *= -1
if nanos % 1000000 == 0:
return "{}".format(nanos / 1000000)
return "{:03d}".format(nanos // 1000000)
elif nanos % 1000 == 0:
return "{}".format(nanos / 1000)
return "{:06d}".format(nanos // 1000)
else:
return "{}".format(nanos)
return "{:09d}".format(nanos)

@staticmethod
def _from_dict_value(value):
Expand Down
Loading