def test_layout(rule_runner: RuleRunner, layout: PexLayout) -> None: rule_runner.write_files({ "src/py/project/app.py": "print('hello')", "src/py/project/BUILD": dedent(f"""\ python_sources(name="lib") pex_binary( entry_point="app.py", layout="{layout.value}", ) """), }) tgt = rule_runner.get_target(Address("src/py/project")) field_set = PexBinaryFieldSet.create(tgt) result = rule_runner.request(BuiltPackage, [field_set]) assert len(result.artifacts) == 1 expected_pex_relpath = "src.py.project/project.pex" assert expected_pex_relpath == result.artifacts[0].relpath rule_runner.write_digest(result.digest) executable = os.path.join( rule_runner.build_root, expected_pex_relpath if PexLayout.ZIPAPP is layout else os.path.join( expected_pex_relpath, "__main__.py"), ) assert b"hello\n" == subprocess.run([executable], check=True, stdout=subprocess.PIPE).stdout
def pex_executable(rule_runner: RuleRunner) -> str: rule_runner.write_files({ "pex_exe/BUILD": dedent("""\ python_requirement(name="req", requirements=["pex==2.1.66"]) pex_binary(dependencies=[":req"], script="pex") """), }) tgt = rule_runner.get_target(Address("pex_exe")) field_set = PexBinaryFieldSet.create(tgt) result = rule_runner.request(BuiltPackage, [field_set]) assert len(result.artifacts) == 1 expected_pex_relpath = "pex_exe/pex_exe.pex" assert expected_pex_relpath == result.artifacts[0].relpath rule_runner.write_digest(result.digest) return os.path.join(rule_runner.build_root, expected_pex_relpath)
def test_complete_platforms(rule_runner: RuleRunner) -> None: linux_complete_platform = pkgutil.get_data(__name__, "platform-linux-py36.json") assert linux_complete_platform is not None mac_complete_platform = pkgutil.get_data(__name__, "platform-mac-py36.json") assert mac_complete_platform is not None rule_runner.write_files({ "src/py/project/platform-linux-py36.json": linux_complete_platform, "src/py/project/platform-mac-py36.json": mac_complete_platform, "src/py/project/BUILD": dedent("""\ python_requirement(name="p537", requirements=["p537==1.0.4"]) files(name="platforms", sources=["platform*.json"]) pex_binary( dependencies=[":p537"], complete_platforms=[":platforms"], include_tools=True, ) """), }) tgt = rule_runner.get_target(Address("src/py/project")) field_set = PexBinaryFieldSet.create(tgt) result = rule_runner.request(BuiltPackage, [field_set]) assert len(result.artifacts) == 1 expected_pex_relpath = "src.py.project/project.pex" assert expected_pex_relpath == result.artifacts[0].relpath rule_runner.write_digest(result.digest) executable = os.path.join(rule_runner.build_root, expected_pex_relpath) pex_info = json.loads( subprocess.run( args=[executable, "info"], env=dict(PEX_TOOLS="1", **os.environ), stdout=subprocess.PIPE, check=True, ).stdout) assert sorted([ "p537-1.0.4-cp36-cp36m-manylinux1_x86_64.whl", "p537-1.0.4-cp36-cp36m-macosx_10_13_x86_64.whl", ]) == sorted(pex_info["distributions"])
def complete_platform(rule_runner: RuleRunner) -> bytes: rule_runner.write_files({ "pex_exe/BUILD": dedent("""\ python_requirement(name="req", requirements=["pex==2.1.66"]) pex_binary(dependencies=[":req"], script="pex") """), }) result = rule_runner.request( BuiltPackage, [PexBinaryFieldSet.create(rule_runner.get_target(Address("pex_exe")))]) rule_runner.write_digest(result.digest) pex_executable = os.path.join(rule_runner.build_root, "pex_exe/pex_exe.pex") return subprocess.run( args=[pex_executable, "interpreter", "inspect", "-mt"], env=dict(PEX_MODULE="pex.cli", **os.environ), check=True, stdout=subprocess.PIPE, ).stdout
def test_resolve_local_platforms(pex_executable: str, rule_runner: RuleRunner) -> None: complete_current_platform = subprocess.run( args=[pex_executable, "interpreter", "inspect", "-mt"], env=dict(PEX_MODULE="pex.cli", **os.environ), stdout=subprocess.PIPE, ).stdout # N.B.: ansicolors 1.0.2 is available sdist-only on PyPI, so resolving it requires using a # local interpreter. rule_runner.write_files({ "src/py/project/app.py": "import colors", "src/py/project/platform.json": complete_current_platform, "src/py/project/BUILD": dedent("""\ python_requirement(name="ansicolors", requirements=["ansicolors==1.0.2"]) file(name="platform", source="platform.json") pex_binary( dependencies=[":ansicolors"], complete_platforms=[":platform"], resolve_local_platforms=True, ) """), }) tgt = rule_runner.get_target(Address("src/py/project")) field_set = PexBinaryFieldSet.create(tgt) result = rule_runner.request(BuiltPackage, [field_set]) assert len(result.artifacts) == 1 expected_pex_relpath = "src.py.project/project.pex" assert expected_pex_relpath == result.artifacts[0].relpath rule_runner.write_digest(result.digest) executable = os.path.join(rule_runner.build_root, expected_pex_relpath) subprocess.run([executable], check=True)
def build_package(rule_runner: RuleRunner, binary_target: Target) -> BuiltPackage: field_set = GoBinaryFieldSet.create(binary_target) result = rule_runner.request(BuiltPackage, [field_set]) rule_runner.write_digest(result.digest) return result