1import textwrap 2 3 4def build_namespace_package(tmpdir, name): 5 src_dir = tmpdir / name 6 src_dir.mkdir() 7 setup_py = src_dir / 'setup.py' 8 namespace, sep, rest = name.partition('.') 9 script = textwrap.dedent(""" 10 import setuptools 11 setuptools.setup( 12 name={name!r}, 13 version="1.0", 14 namespace_packages=[{namespace!r}], 15 packages=[{namespace!r}], 16 ) 17 """).format(**locals()) 18 setup_py.write_text(script, encoding='utf-8') 19 ns_pkg_dir = src_dir / namespace 20 ns_pkg_dir.mkdir() 21 pkg_init = ns_pkg_dir / '__init__.py' 22 tmpl = '__import__("pkg_resources").declare_namespace({namespace!r})' 23 decl = tmpl.format(**locals()) 24 pkg_init.write_text(decl, encoding='utf-8') 25 pkg_mod = ns_pkg_dir / (rest + '.py') 26 some_functionality = 'name = {rest!r}'.format(**locals()) 27 pkg_mod.write_text(some_functionality, encoding='utf-8') 28 return src_dir 29 30 31def make_site_dir(target): 32 """ 33 Add a sitecustomize.py module in target to cause 34 target to be added to site dirs such that .pth files 35 are processed there. 36 """ 37 sc = target / 'sitecustomize.py' 38 target_str = str(target) 39 tmpl = '__import__("site").addsitedir({target_str!r})' 40 sc.write_text(tmpl.format(**locals()), encoding='utf-8') 41