aboutsummaryrefslogtreecommitdiff
path: root/debdate
blob: 45a1bdcba816d0d470cdc92fc299b649c1242faa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env python3

import argparse
import datetime
from dateutil import relativedelta
import unittest

# TODO: these will be read from some other file
RELEASES = [
    (datetime.date(2015, 4, 25), 'jessie'),
    (datetime.date(2013, 5, 4), 'wheezy'),
    (datetime.date(2011, 2, 6), 'squeeze'),
    (datetime.date(2009, 2, 14), 'lenny'),
    (datetime.date(2007, 4, 8), 'etch'),
    (datetime.date(2005, 6, 6), 'sarge'),
    (datetime.date(2002, 7, 19), 'woody'),
    (datetime.date(2000, 8, 15), 'potato'),
    (datetime.date(1999, 3, 9), 'slink'),
    (datetime.date(1998, 6, 24), 'hamm'),
    (datetime.date(1997, 7, 2), 'bo'),
    (datetime.date(1996, 12, 12), 'rex'),
    (datetime.date(1996, 6, 17), 'buzz'),
    ]
MSG = "Today is day {dody} of year {yodr} of the {release}"


class DebDate:
    def get_release(self, day):
        data = {}
        for r in RELEASES:
            epoch = r[0]
            data['release'] = r[1]
            if day > epoch:
                break
        if day < epoch:
            raise OutsideTimeError(
                "{day} happened before the beginning of time".format(
                    day=day,
                    )
                )
        delta = relativedelta.relativedelta(day, epoch)
        data['yodr'] = delta.years + 1
        if delta.years == 0:
            data['dody'] = (day - epoch).days
        else:
            data['dody'] = day.timetuple().tm_yday
        return data


class OutsideTimeError(ValueError):
    """
    Exception raised before the beginning of time
    """


class TestDebDate(unittest.TestCase):
    def setUp(self):
        self.debdate = DebDate()

    def testFirstYearRelease(self):
        r = RELEASES[-1]
        d = r[0] + relativedelta.relativedelta(days=10)
        data = self.debdate.get_release(d)
        self.assertEqual(data['dody'], 10)
        self.assertEqual(data['yodr'], 1)
        self.assertEqual(data['release'], r[1])

    def testSecondYearRelease(self):
        r = RELEASES[-6]
        d = r[0] + relativedelta.relativedelta(years=1)
        data = self.debdate.get_release(d)
        self.assertEqual(data['dody'], 227)
        self.assertEqual(data['yodr'], 2)
        self.assertEqual(data['release'], r[1])

    def testPastLatestRelease(self):
        r = RELEASES[0]
        d = r[0] + relativedelta.relativedelta(years=5)
        data = self.debdate.get_release(d)
        # Day Of The Year will change depending on when is the latest
        # release, so we do not check it
        self.assertEqual(data['yodr'], 6)
        self.assertEqual(data['release'], r[1])

    def testBeforeBeginningOfTime(self):
        r = RELEASES[-1]
        d = r[0] + relativedelta.relativedelta(days=-1)
        with self.assertRaises(OutsideTimeError):
            self.debdate.get_release(d)


class Command:
    def setup_parser(self):
        self.parser = argparse.ArgumentParser(description='Debian Regnal Date')
        self.parser.set_defaults(func=self.print_date)
        self.subparsers = self.parser.add_subparsers()
        self.test_parser = self.subparsers.add_parser(
            'test',
            help='Run unit tests',
            )
        self.test_parser.set_defaults(func=self.run_tests)

    def run_tests(self, args):
        suite = unittest.TestLoader().loadTestsFromTestCase(TestDebDate)
        unittest.TextTestRunner(verbosity=1).run(suite)

    def print_date(self, args):
        today = datetime.date.today()
        debdate = DebDate()
        data = debdate.get_release(today)
        print(MSG.format(**data))

    def main(self):
        self.setup_parser()
        args = self.parser.parse_args()
        args.func(args)


if __name__ == '__main__':
    Command().main()