Skip to content

Commit fff783e

Browse files
anandoleecopybara-github
authored andcommitted
-Add '+' and '-' annotations for Timestamp and Duration in Python
-Add support for "Duration - Duration" and "Duration - timedelata" in Python PiperOrigin-RevId: 747487973
1 parent ad337b0 commit fff783e

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

python/google/protobuf/internal/duration_test.py

+26
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,32 @@ def test_duration_construction(self):
6565
)
6666
self.assertEqual(expected_td, message.optional_duration.ToTimedelta())
6767

68+
def test_duration_sub_annotation(self):
69+
dt = datetime.datetime.now()
70+
dr = duration_pb2.Duration()
71+
td = datetime.timedelta(microseconds=123)
72+
# datetime - Duration
73+
self.assertEqual(dt - dr, dt - duration.to_timedelta(dr))
74+
# timedelta - Duration and Duration - Duration
75+
self.assertEqual(td - dr, duration.from_timedelta(td) - dr)
76+
# Duration - timedelta
77+
self.assertEqual(dr - td, dr - duration.from_timedelta(td))
78+
79+
def test_duration_add_annotation(self):
80+
dt = datetime.datetime.now()
81+
dr = duration_pb2.Duration()
82+
dr2 = duration_pb2.Duration(seconds=100)
83+
# datetime + Duration and Duration + datetime
84+
self.assertEqual(dt + dr, dr + dt)
85+
message = well_known_types_test_pb2.WKTMessage(optional_timestamp=dt)
86+
# Duration + Timestamp
87+
self.assertEqual(dr + message.optional_timestamp, dr + dt)
88+
td = datetime.timedelta(microseconds=123)
89+
# Duration + timedelta and timedelta + Duration
90+
self.assertEqual(dr + td, td + dr)
91+
# Duration + Duration
92+
self.assertEqual(dr + dr2, dr2 + dr)
93+
6894

6995
if __name__ == '__main__':
7096
unittest.main()

python/google/protobuf/internal/timestamp_test.py

+24
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,30 @@ def test_timstamp_construction(self):
6464
optional_timestamp=datetime.datetime.today()
6565
)
6666

67+
def test_timestamp_sub_annotation(self):
68+
t1 = timestamp_pb2.Timestamp()
69+
t2 = timestamp_pb2.Timestamp()
70+
dt = datetime.datetime.now()
71+
td = datetime.timedelta(hours=0)
72+
msg = well_known_types_test_pb2.WKTMessage(optional_duration=td)
73+
# Timestamp - datetime
74+
self.assertEqual(t1 - dt, t2 - dt)
75+
# Timestamp - Timestamp
76+
self.assertEqual(t1 - t2, t2 - t1)
77+
# datetime - Timestamp
78+
self.assertEqual(dt - t1, dt - t2)
79+
# Timestamp - timedelta and Timestamp - Duration
80+
self.assertEqual(t1 - td, t2 - msg.optional_duration)
81+
82+
def test_timestamp_add_annotation(self):
83+
ts = timestamp_pb2.Timestamp()
84+
td = datetime.timedelta(hours=0)
85+
msg = well_known_types_test_pb2.WKTMessage(optional_duration=td)
86+
# Timestamp + timedelta and timedelta + Timestamp
87+
self.assertEqual(ts + td, td + ts)
88+
# Timestamp + Duration and Duration + Timestamp
89+
self.assertEqual(ts + msg.optional_duration, msg.optional_duration + ts)
90+
6791

6892
if __name__ == '__main__':
6993
unittest.main()

python/google/protobuf/internal/well_known_types.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -475,8 +475,11 @@ def __add__(self, value) -> Union[datetime.datetime, datetime.timedelta]:
475475

476476
__radd__ = __add__
477477

478-
def __rsub__(self, dt) -> Union[datetime.datetime, datetime.timedelta]:
479-
return dt - self.ToTimedelta()
478+
def __sub__(self, value) -> datetime.timedelta:
479+
return self.ToTimedelta() - value
480+
481+
def __rsub__(self, value) -> Union[datetime.datetime, datetime.timedelta]:
482+
return value - self.ToTimedelta()
480483

481484

482485
def _CheckDurationValid(seconds, nanos):

0 commit comments

Comments
 (0)