[Checkins] SVN: z3c.autoinclude/trunk/src/z3c/autoinclude/ allow plugin points for virtual namespace packages like 'plone' that only exist via nested 'plone.foo', 'plone.app.bar' etc

Ethan Jucovy ejucovy at openplans.org
Thu Jan 15 18:05:56 EST 2009


Log message for revision 94769:
  allow plugin points for virtual namespace packages like 'plone' that only exist via nested 'plone.foo', 'plone.app.bar' etc

Changed:
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/__init__.py
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/ppa/
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/ppa/__init__.py
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/ppa/bar/
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/ppa/bar/__init__.py
  A   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/setup.py
  U   z3c.autoinclude/trunk/src/z3c/autoinclude/tests/tests.py
  U   z3c.autoinclude/trunk/src/z3c/autoinclude/utils.py
  U   z3c.autoinclude/trunk/src/z3c/autoinclude/utils.txt

-=-
Added: z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/__init__.py
===================================================================
--- z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/__init__.py	                        (rev 0)
+++ z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/__init__.py	2009-01-15 23:05:56 UTC (rev 94769)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Added: z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/ppa/__init__.py
===================================================================
--- z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/ppa/__init__.py	                        (rev 0)
+++ z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/enolp/ppa/__init__.py	2009-01-15 23:05:56 UTC (rev 94769)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Added: z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/setup.py
===================================================================
--- z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/setup.py	                        (rev 0)
+++ z3c.autoinclude/trunk/src/z3c/autoinclude/tests/enolp.ppa.bar/setup.py	2009-01-15 23:05:56 UTC (rev 94769)
@@ -0,0 +1,32 @@
+from setuptools import setup, find_packages
+
+version = '0.1'
+
+setup(name='enolp.ppa.bar',
+      version=version,
+      description="",
+      long_description="""\
+""",
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[
+        "Framework :: Zope3",
+        "Programming Language :: Python",
+        ],
+      keywords='',
+      author='',
+      author_email='',
+      url='',
+      license="''",
+      packages=find_packages(exclude=['ez_setup']),
+      namespace_packages=['enolp', 'enolp.ppa'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+          'setuptools',
+	  'TestDirective',
+          # -*- Extra requirements: -*-
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )

Modified: z3c.autoinclude/trunk/src/z3c/autoinclude/tests/tests.py
===================================================================
--- z3c.autoinclude/trunk/src/z3c/autoinclude/tests/tests.py	2009-01-15 22:45:36 UTC (rev 94768)
+++ z3c.autoinclude/trunk/src/z3c/autoinclude/tests/tests.py	2009-01-15 23:05:56 UTC (rev 94769)
@@ -9,7 +9,8 @@
 # to this list if you want it to be available for import in doctests!
 test_packages = ['APackage', 'BCPackage', 'XYZPackage',
                  'SiblingPackage', 'BasePackage', 'FooPackage',
-                 'base2', 'base2_plug', 'TestDirective']
+                 'base2', 'base2_plug', 'TestDirective',
+                 'enolp.ppa.foo', 'enolp.ppa.bar']
 
 
 from zc.buildout.easy_install import install
@@ -33,6 +34,17 @@
         dist.activate()
     return new_working_set
 
+
+def interactive_testing_env():
+    """ an interactive debugger with the testing environment set up for free """
+
+    import tempfile
+    target_dir = tempfile.mkdtemp('.z3c.autoinclude.test-installs')
+    install_projects(test_packages, target_dir)
+    import code
+    code.interact()
+
+
 def testSetUp(test):
     """
     install test packages so that they can be imported
@@ -40,9 +52,8 @@
     """
     
     testing.buildoutSetUp(test)
-
     import tempfile
-    target_dir = tempfile.mkdtemp('.z3c.autoinclude.test-installs')    
+    target_dir = tempfile.mkdtemp('.z3c.autoinclude.test-installs')
     install_projects(test_packages, target_dir)
 
 
