| "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 |
| ) |