diff --git a/py/_path/local.py b/py/_path/local.py index 3ddfc80fd..37e62037c 100644 --- a/py/_path/local.py +++ b/py/_path/local.py @@ -456,7 +456,8 @@ class LocalPath(FSBase): def pypkgpath(self, pkgname=None): """ return the path's package path by looking for the given pkgname. If pkgname is None then look for the last - directory upwards which still contains an __init__.py. + directory upwards which still contains an __init__.py + and whose basename is python-importable. Return None if a pkgpath can not be determined. """ pkgpath = None @@ -464,6 +465,8 @@ class LocalPath(FSBase): if pkgname is None: if parent.check(file=1): continue + if not isimportable(parent.basename): + break if parent.join('__init__.py').check(): pkgpath = parent continue @@ -797,3 +800,6 @@ def autopath(globs=None): ret.pkgdir = pkgdir return ret + +def isimportable(name): + return name[0].isalpha() and name.isalnum() diff --git a/testing/path/test_local.py b/testing/path/test_local.py index 2eab94fca..8de95ab92 100644 --- a/testing/path/test_local.py +++ b/testing/path/test_local.py @@ -355,6 +355,14 @@ def test_pypkgdir(tmpdir): assert pkg.pypkgpath() == pkg assert pkg.join('subdir', '__init__.py').pypkgpath() == pkg +def test_pypkgdir_unimportable(tmpdir): + pkg = tmpdir.ensure('pkg1-1', dir=1) # unimportable + pkg.ensure("__init__.py") + subdir = pkg.ensure("subdir/__init__.py").dirpath() + assert subdir.pypkgpath() == subdir + assert subdir.ensure("xyz.py").pypkgpath() == subdir + assert not pkg.pypkgpath() + def test_homedir(): homedir = py.path.local._gethomedir() assert homedir.check(dir=1) diff --git a/testing/test_config.py b/testing/test_config.py index 13a8ed7b0..6a172fc93 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -169,6 +169,7 @@ class TestConfigApi_getinitialnodes: assert col.config is config def test_pkgfile(self, testdir, tmpdir): + tmpdir = tmpdir.join("subdir") x = tmpdir.ensure("x.py") tmpdir.ensure("__init__.py") config = testdir.reparseconfig([x]) diff --git a/testing/test_conftesthandle.py b/testing/test_conftesthandle.py index 3861130f1..0eb8066b0 100644 --- a/testing/test_conftesthandle.py +++ b/testing/test_conftesthandle.py @@ -90,6 +90,13 @@ class TestConftestValueAccessGlobal: assert path.dirpath() == basedir.join("adir", "b") assert path.purebasename == "conftest" +def test_conftest_in_nonpkg_with_init(tmpdir): + tmpdir.ensure("adir-1.0/conftest.py").write("a=1 ; Directory = 3") + tmpdir.ensure("adir-1.0/b/conftest.py").write("b=2 ; a = 1.5") + tmpdir.ensure("adir-1.0/b/__init__.py") + tmpdir.ensure("adir-1.0/__init__.py") + conftest = ConftestWithSetinitial(tmpdir.join("adir-1.0", "b")) + def test_conftestcutdir(testdir): conf = testdir.makeconftest("") p = testdir.mkdir("x")