summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bvggrabber/api/__init__.py33
-rw-r--r--tests/test_api.py51
2 files changed, 79 insertions, 5 deletions
diff --git a/bvggrabber/api/__init__.py b/bvggrabber/api/__init__.py
index ed5ca3f..8568d00 100644
--- a/bvggrabber/api/__init__.py
+++ b/bvggrabber/api/__init__.py
@@ -3,7 +3,9 @@ import datetime
import json
import re
+from functools import total_ordering
from math import ceil, floor
+
from dateutil.parser import parse
@@ -30,6 +32,7 @@ class QueryApi(object):
"the call() method!")
+@total_ordering
class Departure(object):
def __init__(self, start, end, when, line, since=None):
@@ -54,11 +57,6 @@ class Departure(object):
raise TypeError("when must be a valid datetime, timestamp or "
"string!")
- def __str__(self):
- return "Start: %s, End: %s, when: %s, now: %s, line: %s" % (
- self.start, self.end, hourformat(self.when),
- hourformat(self.now), self.line)
-
@property
def remaining(self):
return compute_remaining(self.now, self.when)
@@ -73,3 +71,28 @@ class Departure(object):
'when_full': fullformat(self.when),
'when_hour': hourformat(self.when),
'remaining': round(self.remaining)})
+
+ def __eq__(self, other):
+ """Two departures are assumed to be equal iff their remaining time
+ and their destination are equal.
+
+ Right now we do **not** considering the start or line, since that would
+ require some kind of geo location in order to define a *total order*.
+ """
+ return ((self.remaining, self.end.lower()) ==
+ (other.remaining, other.end.lower()))
+
+ def __lt__(self, other):
+ """A departure is assumed to be less than another iff its remaining
+ time is less than the remaining time of the other departure.
+
+ Right now we do **not** considering the start, end or line, since that
+ would require some kind of geo location in order to define a *total
+ order*.
+ """
+ return (remaining < other.remaining)
+
+ def __str__(self):
+ return "Start: %s, End: %s, when: %s, now: %s, line: %s" % (
+ self.start, self.end, hourformat(self.when),
+ hourformat(self.now), self.line)
diff --git a/tests/test_api.py b/tests/test_api.py
index 68e797b..778b9b8 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -221,3 +221,54 @@ class TestDeparture(BaseTestDeparture):
str2 = "Start: From My Station, End: To Your Station, when: 03:05, " \
"now: 03:04, line: A Line"
self.assertEqual(str2, str(dep2))
+
+
+class TestDepartureTotalOrder(unittest.TestCase):
+
+ def setUp(self):
+ self.td = datetime.timedelta(minutes=1)
+
+ self.dt_now1 = datetime.datetime(2013, 1, 2, 3, 4, 1)
+ self.dt_now2 = datetime.datetime(2013, 1, 2, 3, 4, 1)
+ self.dt_earlier = datetime.datetime(2013, 1, 2, 3, 4, 1) - self.td
+ self.dt_later = datetime.datetime(2013, 1, 2, 3, 4, 1) + self.td
+
+ def test_equal(self):
+ self.assertEqual(self.dt_now1, self.dt_now2)
+
+ def test_less(self):
+ self.assertLess(self.dt_earlier, self.dt_now1)
+ self.assertLess(self.dt_earlier, self.dt_later)
+ self.assertLess(self.dt_now1, self.dt_later)
+
+ def test_greater(self):
+ self.assertGreater(self.dt_now1, self.dt_earlier)
+ self.assertGreater(self.dt_later, self.dt_earlier)
+ self.assertGreater(self.dt_later, self.dt_now1)
+
+ def test_not_equal(self):
+ self.assertNotEqual(self.dt_now1, self.dt_earlier)
+ self.assertNotEqual(self.dt_now1, self.dt_later)
+ self.assertNotEqual(self.dt_now2, self.dt_earlier)
+ self.assertNotEqual(self.dt_now2, self.dt_later)
+ self.assertNotEqual(self.dt_earlier, self.dt_later)
+
+ def test_sorting_single(self):
+ l = [self.dt_now1, self.dt_later, self.dt_earlier]
+ self.assertEqual([self.dt_earlier, self.dt_now1, self.dt_later],
+ sorted(l))
+ self.assertEqual([self.dt_later, self.dt_now1, self.dt_earlier],
+ sorted(l, reverse=True))
+
+ def test_sorting_multiple(self):
+ l = [self.dt_now1, self.dt_earlier, self.dt_later,
+ self.dt_now2, self.dt_later, self.dt_earlier,
+ self.dt_earlier, self.dt_later, self.dt_now2]
+ self.assertEqual([self.dt_earlier, self.dt_earlier, self.dt_earlier,
+ self.dt_now1, self.dt_now2, self.dt_now2,
+ self.dt_later, self.dt_later, self.dt_later],
+ sorted(l))
+ self.assertEqual([self.dt_later, self.dt_later, self.dt_later,
+ self.dt_now1, self.dt_now2, self.dt_now2,
+ self.dt_earlier, self.dt_earlier, self.dt_earlier],
+ sorted(l, reverse=True))