Description
Originally reported by: Wolfgang Schnerring (BitBucket: wosc, GitHub: wosc)
The pyargs resolution does not understand namespace packages when the different contributing packages are installed as eggs (which is the layout used by zc.buildout and also pip install --egg
, see http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages). It looks like this:
site-packages/
zope.asdf.egg/
zope/
asdf/
...
zope.qwer.egg/
zope/
qwer/
...
This is a well supported layout, which means import zope.asdf
and import zope.qwer
work just fine (the specification is something to the effect of, if there is more than one directory that claims to be package "zope", there is no guarantee which one you will actually get when you say import zope
, but all subpackages will be accessible regardless).
But py.test --pyargs zope.asdf
will work, while py.test --pyargs zope.qwer
will say "file or package not found" (it might also be the other way around, so zope.qwer works, but zope.asdf doesn't).
This is because _pytest.main.Session._tryconvertpyarg
does not actually rely on the Python import mechanism to do the resolution (I'm not sure why, I'm guessing it's to support collecting tests outside of packages?). Instead it splits the argument on dots and loads the parts from the import system, assuming their filesystem location is the one that matters -- which is incorrect. In the example, trying to resolve zope.qwer
, it will first resolve zope
, which results in a random matching entry, e.g site-packages/zope.asdf/zope/__init__.py
. It then assumes that the rest of the name must exist below this specific directory, thus never finding zope.qwer
.