blob: 62295ef93b596f9836cf939d7545dba5bbb6a604 [file] [log] [blame]
"uv based pip compile rules"
load("@bazel_skylib//lib:types.bzl", "types")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("//uv/private:pip.bzl", "pip_compile_test", _pip_compile = "pip_compile")
def pip_compile(
name,
requirements_in = None,
requirements_overrides = None,
requirements_txt = None,
target_compatible_with = None,
python_platform = None,
universal = False,
args = None,
extra_args = None,
data = None,
tags = None,
size = None,
env = None,
**kwargs):
"""
Produce targets to compile a requirements.in or pyproject.toml file into a requirements.txt file.
Args:
name: name of the primary compilation target.
requirements_in: (optional, default "//:requirements.in") a label for the requirements.in file.
May also be provided as a list of strings which represent the requirements file lines.
requirements_overrides: (optional, default None) a label for the file that is used to override dependencies.
requirements_txt: (optional, default "//:requirements.txt") a label for the requirements.txt file.
python_platform: (optional) a uv pip compile compatible value for --python-platform.
universal: (optional, default False) use uv's `--universal` option
target_compatible_with: (optional) specify that a particular target is compatible only with certain
Bazel platforms.
args: (optional) override the default arguments passed to uv pip compile, default arguments are:
--generate-hashes (Include distribution hashes in the output file)
--emit-index-url (Include `--index-url` and `--extra-index-url` entries in the generated output file)
--no-strip-extras (Include extras in the output file)
extra_args: (optional) appends to the default arguments passed to uv pip compile. If both args and
extra_args are provided, extra_args will be appended to args.
data: (optional) a list of labels of additional files to include
tags: (optional) tags to apply to the generated test target
size: (optional) size of the test target, see https://bazel.build/reference/test-encyclopedia#role-test-runner
env: (optional) a dictionary of environment variables to set for uv pip compile and the test target
**kwargs: (optional) other fields passed through to all underlying rules
Targets produced by this macro are:
[name]: a runnable target that will use requirements_in to generate and overwrite requirements_txt
[name].update: an alias for [name]
[name]_test: a testable target that will check that requirements_txt is up to date with requirements_in
"""
requirements_in = requirements_in or "//:requirements.in"
requirements_txt = requirements_txt or "//:requirements.txt"
tags = tags or []
size = size or "small"
if types.is_list(requirements_in):
write_target = "_{}.write".format(name)
write_file(
name = write_target,
out = "_{}.in".format(name),
content = requirements_in,
)
requirements_in = write_target
_pip_compile(
name = name,
requirements_in = requirements_in,
requirements_overrides = requirements_overrides,
requirements_txt = requirements_txt,
python_platform = python_platform,
universal = universal,
target_compatible_with = target_compatible_with,
data = data,
uv_args = args,
extra_args = extra_args,
env = env,
**kwargs
)
# Also allow 'bazel run' with a "custom verb" https://bazel.build/rules/verbs-tutorial
# Provides compatibility with rules_python's compile_pip_requirements [name].update target.
native.alias(
name = name + ".update",
actual = name,
)
pip_compile_test(
name = name + "_test",
generator_label = name,
requirements_in = requirements_in,
requirements_overrides = requirements_overrides,
requirements_txt = requirements_txt,
python_platform = python_platform or "",
universal = universal,
target_compatible_with = target_compatible_with,
data = data,
uv_args = args,
extra_args = extra_args,
tags = ["requires-network"] + tags,
size = size,
env = env,
**kwargs
)