From 2e99e90e5d6776f21ed015181133ab50d86f0896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Wed, 2 Nov 2005 19:18:51 +0000 Subject: [PATCH] * automxlize metadata * autoxml: hooks for decode and encode steps * update tests * fix: we can just use '/tmp'. doh! --- pisi.e3p | 18 ++--- pisi/metadata.py | 134 ++++++++++++-------------------------- pisi/xmlfile.py | 4 ++ tests/specfileoldtests.py | 2 +- tests/specfiletests.py | 11 +--- 5 files changed, 54 insertions(+), 115 deletions(-) diff --git a/pisi.e3p b/pisi.e3p index f5deb77f..1bf5c07d 100644 --- a/pisi.e3p +++ b/pisi.e3p @@ -1,7 +1,7 @@ - + Python @@ -294,10 +294,6 @@ tests xmlfiletests.py - - pisi - specfilenew.py - TODO @@ -360,10 +356,6 @@ pisi atomicoperations.py - - tests - specfilenewtests.py - tests ootests.py @@ -417,10 +409,10 @@ {'standardLayout': 1} - - - - + + + + diff --git a/pisi/metadata.py b/pisi/metadata.py index 0502879a..b5335a68 100644 --- a/pisi/metadata.py +++ b/pisi/metadata.py @@ -25,89 +25,60 @@ _ = __trans.ugettext import pisi.context as ctx import pisi.specfile as specfile -from pisi.xmlfile import * +import pisi.xmlfile as xmlfile from pisi.util import Checks -class SourceInfo: +class Source: + __metaclass__ = xmlfile.autoxml - def __init__(self, node=None): - if node: - self.name = getNodeText(node, "Name") - self.homepage = getNodeText(node, "HomePage") - self.packager = specfile.PackagerInfo(getNode(node, "Packager")) - else: - self.homepage = None + t_Name = [xmlfile.String, xmlfile.mandatory] + t_Homepage = [xmlfile.String, xmlfile.mandatory] + t_Packager = [specfile.Packager, xmlfile.mandatory] - def elt(self, xml): - node = xml.newNode("Source") - xml.addTextNodeUnder(node, "Name", self.name) - if self.homepage: - xml.addTextNodeUnder(node, "Homepage", self.homepage) - node.appendChild(self.packager.elt(xml)) - return node +# FIXME: make inheritance work with autoxml (specfile.Package) +class Package: + __metaclass__ = xmlfile.autoxml - def has_errors(self): - if not self.name: - return [ _("SourceInfo should have a Name") ] - return [] + t_Name = [ xmlfile.String, xmlfile.mandatory ] + t_Summary = [ xmlfile.String, xmlfile.mandatory ] + t_Description = [ xmlfile.String, xmlfile.mandatory ] + t_IsA = [ [xmlfile.String], xmlfile.optional] + t_PartOf = [xmlfile.String, xmlfile.optional] + t_License = [ [xmlfile.String], xmlfile.optional] + t_Icon = [ xmlfile.String, xmlfile.optional] + t_RuntimeDependencies = [ [specfile.Dependency], xmlfile.optional] + t_Files = [ [specfile.Path], xmlfile.optional] + t_Conflicts = [ [xmlfile.String], xmlfile.optional, "Conflicts/Package"] + t_ProvidesComar = [ [specfile.ComarProvide], xmlfile.optional, "Provides/COMAR"] + #t_RequiresComar = [ [xmlfile.String], xmlfile.mandatory, "Requires/COMAR"] + t_AdditionalFiles = [ [specfile.AdditionalFile], xmlfile.optional] + t_History = [ [specfile.Update], xmlfile.optional] + t_Build = [ xmlfile.Integer, xmlfile.optional] + t_Distribution = [ xmlfile.String, xmlfile.mandatory] + t_DistributionRelease = [ xmlfile.String, xmlfile.mandatory] + t_Architecture = [ xmlfile.String, xmlfile.mandatory] + t_InstalledSize = [ xmlfile.Integer, xmlfile.mandatory] + t_PackageURI = [ xmlfile.Integer, xmlfile.optional] - -class PackageInfo(specfile.PackageInfo): - - def __init__(self, node = None): - if node: - specfile.PackageInfo.__init__(self, node) - self.version = getNodeText(node, "History/Update/Version") - self.release = getNodeAttribute(getNode(node, "History/Update"), "release") - #FIXME: Support Build No under History/Update/Build - build_ = getNodeText(node, "Build") - if build_ != None: - self.build = int(build_) - else: - self.build = None - self.distribution = getNodeText(node, "Distribution") - self.distributionRelease = getNodeText(node, "DistributionRelease") - self.architecture = getNodeText(node, "Architecture") - self.installedSize = int(getNodeText(node, "InstalledSize")) - self.packageURI = getNodeText(node, "PackageURI") - else: - self.packageURI = None - - def elt(self, xml): - node = specfile.PackageInfo.elt(self, xml) - if self.build != None: - xml.addTextNodeUnder(node, "Build", str(self.build)) - xml.addTextNodeUnder(node, "Distribution", self.distribution) - xml.addTextNodeUnder(node, "DistributionRelease", self.distributionRelease) - xml.addTextNodeUnder(node, "Architecture", self.architecture) - xml.addTextNodeUnder(node, "InstalledSize", str(self.installedSize)) - if self.packageURI: - xml.addTextNodeUnder(node, "PackageURI", str(self.packageURI)) - return node - - def has_errors(self): - # FIXME: there should be real error msgs - # and comment the logic here please, it isn't very clear -gurer - err = Checks() - err.join(specfile.PackageInfo.has_errors(self)) - err.has_tag(self.version, 'Package', 'Version') - err.has_tag(self.release, 'Package', 'Release') - err.has_tag(self.distribution, 'Package', 'Distribution') - err.has_tag(self.distributionRelease, 'Package', 'DistributionRelease') - err.has_tag(self.architecture, 'Package', 'Architecture') - err.has_tag(self.installedSize, 'Package', 'InstalledSize') - return err.list + def decode_hook(self, node, errs, where): + self.version = self.history[0].version + self.release = self.history[0].release def __str__(self): - s = specfile.PackageInfo.__str__(self) + s = specfile.Package.__str__(self) return s -class MetaData(XmlFile): +class MetaData(xmlfile.XmlFile): """Package metadata. Metadata is composed of Specfile and various other information. A metadata has two parts, Source and Package.""" - def __init__(self): - XmlFile.__init__(self, "PISI") + __metaclass__ = xmlfile.autoxml + + tag = "PISI" + + t_Source = [ Source, xmlfile.mandatory] + t_Package = [ Package, xmlfile.mandatory] + #t_History = [ [Update], xmlfile.mandatory] def from_spec(self, src, pkg): self.source = SourceInfo() @@ -136,26 +107,3 @@ class MetaData(XmlFile): self.source.release = src.release self.package.version = src.version self.package.release = src.release - - def read(self, filename): - self.readxml(filename) - self.source = SourceInfo(self.getNode("Source")) - self.package = PackageInfo(self.getNode("Package")) - - def write(self, filename): - self.newDOM() - self.addChild(self.source.elt(self)) - self.addChild(self.package.elt(self)) - self.writexml(filename) - - def has_errors(self): - err = Checks() - # FIXME: is this an internal error?? -gurer - if not hasattr(self, 'source'): - err.add(_("Metadata should have source")) - err.join(self.source.has_errors()) - - if not self.package: - err.add(_("Metadata should have a package")) - err.join(self.package.has_errors()) - return err.list diff --git a/pisi/xmlfile.py b/pisi/xmlfile.py index 40f85df6..9f7a6598 100644 --- a/pisi/xmlfile.py +++ b/pisi/xmlfile.py @@ -278,12 +278,16 @@ class autoxml(oo.autosuper, oo.autoprop): def decode(self, node, errs, where = unicode()): for decode_member in self.__class__.decoders: decode_member(self, node, errs, where) + if hasattr(self, 'decode_hook'): + errs.extend(self.decode_hook(node, errs, where)) cls.decode = decode cls.encoders = encoders def encode(self, xml, node, errs): for encode_member in self.__class__.encoders: encode_member(self, xml, node, errs) + if hasattr(self, 'encode_hook'): + errs.extend(self.encode_hook(xml, node, errs)) cls.encode = encode cls.checkers = checkers diff --git a/tests/specfileoldtests.py b/tests/specfileoldtests.py index 9c3788bf..d8befa79 100644 --- a/tests/specfileoldtests.py +++ b/tests/specfileoldtests.py @@ -11,7 +11,7 @@ import unittest import os -from pisi import specfile +from pisi import specfileold as specfile import pisi.context as ctx import pisi.util as util diff --git a/tests/specfiletests.py b/tests/specfiletests.py index 4ed6611f..b78cc5ce 100644 --- a/tests/specfiletests.py +++ b/tests/specfiletests.py @@ -11,16 +11,12 @@ import unittest import os -import pisi.specfilenew as specfile -import pisi.context as ctx +import pisi.specfile as specfile import pisi.util as util -import testcase - -class SpecFileNewTestCase(testcase.TestCase): +class SpecFileNewTestCase(unittest.TestCase): def setUp(self): - testcase.TestCase.setUp(self, database=False) self.spec = specfile.SpecFile() self.spec.read("tests/popt/pspec.xml") @@ -76,8 +72,7 @@ class SpecFileNewTestCase(testcase.TestCase): self.fail("Failed to verify specfile") def testCopy(self): - util.check_dir(ctx.config.tmp_dir()) self.spec.read("tests/popt/pspec.xml") - self.spec.write(os.path.join(ctx.config.tmp_dir(), 'popt-copy.pspec.xml')) + self.spec.write('/tmp/popt-copy.pspec.xml') suite = unittest.makeSuite(SpecFileNewTestCase)