From f1d6771be35e0ad6b3974d524d76573685d46195 Mon Sep 17 00:00:00 2001
From: jim <jim@62d5b8a3-27da-0310-9561-8e5933582275>
Date: Tue, 24 Oct 2006 23:56:42 +0000
Subject: [PATCH] Bugs Fixed ----------

- We treat setuptools as a dependency of any distribution that
  (declares that it) uses namespace packages, whether it declares
  setuptools as a dependency or not.  This wasn't working for eggs
  intalled by virtue of being dependencies.


git-svn-id: http://svn.zope.org/repos/main/zc.buildout/trunk@70907 62d5b8a3-27da-0310-9561-8e5933582275
---
 CHANGES.txt                     | 12 +++++++++
 setup.py                        |  2 +-
 src/zc/buildout/easy_install.py | 48 ++++++++++++++++++---------------
 src/zc/buildout/tests.py        | 42 ++++++++++++++++++++++++++---
 4 files changed, 79 insertions(+), 25 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 1ab1a39..d14e723 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -20,6 +20,18 @@ priorities include:
 Change History
 **************
 
+1.0.0b12 (2006-10-?)
+=====================
+
+Bugs Fixed
+----------
+
+- We treat setuptools as a dependency of any distribution that
+  (declares that it) uses namespace packages, whether it declares
+  setuptools as a dependency or not.  This wasn't working for eggs
+  intalled by virtue of being dependencies.
+
+
 1.0.0b12 (2006-10-24)
 =====================
 
diff --git a/setup.py b/setup.py
index 3ddeb96..35ed65b 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ def read(*rnames):
 name = "zc.buildout"
 setup(
     name = name,
-    version = "1.0.0b12",
+    version = "1.0.0b13",
     author = "Jim Fulton",
     author_email = "jim@zope.com",
     description = "System for managing development buildouts",
diff --git a/src/zc/buildout/easy_install.py b/src/zc/buildout/easy_install.py
index e139b30..4ce80ac 100644
--- a/src/zc/buildout/easy_install.py
+++ b/src/zc/buildout/easy_install.py
@@ -298,6 +298,27 @@ def _get_dist(requirement, env, ws,
                 links.append(link)
                 
     return dist
+
+def _maybe_add_setuptools(ws, dist, env, dest, links, index, executable):
+    if dist.has_metadata('namespace_packages.txt'):
+        for r in dist.requires():
+            if r.project_name == 'setuptools':
+                break
+        else:
+            # We have a namespace package but no requirement for setuptools
+            if dist.precedence == pkg_resources.DEVELOP_DIST:
+                logger.warn(
+                    "Develop distribution for %s\n"
+                    "uses namespace packages but the distribution "
+                    "does not require setuptools.",
+                    dist)
+            requirement = pkg_resources.Requirement.parse('setuptools')
+            if ws.find(requirement) is None:
+                dist = _get_dist(requirement, env, ws,
+                                 dest, links, index, executable,
+                                 False)
+                ws.add(dist)
+    
     
 def install(specs, dest,
             links=(), index=None,
@@ -330,25 +351,8 @@ def install(specs, dest,
         dist = _get_dist(requirement, env, ws,
                          dest, links, index, executable, always_unzip)
         ws.add(dist)
-        if dist.has_metadata('namespace_packages.txt'):
-            for r in dist.requires():
-                if r.project_name == 'setuptools':
-                    break
-            else:
-                # We have a namespace package but no requirement for setuptools
-                if dist.precedence == pkg_resources.DEVELOP_DIST:
-                    logger.warn(
-                        "Develop distribution for %s\n"
-                        "uses namespace packages but the distribution "
-                        "does not require setuptools.",
-                        dist)
-                requirement = pkg_resources.Requirement.parse('setuptools')
-                if ws.find(requirement) is None:
-                    dist = _get_dist(requirement, env, ws,
-                                     dest, links, index, executable,
-                                     False)
-                    ws.add(dist)
-                    
+        _maybe_add_setuptools(ws, dist,
+                              env, dest, links, index, executable)
 
     # OK, we have the requested distributions and they're in the working
     # set, but they may have unmet requirements.  We'll simply keep
@@ -365,9 +369,11 @@ def install(specs, dest,
             [requirement] = err
             if dest:
                 logger.debug('Getting required %s', requirement)
-            ws.add(_get_dist(requirement, env, ws,
+            dist = _get_dist(requirement, env, ws,
                              dest, links, index, executable, always_unzip)
-                   )
+            ws.add(dist)
+            _maybe_add_setuptools(ws, dist,
+                                  env, dest, links, index, executable)
         else:
             break
             
diff --git a/src/zc/buildout/tests.py b/src/zc/buildout/tests.py
index a0b12e5..670d5a2 100644
--- a/src/zc/buildout/tests.py
+++ b/src/zc/buildout/tests.py
@@ -581,11 +581,9 @@ namespace packages. In this situation, package authors often forget to
 declare setuptools as a dependency. This is a mistake, but,
 unfortunately, a common one that we need to work around.  If an egg
 uses namespace packages and does not include setuptools as a depenency,
-we willll still include setuptools in the working set.  If we see this for
+we will still include setuptools in the working set.  If we see this for
 a devlop egg, we will also generate a warning.
 
-    >>> cd(sample_buildout)
-
     >>> mkdir('foo')
     >>> mkdir('foo', 'src')
     >>> mkdir('foo', 'src', 'stuff')
@@ -664,8 +662,46 @@ We do not get a warning, but we do get setuptools included in the working set:
 
     >>> print handler,
 
+We get the same behavior if the it is a depedency that uses a
+namespace package.
+
+
+    >>> mkdir('bar')
+    >>> write('bar', 'setup.py',
+    ... """
+    ... from setuptools import setup
+    ... setup(name='bar', install_requires = ['foox'])
+    ... """)
+    >>> write('bar', 'README.txt', '')
+    
+    >>> write('buildout.cfg',
+    ... """
+    ... [buildout]
+    ... develop = foo bar
+    ... parts = 
+    ... """)
+
+    >>> print system(join('bin', 'buildout')),
+    buildout: Develop: /sample-buildout/foo/setup.py
+    buildout: Develop: /sample-buildout/bar/setup.py
+
+    >>> [dist.project_name
+    ...  for dist in zc.buildout.easy_install.working_set(
+    ...    ['bar'], sys.executable,
+    ...    [join(sample_buildout, 'eggs'),
+    ...     join(sample_buildout, 'develop-eggs'),
+    ...     ])]
+    ['bar', 'foox', 'setuptools']
+
+    >>> print handler,
+    zc.buildout.easy_install WARNING
+      Develop distribution for foox 0.0.0
+    uses namespace packages but the distribution does not require setuptools.
+
+
     >>> logging.getLogger('zc').propagate = True
     >>> handler.uninstall()
+
     '''
     
 def create_sample_eggs(test, executable=sys.executable):
-- 
2.30.9