def test_all_wheel_requirements(self) -> None: contents = bazel.generate_requirements_file_contents( repo_name='test', targets=['"@test//pypi__pkg1"', '"@test//pypi__pkg2"'], ) expected = 'all_whl_requirements = ["@test//pypi__pkg1:whl","@test//pypi__pkg2:whl"]' self.assertIn(expected, contents)
def main() -> None: """Main program. Exits zero on successful program termination, non-zero otherwise. """ configure_reproducible_wheels() parser = argparse.ArgumentParser( description="Resolve and fetch artifacts transitively from PyPI") parser.add_argument( "--requirements", action="store", required=True, help="Path to requirements.txt from where to install dependencies", ) arguments.parse_common_args(parser) args = parser.parse_args() deserialized_args = dict(vars(args)) arguments.deserialize_structured_args(deserialized_args) # Pip is run with the working directory changed to the folder containing the requirements.txt file, to allow for # relative requirements to be correctly resolved. The --wheel-dir is therefore required to be repointed back to the # current calling working directory (the repo root in .../external/name), where the wheel files should be written to pip_args = ([sys.executable, "-m", "pip"] + (["--isolated"] if args.isolated else []) + ["wheel", "-r", args.requirements] + ["--wheel-dir", os.getcwd()] + deserialized_args["extra_pip_args"]) env = os.environ.copy() env.update(deserialized_args["environment"]) # Assumes any errors are logged by pip so do nothing. This command will fail if pip fails subprocess.run(pip_args, check=True, env=env, cwd=str(pathlib.Path(args.requirements).parent.resolve())) extras = requirements.parse_extras(args.requirements) repo_label = "@%s" % args.repo targets = [ '"%s%s"' % ( repo_label, bazel.extract_wheel(whl, extras, deserialized_args["pip_data_exclude"], args.enable_implicit_namespace_pkgs), ) for whl in glob.glob("*.whl") ] with open("requirements.bzl", "w") as requirement_file: requirement_file.write( bazel.generate_requirements_file_contents(repo_label, targets))
def main() -> None: """Main program. Exits zero on successful program termination, non-zero otherwise. """ configure_reproducible_wheels() parser = argparse.ArgumentParser( description="Resolve and fetch artifacts transitively from PyPI") parser.add_argument( "--requirements", action="store", required=True, help="Path to requirements.txt from where to install dependencies", ) arguments.parse_common_args(parser) args = parser.parse_args() pip_args = [ sys.executable, "-m", "pip", "--isolated", "wheel", "-r", args.requirements ] if args.extra_pip_args: pip_args += json.loads(args.extra_pip_args)["args"] # Assumes any errors are logged by pip so do nothing. This command will fail if pip fails subprocess.run(pip_args, check=True) extras = requirements.parse_extras(args.requirements) if args.pip_data_exclude: pip_data_exclude = json.loads(args.pip_data_exclude)["exclude"] else: pip_data_exclude = [] repo_label = "@%s" % args.repo targets = [ '"%s%s"' % ( repo_label, bazel.extract_wheel(whl, extras, pip_data_exclude, args.enable_implicit_namespace_pkgs), ) for whl in glob.glob("*.whl") ] with open("requirements.bzl", "w") as requirement_file: requirement_file.write( bazel.generate_requirements_file_contents(repo_label, targets))
def main() -> None: """Main program. Exits zero on successful program termination, non-zero otherwise. """ configure_reproducible_wheels() parser = argparse.ArgumentParser( description="Resolve and fetch artifacts transitively from PyPI" ) parser.add_argument( "--requirements", action="store", required=True, help="Path to requirements.txt from where to install dependencies", ) parser.add_argument( "--repo", action="store", required=True, help="The external repo name to install dependencies. In the format '@{REPO_NAME}'", ) parser.add_argument( "--extra_pip_args", action="store", help="Extra arguments to pass down to pip.", ) parser.add_argument( "--pip_data_exclude", action="store", help="Additional data exclusion parameters to add to the pip packages BUILD file.", ) parser.add_argument( "--enable_implicit_namespace_pkgs", action="store_true", help="Disables conversion of implicit namespace packages into pkg-util style packages.", ) args = parser.parse_args() pip_args = [sys.executable, "-m", "pip", "wheel", "-r", args.requirements] if args.extra_pip_args: pip_args += json.loads(args.extra_pip_args)["args"] # Assumes any errors are logged by pip so do nothing. This command will fail if pip fails subprocess.run(pip_args, check=True) extras = requirements.parse_extras(args.requirements) if args.pip_data_exclude: pip_data_exclude = json.loads(args.pip_data_exclude)["exclude"] else: pip_data_exclude = [] targets = [ '"%s%s"' % ( args.repo, bazel.extract_wheel( whl, extras, pip_data_exclude, args.enable_implicit_namespace_pkgs ), ) for whl in glob.glob("*.whl") ] with open("requirements.bzl", "w") as requirement_file: requirement_file.write( bazel.generate_requirements_file_contents(args.repo, targets) )