From 2443c414af8901e89b1b55e126ab4867c2cf91e4 Mon Sep 17 00:00:00 2001 From: Markus Holtermann Date: Wed, 30 Jan 2013 20:56:55 +0100 Subject: Move hourformat and fullformat to separate module. Add and adjust tests --- bvggrabber/api/__init__.py | 8 +++----- bvggrabber/utils/format.py | 35 ++++++++++++++++++++++++++++++++++- tests/test_api.py | 27 ++++++--------------------- tests/test_format.py | 31 +++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 tests/test_format.py diff --git a/bvggrabber/api/__init__.py b/bvggrabber/api/__init__.py index 8568d00..ba68450 100644 --- a/bvggrabber/api/__init__.py +++ b/bvggrabber/api/__init__.py @@ -4,13 +4,11 @@ import json import re from functools import total_ordering -from math import ceil, floor +from math import floor from dateutil.parser import parse - -fullformat = lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S') -hourformat = lambda dt: dt.strftime('%H:%M') +from bvggrabber.utils.format import hourformat, fullformat def compute_remaining(start, end): @@ -90,7 +88,7 @@ class Departure(object): would require some kind of geo location in order to define a *total order*. """ - return (remaining < other.remaining) + return (self.remaining < other.remaining) def __str__(self): return "Start: %s, End: %s, when: %s, now: %s, line: %s" % ( diff --git a/bvggrabber/utils/format.py b/bvggrabber/utils/format.py index 98bbaee..603124b 100644 --- a/bvggrabber/utils/format.py +++ b/bvggrabber/utils/format.py @@ -1,7 +1,40 @@ #-*- coding: utf-8 -*- -def int2bin(i, length): +def fullformat(dt): + """Formats a datetime object as YYYY-MM-DD HH:MM:SS + + :param datetime dt: The datetime.datetime object to format + :return: A formattet string + :rtype: str + + """ + return dt.strftime('%Y-%m-%d %H:%M:%S') + + +def hourformat(dt): + """Formats a datetime object as HH:MM + + :param datetime dt: The datetime.datetime object to format + :return: A formattet string + :rtype: str + + """ + return dt.strftime('%H:%M') + + +def int2bin(i, length=8): + """Returns the bit representation of the given integer with a minimum + length of ``length``. E.g. ``int2bin(109, 7) == '1101101'`` and + ``int2bin(109, 8) == '01101101'. + + :param int i: The integer to format + :param int length: The minimum length of the output string. The string is + zero-padded on the left. + :return: The bit representation of the given int + :rtype: string + + """ if not isinstance(length, int): raise ValueError("expected int for length") return ('{:0>' + str(length) + 'b}').format(i) diff --git a/tests/test_api.py b/tests/test_api.py index 778b9b8..cf111d7 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,23 +3,8 @@ import datetime import json import unittest -from bvggrabber.api import QueryApi, Departure, fullformat, \ - compute_remaining - -from bvggrabber.utils.format import int2bin - - -class TestUtils(unittest.TestCase): - - def test_int2bin(self): - nums = [(0b1101110, 7, '1101110'), - (0b0010001, 7, '0010001'), - (0b111111, 6, '111111'), - (0b00000001, 8, '00000001'), - (0b00111, 5, '00111'), - (0b1100011, 7, '1100011')] - for b, l, s in nums: - self.assertEqual(int2bin(b, l), s) +from bvggrabber.api import QueryApi, Departure, compute_remaining +from bvggrabber.utils.format import fullformat class TestFunctions(unittest.TestCase): @@ -256,9 +241,9 @@ class TestDepartureTotalOrder(unittest.TestCase): 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)) + sorted(l)) self.assertEqual([self.dt_later, self.dt_now1, self.dt_earlier], - sorted(l, reverse=True)) + sorted(l, reverse=True)) def test_sorting_multiple(self): l = [self.dt_now1, self.dt_earlier, self.dt_later, @@ -267,8 +252,8 @@ class TestDepartureTotalOrder(unittest.TestCase): 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)) + 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)) + sorted(l, reverse=True)) diff --git a/tests/test_format.py b/tests/test_format.py new file mode 100644 index 0000000..9c3e35e --- /dev/null +++ b/tests/test_format.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +import datetime +import unittest + +from bvggrabber.api import fullformat, hourformat +from bvggrabber.utils.format import int2bin + + +class TestFormats(unittest.TestCase): + + def test_int2bin(self): + nums = [(0b1101110, 7, '1101110'), + (0b0010001, 7, '0010001'), + (0b111111, 6, '111111'), + (0b00000001, 8, '00000001'), + (0b00111, 5, '00111'), + (0b00111, 8, '00000111'), + (0b1100011, 7, '1100011')] + for b, l, s in nums: + self.assertEqual(int2bin(b, l), s) + + def test_datetime_formats(self): + f = [(datetime.datetime(2013, 1, 2, 3, 4, 0), + "2013-01-02 03:04:00", "03:04"), + (datetime.datetime(2013, 1, 2), + "2013-01-02 00:00:00", "00:00"), + (datetime.datetime(2013, 1, 2, 3, 4, 30), + "2013-01-02 03:04:30", "03:04")] + for dt, sf, sh in f: + self.assertEqual(fullformat(dt), sf) + self.assertEqual(hourformat(dt), sh) -- cgit v1.2.3