Commit ed765324 authored by Jason R. Coombs's avatar Jason R. Coombs

Extract namespace support functionality into a separate module.

parent 5d78aeb9
from __future__ import absolute_import, unicode_literals
import textwrap
def build_namespace_package(tmpdir, name):
src_dir = tmpdir / name
src_dir.mkdir()
setup_py = src_dir / 'setup.py'
namespace, sep, rest = name.partition('.')
script = textwrap.dedent("""
import setuptools
setuptools.setup(
name={name!r},
version="1.0",
namespace_packages=[{namespace!r}],
packages=[{namespace!r}],
)
""").format(**locals())
setup_py.write_text(script, encoding='utf-8')
ns_pkg_dir = src_dir / namespace
ns_pkg_dir.mkdir()
pkg_init = ns_pkg_dir / '__init__.py'
tmpl = '__import__("pkg_resources").declare_namespace({namespace!r})'
decl = tmpl.format(**locals())
pkg_init.write_text(decl, encoding='utf-8')
pkg_mod = ns_pkg_dir / (rest + '.py')
some_functionality = 'name = {rest!r}'.format(**locals())
pkg_mod.write_text(some_functionality, encoding='utf-8')
return src_dir
def make_site_dir(target):
"""
Add a sitecustomize.py module in target to cause
target to be added to site dirs such that .pth files
are processed there.
"""
sc = target / 'sitecustomize.py'
target_str = str(target)
tmpl = '__import__("site").addsitedir({target_str!r})'
sc.write_text(tmpl.format(**locals()), encoding='utf-8')
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import os import os
import textwrap
import sys import sys
import subprocess import subprocess
import pytest import pytest
from . import namespaces
class TestNamespaces:
@staticmethod
def build_namespace_package(tmpdir, name):
src_dir = tmpdir / name
src_dir.mkdir()
setup_py = src_dir / 'setup.py'
namespace, sep, rest = name.partition('.')
script = textwrap.dedent("""
import setuptools
setuptools.setup(
name={name!r},
version="1.0",
namespace_packages=[{namespace!r}],
packages=[{namespace!r}],
)
""").format(**locals())
setup_py.write_text(script, encoding='utf-8')
ns_pkg_dir = src_dir / namespace
ns_pkg_dir.mkdir()
pkg_init = ns_pkg_dir / '__init__.py'
tmpl = '__import__("pkg_resources").declare_namespace({namespace!r})'
decl = tmpl.format(**locals())
pkg_init.write_text(decl, encoding='utf-8')
pkg_mod = ns_pkg_dir / (rest + '.py')
some_functionality = 'name = {rest!r}'.format(**locals())
pkg_mod.write_text(some_functionality, encoding='utf-8')
return src_dir
@staticmethod class TestNamespaces:
def make_site_dir(target):
"""
Add a sitecustomize.py module in target to cause
target to be added to site dirs such that .pth files
are processed there.
"""
sc = target / 'sitecustomize.py'
target_str = str(target)
tmpl = '__import__("site").addsitedir({target_str!r})'
sc.write_text(tmpl.format(**locals()), encoding='utf-8')
@pytest.mark.xfail(sys.version_info < (3, 3), @pytest.mark.xfail(sys.version_info < (3, 3),
reason="Requires PEP 420") reason="Requires PEP 420")
...@@ -57,8 +20,8 @@ class TestNamespaces: ...@@ -57,8 +20,8 @@ class TestNamespaces:
should leave the namespace in tact and both packages reachable by should leave the namespace in tact and both packages reachable by
import. import.
""" """
pkg_A = self.build_namespace_package(tmpdir, 'myns.pkgA') pkg_A = namespaces.build_namespace_package(tmpdir, 'myns.pkgA')
pkg_B = self.build_namespace_package(tmpdir, 'myns.pkgB') pkg_B = namespaces.build_namespace_package(tmpdir, 'myns.pkgB')
site_packages = tmpdir / 'site-packages' site_packages = tmpdir / 'site-packages'
path_packages = tmpdir / 'path-packages' path_packages = tmpdir / 'path-packages'
targets = site_packages, path_packages targets = site_packages, path_packages
...@@ -71,7 +34,7 @@ class TestNamespaces: ...@@ -71,7 +34,7 @@ class TestNamespaces:
'-t', str(site_packages), '-t', str(site_packages),
] ]
subprocess.check_call(install_cmd) subprocess.check_call(install_cmd)
self.make_site_dir(site_packages) namespaces.make_site_dir(site_packages)
install_cmd = [ install_cmd = [
'pip', 'pip',
'install', 'install',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment