def test_pex_executable(): # type: () -> None # Tests that pex keeps executable permissions with temporary_dir() as temp_dir: pex_dir = os.path.join(temp_dir, "pex_dir") safe_mkdir(pex_dir) with open(os.path.join(pex_dir, "exe.py"), "w") as fp: fp.write( textwrap.dedent( """ import subprocess import os import sys import my_package path = os.path.join(os.path.dirname(my_package.__file__), 'bin/start.sh') sys.stdout.write(subprocess.check_output([path]).decode('utf-8')) """ ) ) project_content = { "setup.py": textwrap.dedent( """ from setuptools import setup setup( name='my_project', version='0.0.0.0', zip_safe=True, packages=['my_package'], package_data={'my_package': ['bin/*']}, install_requires=[], ) """ ), "my_package/__init__.py": 0, "my_package/bin/start.sh": ( "#!/usr/bin/env bash\n" "echo 'hello world from start.sh!'" ), "my_package/my_module.py": 'def do_something():\n print("hello world!")\n', } # type: Dict[str, Union[str, int]] pex_builder = PEXBuilder(path=pex_dir) with temporary_content(project_content, perms=0o755) as project_dir: installer = WheelBuilder(project_dir) bdist = installer.bdist() pex_builder.add_dist_location(bdist) pex_builder.set_executable(os.path.join(pex_dir, "exe.py")) pex_builder.freeze() app_pex = os.path.join(os.path.join(temp_dir, "out_pex_dir"), "app.pex") pex_builder.build(app_pex) std_out, rc = run_simple_pex(app_pex, env={"PEX_ROOT": os.path.join(temp_dir, ".pex")}) assert rc == 0 assert std_out.decode("utf-8") == "hello world from start.sh!\n"
def pythonpath_isolation_test(): # type: () -> Iterator[PythonpathIsolationTest] with temporary_dir() as temp_dir: pythonpath = os.path.join(temp_dir, "one") with safe_open(os.path.join(pythonpath, "foo.py"), "w") as fp: fp.write("BAR = 42") with safe_open(os.path.join(pythonpath, "bar.py"), "w") as fp: fp.write("FOO = 137") dist_content = { "setup.py": textwrap.dedent( """ from setuptools import setup setup( name='foo', version='0.0.0', zip_safe=True, packages=['foo'], install_requires=[], ) """ ), "foo/__init__.py": "BAR = 137", } with temporary_content(dist_content) as project_dir: installer = WheelBuilder(project_dir) foo_bdist = installer.bdist() exe_contents = textwrap.dedent( """ import sys try: import bar except ImportError: import collections bar = collections.namedtuple('bar', ['FOO'])(None) import foo sys.stdout.write("foo.BAR={} bar.FOO={}".format(foo.BAR, bar.FOO)) """ ) yield PythonpathIsolationTest( pythonpath=pythonpath, dists=[foo_bdist], exe=exe_contents )