summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Holtermann <info@markusholtermann.eu>2013-01-25 21:58:58 +0100
committerMarkus Holtermann <info@markusholtermann.eu>2013-01-25 21:58:58 +0100
commit6b3a20f1c5dcddf74491e28e8960f174d0e1c642 (patch)
tree2dfe1c6e897c71351761dfed6e1b7d1575d869c8
parent7f21700fd1f151fbe277f22c46bfbdfd8745bb82 (diff)
downloadbvg-grabber-6b3a20f1c5dcddf74491e28e8960f174d0e1c642.tar.gz
bvg-grabber-6b3a20f1c5dcddf74491e28e8960f174d0e1c642.tar.bz2
bvg-grabber-6b3a20f1c5dcddf74491e28e8960f174d0e1c642.zip
Take care of the seconds
-rw-r--r--bvggrabber/api/__init__.py25
-rw-r--r--tests/test_api.py105
2 files changed, 80 insertions, 50 deletions
diff --git a/bvggrabber/api/__init__.py b/bvggrabber/api/__init__.py
index dbffe6c..81c4980 100644
--- a/bvggrabber/api/__init__.py
+++ b/bvggrabber/api/__init__.py
@@ -1,12 +1,13 @@
# -*- coding: utf-8 -*-
+import datetime
import json
import re
-from datetime import datetime
+from math import ceil, floor
from dateutil.parser import parse
-fullformat = lambda dt: dt.strftime('%Y-%m-%d %H:%M')
+fullformat = lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S')
hourformat = lambda dt: dt.strftime('%H:%M')
@@ -22,19 +23,22 @@ class QueryApi(object):
class Departure(object):
- def __init__(self, start, end, when, line):
+ def __init__(self, start, end, when, line, since=None):
+ if since is None:
+ self.now = datetime.datetime.now()
+ else:
+ self.now = since
self.start = start
self.end = end
self.line = line
- self.now = datetime.now()
if isinstance(when, (int, float)):
# We assume to get a UNIX / POSIX timestamp
- self.when = datetime.fromtimestamp(when)
+ self.when = datetime.datetime.fromtimestamp(when)
elif isinstance(when, str):
self.when = parse(re.sub('[\s*]$', '', when))
#if (self.when - self.now).total_seconds() < -60:
# self.when = self.when + timedelta(days=1)
- elif isinstance(when, datetime):
+ elif isinstance(when, datetime.datetime):
self.when = when
else:
ValueError("when must be a valid datetime, timestamp or string!")
@@ -46,7 +50,14 @@ class Departure(object):
@property
def remaining(self):
- return self.when - self.now
+ td = self.when - self.now
+ seconds = (td / 60).total_seconds()
+ if td < datetime.timedelta(seconds=0):
+ return datetime.timedelta(minutes=floor(seconds))
+ elif td > datetime.timedelta(seconds=0):
+ return datetime.timedelta(minutes=ceil(seconds))
+ else:
+ return datetime.timedelta(seconds=0)
def to_json(self):
return json.dumps({'start': self.start.decode('iso-8859-1'),
diff --git a/tests/test_api.py b/tests/test_api.py
index 8493524..bd8e0ca 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -1,10 +1,9 @@
# -*- coding: utf-8 -*-
-import time
import unittest
-from datetime import datetime, timedelta
+import datetime
-from bvggrabber.api import QueryApi, Departure
+from bvggrabber.api import QueryApi, Departure, fullformat
class TestQueryApi(unittest.TestCase):
@@ -17,73 +16,93 @@ class TestQueryApi(unittest.TestCase):
class TestDeparture(unittest.TestCase):
def setUp(self):
- self.td = timedelta(minutes=10)
+ self.since = datetime.datetime(2013, 1, 2, 3, 4, 0)
+ self.delta1 = datetime.timedelta(seconds=60)
+ self.delta2 = datetime.timedelta(seconds=80)
def test_timestamp_futur(self):
- when = time.time() + 10 * 60
- dep = Departure("from", "to", when, "line")
+ when = self.since + self.delta1
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, 600)
- self.assertGreaterEqual(diff, 590)
+ self.assertEqual(diff, 60)
+
+ when = self.since + self.delta2
+ dep = Departure("from", "to", when, "line", since=self.since)
+ diff = dep.remaining.total_seconds()
+ self.assertEqual(diff, 120)
def test_timestamp_now(self):
- when = time.time()
- dep = Departure("from", "to", when, "line")
+ when = self.since
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, 5)
- self.assertGreaterEqual(diff, -5)
+ self.assertEqual(diff, 0)
def test_timestamp_past(self):
- when = time.time() - 10 * 60
- dep = Departure("from", "to", when, "line")
+ when = self.since - self.delta1
+ dep = Departure("from", "to", when, "line", since=self.since)
+ diff = dep.remaining.total_seconds()
+ self.assertEqual(diff, -60)
+
+ when = self.since - self.delta2
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, -600)
- self.assertGreaterEqual(diff, -610)
+ self.assertEqual(diff, -120)
def test_string_futur(self):
- when = datetime.now() + self.td
- when = when.strftime('%Y-%m-%d %H:%M:%S')
- dep = Departure("from", "to", when, "line")
+ when = fullformat(self.since + self.delta1)
+ dep = Departure("from", "to", when, "line", since=self.since)
+ diff = dep.remaining.total_seconds()
+ self.assertEqual(diff, 60)
+
+ when = fullformat(self.since + self.delta2)
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, 600)
- self.assertGreaterEqual(diff, 590)
+ self.assertEqual(diff, 120)
def test_string_now(self):
- when = datetime.now()
- when = when.strftime('%Y-%m-%d %H:%M:%S')
- dep = Departure("from", "to", when, "line")
+ when = fullformat(self.since)
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, 5)
- self.assertGreaterEqual(diff, -5)
+ self.assertEqual(diff, 0)
def test_string_past(self):
- when = datetime.now() - self.td
- when = when.strftime('%Y-%m-%d %H:%M:%S')
- dep = Departure("from", "to", when, "line")
+ when = fullformat(self.since - self.delta1)
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, -600)
- self.assertGreaterEqual(diff, -610)
+ self.assertEqual(diff, -60)
+
+ when = fullformat(self.since - self.delta2)
+ dep = Departure("from", "to", when, "line", since=self.since)
+ diff = dep.remaining.total_seconds()
+ self.assertEqual(diff, -120)
def test_datetime_futur(self):
- when = datetime.now() + self.td
- dep = Departure("from", "to", when, "line")
+ when = self.since + self.delta1
+ dep = Departure("from", "to", when, "line", since=self.since)
+ diff = dep.remaining.total_seconds()
+ self.assertEqual(diff, 60)
+
+ when = self.since + self.delta2
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, 600)
- self.assertGreaterEqual(diff, 590)
+ self.assertEqual(diff, 120)
def test_datetime_now(self):
- when = datetime.now()
- dep = Departure("from", "to", when, "line")
+ when = self.since
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, 5)
- self.assertGreaterEqual(diff, -5)
+ self.assertEqual(diff, 0)
def test_datetime_past(self):
- when = datetime.now() - self.td
- dep = Departure("from", "to", when, "line")
+ when = self.since - self.delta1
+ dep = Departure("from", "to", when, "line", since=self.since)
+ diff = dep.remaining.total_seconds()
+ self.assertEqual(diff, -60)
+
+ when = self.since - self.delta2
+ dep = Departure("from", "to", when, "line", since=self.since)
diff = dep.remaining.total_seconds()
- self.assertLessEqual(diff, -600)
- self.assertGreaterEqual(diff, -610)
+ self.assertEqual(diff, -120)
def test_error(self):
self.assertRaises(ValueError, Departure, "from", "to", "foo", "line")