Skip to content

Commit

Permalink
Fix 'Package has no len()' error during collection
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoddemus committed Sep 20, 2018
1 parent 7a5e11b commit 41f6ea1
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 3 deletions.
3 changes: 3 additions & 0 deletions changelog/3749.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix the following error during collection of tests inside packages::

TypeError: object of type 'Package' has no len()
7 changes: 4 additions & 3 deletions src/_pytest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -504,13 +504,14 @@ def _collect(self, arg):
pkginit = parent.join("__init__.py")
if pkginit.isfile():
if pkginit in self._node_cache:
root = self._node_cache[pkginit]
root = self._node_cache[pkginit][0]
else:
col = root._collectfile(pkginit)
if col:
if isinstance(col[0], Package):
root = col[0]
self._node_cache[root.fspath] = root
# always store a list in the cache, matchnodes expects it
self._node_cache[root.fspath] = [root]

# If it's a directory argument, recurse and look for any Subpackages.
# Let the Package collector deal with subnodes, don't collect here.
Expand All @@ -530,8 +531,8 @@ def _collect(self, arg):
if (type(x), x.fspath) in self._node_cache:
yield self._node_cache[(type(x), x.fspath)]
else:
yield x
self._node_cache[(type(x), x.fspath)] = x
yield x
else:
assert argpath.check(file=1)

Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def test():
pass
7 changes: 7 additions & 0 deletions testing/python/collect.py
Original file line number Diff line number Diff line change
Expand Up @@ -1591,6 +1591,13 @@ def test_package_collection_infinite_recursion(testdir):
result.stdout.fnmatch_lines("*1 passed*")


def test_package_collection_init_given_as_argument(testdir):
"""Regression test for #3749"""
p = testdir.copy_example("collect/package_init_given_as_arg")
result = testdir.runpytest(p / "pkg" / "__init__.py")
result.stdout.fnmatch_lines("*1 passed*")


def test_package_with_modules(testdir):
"""
.
Expand Down

0 comments on commit 41f6ea1

Please sign in to comment.