kopia lustrzana https://github.com/glidernet/python-ogn-client
Merge pull request #2 from glidernet/fix/createTimestamp
parser: Accept delayed packets and reconstruct timestamppull/3/head
commit
ea0a01508d
|
@ -23,13 +23,22 @@ def dmsToDeg(dms):
|
|||
def createTimestamp(hhmmss, reference):
|
||||
packet_time = datetime.strptime(hhmmss, '%H%M%S').time()
|
||||
timestamp = datetime.combine(reference, packet_time)
|
||||
delta = timestamp - reference
|
||||
|
||||
if reference.hour == 23 and timestamp.hour == 0:
|
||||
timestamp = timestamp + timedelta(days=1)
|
||||
elif reference.hour == 0 and timestamp.hour == 23:
|
||||
timestamp = timestamp - timedelta(days=1)
|
||||
# This function reconstructs the packet date from the timestamp and a reference time.
|
||||
# delta vs. packet date:
|
||||
# -24h -12h 0 +12h +24h
|
||||
# |-------------------------|---------------------|------------------------|----------------------|
|
||||
# [-] <-- tomorrow [---------today---------] [-------yesterday------]
|
||||
|
||||
if reference - timestamp > timedelta(hours=1):
|
||||
if timedelta(hours=-12) <= delta <= timedelta(minutes=30):
|
||||
# Packet less than 12h from the past or 30min from the future
|
||||
return timestamp
|
||||
elif delta < timedelta(hours=-23, minutes=-30):
|
||||
# Packet from next day, less than 30min from the future
|
||||
return datetime.combine(reference + timedelta(hours=+12), packet_time)
|
||||
elif timedelta(hours=12) < delta:
|
||||
# Packet from previous day, less than 12h from the past
|
||||
return datetime.combine(reference + timedelta(hours=-12), packet_time)
|
||||
else:
|
||||
raise AmbigousTimeError(reference, packet_time)
|
||||
|
||||
return timestamp
|
||||
|
|
|
@ -10,17 +10,22 @@ class TestStringMethods(unittest.TestCase):
|
|||
dms = 50.4830
|
||||
self.assertAlmostEqual(dmsToDeg(dms), 50.805, 5)
|
||||
|
||||
def test_createTimestamp_seconds_behind(self):
|
||||
timestamp = createTimestamp('235959', reference=datetime(2015, 10, 16, 0, 0, 1))
|
||||
self.assertEqual(timestamp, datetime(2015, 10, 15, 23, 59, 59))
|
||||
def test_createTimestamp(self):
|
||||
test_data = [
|
||||
('000001', datetime(2015, 1, 10, 0, 0, 1), datetime(2015, 1, 10, 0, 0, 1)), # packet from current day (on the tick)
|
||||
('235959', datetime(2015, 1, 10, 0, 0, 1), datetime(2015, 1, 9, 23, 59, 59)), # packet from previous day (2 seconds old)
|
||||
('110000', datetime(2015, 1, 10, 0, 0, 1), None), # packet 11 hours from future or 13 hours old
|
||||
('123500', datetime(2015, 1, 10, 23, 50, 0), datetime(2015, 1, 10, 12, 35, 0)), # packet from current day (11 hours old)
|
||||
('000001', datetime(2015, 1, 10, 23, 50, 0), datetime(2015, 1, 11, 0, 0, 1)) # packet from next day (11 minutes from future)
|
||||
]
|
||||
|
||||
def test_createTimestamp_seconds_before(self):
|
||||
timestamp = createTimestamp('000001', reference=datetime(2015, 10, 15, 23, 59, 59))
|
||||
self.assertEqual(timestamp, datetime(2015, 10, 16, 0, 0, 1))
|
||||
|
||||
def test_createTimestamp_big_difference(self):
|
||||
with self.assertRaises(AmbigousTimeError):
|
||||
createTimestamp('123456', reference=datetime(2015, 10, 15, 23, 59, 59))
|
||||
for test in test_data:
|
||||
if test[2]:
|
||||
timestamp = createTimestamp(test[0], reference=test[1])
|
||||
self.assertEqual(timestamp, test[2])
|
||||
else:
|
||||
with self.assertRaises(AmbigousTimeError):
|
||||
createTimestamp(test[0], reference=test[1])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
Ładowanie…
Reference in New Issue