* automxlize metadata

* autoxml: hooks for decode and encode steps
* update tests
* fix: we can just use '/tmp'. doh!
This commit is contained in:
Eray Özkural
2005-11-02 19:18:51 +00:00
parent 2667582625
commit 2e99e90e5d
5 changed files with 54 additions and 115 deletions
+5 -13
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-3.8.dtd"> <!DOCTYPE Project SYSTEM "Project-3.8.dtd">
<!-- Project file for project pisi --> <!-- Project file for project pisi -->
<!-- Saved: 2005-11-02, 19:32:02 --> <!-- Saved: 2005-11-02, 20:32:59 -->
<!-- Copyright (C) 2005 PiSi Development Team, --> <!-- Copyright (C) 2005 PiSi Development Team, -->
<Project version="3.8"> <Project version="3.8">
<ProgLanguage mixed="0">Python</ProgLanguage> <ProgLanguage mixed="0">Python</ProgLanguage>
@@ -294,10 +294,6 @@
<Dir>tests</Dir> <Dir>tests</Dir>
<Name>xmlfiletests.py</Name> <Name>xmlfiletests.py</Name>
</Source> </Source>
<Source>
<Dir>pisi</Dir>
<Name>specfilenew.py</Name>
</Source>
<Source> <Source>
<Name>TODO</Name> <Name>TODO</Name>
</Source> </Source>
@@ -360,10 +356,6 @@
<Dir>pisi</Dir> <Dir>pisi</Dir>
<Name>atomicoperations.py</Name> <Name>atomicoperations.py</Name>
</Source> </Source>
<Source>
<Dir>tests</Dir>
<Name>specfilenewtests.py</Name>
</Source>
<Source> <Source>
<Dir>tests</Dir> <Dir>tests</Dir>
<Name>ootests.py</Name> <Name>ootests.py</Name>
@@ -417,10 +409,10 @@
<VcsOtherData>{'standardLayout': 1}</VcsOtherData> <VcsOtherData>{'standardLayout': 1}</VcsOtherData>
</Vcs> </Vcs>
<FiletypeAssociations> <FiletypeAssociations>
<FiletypeAssociation pattern="*.ui.h" type="FORMS" />
<FiletypeAssociation pattern="*.ui" type="FORMS" />
<FiletypeAssociation pattern="*.idl" type="INTERFACES" />
<FiletypeAssociation pattern="*.ptl" type="SOURCES" />
<FiletypeAssociation pattern="*.py" type="SOURCES" /> <FiletypeAssociation pattern="*.py" type="SOURCES" />
<FiletypeAssociation pattern="*.ui.h" type="FORMS" />
<FiletypeAssociation pattern="*.idl" type="INTERFACES" />
<FiletypeAssociation pattern="*.ui" type="FORMS" />
<FiletypeAssociation pattern="*.ptl" type="SOURCES" />
</FiletypeAssociations> </FiletypeAssociations>
</Project> </Project>
+41 -93
View File
@@ -25,89 +25,60 @@ _ = __trans.ugettext
import pisi.context as ctx import pisi.context as ctx
import pisi.specfile as specfile import pisi.specfile as specfile
from pisi.xmlfile import * import pisi.xmlfile as xmlfile
from pisi.util import Checks from pisi.util import Checks
class SourceInfo: class Source:
__metaclass__ = xmlfile.autoxml
def __init__(self, node=None): t_Name = [xmlfile.String, xmlfile.mandatory]
if node: t_Homepage = [xmlfile.String, xmlfile.mandatory]
self.name = getNodeText(node, "Name") t_Packager = [specfile.Packager, xmlfile.mandatory]
self.homepage = getNodeText(node, "HomePage")
self.packager = specfile.PackagerInfo(getNode(node, "Packager"))
else:
self.homepage = None
def elt(self, xml): # FIXME: make inheritance work with autoxml (specfile.Package)
node = xml.newNode("Source") class Package:
xml.addTextNodeUnder(node, "Name", self.name) __metaclass__ = xmlfile.autoxml
if self.homepage:
xml.addTextNodeUnder(node, "Homepage", self.homepage)
node.appendChild(self.packager.elt(xml))
return node
def has_errors(self): t_Name = [ xmlfile.String, xmlfile.mandatory ]
if not self.name: t_Summary = [ xmlfile.String, xmlfile.mandatory ]
return [ _("SourceInfo should have a Name") ] t_Description = [ xmlfile.String, xmlfile.mandatory ]
return [] 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]
def decode_hook(self, node, errs, where):
class PackageInfo(specfile.PackageInfo): self.version = self.history[0].version
self.release = self.history[0].release
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 __str__(self): def __str__(self):
s = specfile.PackageInfo.__str__(self) s = specfile.Package.__str__(self)
return s return s
class MetaData(XmlFile): class MetaData(xmlfile.XmlFile):
"""Package metadata. Metadata is composed of Specfile and various """Package metadata. Metadata is composed of Specfile and various
other information. A metadata has two parts, Source and Package.""" other information. A metadata has two parts, Source and Package."""
def __init__(self): __metaclass__ = xmlfile.autoxml
XmlFile.__init__(self, "PISI")
tag = "PISI"
t_Source = [ Source, xmlfile.mandatory]
t_Package = [ Package, xmlfile.mandatory]
#t_History = [ [Update], xmlfile.mandatory]
def from_spec(self, src, pkg): def from_spec(self, src, pkg):
self.source = SourceInfo() self.source = SourceInfo()
@@ -136,26 +107,3 @@ class MetaData(XmlFile):
self.source.release = src.release self.source.release = src.release
self.package.version = src.version self.package.version = src.version
self.package.release = src.release 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
+4
View File
@@ -278,12 +278,16 @@ class autoxml(oo.autosuper, oo.autoprop):
def decode(self, node, errs, where = unicode()): def decode(self, node, errs, where = unicode()):
for decode_member in self.__class__.decoders: for decode_member in self.__class__.decoders:
decode_member(self, node, errs, where) decode_member(self, node, errs, where)
if hasattr(self, 'decode_hook'):
errs.extend(self.decode_hook(node, errs, where))
cls.decode = decode cls.decode = decode
cls.encoders = encoders cls.encoders = encoders
def encode(self, xml, node, errs): def encode(self, xml, node, errs):
for encode_member in self.__class__.encoders: for encode_member in self.__class__.encoders:
encode_member(self, xml, node, errs) encode_member(self, xml, node, errs)
if hasattr(self, 'encode_hook'):
errs.extend(self.encode_hook(xml, node, errs))
cls.encode = encode cls.encode = encode
cls.checkers = checkers cls.checkers = checkers
+1 -1
View File
@@ -11,7 +11,7 @@
import unittest import unittest
import os import os
from pisi import specfile from pisi import specfileold as specfile
import pisi.context as ctx import pisi.context as ctx
import pisi.util as util import pisi.util as util
+3 -8
View File
@@ -11,16 +11,12 @@
import unittest import unittest
import os import os
import pisi.specfilenew as specfile import pisi.specfile as specfile
import pisi.context as ctx
import pisi.util as util import pisi.util as util
import testcase class SpecFileNewTestCase(unittest.TestCase):
class SpecFileNewTestCase(testcase.TestCase):
def setUp(self): def setUp(self):
testcase.TestCase.setUp(self, database=False)
self.spec = specfile.SpecFile() self.spec = specfile.SpecFile()
self.spec.read("tests/popt/pspec.xml") self.spec.read("tests/popt/pspec.xml")
@@ -76,8 +72,7 @@ class SpecFileNewTestCase(testcase.TestCase):
self.fail("Failed to verify specfile") self.fail("Failed to verify specfile")
def testCopy(self): def testCopy(self):
util.check_dir(ctx.config.tmp_dir())
self.spec.read("tests/popt/pspec.xml") 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) suite = unittest.makeSuite(SpecFileNewTestCase)