[Checkins] SVN: zc.buildout/trunk/src/zc/buildout/tests.py Improved error reporting by showing which packages require other

Jim Fulton jim at zope.com
Sun May 6 16:22:27 EDT 2007


Log message for revision 75588:
  Improved error reporting by showing which packages require other
  packages that can't be found or that cause version conflicts.
  
  Fixed a renormalizer to prevent spurious test failures,
  

Changed:
  U   zc.buildout/trunk/src/zc/buildout/tests.py

-=-
Modified: zc.buildout/trunk/src/zc/buildout/tests.py
===================================================================
--- zc.buildout/trunk/src/zc/buildout/tests.py	2007-05-06 20:22:23 UTC (rev 75587)
+++ zc.buildout/trunk/src/zc/buildout/tests.py	2007-05-06 20:22:27 UTC (rev 75588)
@@ -232,6 +232,135 @@
     Error: Missing option: x:recipe
 
 """
+
+make_dist_that_requires_setup_py_template = """
+from setuptools import setup
+setup(name=%r, version=%r,
+      install_requires=%r,
+      )
+"""
+
+def make_dist_that_requires(dest, name, requires=[], version=1, egg=''):
+    os.mkdir(os.path.join(dest, name))
+    open(os.path.join(dest, name, 'setup.py'), 'w').write(
+        make_dist_that_requires_setup_py_template
+        % (name, version, requires)
+        )
+
+def show_who_requires_when_there_is_a_conflict():
+    """
+    It's a pain when we require eggs that have requirements that are
+    incompatible. We want the error we get to tell us what is missing.
+
+    Let's make a few develop distros, some of which have incompatible
+    requirements.
+
+    >>> make_dist_that_requires(sample_buildout, 'sampley',
+    ...                         ['demoneeded ==1.0']) 
+    >>> make_dist_that_requires(sample_buildout, 'samplez',
+    ...                         ['demoneeded ==1.1']) 
+
+    Now, let's create a buildout that requires y and z:
+
+    >>> write('buildout.cfg',
+    ... '''
+    ... [buildout]
+    ... parts = eggs
+    ... develop = sampley samplez
+    ... find-links = %(link_server)s
+    ...
+    ... [eggs]
+    ... recipe = zc.recipe.egg
+    ... eggs = sampley
+    ...        samplez
+    ... ''' % globals())
+
+    >>> print system(buildout),
+    buildout: Develop: /sample-buildout/sampley
+    buildout: Develop: /sample-buildout/samplez
+    buildout: Installing eggs
+    zc.buildout.easy_install: Getting new distribution for demoneeded==1.1
+    zc.buildout.easy_install: Got demoneeded 1.1
+    While:
+      Installing eggs
+    Error: There is a version conflict.
+    We already have: demoneeded 1.1
+    but sampley 1 requires demoneeded==1.0.
+
+    Here, we see that sampley required an older version of demoneeded.
+    What if we hadn't required sampley ourselves:
+
+    >>> make_dist_that_requires(sample_buildout, 'samplea', ['sampleb']) 
+    >>> make_dist_that_requires(sample_buildout, 'sampleb',
+    ...                         ['sampley', 'samplea'])
+    >>> write('buildout.cfg',
+    ... '''
+    ... [buildout]
+    ... parts = eggs
+    ... develop = sampley samplez samplea sampleb
+    ... find-links = %(link_server)s
+    ...
+    ... [eggs]
+    ... recipe = zc.recipe.egg
+    ... eggs = samplea
+    ...        samplez
+    ... ''' % globals())
+
+    >>> print system(buildout),
+    buildout: Develop: /sample-buildout/sampley
+    buildout: Develop: /sample-buildout/samplez
+    buildout: Develop: /sample-buildout/samplea
+    buildout: Develop: /sample-buildout/sampleb
+    buildout: Installing eggs
+    While:
+      Installing eggs
+    Error: There is a version conflict.
+    We already have: demoneeded 1.1
+    but sampley 1 requires demoneeded==1.0.
+    sampley 1 is required by sampleb 1.
+    sampleb 1 is required by samplea 1.
+    """
+
+def show_who_requires_missing_distributions():
+    """
+
+    When working with a lot of eggs, which require eggs recursively,
+    it can be hard to tell why we're requireing things we can't find.
+    Fortunately, buildout will tell us who's asking for something that
+    we can't find.
+
+    >>> make_dist_that_requires(sample_buildout, 'sampley', ['demoneeded']) 
+    >>> make_dist_that_requires(sample_buildout, 'samplea', ['sampleb']) 
+    >>> make_dist_that_requires(sample_buildout, 'sampleb',
+    ...                         ['sampley', 'samplea'])
+    >>> write('buildout.cfg',
+    ... '''
+    ... [buildout]
+    ... parts = eggs
+    ... develop = sampley samplea sampleb
+    ...
+    ... [eggs]
+    ... recipe = zc.recipe.egg
+    ... eggs = samplea
+    ... ''')
+
+    >>> print system(buildout),
+    buildout: Develop: /sample-buildout/sampley
+    buildout: Develop: /sample-buildout/samplea
+    buildout: Develop: /sample-buildout/sampleb
+    buildout: Installing eggs
+    Couldn't find index page for 'demoneeded' (maybe misspelled?)
+    zc.buildout.easy_install: Getting new distribution for demoneeded
+    While:
+      Installing eggs
+      Getting distribution for demoneeded
+    Error: Couldn't find a distribution for demoneeded.
+    demoneeded is required by sampley 1.
+    sampley 1 is required by sampleb 1.
+    sampleb 1 is required by samplea 1.
+
+    """
+    
  
 def test_comparing_saved_options_with_funny_characters():
     """
@@ -1963,6 +2092,8 @@
                 'setuptools.egg'),
                (re.compile('zc.buildout-\S+-'),
                 'zc.buildout.egg'),
+               (re.compile('File "\S+one.py"'),
+                'File "one.py"'),
                ]),
             ),
         ))



More information about the Checkins mailing list