blob: 195cdd9c77600066297d62bf732f7e51849f8755 [file] [log] [blame]
import pathlib
import shutil
import tempfile
import unittest
from extract_wheels.lib import namespace_pkgs
class TempDir:
def __init__(self):
self.dir = tempfile.mkdtemp()
def root(self):
return self.dir
def add_dir(self, rel_path):
d = pathlib.Path(self.dir, rel_path)
d.mkdir(parents=True)
def add_file(self, rel_path, contents=None):
f = pathlib.Path(self.dir, rel_path)
f.parent.mkdir(parents=True, exist_ok=True)
if contents:
with open(f, "w") as writeable_f:
writeable_f.write(contents)
else:
f.touch()
def remove(self):
shutil.rmtree(self.dir)
class TestPkgResourcesStyleNamespacePackages(unittest.TestCase):
def test_finds_correct_namespace_packages(self):
directory = TempDir()
directory.add_file("google/auth/__init__.py")
directory.add_file("google/auth/foo.py")
directory.add_file(
"google_auth-1.8.2.dist-info/namespace_packages.txt", contents="google\n"
)
expected = {
directory.root() + "/google",
}
actual = namespace_pkgs.pkg_resources_style_namespace_packages(directory.root())
self.assertEqual(actual, expected)
def test_nested_namespace_packages(self):
directory = TempDir()
directory.add_file("google/auth/__init__.py")
directory.add_file("google/auth/foo.py")
directory.add_file("google/bar/biz/__init__.py")
directory.add_file("google/bar/biz/bee.py")
directory.add_file(
"google_auth-1.8.2.dist-info/namespace_packages.txt",
contents="google\ngoogle.bar\n",
)
expected = {
directory.root() + "/google",
directory.root() + "/google/bar",
}
actual = namespace_pkgs.pkg_resources_style_namespace_packages(directory.root())
self.assertEqual(actual, expected)
def test_empty_case(self):
# Even though this directory contains directories with no __init__.py
# it has an empty namespace_packages.txt file so no namespace packages
# should be returned.
directory = TempDir()
directory.add_file("foo/bar/biz.py")
directory.add_file("foo/bee/boo.py")
directory.add_file("foo/buu/__init__.py")
directory.add_file("foo/buu/bii.py")
directory.add_file("foo-1.0.0.dist-info/namespace_packages.txt")
actual = namespace_pkgs.pkg_resources_style_namespace_packages(directory.root())
self.assertEqual(actual, set())
def test_missing_namespace_pkgs_record_file(self):
# Even though this directory contains directories with no __init__.py
# it has no namespace_packages.txt file, so no namespace packages should
# be found and returned.
directory = TempDir()
directory.add_file("foo/bar/biz.py")
directory.add_file("foo/bee/boo.py")
directory.add_file("foo/buu/__init__.py")
directory.add_file("foo/buu/bii.py")
directory.add_file("foo-1.0.0.dist-info/METADATA")
directory.add_file("foo-1.0.0.dist-info/RECORD")
actual = namespace_pkgs.pkg_resources_style_namespace_packages(directory.root())
self.assertEqual(actual, set())
class TestImplicitNamespacePackages(unittest.TestCase):
def test_finds_correct_namespace_packages(self):
directory = TempDir()
directory.add_file("foo/bar/biz.py")
directory.add_file("foo/bee/boo.py")
directory.add_file("foo/buu/__init__.py")
directory.add_file("foo/buu/bii.py")
expected = {
directory.root() + "/foo",
directory.root() + "/foo/bar",
directory.root() + "/foo/bee",
}
actual = namespace_pkgs.implicit_namespace_packages(directory.root())
self.assertEqual(actual, expected)
def test_ignores_empty_directories(self):
directory = TempDir()
directory.add_file("foo/bar/biz.py")
directory.add_dir("foo/cat")
expected = {
directory.root() + "/foo",
directory.root() + "/foo/bar",
}
actual = namespace_pkgs.implicit_namespace_packages(directory.root())
self.assertEqual(actual, expected)
def test_empty_case(self):
directory = TempDir()
directory.add_file("foo/__init__.py")
directory.add_file("foo/bar/__init__.py")
directory.add_file("foo/bar/biz.py")
actual = namespace_pkgs.implicit_namespace_packages(directory.root())
self.assertEqual(actual, set())
class TestaddPkgutilStyleNamespacePkgInit(unittest.TestCase):
def test_missing_directory_is_created(self):
missing_directory = pathlib.Path(TempDir().root(), "missing_directory")
namespace_pkgs.add_pkgutil_style_namespace_pkg_init(str(missing_directory))
self.assertTrue(missing_directory.is_dir())
if __name__ == "__main__":
unittest.main()