New issue 478: --pyargs does not understand namespace packages
https://bitbucket.org/hpk42/pytest/issue/478/pyargs-does-not-understand-namespace

Wolfgang Schnerring:

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`.


_______________________________________________
pytest-commit mailing list
pytest-commit@python.org
https://mail.python.org/mailman/listinfo/pytest-commit

Reply via email to