diff options
author | Rob Cakebread <pythonhead@gentoo.org> | 2010-03-22 20:43:36 +0100 |
---|---|---|
committer | Sebastian Pipping <sebastian@pipping.org> | 2010-03-22 20:51:52 +0100 |
commit | 9a8b04a0438f14c67d4b92bfc5870c0748626d6d (patch) | |
tree | 05a509782688bca37d70bc7a23ea5572afb4d0fd | |
parent | Update with content from metagen-0.3.tar.bz2 (diff) | |
download | metagen-9a8b04a0438f14c67d4b92bfc5870c0748626d6d.tar.gz metagen-9a8b04a0438f14c67d4b92bfc5870c0748626d6d.tar.bz2 metagen-9a8b04a0438f14c67d4b92bfc5870c0748626d6d.zip |
Update with content from metagen-0.4.tbz2v0.4
-rw-r--r-- | __init__.py | 0 | ||||
-rw-r--r-- | docs/ChangeLog | 6 | ||||
-rw-r--r-- | docs/README | 118 | ||||
-rw-r--r-- | meta_unittest.py | 52 | ||||
-rw-r--r-- | metadata.xml | 9 | ||||
-rwxr-xr-x | metagen | 159 | ||||
-rwxr-xr-x | metagen.py | 185 | ||||
-rw-r--r-- | metagenerator.py | 63 | ||||
-rwxr-xr-x | test_cli | 28 |
9 files changed, 461 insertions, 159 deletions
diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/__init__.py diff --git a/docs/ChangeLog b/docs/ChangeLog new file mode 100644 index 0000000..87e02b2 --- /dev/null +++ b/docs/ChangeLog @@ -0,0 +1,6 @@ +* metagen-0.4 (04 Jan 2005) + + 04 Jan 04 2005; Rob Cakebread <pythonhead@gentoo.org>: + Major refactoring. Created separate class metagenerator.py + Created rudimentary testing framework. + diff --git a/docs/README b/docs/README new file mode 100644 index 0000000..76d75e3 --- /dev/null +++ b/docs/README @@ -0,0 +1,118 @@ + +metagen is copyright 2004,2005 Rob Cakebread, released under +the terms of the GNU Public License v2 + + +metagen is a command line tool that writes a Gentoo metadata.xml file +in the current working directory. + +The metagen package also has a metagenerator class that can be used +from Python to create metadata.xml files easily: + + from metagenerator import MyMetadata + + metadata = MyMetadata() + metadata.set_herd(["python"]) + print metadata + + metadata = MyMetadata() + metadata.set_herd(["gnome", "python"]) + metadata.set_maintainer(["<pythonhead@gentoo.org>"], + ["Rob Cakebread"], + ["Maintainer description."] + ) + print metadata + + * All methods use lists of strings as arguments except + set_longdescription, which is a string + + * See meta_unittest.py for more detailed examples + + * There isn't much in the way of error checking in metagenerator.py + Most of the sanity checking is done in metagen.py + + + +Command line tool examples: + +metagen -H python + + * One herd + + <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE pkgmetadata SYSTEMhttp://www.gentoo.org/dtd/metadata.dtd"> + <pkgmetadata> + <herd>python</herd> + </pkgmetadata> + +metagen -m + + * This takes the maintainer info from your ECHANGELOG_USER variable + and assigns "no-herd" as the herd. + + <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE pkgmetadata SYSTEMhttp://www.gentoo.org/dtd/metadata.dtd"> + <pkgmetadata> + <herd>no-herd</herd> + <maintainer> + <email>pythonhead@gentoo.org</email> + <name>Rob Cakebread</name> + </maintainer> + </pkgmetadata> + + +metagen -m -d "I maintain this because I'm crazy." + + * Maintainer with description of maintenance + + <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE pkgmetadata SYSTEMhttp://www.gentoo.org/dtd/metadata.dtd"> + <pkgmetadata> + <herd>no-herd</herd> + <maintainer> + <email>pythonhead@gentoo.org</email> + <name>Rob Cakebread</name> + <description>I maintain this because I'm crazy.</description> + </maintainer> + </pkgmetadata> + + +metagen -m -H python -l "This package does X, Y, and Z." + + * Maintainer, herd, long description + + <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE pkgmetadata SYSTEMhttp://www.gentoo.org/dtd/metadata.dtd"> + <pkgmetadata> + <herd>python</herd> + <maintainer> + <email>pythonhead@gentoo.org</email> + <name>Rob Cakebread</name> + </maintainer> + <longdescription>This package does X, Y, and Z.</longdescription> + </pkgmetadata> + +metagen -m -e "jdoe@gentoo.org","tsmith@gentoo.org" -n "Jane Doe","Tom Smith" -H python,gnome -l "This package does X, Y, and Z." + + * Two herds, 3 maintainers, long description + + <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE pkgmetadata SYSTEMhttp://www.gentoo.org/dtd/metadata.dtd"> + <pkgmetadata> + <herd>python</herd> + <herd>gnome</herd> + <maintainer> + <email>pythonhead@gentoo.org</email> + <name>Rob Cakebread</name> + </maintainer> + <maintainer> + <email>jdoe@gentoo.org</email> + <name>Jane Doe</name> + </maintainer> + <maintainer> + <email>tsmith@gentoo.org</email> + <name>Tom Smith</name> + </maintainer> + <longdescription>This package does X, Y, and Z.</longdescription> + </pkgmetadata> + diff --git a/meta_unittest.py b/meta_unittest.py new file mode 100644 index 0000000..06208a6 --- /dev/null +++ b/meta_unittest.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +from metagenerator import MyMetadata + + +def test1(): + """1 herd specified""" + metadata = MyMetadata() + metadata.set_herd(("python")) + return metadata + +def test2(): + """No herd specified, 1 maintainer""" + metadata = MyMetadata() + metadata.set_herd([""]) + metadata.set_maintainer(["<pythonhead@gentoo.org>"], + ["Rob Cakebread"], + ["Maintainer description."] + ) + return metadata + +def test3(): + """1 herd, 1 maintainer""" + metadata = MyMetadata() + metadata.set_herd(["python"]) + metadata.set_maintainer(["<pythonhead@gentoo.org>"], + ["Rob Cakebread"], + ["Maintainer description."] + ) + return metadata + +def test4(): + """2 herds, 1 maintainer""" + metadata = MyMetadata() + metadata.set_herd(["python", "gnome"]) + metadata.set_maintainer(["pythonhead@gentoo.org"], + ["Rob Cakebread"], + ["Maintainer description."] + ) + return metadata + +def test5(): + """2 herds, 2 maintainers, longdesc""" + metadata = MyMetadata() + metadata.set_herd(["python", "gnome"]) + metadata.set_maintainer(["goofy@gentoo.org", "pythonhead@gentoo.org"], + ["Goo Fi", "Rob Cakebread"], + ["Maintainer one.", "Maintainer two"] + ) + metadata.set_longdescription("This packages does X Y and Z.") + return metadata + diff --git a/metadata.xml b/metadata.xml new file mode 100644 index 0000000..178bf7a --- /dev/null +++ b/metadata.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEMhttp://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <herd>no-herd</herd> + <maintainer> + <email>pythonhead@gentoo.org</email> + <name>Rob Cakebread</name> + </maintainer> +</pkgmetadata> diff --git a/metagen b/metagen deleted file mode 100755 index 97769ec..0000000 --- a/metagen +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/python - - -""" - -NAME - metagen - -SYNOPSIS - Adds metadata.xml to current directory - -AUTHOR - Rob Cakebread <pythonhead@gentoo.org> - -USE - metagen --help - -""" - -import string, sys, re, os -from optparse import * -from commands import getstatusoutput - -from output import * -import jaxml - - -def generate_xml(options): - """Returns metadata.xml""" - #TODO: Make a separate class so it can be used by external apps? - doc = jaxml.XML_document("1.0", "UTF-8") - doc._indentstring("\t") - doc._text('<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">') - doc.pkgmetadata() - if not options.herd: - options.herd = "no-herd" - for o in options.herd.split(","): - doc.herd(o) - i = 0 - if options.echangelog: - if not os.environ.has_key("ECHANGELOG_USER"): - print red("!!! Environmental variable ECHANGELOG_USER not set.") - sys.exit(1) - e = os.environ["ECHANGELOG_USER"] - my_email = e[e.find("<") +1:e.find(">")] - my_name = e[0:e.find("<")-1] - if options.email: - options.email = "%s,%s" % (my_email, options.email) - else: - options.email = my_email - if options.name: - options.name = "%s,%s" % (my_name, options.name) - else: - options.name = my_name - if options.email: - emails = options.email.split(",") - for o in emails: - doc._push("maintainer_level") - doc.maintainer().email(o) - if options.name: - names = options.name.split(",") - if len(names) > len(emails): - print red("!!! Number of names is greater than number of emails") - sys.exit(1) - if i <= len(names) -1: - doc.name(names[i]) - if options.desc: - descs = options.desc.split(",") - if len(descs) > len(emails): - print red("!!! Number of descriptions is greater than number of emails") - sys.exit(1) - if i <= len(descs) -1: - doc.description(descs[i]) - doc._pop("maintainer_level") - i += 1 - if options.long: - doc.longdescription(options.long) - - return "%s" % doc - -def ValidateXML(file): - """Test for valid XML""" - #TODO validate against DTD - re_escape_quotes=re.compile('"') - s=re_escape_quotes.sub('\\"', f) - return getstatusoutput("echo \"%s\" | xmllint --valid - 2>&1 > /dev/null" % s)[0] - - -if __name__ == '__main__': - optParser = OptionParser() - optParser.add_option( "-H", action="store", dest="herd", type="string", - help="Name of herd. If not specified, 'no-herd' will be inserted. \ - This would require the -e option.") - - optParser.add_option( "-e", action="store", dest="email", type="string", - help="Maintainer's email address") - - optParser.add_option( "-n", action="store", dest="name", type="string", - help="Maintainer's name") - - optParser.add_option( "-m", action="store_true", dest="echangelog", default=False, - help="Use name and email address from ECHANGELOG_USER environmental variable. \ - This is a shortcut for -e <email> -n <name>") - - optParser.add_option( "-d", action="store", dest="desc", type="string", - help="Description of maintainership") - - optParser.add_option( "-l", action="store", dest="long", type="string", - help="Long description of package.") - - optParser.add_option( "-o", action="store", dest="output", type="string", - help="Specify location of output file.") - - optParser.add_option( "-f", action="store_true", dest="force", default=False, - help="Force overwrite of existing metadata.") - - optParser.add_option( "-v", action="store_true", dest="verbose", default=True, - help="Verbose. Output of file to stdout. (default)") - - optParser.add_option( "-q", action="store_false", dest="verbose", - help="Squelch output of file to stdout.") - - optParser.add_option( "-Q", action="store_true", dest="no_write", default=False, - help="Do not write file to disk.") - - (options, remainingArgs) = optParser.parse_args() - - if len(sys.argv) == 1: - optParser.print_help() - sys.exit(1) - - if options.desc or options.name: - if not options.email: - print red("!!! You haven't specified a maintainer's email address (-e)") - print red("!!! Options -d and -n are only valid when used with -e") - sys.exit(1) - - if not options.herd and not options.email: - print red("!!! You must specify at least a herd (-H) or maintainer's email address (-e)\n") - sys.exit(1) - - f = generate_xml(options) - - if ValidateXML(f): - print red("!!! Error - Invalid XML") - print red("!!! Please report this bug with the options you used and the output:") - print f - sys.exit(1) - - if options.verbose: - print "\n%s" % f - - oloc = "./metadata.xml" - if options.output: - oloc = options.output - if not options.no_write and os.path.exists(oloc): - if not options.force: - print red("!!! File %s exists." % oloc) - print red("!!! Use -f to force overwrite.") - sys.exit(1) - if not options.no_write: - open("%s" % oloc, "w").writelines(f) - diff --git a/metagen.py b/metagen.py new file mode 100755 index 0000000..31fe91d --- /dev/null +++ b/metagen.py @@ -0,0 +1,185 @@ +#!/usr/bin/python + + +""" + +NAME - metagen + +SYNOPSIS - Adds metadata.xml to current directory + +AUTHOR - Rob Cakebread <pythonhead@gentoo.org> + +USE - metagen --help + +EXAMPLES - man metagen + +""" + +import sys +import re +import os +from optparse import OptionParser +from commands import getstatusoutput + +from output import red, blue + +import metagenerator + + +def parse_echangelog_variable(name, email): + """Extract developer name and email from ECHANGELOG_USER variable""" + try: + e = os.environ["ECHANGELOG_USER"] + except KeyError: + print red("!!! Environmental variable ECHANGELOG_USER not set.") + print red("!!! Set ECHANGELOG_USER or use -e and -n") + sys.exit(1) + try: + my_email = e[e.find("<") +1:e.find(">")] + except: + print red("!!! ECHANGELOG_USER not set properly") + sys.exit(1) + try: + my_name = e[0:e.find("<")-1] + except: + print red("!!! ECHANGELOG_USER not set properly") + sys.exit(1) + if email: + email = "%s,%s" % (my_email, email) + else: + email = my_email + if name: + name = "%s,%s" % (my_name, name) + else: + name = my_name + return name, email + +def generate_xml(options): + """Returns metadata.xml text""" + + metadata = metagenerator.MyMetadata() + + if options.herd: + herds = options.herd.split(",") + else: + herds = ["no-herd"] + metadata.set_herd(herds) + + if options.echangelog: + (options.name, options.email) = \ + parse_echangelog_variable(options.name, options.email) + + if options.email: + names, descs = [], [] + if options.name: + names = options.name.split(",") + if options.desc: + descs = options.desc.split(",") + metadata.set_maintainer(options.email.split(","), + names, + descs + ) + + if options.long: + metadata.set_longdescription(options.long) + + return "%s" % metadata + +def validate_xml(my_xml): + """Test for valid XML""" + #TODO validate against DTD + #This just makes sure its valid XML of some sort. + #Probably not necessary since repoma validates against DTD? + re_escape_quotes = re.compile('"') + s = re_escape_quotes.sub('\\"', my_xml) + cmd = "echo \"%s\" | xmllint --valid - 2>&1 > /dev/null" % s + return getstatusoutput(cmd)[0] + + +if __name__ == '__main__': + optParser = OptionParser() + optParser.add_option("-H", action="store", dest="herd", type="string", + help="Name of herd. If not specified, " + + "'no-herd' will be inserted. " + + "This requires either the -e or -m option.") + + optParser.add_option("-e", action="store", dest="email", type="string", + help="Maintainer's email address") + + optParser.add_option("-n", action="store", dest="name", type="string", + help="Maintainer's name") + + optParser.add_option("-m", action="store_true", dest="echangelog", + default=False, + help="Use name and email address from ECHANGELOG_USER "+ + "environmental variable. "+ + "This is a shortcut for -e <email> -n <name>") + + optParser.add_option("-d", action="store", dest="desc", type="string", + help="Description of maintainership") + + optParser.add_option("-l", action="store", dest="long", type="string", + help="Long description of package.") + + optParser.add_option("-o", action="store", dest="output", type="string", + help="Specify location of output file.") + + optParser.add_option("-f", action="store_true", dest="force", default=False, + help="Force overwrite of existing metadata.") + + optParser.add_option("-v", action="store_true", dest="verbose", default=True, + help="Verbose. Output of file to stdout. (default)") + + optParser.add_option("-q", action="store_false", dest="verbose", + help="Squelch output of file to stdout.") + + optParser.add_option("-Q", action="store_true", dest="no_write", + default=False, + help="Do not write file to disk.") + + (options, remainingArgs) = optParser.parse_args() + + if len(sys.argv) == 1: + optParser.print_help() + sys.exit(1) + + if options.desc or options.name: + if not options.email and not options.echangelog: + print red("!!! No maintainer's email address specified.") + print red("!!! Options -d and -n are only valid with -e or -m") + sys.exit(1) + + if options.herd == "no-herd" and not options.email and not options.echangelog: + print red("!!! You must specify a maintainer if you have no-herd.") + sys.exit(1) + + if not options.herd and not options.email and not options.echangelog: + print red("!!! You must specify at least a herd (-H) " + + "or maintainer's email address (-e)\n") + sys.exit(1) + + txt = generate_xml(options) + + error_status = validate_xml(txt) + if error_status < 0: + print red("!!! Error - Invalid XML") + print red("!!! Please report this bug with the options you used and the output:") + print error_status + print txt + sys.exit(1) + + if options.verbose: + print "\n%s" % txt + + out_file = "./metadata.xml" + if options.output: + out_file = options.output + if not options.no_write and os.path.exists(out_file): + if not options.force: + print red("!!! File %s exists." % out_file) + print red("!!! Use -f to force overwrite.") + sys.exit(1) + if not options.no_write: + open("%s" % out_file, "w").writelines(txt) + print blue("%s written") % out_file + diff --git a/metagenerator.py b/metagenerator.py new file mode 100644 index 0000000..842388f --- /dev/null +++ b/metagenerator.py @@ -0,0 +1,63 @@ +#!/usr/bin/python + +import sys + +import jaxml +from output import red + + +class MyMetadata(jaxml.XML_document): + + """Create Gentoo Linux metadata.xml""" + + def __init__(self): + jaxml.XML_document.__init__(self, "1.0", "UTF-8") + self._indentstring("\t") + self._text('<!DOCTYPE pkgmetadata SYSTEM' + + 'http://www.gentoo.org/dtd/metadata.dtd">') + self.pkgmetadata() + + def set_herd(self, opt_herds=["no-herd"]): + """Set herd(s)""" + for my_herd in opt_herds: + self.herd(my_herd) + + def set_maintainer(self, emails, names, descs): + """Set maintainer(s)'s email, name, desc""" + i = 0 + for e in emails: + self._push("maintainer_level") + self.maintainer().email(e) + if names: + if len(names) > len(emails): + print red("!!! Nbr names > nbr emails") + sys.exit(1) + if i <= len(names) -1: + self.name(names[i]) + if descs: + if len(descs) > len(emails): + print red("!!! Nbr descs > nbr emails") + sys.exit(1) + if i <= len(descs) -1: + self.description(descs[i]) + self._pop("maintainer_level") + i += 1 + + def set_longdescription(self, longdesc): + """Set package's long description.""" + self.longdescription(longdesc) + +if __name__ == "__main__": + import meta_unittest + fails = 0 + for func in dir(meta_unittest): + if func[0:4] == "test": + try: + exec "print meta_unittest.%s.__name__ + ':'," % func + exec "print meta_unittest.%s.__doc__" % func + exec "print meta_unittest.%s()" % func + except: + fails += 1 + print "Test %s failed:" % func + print sys.exc_type, sys.exc_value + print "%s tests failed." % fails diff --git a/test_cli b/test_cli new file mode 100755 index 0000000..8995050 --- /dev/null +++ b/test_cli @@ -0,0 +1,28 @@ +#!/bin/bash + +#Should fail if ECHANGELOG_USER not set: +echo 'metagen -m -Q' +./metagen.py -m -Q + +echo 'metagen -e "someguy@gentoo.org" -d "Maint desc" -Q' +./metagen.py -e "someguy@gentoo.org" -d "Maint desc" -Q + +echo 'metagen -e "someguy@gentoo.org" -n "Jon Doe" -d "Maint desc" -Q' +./metagen.py -e "someguy@gentoo.org" -n "Jon Doe" -d "Maint desc" -Q + +#Should fail if ECHANGELOG_USER not set: +echo 'metagen -m -H python -e "foo@bar.com" -d "Foo bar.","Chow fun" -Q' +./metagen.py -m -H python -e "foo@bar.com" -d "Foo bar.","Chow fun" -Q + +#Should fail: +echo 'metagen -H no-herd -Q' +./metagen.py -H no-herd -Q + +#Should fail: +echo 'metagen -l "Long desc" -Q' +./metagen.py -l "Long desc" -Q + +#Should fail: +echo 'metagen -d "Maintainer desc" -Q' +./metagen.py -d "Maintainer desc" -Q + |