././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1609608738.8526447 debdate-0.20210102/0000755000177700017770000000000000000000000013646 5ustar00valhallavalhalla././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1500065165.0 debdate-0.20210102/MANIFEST.in0000644000177700017770000000002600000000000015402 0ustar00valhallavalhallainclude debdate.1.rst ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1609608738.8526447 debdate-0.20210102/PKG-INFO0000644000177700017770000000111100000000000014735 0ustar00valhallavalhallaMetadata-Version: 1.1 Name: debdate Version: 0.20210102 Summary: Convert Gregorian dates to Debian Regnal dates Home-page: http://git.trueelena.org/software/debdate/about/ Author: Elena ``of Valhalla'' Grandi Author-email: valhalla@trueelena.org License: WTFPLv2 Description: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Intended Audience :: End Users/Desktop Classifier: License :: DFSG approved Classifier: Programming Language :: Python :: 3 :: Only Classifier: Topic :: Religion Classifier: Topic :: Utilities ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1500062150.0 debdate-0.20210102/README.rst0000644000177700017770000000171400000000000015340 0ustar00valhallavalhalla========= debdate ========= ------------------------------------------------ Convert Gregorian dates to Debian Regnal dates ------------------------------------------------ ``debdate`` is a fundamental tool for anybody who follows the debian calendar where the years are named after the current stable release. Installation ------------ ``debdate`` depends on python3 and dateutil; no installation is required, as the script can be run directly from the repository. Under Debian and possibly some derivatives, ``debdate`` can read up-to-date release dates from the package distro-info-data. License ------- Copyright (C) 2017 Elena Grandi This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See http://www.wtfpl.net/ for more details. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1609608347.0 debdate-0.20210102/debdate0000755000177700017770000001715400000000000015174 0ustar00valhallavalhalla#!/usr/bin/env python3 # Copyright (C) 2017 Elena Grandi # This program is free software. It comes without any warranty, to the # extent permitted by applicable law. You can redistribute it and/or # modify it under the terms of the Do What The Fuck You Want To Public # License, Version 2, as published by Sam Hocevar. See # http://www.wtfpl.net/ for more details. # Debian release dates can be found in the package distro-info-data, # but an hardcoded fallback is included to run this script where such # package is not available. import argparse import csv import datetime from dateutil import relativedelta, parser import math import unittest RELEASES = [ (datetime.date(2019, 7, 6), 'buster'), (datetime.date(2017, 6, 17), 'stretch'), (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}" FUTURE_MSG = "{today} could be day {dody} of year {yodr} of the {release}" ERR_MSG = "{isodate} is in the Debianless Age" class DebDate: def __init__( self, distro_info_file='/usr/share/distro-info/debian.csv', nameless_age=datetime.date(1993, 8, 1)): self.releases = [] try: with open(distro_info_file) as fp: releases = csv.reader(fp, delimiter=',') for row in releases: if len(row) > 4: try: date = datetime.datetime.strptime( row[4], '%Y-%m-%d' ) except ValueError: pass else: self.releases.append((date.date(), row[1])) except FileNotFoundError: releases = [] self.releases.sort(key=lambda x: x[0], reverse=True) if not self.releases: self.releases = RELEASES.copy() if nameless_age: self.releases.append(( nameless_age, 'Nameless Age' )) def get_release(self, day): data = {} today = datetime.date.today() if day > today: # This is just a fuzzy way to decide whether a date is # likely to be after a future release. data['certain'] = math.exp((today - day).days / 365.25 ) else: data['certain'] = 1 if day == today: data['today'] = 'Today' else: data['today'] = day.isoformat() for r in self.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, ) ) if day.year == epoch.year: data['dody'] = (day - epoch).days data['yodr'] = 1 else: data['dody'] = day.timetuple().tm_yday data['yodr'] = day.year - epoch.year + 1 return data class OutsideTimeError(ValueError): """ Exception raised before the beginning of time """ class TestDebDate(unittest.TestCase): def setUp(self): self.debdates = [ DebDate(), DebDate(distro_info_file='/no/such/file'), ] def testFirstYearRelease(self): for debdate in self.debdates: r = debdate.releases[-2] d = r[0] + relativedelta.relativedelta(days=10) data = debdate.get_release(d) self.assertEqual(data['dody'], 10) self.assertEqual(data['yodr'], 1) self.assertEqual(data['release'], r[1]) self.assertEqual(data['certain'], 1) def testSecondYearRelease(self): for debdate in self.debdates: r = debdate.releases[-7] d = r[0] + relativedelta.relativedelta(years=1) data = debdate.get_release(d) self.assertEqual(data['dody'], 227) self.assertEqual(data['yodr'], 2) self.assertEqual(data['release'], r[1]) self.assertEqual(data['certain'], 1) def testJanuarySecondYearRelease(self): for debdate in self.debdates: r = debdate.releases[-7] d = datetime.date(r[0].year + 1, 1, 1) data = debdate.get_release(d) self.assertEqual(data['dody'], 1) self.assertEqual(data['yodr'], 2) self.assertEqual(data['release'], r[1]) self.assertEqual(data['certain'], 1) def testPastLatestRelease(self): for debdate in self.debdates: r = debdate.releases[0] d = r[0] + relativedelta.relativedelta(years=5) data = 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]) self.assertLess(data['certain'], 1) def testBeforeBeginningOfTime(self): for debdate in self.debdates: r = debdate.releases[-1] d = r[0] + relativedelta.relativedelta(days=-1) with self.assertRaises(OutsideTimeError): debdate.get_release(d) class Command: def setup_parser(self): self.parser = argparse.ArgumentParser( description=''' Convert Gregorian dates to Debian Regnal dates ''' ) self.date_options = self.parser.add_mutually_exclusive_group() self.date_options.add_argument( '-d', '--date', help='A gregorian date', default=None, type=parser.parse, ) self.date_options.add_argument( '-s', '--seconds', help='A date as seconds from the Unix Epoch', default=None, type=int, ) 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 = args.date.date() elif args.seconds: date = datetime.date.fromtimestamp(args.seconds) else: date = datetime.date.today() debdate = DebDate() try: data = debdate.get_release(date) except OutsideTimeError: print(ERR_MSG.format(isodate=date.strftime("%Y-%m-%d"))) else: if data['certain'] > 0.14: print(MSG.format(**data)) else: print(FUTURE_MSG.format(**data)) def main(self): self.setup_parser() args = self.parser.parse_args() args.func(args) if __name__ == '__main__': Command().main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1514907954.0 debdate-0.20210102/debdate.1.rst0000644000177700017770000000260400000000000016131 0ustar00valhallavalhalla========= debdate ========= ------------------------------------------------ Convert Gregorian dates to Debian Regnal dates ------------------------------------------------ :Author: valhalla@trueelena.org :Date: 2017-07-14 :Copyright: 2017 Elena Grandi :License: Released under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. http://www.wtfpl.net/ :Manual section: 1 SYNOPSIS ======== debdate [-h] [-d DATE | -s SECONDS] {test} ... DESCRIPTION =========== ``debdate`` is a fundamental tool for anybody who follows the debian calendar where the years are named after the current stable release. OPTIONS ======= -h, --help show this help message and exit -d DATE, --date DATE A gregorian date -s SECONDS, --seconds SECONDS A date as seconds from the Unix Epoch EXAMPLES ======== ``debdate`` Print the debian regnal date for today. ``debdate -d 2017-06-18`` Print the debian regnal date for the day of the release of Stretch. ``debdate -s 1497736800`` Print the same date as above. ``debdate -d 'Jul 18 2017'`` Print again the same date as above, passed in an illogical format. Any string that is recognised as a valid date by dateutil can be used. SEE ALSO ======== * date(1) * ddate(1) * https://dateutil.readthedocs.io/en/stable/ ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1609608738.8526447 debdate-0.20210102/debdate.egg-info/0000755000177700017770000000000000000000000016730 5ustar00valhallavalhalla././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1609608738.0 debdate-0.20210102/debdate.egg-info/PKG-INFO0000644000177700017770000000111100000000000020017 0ustar00valhallavalhallaMetadata-Version: 1.1 Name: debdate Version: 0.20210102 Summary: Convert Gregorian dates to Debian Regnal dates Home-page: http://git.trueelena.org/software/debdate/about/ Author: Elena ``of Valhalla'' Grandi Author-email: valhalla@trueelena.org License: WTFPLv2 Description: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Intended Audience :: End Users/Desktop Classifier: License :: DFSG approved Classifier: Programming Language :: Python :: 3 :: Only Classifier: Topic :: Religion Classifier: Topic :: Utilities ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1609608738.0 debdate-0.20210102/debdate.egg-info/SOURCES.txt0000644000177700017770000000031700000000000020615 0ustar00valhallavalhallaMANIFEST.in README.rst debdate debdate.1.rst setup.py debdate.egg-info/PKG-INFO debdate.egg-info/SOURCES.txt debdate.egg-info/dependency_links.txt debdate.egg-info/requires.txt debdate.egg-info/top_level.txt././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1609608738.0 debdate-0.20210102/debdate.egg-info/dependency_links.txt0000644000177700017770000000000100000000000022776 0ustar00valhallavalhalla ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1609608738.0 debdate-0.20210102/debdate.egg-info/requires.txt0000644000177700017770000000002000000000000021320 0ustar00valhallavalhallapython-dateutil ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1609608738.0 debdate-0.20210102/debdate.egg-info/top_level.txt0000644000177700017770000000000100000000000021451 0ustar00valhallavalhalla ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1609608738.8526447 debdate-0.20210102/setup.cfg0000644000177700017770000000004600000000000015467 0ustar00valhallavalhalla[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1609608620.0 debdate-0.20210102/setup.py0000644000177700017770000000133600000000000015363 0ustar00valhallavalhalla#!/usr/bin/env python3 from setuptools import setup setup( name='debdate', version='0.20210102', scripts=['debdate'], install_requires=[ 'python-dateutil', ], author="Elena ``of Valhalla'' Grandi", author_email="valhalla@trueelena.org", description='Convert Gregorian dates to Debian Regnal dates', url='http://git.trueelena.org/software/debdate/about/', license='WTFPLv2', classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Console', 'Intended Audience :: End Users/Desktop', 'License :: DFSG approved', 'Programming Language :: Python :: 3 :: Only', 'Topic :: Religion', 'Topic :: Utilities', ] )