Hi, everyone.

Python namespaces are an ugly hack that Python upstreams do mostly
to look more enterprise'y and support installing subpackages of a common
parent package in different locations (i.e. zope.*, ...). For more
information on them, read PEP 420 [1], Python Packaging Guide [2]
and our wiki page [3].

So far we haven't been really providing any special support for
namespaces. We were rather relying on things magically working out
of the box and applying distutils_install_for_testing whenever they
weren't. However, this was really a 'big hammer' solution -- not very
precise, not very reliable.

I've been working on adding missing test dependencies of yet another
zope-related package lately [4] and hit a few more issues with namespace
of zope.*. It turned out that due to some random changes in Python 3.5+,
'setup.py install --home=...' (used for d_i_f_t) no longer correctly
established namespaces for our use and I had to use 'setup.py develop'
instead for zope.testrunner [5]. However, even this didn't work for
zope.exceptions where I would probably have to also deploy 'setup.py
easy_install' or add requirements to setup.py.

So I've went ahead and explored other possibilities. I've figured out
that at the moment namespace packages work on old Python versions
because of *.pth files installed by setuptools along with the packages.
However, this hack might be deprecated [6]. Also, it seemed to be
the source of problems with Python 3.5+.


You can see what I did on the PR [4]. It boils down to:

1. Adding dev-python/namespace-zope package (name selected to avoid
collisions with potential packages) that installs setuptools-compliant
__init__.py.

2. Removing *.pth files from dev-python/zope* and making those packages
depend on dev-python/namespace-zope instead.

This done, I was able to get the tests on the 5 zope packages to pass
on all Python implementations without any additional logic
(in particular, without a call to d_i_f_t).


If you consider this an acceptable solution to the namespace problem,
I'd like to set up the following guidelines for dealing with namespaces:

1. A single package should be selected to 'hold' the namespace. It can
be a common package for the ns (e.g. dev-python/logilab-common)
or a dedicated dev-python/namespace-* package.

2. This package should install appropriate __init__.py for the
namespace. The contents should be selected to match the namespace logic
used by the packages (pkgutil vs setuptools).

3. All subpackages in the namespace should RDEP (+ DEP) on this package,
and not install *-nspkg.pth files.


Your thoughts?


[1]:https://www.python.org/dev/peps/pep-0420/
[2]:https://packaging.python.org/namespace_packages/
[3]:https://wiki.gentoo.org/wiki/Project:Python/Namespace_packages
[4]:https://github.com/gentoo/gentoo/pull/4519
[5]:https://github.com/pypa/setuptools/issues/912
[6]:http://setuptools.readthedocs.io/en/latest/setuptools.html#transitional-note

-- 
Best regards,
Michał Górny

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to