From 53005db7163e04a8137f3baebc8dc09af190dcc6 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Mon, 17 Apr 2006 20:04:17 +0000 Subject: [PATCH] Read min-version and max-version attributes on elements. git-svn-id: file:///home/talex/Backups/sf.net/Subversion/zero-install/trunk/0launch@806 9f8c893c-44ee-0310-b757-c8ca8341c71e --- tests/testmodel.py | 12 +++++++++++- tests/testreader.py | 44 +++++++++++++++++++++++++++++++++++++----- zeroinstall/injector/model.py | 15 ++++++++++++-- zeroinstall/injector/reader.py | 14 +++++++++++++- 4 files changed, 76 insertions(+), 9 deletions(-) diff --git a/tests/testmodel.py b/tests/testmodel.py index 87693d7..d262c1d 100755 --- a/tests/testmodel.py +++ b/tests/testmodel.py @@ -1,9 +1,10 @@ #!/usr/bin/env python2.3 import sys, tempfile, os, shutil import unittest +from StringIO import StringIO sys.path.insert(0, '..') -from zeroinstall.injector import model +from zeroinstall.injector import model, qdom class TestModel(unittest.TestCase): def testLevels(self): @@ -50,6 +51,15 @@ class TestModel(unittest.TestCase): self.assertEquals('(foo)', i.get_name()) repr(i) + def testMetadata(self): + i = model.Interface('http://foo') + e = qdom.parse(StringIO('')) + i.metadata = [e] + assert i.get_metadata('a', 'b') == [e] + assert i.get_metadata('b', 'b') == [] + assert i.get_metadata('a', 'a') == [] + assert e.getAttribute('foo') == 'bar' + def testStabPolicy(self): i = model.Interface('http://foo') self.assertEquals(None, i.stability_policy) diff --git a/tests/testreader.py b/tests/testreader.py index 9b7e9e0..acb979a 100755 --- a/tests/testreader.py +++ b/tests/testreader.py @@ -6,22 +6,26 @@ from logging import getLogger, DEBUG, INFO sys.path.insert(0, '..') -config_home = tempfile.mktemp() -cache_home = tempfile.mktemp() -os.environ['XDG_CONFIG_HOME'] = config_home -os.environ['XDG_CACHE_HOME'] = cache_home - from zeroinstall import NeedDownload from zeroinstall.injector import model, basedir, autopolicy, gpg, iface_cache, namespaces, reader import data reload(basedir) foo_iface_uri = 'http://foo' +bar_iface_uri = 'http://localhost/bar' logger = logging.getLogger() +config_home = tempfile.mktemp() +cache_home = tempfile.mktemp() +os.environ['XDG_CONFIG_HOME'] = config_home +os.environ['XDG_CACHE_HOME'] = cache_home + +assert not os.path.exists(config_home) + class TestReader(unittest.TestCase): def setUp(self): + assert not os.path.exists(config_home) os.mkdir(config_home, 0700) os.mkdir(cache_home, 0700) if os.environ.has_key('DISPLAY'): @@ -69,6 +73,36 @@ class TestReader(unittest.TestCase): except reader.InvalidInterface, ex: assert "1000" in str(ex) + def testRequiresVersion(self): + tmp = tempfile.NamedTemporaryFile(prefix = 'test-') + tmp.write( +""" + + Foo + Foo + Foo + + + + + +""" % (foo_iface_uri, bar_iface_uri, bar_iface_uri)) + tmp.flush() + iface = model.Interface(foo_iface_uri) + reader.update(iface, tmp.name) + impl = iface.implementations['sha1=123'] + assert len(impl.dependencies) == 2 + dep = impl.dependencies[bar_iface_uri] + assert dep.min_version == [2, 3, 4] + assert dep.max_version == [3, 4, 5] + dep2 = impl.dependencies[bar_iface_uri + '2'] + assert dep2.min_version is None + assert dep2.max_version is None + str(dep) + str(dep2) + suite = unittest.makeSuite(TestReader) if __name__ == '__main__': sys.argv.append('-v') diff --git a/zeroinstall/injector/model.py b/zeroinstall/injector/model.py index e446974..2eb1445 100644 --- a/zeroinstall/injector/model.py +++ b/zeroinstall/injector/model.py @@ -106,7 +106,7 @@ class Feed(object): class Dependency(object): """A Dependency indicates that an Implementation requires some additional code to function, specified by another Interface.""" - __slots__ = ['interface', 'restrictions', 'bindings'] + __slots__ = ['interface', 'restrictions', 'bindings', 'min_version', 'max_version'] def __init__(self, interface): assert isinstance(interface, (str, unicode)) @@ -114,9 +114,20 @@ class Dependency(object): self.interface = interface self.restrictions = [] self.bindings = [] + self.min_version = self.max_version = None def __str__(self): - return "" % (self.interface, len(self.bindings), self.bindings) + if self.min_version is not None or self.max_version is not None: + range = ' (' + if self.min_version is not None: + range += '.'.join(map(str, self.min_version)) + ' < ' + range += 'version' + if self.max_version is not None: + range += ' < ' + '.'.join(map(str, self.max_version)) + range += ')' + else: + range = '' + return "" % (self.interface, len(self.bindings), self.bindings, range) class DownloadSource(object): """A DownloadSource provides a way to fetch an implementation.""" diff --git a/zeroinstall/injector/reader.py b/zeroinstall/injector/reader.py index a3a0a70..0c17eb2 100644 --- a/zeroinstall/injector/reader.py +++ b/zeroinstall/injector/reader.py @@ -45,7 +45,16 @@ class Attrs(object): setattr(new, x, value) return new +def parse_version(version_string): + if version_string is None: return None + try: + return map(int, version_string.split('.')) + except ValueError, ex: + raise InvalidInterface("Invalid version format in '%s': %s" % (version_string, ex)) + def process_depends(dependency, item): + dependency.min_version = parse_version(item.getAttribute('min-version')) + dependency.max_version = parse_version(item.getAttribute('max-version')) for e in item.childNodes: if e.uri == XMLNS_IFACE and e.name == 'environment': binding = EnvironmentBinding(e.getAttribute('name'), @@ -218,7 +227,10 @@ def update(interface, source, local = False): for child in item.childNodes: if child.uri != XMLNS_IFACE: continue if child.name == 'requires': - dep = Dependency(child.getAttribute('interface')) + dep_iface = child.getAttribute('interface') + if dep_iface is None: + raise InvalidInterface("Missing 'interface' on ") + dep = Dependency(dep_iface) process_depends(dep, child) depends[dep.interface] = dep -- 2.11.4.GIT