* automxlize metadata
* autoxml: hooks for decode and encode steps * update tests * fix: we can just use '/tmp'. doh!
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE Project SYSTEM "Project-3.8.dtd">
|
||||
<!-- 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, -->
|
||||
<Project version="3.8">
|
||||
<ProgLanguage mixed="0">Python</ProgLanguage>
|
||||
@@ -294,10 +294,6 @@
|
||||
<Dir>tests</Dir>
|
||||
<Name>xmlfiletests.py</Name>
|
||||
</Source>
|
||||
<Source>
|
||||
<Dir>pisi</Dir>
|
||||
<Name>specfilenew.py</Name>
|
||||
</Source>
|
||||
<Source>
|
||||
<Name>TODO</Name>
|
||||
</Source>
|
||||
@@ -360,10 +356,6 @@
|
||||
<Dir>pisi</Dir>
|
||||
<Name>atomicoperations.py</Name>
|
||||
</Source>
|
||||
<Source>
|
||||
<Dir>tests</Dir>
|
||||
<Name>specfilenewtests.py</Name>
|
||||
</Source>
|
||||
<Source>
|
||||
<Dir>tests</Dir>
|
||||
<Name>ootests.py</Name>
|
||||
@@ -417,10 +409,10 @@
|
||||
<VcsOtherData>{'standardLayout': 1}</VcsOtherData>
|
||||
</Vcs>
|
||||
<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="*.ui.h" type="FORMS" />
|
||||
<FiletypeAssociation pattern="*.idl" type="INTERFACES" />
|
||||
<FiletypeAssociation pattern="*.ui" type="FORMS" />
|
||||
<FiletypeAssociation pattern="*.ptl" type="SOURCES" />
|
||||
</FiletypeAssociations>
|
||||
</Project>
|
||||
|
||||
+41
-93
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user