[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