def setup_namespace_pkg_compatibility(wheel_dir: str) -> None: """Converts native namespace packages and pkg_resource-style packages to pkgutil-style packages Namespace packages can be created in one of three ways. They are detailed here: https://packaging.python.org/guides/packaging-namespace-packages/#creating-a-namespace-package 'pkgutil-style namespace packages' (2) works in Bazel, but 'native namespace packages' (1) and 'pkg_resources-style namespace packages' (3) do not. We ensure compatibility with Bazel of methods 1 and 3 by converting them into method 2. Args: wheel_dir: the directory of the wheel to convert """ namespace_pkg_dirs = namespace_pkgs.pkg_resources_style_namespace_packages( wheel_dir ) if not namespace_pkg_dirs and namespace_pkgs.native_namespace_packages_supported(): namespace_pkg_dirs = namespace_pkgs.implicit_namespace_packages( wheel_dir, ignored_dirnames=["%s/bin" % wheel_dir,], ) for ns_pkg_dir in namespace_pkg_dirs: namespace_pkgs.add_pkgutil_style_namespace_pkg_init(ns_pkg_dir)
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())
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_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)