diff --git a/src/_pytest/main.py b/src/_pytest/main.py index 1c41f7e6e..dbe1ccf42 100644 --- a/src/_pytest/main.py +++ b/src/_pytest/main.py @@ -18,6 +18,7 @@ from _pytest.config import directory_arg from _pytest.config import hookimpl from _pytest.config import UsageError from _pytest.outcomes import exit +from _pytest.pathlib import parts from _pytest.runner import collect_one_node @@ -469,8 +470,8 @@ class Session(nodes.FSCollector): return items def collect(self): - for parts in self._initialparts: - arg = "::".join(map(str, parts)) + for initialpart in self._initialparts: + arg = "::".join(map(str, initialpart)) self.trace("processing argument", arg) self.trace.root.indent += 1 try: @@ -532,12 +533,12 @@ class Session(nodes.FSCollector): fil=filter_, rec=self._recurse, bf=True, sort=True ): pkginit = path.dirpath().join("__init__.py") - if pkginit.exists() and not any(x in pkginit.parts() for x in paths): + if pkginit.exists() and not any(x in parts(pkginit.strpath) for x in paths): for x in root._collectfile(pkginit): yield x paths.append(x.fspath.dirpath()) - if not any(x in path.parts() for x in paths): + if not any(x in parts(path.strpath) for x in paths): for x in root._collectfile(path): if (type(x), x.fspath) in self._node_cache: yield self._node_cache[(type(x), x.fspath)] diff --git a/src/_pytest/pathlib.py b/src/_pytest/pathlib.py index f5c1da8c5..c907b495c 100644 --- a/src/_pytest/pathlib.py +++ b/src/_pytest/pathlib.py @@ -303,3 +303,8 @@ def fnmatch_ex(pattern, path): else: name = six.text_type(path) return fnmatch.fnmatch(name, pattern) + + +def parts(s): + parts = s.split(sep) + return [sep.join(parts[:i+1]) or sep for i in range(len(parts))] diff --git a/src/_pytest/python.py b/src/_pytest/python.py index b866532cc..2eb5f0b87 100644 --- a/src/_pytest/python.py +++ b/src/_pytest/python.py @@ -41,6 +41,7 @@ from _pytest.mark.structures import get_unpacked_marks from _pytest.mark.structures import normalize_mark_list from _pytest.mark.structures import transfer_markers from _pytest.outcomes import fail +from _pytest.pathlib import parts from _pytest.warning_types import PytestWarning from _pytest.warning_types import RemovedInPytest4Warning @@ -562,14 +563,10 @@ class Package(Module): yield Module(init_module, self) pkg_prefixes = set() for path in this_path.visit(rec=self._recurse, bf=True, sort=True): - # We will visit our own __init__.py file, in which case we skip it. - if path.isfile(): - if path.basename == "__init__.py" and path.dirpath() == this_path: - continue - parts = path.parts() + parts_ = parts(path.strpath) if any( - pkg_prefix in parts and pkg_prefix.join("__init__.py") != path + pkg_prefix in parts_ and pkg_prefix.join("__init__.py") != path for pkg_prefix in pkg_prefixes ): continue