diff --git a/data/debian.csv b/data/debian.csv new file mode 100644 index 0000000..a54af3e --- /dev/null +++ b/data/debian.csv @@ -0,0 +1,13 @@ +version,codename,series,release,eol +1.1,Buzz,buzz,1996-06-17,1997-06-05 +1.2,Rex,rex,1996-12-12,1998-06-05 +1.3,Bo,bo,1997-06-05,1999-03-09 +2.0,Hamm,hamm,1998-07-24,2000-03-09 +2.1,Slink,slink,1999-03-09,2000-10-30 +2.2,Potato,potato,2000-08-15,2003-07-30 +3.0,Woody,woody,2002-07-19,2006-06-30 +3.1,Sarge,sarge,2005-06-06,2008-03-30 +4.0,Etch,etch,2007-04-08,2010-02-14 +5.0,Lenny,lenny,2009-02-14 +6.0,Squeeze,squeeze +,Sid,sid diff --git a/data/ubuntu.csv b/data/ubuntu.csv new file mode 100644 index 0000000..64a88d0 --- /dev/null +++ b/data/ubuntu.csv @@ -0,0 +1,15 @@ +version,codename,series,release,eol,eol-server +4.10,Warty Warthog,warty,2004-10-20,2006-04-30 +5.04,Hoary Hedgehog,hoary,2005-04-08,2006-10-31 +5.10,Breezy Badger,breezy,2005-10-13,2007-04-13 +6.06 LTS,Dapper Drake,dapper,2006-06-01,2009-07-14,2011-06-01 +6.10,Edgy Eft,edgy,2006-10-26,2008-04-25 +7.04,Feisty Fawn,feisty,2007-04-19,2008-10-19 +7.10,Gutsy Gibbon,gutsy,2007-10-18,2009-04-18 +8.04 LTS,Hardy Heron,hardy,2008-04-24,2011-04,2013-04 +8.10,Intrepid Ibex,intrepid,2008-10-30,2010-04-30 +9.04,Jaunty Jackalope,jaunty,2009-04-23,2010-10-23 +9.10,Karmic Koala,karmic,2009-10-29,2011-04 +10.04 LTS,Lucid Lynx,lucid,2010-04-29,2013-04,2015-04 +10.10,Maverick Meerkat,maverick,2010-10-10,2012-04 +11.04,Natty Narwhal,natty,2011-04-28,2012-10 diff --git a/debian-distro-info b/debian-distro-info new file mode 100755 index 0000000..026bf3c --- /dev/null +++ b/debian-distro-info @@ -0,0 +1,98 @@ +#!/usr/bin/python + +# Copyright (C) 2009-2011, Benjamin Drung +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""provides information about Debian's distributions""" + +import optparse +import os +import sys + +from ubuntutools.distro_info import convert_date, DebianDistroInfo + +def main(): + script_name = os.path.basename(sys.argv[0]) + usage = "%s [options]" % (script_name) + epilog = "See %s(1) for more info." % (script_name) + parser = optparse.OptionParser(usage=usage, epilog=epilog) + + parser.add_option("--date", dest="date", default=None, + help="date for calculating the version (default: today).") + parser.add_option("-a", "--all", dest="all", + help="list all known versions", + action="store_true", default=False) + parser.add_option("-d", "--devel", dest="devel", + help="latest development version", + action="store_true", default=False) + parser.add_option("-o", "--old", dest="old", + help="latest old (stable) version", + action="store_true", default=False) + parser.add_option("-s", "--stable", dest="stable", + help="latest stable version", + action="store_true", default=False) + parser.add_option("--supported", dest="supported", + help="list of all supported stable versions", + action="store_true", default=False) + parser.add_option("-t", "--testing", dest="testing", + help="current testing version", + action="store_true", default=False) + parser.add_option("--unsupported", dest="unsupported", + help="list of all unsupported stable versions", + action="store_true", default=False) + + (options, args) = parser.parse_args() + + if len(args) != 0: + parser.error("This script does not take any additional parameters.") + return 1 + + versions = [options.all, options.devel, options.old, options.stable, + options.supported, options.testing, options.unsupported] + if len([x for x in versions if x]) != 1: + parser.error("You have to select exactly one of --all, --devel, --old, " + "--stable, --supported, --testing, --unsupported.") + return 1 + + if options.date is None: + date = None + else: + try: + date = convert_date(options.date) + except ValueError: + parser.error("Option --date needs to be an date in ISO 8601 " + "format.") + return 1 + + if options.all: + for distro in DebianDistroInfo().all: + print distro + elif options.devel: + print DebianDistroInfo().devel(date) + elif options.old: + print DebianDistroInfo().old(date) + elif options.stable: + print DebianDistroInfo().stable(date) + elif options.supported: + for distro in DebianDistroInfo().supported(date): + print distro + elif options.testing: + print DebianDistroInfo().testing(date) + elif options.unsupported: + for distro in DebianDistroInfo().unsupported(date): + print distro + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/debian/changelog b/debian/changelog index 27988ae..8e67921 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ubuntu-dev-tools (0.113) UNRELEASED; urgency=low + + * debian-distro-info, distro-info, ubuntu-distro-info: New tools. + + -- Benjamin Drung Fri, 21 Jan 2011 18:22:23 +0100 + ubuntu-dev-tools (0.112) unstable; urgency=low [ Robert Collins ] diff --git a/debian/control b/debian/control index 470e6c8..cfc9656 100644 --- a/debian/control +++ b/debian/control @@ -72,7 +72,9 @@ Description: useful tools for Ubuntu developers - check-symbols - will compare and give you a diff of the exported symbols of all .so files in a binary package. - dch-repeat - used to repeat a change log into an older release. + - debian-distro-info - provides information about Debian's distributions. - dgetlp - download a source package from the Launchpad library. + - distro-info - provides information about the distributions' releases. - errno - search POSIX error codes by error number, name, or description - get-branches - used to branch/checkout all the bzr branches in a Launchpad team. @@ -114,6 +116,7 @@ Description: useful tools for Ubuntu developers - syncpackage - helper to prepare .changes file to upload synced packages - ubuntu-build - give commands to the Launchpad build daemons from the command line. + - ubuntu-distro-info - provides information about Ubuntu's distributions. - ubuntu-iso - output information of an Ubuntu ISO image. - update-maintainer - script to update maintainer field in ubuntu packages. - what-patch - determines what patch system, if any, a source package is diff --git a/debian/copyright b/debian/copyright index 74a5ac4..48a6d9a 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,6 +1,6 @@ -Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135 -Name: Ubuntu Developer Tools -Maintainer: Ubuntu Developers +Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=165 +Upstream-Name: Ubuntu Developer Tools +Upstream-Contact: Ubuntu Developers Source: https://launchpad.net/ubuntu-dev-tools Files: *, @@ -175,20 +175,27 @@ License: GPL-3+ On Debian systems, the complete text of the GNU General Public License version 3 can be found in the /usr/share/common-licenses/GPL-3 file. -Files: doc/pull-debian-debdiff.1, +Files: data/*, + debian-distro-info, + doc/debian-distro-info.1, + doc/distro-info.1, + doc/pull-debian-debdiff.1, doc/sponsor-patch.1, doc/suspicious-source.1, doc/ubuntu-dev-tools.5, + doc/ubuntu-distro-info.1, doc/update-maintainer.1, doc/wrap-and-sort.1, pull-debian-debdiff, sponsor-patch, suspicious-source, test-data/*, + ubuntu-distro-info, ubuntutools/archive.py, ubuntutools/builder.py, ubuntutools/config.py, ubuntutools/control.py, + ubuntutools/distro_info.py, ubuntutools/logger.py, ubuntutools/question.py, ubuntutools/sponsor_patch/*, @@ -196,7 +203,7 @@ Files: doc/pull-debian-debdiff.1, ubuntutools/update_maintainer.py, update-maintainer, wrap-and-sort -Copyright: 2010, Benjamin Drung +Copyright: 2009-2011, Benjamin Drung 2010, Evan Broder 2008, Siegfried-Angel Gevatter Pujals 2010-2011, Stefano Rivera diff --git a/debian/rules b/debian/rules index da314d6..a3460d5 100755 --- a/debian/rules +++ b/debian/rules @@ -3,6 +3,10 @@ %: dh $@ --with python2 +override_dh_auto_install: + dh_auto_install + ln -s $(shell dpkg-vendor --query Vendor | tr '[:upper:]' '[:lower:]')-distro-info debian/ubuntu-dev-tools/usr/bin/distro-info + ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) override_dh_auto_test: set -e; \ diff --git a/doc/debian-distro-info.1 b/doc/debian-distro-info.1 new file mode 100644 index 0000000..fbf94c4 --- /dev/null +++ b/doc/debian-distro-info.1 @@ -0,0 +1,51 @@ +.\" Copyright (c) 2009-2011, Benjamin Drung +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.TH DEBIAN\-DISTRO\-INFO "1" "January 2011" "ubuntu-dev-tools" +.SH NAME +debian-distro-info \- provides information about Debian's distributions +.SH SYNOPSIS +.B debian-distro-info +[\fIOPTIONS\fR] +.SH OPTIONS +.TP +\fB\-\-date\fR +date for calculating the version (default: today) +.TP +\fB\-h\fR, \fB\-\-help\fR +display help message and exit +.TP +\fB\-a\fR, \fB\-\-all\fR +list all known versions +.TP +\fB\-d\fR, \fB\-\-devel\fR +latest development version +.TP +\fB\-o\fR, \fB\-\-old\fR +latest old (stable) version +.TP +\fB\-s\fR, \fB\-\-stable\fR +latest stable version +.TP +\fB\-\-supported\fR +list of all supported stable versions +.TP +\fB\-t\fR, \fB\-\-testing\fR +latest testing version +.TP +\fB\-\-unsupported\fR +list of all unsupported stable versions +.SH AUTHOR +The script and this manual page was written by +Benjamin Drung . diff --git a/doc/distro-info.1 b/doc/distro-info.1 new file mode 100644 index 0000000..8ca2641 --- /dev/null +++ b/doc/distro-info.1 @@ -0,0 +1,59 @@ +.\" Copyright (c) 2009-2011, Benjamin Drung +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.TH DISTRO-INFO "1" "January 2011" "ubuntu-dev-tools" +.SH NAME +distro-info \- provides information about the distributions' releases +.SH SYNOPSIS +.B distro-info +[\fIOPTIONS\fR] +.SH DESCRIPTION +.B distro-info +is a symlink to the distro-info command of your distribution. +On Debian it links to +.B debian-distro-info +and on Ubuntu it links to +.B ubuntu-distro-info. +All options, which are described in this manual page, are available in all +.B distro-info +commands. All other options, which are not described here, are distribution +specific. +.SH OPTIONS +.TP +\fB\-\-date\fR +date for calculating the version (default: today) +.TP +\fB\-h\fR, \fB\-\-help\fR +display help message and exit +.TP +\fB\-a\fR, \fB\-\-all\fR +list all known versions +.TP +\fB\-d\fR, \fB\-\-devel\fR +latest development version +.TP +\fB\-s\fR, \fB\-\-stable\fR +latest stable version +.TP +\fB\-\-supported\fR +list of all supported stable versions +.TP +\fB\-\-unsupported\fR +list of all unsupported stable versions +.SH SEE ALSO +.BR debian-distro-info (1), +.BR ubuntu-distro-info (1) +.SH AUTHOR +The script and this manual page was written by +Benjamin Drung . diff --git a/doc/ubuntu-distro-info.1 b/doc/ubuntu-distro-info.1 new file mode 100644 index 0000000..db31793 --- /dev/null +++ b/doc/ubuntu-distro-info.1 @@ -0,0 +1,48 @@ +.\" Copyright (c) 2009-2011, Benjamin Drung +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.TH UBUNTU-DISTRO-INFO "1" "January 2011" "ubuntu-dev-tools" +.SH NAME +ubuntu-distro-info \- provides information about Ubuntu's distributions +.SH SYNOPSIS +.B ubuntu-distro-info +[\fIOPTIONS\fR] +.SH OPTIONS +.TP +\fB\-\-date\fR +date for calculating the version (default: today) +.TP +\fB\-h\fR, \fB\-\-help\fR +display help message and exit +.TP +\fB\-a\fR, \fB\-\-all\fR +list all known versions +.TP +\fB\-d\fR, \fB\-\-devel\fR +latest development version +.TP +\fB\-\-lts\fR +latest long term support (LTS) version +.TP +\fB\-s\fR, \fB\-\-stable\fR +latest stable version +.TP +\fB\-\-supported\fR +list of all supported stable versions +.TP +\fB\-\-unsupported\fR +list of all unsupported stable versions +.SH AUTHOR +The script and this manual page was written by +Benjamin Drung . diff --git a/setup.py b/setup.py index 5e1117b..0e64299 100755 --- a/setup.py +++ b/setup.py @@ -18,6 +18,7 @@ scripts = ['404main', 'check-mir', 'check-symbols', 'dch-repeat', + 'debian-distro-info', 'dgetlp', 'edit-patch', 'errno', @@ -50,6 +51,7 @@ scripts = ['404main', 'suspicious-source', 'syncpackage', 'ubuntu-build', + 'ubuntu-distro-info', 'ubuntu-iso', 'update-maintainer', 'what-patch', @@ -68,6 +70,7 @@ if __name__ == '__main__': ], data_files=[('/etc/bash_completion.d', glob.glob("bash_completion/*")), + ('share/ubuntu-dev-tools', glob.glob('data/*')), ('share/doc/ubuntu-dev-tools/examples', glob.glob('examples/*')), ('share/man/man1', glob.glob("doc/*.1")), diff --git a/ubuntu-distro-info b/ubuntu-distro-info new file mode 100755 index 0000000..89d1699 --- /dev/null +++ b/ubuntu-distro-info @@ -0,0 +1,93 @@ +#!/usr/bin/python + +# Copyright (C) 2009-2011, Benjamin Drung +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""provides information about Ubuntu's distributions""" + +import optparse +import os +import sys + +from ubuntutools.distro_info import convert_date, UbuntuDistroInfo + +def main(): + script_name = os.path.basename(sys.argv[0]) + usage = "%s [options]" % (script_name) + epilog = "See %s(1) for more info." % (script_name) + parser = optparse.OptionParser(usage=usage, epilog=epilog) + + parser.add_option("--date", dest="date", default=None, + help="date for calculating the version (default: today).") + parser.add_option("-a", "--all", dest="all", + help="list all known versions", + action="store_true", default=False) + parser.add_option("-d", "--devel", dest="devel", + help="latest development version", + action="store_true", default=False) + parser.add_option("--lts", dest="lts", + help="latest long term support (LTS) version", + action="store_true", default=False) + parser.add_option("-s", "--stable", dest="stable", + help="latest stable version", + action="store_true", default=False) + parser.add_option("--supported", dest="supported", + help="list of all supported stable versions", + action="store_true", default=False) + parser.add_option("--unsupported", dest="unsupported", + help="list of all unsupported stable versions", + action="store_true", default=False) + + (options, args) = parser.parse_args() + + if len(args) != 0: + parser.error("This script does not take any additional parameters.") + return 1 + + versions = [options.all, options.devel, options.lts, options.stable, + options.supported, options.unsupported] + if len([x for x in versions if x]) != 1: + parser.error("You have to select exactly one of --all, --devel, --lts, " + "--stable, --supported, --unsupported.") + return 1 + + if options.date is None: + date = None + else: + try: + date = convert_date(options.date) + except ValueError: + parser.error("Option --date needs to be an date in ISO 8601 " + "format.") + return 1 + + if options.all: + for distro in UbuntuDistroInfo().all: + print distro + elif options.devel: + print UbuntuDistroInfo().devel(date) + elif options.lts: + print UbuntuDistroInfo().lts(date) + elif options.stable: + print UbuntuDistroInfo().stable(date) + elif options.supported: + for distro in UbuntuDistroInfo().supported(date): + print distro + elif options.unsupported: + for distro in UbuntuDistroInfo().unsupported(date): + print distro + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ubuntutools/distro_info.py b/ubuntutools/distro_info.py new file mode 100644 index 0000000..88d2d5f --- /dev/null +++ b/ubuntutools/distro_info.py @@ -0,0 +1,174 @@ +# Copyright (C) 2009-2011, Benjamin Drung +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""provides information about Ubuntu's and Debian's distributions""" + +import csv +import datetime +import os +import sys + +def convert_date(string): + """Convert a date string in ISO 8601 into a datetime object.""" + if string is None or string == "": + date = None + else: + try: + (year, month, day) = [int(x) for x in string.split("-")] + date = datetime.date(year, month, day) + except ValueError: + (year, month) = [int(x) for x in string.split("-")] + if month == 12: + date = datetime.date(year, month, 31) + else: + date = datetime.date(year, month + 1, 1) - datetime.timedelta(1) + return date + +def _get_data_dir(): + """Get the data directory based on the script location.""" + if os.path.dirname(sys.argv[0]) == "/usr/bin": + data_dir = "/usr/share/ubuntu-dev-tools" + else: + data_dir = os.path.join(os.path.dirname(sys.argv[0]), "data") + return data_dir + +class DistroDataOutdated(Exception): + """Distribution data outdated.""" + + def __init__(self): + super(DistroDataOutdated, self).__init__("Distribution data outdated.") + + +class DistroInfo(object): + """Base class for distribution information. + Use DebianDistroInfo or UbuntuDistroInfo instead of using this directly. + """ + + def __init__(self, distro): + filename = os.path.join(_get_data_dir(), distro + ".csv") + csvfile = open(filename) + csv_reader = csv.DictReader(csvfile) + self._rows = [] + for row in csv_reader: + for column in ("release", "eol", "eol-server"): + if column in row: + row[column] = convert_date(row[column]) + self._rows.append(row) + self._date = datetime.date.today() + + @property + def all(self): + """List all known distributions.""" + return [x["series"] for x in self._rows] + + def devel(self, date=None): + """Get latest development distribution based on the given date.""" + if date is None: + date = self._date + distros = [x for x in self._rows + if x["release"] is None or + (date < x["release"] and + (x["eol"] is None or date <= x["eol"]))] + if not distros: + raise DistroDataOutdated() + return distros[-1]["series"] + + def stable(self, date=None): + """Get latest stable distribution based on the given date.""" + if date is None: + date = self._date + distros = [x for x in self._rows + if x["release"] is not None and date >= x["release"] and + (x["eol"] is None or date <= x["eol"])] + if not distros: + raise DistroDataOutdated() + return distros[-1]["series"] + + def supported(self, date=None): + """Get list of all supported distributions based on the given date.""" + raise NotImplementedError() + + def unsupported(self, date=None): + """Get list of all unsupported distributions based on the given date.""" + supported = self.supported(date) + distros = [x["series"] for x in self._rows + if x["series"] not in supported] + return distros + + +class DebianDistroInfo(DistroInfo): + """provides information about Debian's distributions""" + + def __init__(self): + super(DebianDistroInfo, self).__init__("debian") + + def old(self, date=None): + """Get old (stable) Debian distribution based on the given date.""" + if date is None: + date = self._date + distros = [x for x in self._rows + if x["release"] is not None and date >= x["release"]] + if len(distros) < 2: + raise DistroDataOutdated() + return distros[-2]["series"] + + def supported(self, date=None): + """Get list of all supported Debian distributions based on the given + date.""" + if date is None: + date = self._date + distros = [x["series"] for x in self._rows + if x["eol"] is None or date <= x["eol"]] + return distros + + def testing(self, date=None): + """Get latest testing Debian distribution based on the given date.""" + if date is None: + date = self._date + distros = [x for x in self._rows + if x["release"] is None or + (date < x["release"] and + (x["eol"] is None or date <= x["eol"]))] + if len(distros) < 2: + raise DistroDataOutdated() + return distros[-2]["series"] + + +class UbuntuDistroInfo(DistroInfo): + """provides information about Ubuntu's distributions""" + + def __init__(self): + super(UbuntuDistroInfo, self).__init__("ubuntu") + + def lts(self, date=None): + """Get latest long term support (LTS) Ubuntu distribution based on the + given date.""" + if date is None: + date = self._date + distros = [x for x in self._rows if x["version"].find("LTS") >= 0 and + date >= x["release"] and + date <= x["eol"]] + if not distros: + raise DistroDataOutdated() + return distros[-1]["series"] + + def supported(self, date=None): + """Get list of all supported Ubuntu distributions based on the given + date.""" + if date is None: + date = self._date + distros = [x["series"] for x in self._rows + if date <= x["eol"] or + (x["eol-server"] is not None and date <= x["eol-server"])] + return distros diff --git a/ubuntutools/test/test_distro_info.py b/ubuntutools/test/test_distro_info.py new file mode 100644 index 0000000..cb50d2b --- /dev/null +++ b/ubuntutools/test/test_distro_info.py @@ -0,0 +1,108 @@ +# test_distro_info.py - Test suite for ubuntutools.distro_info +# +# Copyright (C) 2011, Benjamin Drung +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Test suite for ubuntutools.distro_info""" + +import datetime + +from ubuntutools.test import unittest +from ubuntutools.distro_info import DebianDistroInfo, UbuntuDistroInfo + +#pylint: disable=R0904 +class DebianDistroInfoTestCase(unittest.TestCase): + """TestCase object for ubuntutools.distro_info.DebianDistroInfo""" + + #pylint: disable=C0103 + def setUp(self): + self._distro_info = DebianDistroInfo() + self._date = datetime.date(2011, 01, 10) + + #pylint: enable=C0103 + def test_all(self): + """Test: List all known Debian distributions.""" + all_distros = set(["buzz", "rex", "bo", "hamm", "slink", "potato", + "woody", "sarge", "etch", "lenny", "squeeze", "sid"]) + self.assertEqual(all_distros - set(self._distro_info.all), set()) + + def test_devel(self): + """Test: Get latest development Debian distribution.""" + self.assertEqual(self._distro_info.devel(self._date), "sid") + + def test_old(self): + """Test: Get old (stable) Debian distribution.""" + self.assertEqual(self._distro_info.old(self._date), "etch") + + def test_stable(self): + """Test: Get latest stable Debian distribution.""" + self.assertEqual(self._distro_info.stable(self._date), "lenny") + + def test_supported(self): + """Test: List all supported Debian distribution.""" + self.assertEqual(self._distro_info.supported(self._date), + ["lenny", "squeeze", "sid"]) + + def test_testing(self): + """Test: Get latest testing Debian distribution.""" + self.assertEqual(self._distro_info.testing(self._date), "squeeze") + + def test_unsupported(self): + """Test: List all unsupported Debian distribution.""" + unsupported = set(["buzz", "rex", "bo", "hamm", "slink", "potato", + "woody", "sarge", "etch"]) + self.assertEqual(unsupported - + set(self._distro_info.unsupported(self._date)), set()) + + +#pylint: disable=R0904 +class UbuntuDistroInfoTestCase(unittest.TestCase): + """TestCase object for ubuntutools.distro_info.UbuntuDistroInfo""" + + #pylint: disable=C0103 + def setUp(self): + self._distro_info = UbuntuDistroInfo() + self._date = datetime.date(2011, 01, 10) + + #pylint: enable=C0103 + def test_all(self): + """Test: List all known Ubuntu distributions.""" + all_distros = set(["warty", "hoary", "breezy", "dapper", "edgy", + "feisty", "gutsy", "hardy", "intrepid", "jaunty", + "karmic", "lucid", "maverick", "natty"]) + self.assertEqual(all_distros - set(self._distro_info.all), set()) + + def test_devel(self): + """Test: Get latest development Ubuntu distribution.""" + self.assertEqual(self._distro_info.devel(self._date), "natty") + + def test_lts(self): + """Test: Get latest long term support (LTS) Ubuntu distribution.""" + self.assertEqual(self._distro_info.lts(self._date), "lucid") + + def test_stable(self): + """Test: Get latest stable Ubuntu distribution.""" + self.assertEqual(self._distro_info.stable(self._date), "maverick") + + def test_supported(self): + """Test: List all supported Ubuntu distribution.""" + supported = ["dapper", "hardy", "karmic", "lucid", "maverick", "natty"] + self.assertEqual(self._distro_info.supported(self._date), supported) + + def test_unsupported(self): + """Test: List all unsupported Ubuntu distribution.""" + unsupported = set(["warty", "hoary", "breezy", "edgy", "feisty", + "gutsy", "intrepid", "jaunty"]) + self.assertEqual(unsupported - + set(self._distro_info.unsupported(self._date)), set())