[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