[Python-checkins] distutils2: make sure depgraph don't choke on irrational installed versions
tarek.ziade
python-checkins at python.org
Sun Oct 3 12:30:12 CEST 2010
tarek.ziade pushed bdfaec90d665 to distutils2:
http://hg.python.org/distutils2/rev/bdfaec90d665
changeset: 739:bdfaec90d665
tag: tip
user: Tarek Ziade <tarek at ziade.org>
date: Sun Oct 03 12:30:06 2010 +0200
summary: make sure depgraph don't choke on irrational installed versions
files: distutils2/_backport/tests/fake_dists/choxie-2.0.0.9.dist-info/METADATA, distutils2/_backport/tests/fake_dists/nut-funkyversion.egg-info, distutils2/depgraph.py, distutils2/tests/test_depgraph.py
diff --git a/distutils2/_backport/tests/fake_dists/choxie-2.0.0.9.dist-info/METADATA b/distutils2/_backport/tests/fake_dists/choxie-2.0.0.9.dist-info/METADATA
--- a/distutils2/_backport/tests/fake_dists/choxie-2.0.0.9.dist-info/METADATA
+++ b/distutils2/_backport/tests/fake_dists/choxie-2.0.0.9.dist-info/METADATA
@@ -3,6 +3,7 @@
Version: 2.0.0.9
Summary: Chocolate with a kick!
Requires-Dist: towel-stuff (0.1)
+Requires-Dist: nut
Provides-Dist: truffles (1.0)
Obsoletes-Dist: truffles (<=0.8,>=0.5)
Obsoletes-Dist: truffles (<=0.9,>=0.6)
diff --git a/distutils2/_backport/tests/fake_dists/nut-funkyversion.egg-info b/distutils2/_backport/tests/fake_dists/nut-funkyversion.egg-info
new file mode 100644
--- /dev/null
+++ b/distutils2/_backport/tests/fake_dists/nut-funkyversion.egg-info
@@ -0,0 +1,3 @@
+Metadata-Version: 1.2
+Name: nut
+Version: funkyversion
diff --git a/distutils2/depgraph.py b/distutils2/depgraph.py
--- a/distutils2/depgraph.py
+++ b/distutils2/depgraph.py
@@ -4,7 +4,7 @@
import sys
from StringIO import StringIO
from distutils2.errors import DistutilsError
-from distutils2.version import VersionPredicate
+from distutils2.version import VersionPredicate, IrrationalVersionError
__all__ = ['DependencyGraph', 'generate_graph', 'dependent_dists',
'graph_to_dot']
@@ -156,8 +156,17 @@
graph.add_missing(dist, req)
else:
matched = False
- for (version, provider) in provided[name]:
- if predicate.match(version):
+ for version, provider in provided[name]:
+ try:
+ match = predicate.match(version)
+ except IrrationalVersionError:
+ # XXX small compat-mode
+ if version.split(' ' ) == 1:
+ match = True
+ else:
+ match = False
+
+ if match:
graph.add_edge(dist, provider, req)
matched = True
break
diff --git a/distutils2/tests/test_depgraph.py b/distutils2/tests/test_depgraph.py
--- a/distutils2/tests/test_depgraph.py
+++ b/distutils2/tests/test_depgraph.py
@@ -17,6 +17,8 @@
DISTROS_DIST = ('choxie', 'grammar', 'towel-stuff')
DISTROS_EGG = ('bacon', 'banana', 'strawberry', 'cheese')
+ BAD_EGGS = ('nut',)
+
EDGE = re.compile(
r'"(?P<from>.*)" -> "(?P<to>.*)" \[label="(?P<label>.*)"\]'
)
@@ -53,7 +55,7 @@
deps = [(x.name, y) for (x,y) in graph.adjacency_list[choxie]]
self.checkLists([('towel-stuff', 'towel-stuff (0.1)')], deps)
self.assertTrue(choxie in graph.reverse_list[towel])
- self.checkLists(graph.missing[choxie], [])
+ self.checkLists(graph.missing[choxie], ['nut'])
deps = [(x.name, y) for (x,y) in graph.adjacency_list[grammar]]
self.checkLists([], deps)
@@ -77,7 +79,7 @@
deps = [(x.name, y) for (x,y) in graph.adjacency_list[choxie]]
self.checkLists([('towel-stuff', 'towel-stuff (0.1)')], deps)
self.assertTrue(choxie in graph.reverse_list[towel])
- self.checkLists(graph.missing[choxie], [])
+ self.checkLists(graph.missing[choxie], ['nut'])
deps = [(x.name, y) for (x,y) in graph.adjacency_list[grammar]]
self.checkLists([('bacon', 'truffles (>=1.2)')], deps)
@@ -181,6 +183,35 @@
self.checkLists(matches, expected)
+ def test_graph_bad_version_to_dot(self):
+ expected = (
+ ('towel-stuff', 'bacon', 'bacon (<=0.2)'),
+ ('grammar', 'bacon', 'truffles (>=1.2)'),
+ ('choxie', 'towel-stuff', 'towel-stuff (0.1)'),
+ ('banana', 'strawberry', 'strawberry (>=0.5)')
+ )
+
+ dists = []
+ for name in self.DISTROS_DIST + self.DISTROS_EGG + self.BAD_EGGS:
+ dist = pkgutil.get_distribution(name, use_egg_info=True)
+ self.assertNotEqual(dist, None)
+ dists.append(dist)
+
+ graph = depgraph.generate_graph(dists)
+ buf = StringIO.StringIO()
+ depgraph.graph_to_dot(graph, buf)
+ buf.seek(0)
+ matches = []
+ lines = buf.readlines()
+ for line in lines[1:-1]: # skip the first and the last lines
+ if line[-1] == '\n':
+ line = line[:-1]
+ match = self.EDGE.match(line.strip())
+ self.assertTrue(match is not None)
+ matches.append(match.groups())
+
+ self.checkLists(matches, expected)
+
def test_main(self):
tempout = StringIO.StringIO()
old = sys.stdout
--
Repository URL: http://hg.python.org/distutils2
More information about the Python-checkins
mailing list