#!/usr/bin/env python3 # Copyright 2023 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import platform import subprocess import sys import unittest from pathlib import Path from python.runfiles import runfiles class PipWhlModsTest(unittest.TestCase): maxDiff = None @staticmethod def _get_bazel_pkg_dir_name(env_var: str) -> str: a_file = Path(os.environ.get(env_var).split(" ")[0]) head = a_file while head.parent.name: head = head.parent return head.name @classmethod def setUpClass(cls): cls._wheel_pkg_dir = cls._get_bazel_pkg_dir_name("WHEEL_PKG") cls._requests_pkg_dir = cls._get_bazel_pkg_dir_name("REQUESTS_PKG") def wheel_pkg_dir(self) -> Path: return self._wheel_pkg def test_build_content_and_data(self): r = runfiles.Create() rpath = r.Rlocation( "{}/generated_file.txt".format( self._wheel_pkg_dir, ), ) generated_file = Path(rpath) self.assertTrue(generated_file.exists()) content = generated_file.read_text().rstrip() self.assertEqual(content, "Hello world from build content file") def test_copy_files(self): r = runfiles.Create() rpath = r.Rlocation( "{}/copied_content/file.txt".format( self._wheel_pkg_dir, ) ) copied_file = Path(rpath) self.assertTrue(copied_file.exists()) content = copied_file.read_text().rstrip() self.assertEqual(content, "Hello world from copied file") def test_copy_executables(self): executable_name = ( "executable.exe" if platform.system() == "windows" else "executable.py" ) r = runfiles.Create() rpath = r.Rlocation( "{}/copied_content/{}".format( self._wheel_pkg_dir, executable_name, ) ) executable = Path(rpath) self.assertTrue(executable.exists()) proc = subprocess.run( [sys.executable, str(executable)], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) stdout = proc.stdout.decode("utf-8").strip() self.assertEqual(stdout, "Hello world from copied executable") def test_data_exclude_glob(self): current_wheel_version = "0.40.0" r = runfiles.Create() dist_info_dir = "{}/site-packages/wheel-{}.dist-info".format( self._wheel_pkg_dir, current_wheel_version, ) # Note: `METADATA` is important as it's consumed by https://docs.python.org/3/library/importlib.metadata.html # `METADATA` is expected to be there to show dist-info files are included in the runfiles. metadata_path = r.Rlocation("{}/METADATA".format(dist_info_dir)) # However, `WHEEL` was explicitly excluded, so it should be missing wheel_path = r.Rlocation("{}/WHEEL".format(dist_info_dir)) self.assertTrue(Path(metadata_path).exists(), f"Could not find {metadata_path}") self.assertFalse( Path(wheel_path).exists(), f"Expected to not find {wheel_path}" ) def test_extra(self): # This test verifies that annotations work correctly for pip packages with extras # specified, in this case requests[security]. r = runfiles.Create() rpath = r.Rlocation( "{}/generated_file.txt".format( self._requests_pkg_dir, ), ) generated_file = Path(rpath) self.assertTrue(generated_file.exists()) content = generated_file.read_text().rstrip() self.assertEqual(content, "Hello world from requests") def test_patches(self): current_wheel_version = "2.25.1" # This test verifies that the patches are applied to the wheel. r = runfiles.Create() metadata_path = "{}/site-packages/requests-{}.dist-info/METADATA".format( self._requests_pkg_dir, current_wheel_version, ) metadata = Path(r.Rlocation(metadata_path)) self.assertIn( "Summary: Python HTTP for Humans. Patched.", metadata.read_text().splitlines(), ) if __name__ == "__main__": unittest.main()