@@ -60,8 +71,8 @@
 
     from pprint import pprint
     suite = doctest.DocFileSuite('../utils.txt',
-                                 '../dependency.txt',
-                                 '../plugin.txt',
+#                                 '../dependency.txt',
+#                                 '../plugin.txt',
                                  setUp=testSetUp,
                                  tearDown=testTearDown,
                                  globs={'pprint':pprint},
@@ -70,4 +81,7 @@
     return unittest.TestSuite((suite,))
 
 if __name__ == '__main__':
-    unittest.main(defaultTest='test_suite')
+    import zope.testing.testrunner
+    zope.testing.testrunner.run([
+  '--test-path', '/home/egj/z3c.autoinclude/src',
+  ])

Modified: z3c.autoinclude/trunk/src/z3c/autoinclude/utils.py
===================================================================
--- z3c.autoinclude/trunk/src/z3c/autoinclude/utils.py	2009-01-15 22:45:36 UTC (rev 94768)
+++ z3c.autoinclude/trunk/src/z3c/autoinclude/utils.py	2009-01-15 23:05:56 UTC (rev 94769)
@@ -65,6 +65,11 @@
     return distributionForDottedName(package_dottedname)
 
 def distributionForDottedName(package_dottedname):
+    """
+    This function is ugly and probably slow.
+    It needs to be heavily commented, it needs narrative doctests, and it needs some broad explanation.
+    Then it needs to be profiled.
+    """
     valid_dists_for_package = []
     for path in sys.path:
         dists = find_distributions(path, True)
@@ -73,15 +78,26 @@
                 continue
             packages = find_packages(dist.location) # TODO: don't use setuptools here; look for ``top_level.txt`` metadata instead
             ns_packages = namespaceDottedNames(dist)
-            if package_dottedname in ns_packages:
-                continue
+            #if package_dottedname in ns_packages:
+                #continue
             if package_dottedname not in packages:
                 continue
-            valid_dists_for_package.append(dist)
+            valid_dists_for_package.append((dist, ns_packages))
     assert valid_dists_for_package, "No distributions found for package %s." % package_dottedname
-    assert len(valid_dists_for_package) == 1, "Multiple distributions found for package %s; z3c.autoinclude refuses to guess." % package_dottedname
-    return valid_dists_for_package[0]
+    
+    if len(valid_dists_for_package) > 1:
+        non_namespaced_dists = filter(lambda x: len(x[1]) is 0, valid_dists_for_package)
+        if len(non_namespaced_dists) == 0:
+            # if we only have namespace packages at this point, 'foo.bar' and 'foo.baz', while looking for 'foo',
+            # we can just select the first because the choice has no effect
+            return valid_dists_for_package[0][0]
 
+        valid_dists_for_package = non_namespaced_dists ### if we have packages 'foo', 'foo.bar', and 'foo.baz', the correct one is 'foo'.
+        assert len(non_namespaced_dists) == 1          ### we really are in trouble if we get into a situation with more than one
+                                                       ### non-namespaced package at this point.
+
+    return valid_dists_for_package[0][0]
+
 def namespaceDottedNames(dist):
     """
     Return a list of dotted names of all namespace packages in a distribution.

Modified: z3c.autoinclude/trunk/src/z3c/autoinclude/utils.txt
===================================================================
--- z3c.autoinclude/trunk/src/z3c/autoinclude/utils.txt	2009-01-15 22:45:36 UTC (rev 94768)
+++ z3c.autoinclude/trunk/src/z3c/autoinclude/utils.txt	2009-01-15 23:05:56 UTC (rev 94769)
@@ -22,6 +22,13 @@
     >>> distributionForPackage(base2.plug)
     base2-plug 0.0 (...base2_plug-0.0...egg)
 
+If you have a virtual package (a namespace package that exists only
+by having been extended by nested packages) it should find a package::
+
+    >>> import enolp
+    >>> distributionForPackage(enolp)
+    enolp.ppa.foo 0.1 (...enolp.ppa.foo-0.1...egg)
+
 While we're at it, it should also find the correct distribution for
 packages whose distribution name has no bearing on the name of the
 package contained within it::



More information about the Checkins mailing list