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
121
122
123
124
125
126
127
128
|
#!/usr/bin/env python3
import argparse
import datetime
from dateutil import relativedelta, parser
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.add_argument(
'-d', '--date',
help='A gregorian date',
default='',
)
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):
if args.date:
date = parser.parse(args.date).date()
else:
date = datetime.date.today()
debdate = DebDate()
data = debdate.get_release(date)
print(MSG.format(**data))
def main(self):
self.setup_parser()
args = self.parser.parse_args()
args.func(args)
if __name__ == '__main__':
Command().main()
|