bazel-contrib / bazel-contrib/rules_python

(feat request) Add a gazelle directive for using `requirement()` for pip-installable dependencies

Open
#1,789 4 comments 1 reaction 0 assignees View on GitHub
Can Close? gazelle
Dominant language
Starlark
Stars
688
Forks
721
Avg merge
15h 7m
Merged PRs (30d)
76

Description

# 🚀 feature request

### Relevant Rules

+ gazelle
+ requirements.bzl

### Description

Gazelle generates deps using the library labels directly, rather than using `requirement()` (possibly because of the [drawbacks of `requirement()`](https://github.com/bazelbuild/rules_python/issues/414)).

```starlark
# using labels
py_library(
name = "foo",
srcs = ["foo.py"],
deps = ["@pip_parse_name//boto3"],
)
```

```starlark
# using `requirement()` function
load("@pip_parse_name//:requirements.bzl", "requirement")

py_library(
name = "foo",
srcs = ["foo.py"],
deps = [requirement("boto3")],
)
```

It would be great if we could configure this on a per-package basis. Users would then be able to opt-in to using `requirement()`, making the transition from manually-built BUILD files to gazelle-generated files much easier (as the diff will be much smaller or nonexistent[^1]).

[^1]: The [docs](https://rules-python.readthedocs.io/en/latest/pypi-dependencies.html#using-third-party-packages) guide users to use `requirement()` initially, and I'm not sure how many people opt to use labels instead.

### Describe the solution you'd like

Add a new directive `gazelle:python_use_pip_requirement_function` (or similar name) that accepts 3 values:

+ **`false` (the default):** Use library labels directly. Same as current behavior.
+ **`true`:** Use `requirement("library")`
+ **`DEFAULT` or `RESET`:** reset to the default as defined by `rules_python`.

Example:

```starlark
# no directive set. Use labels directly.
py_library(
...,
deps = ["@pip_parse_name//boto3"],
)

# gazelle:python_use_pip_requirement_function false
py_library(
...,
deps = ["@pip_parse_name//boto3"],
)

# gazelle:python_use_pip_requirement_function true
load("@pip_parse_name//:requirements.bzl", "requirement")
py_library(
...,
deps = [requirement("boto3")],
)

# gazelle:python_use_pip_requirement_function DEFAULT
py_library(
...,
deps = ["@pip_parse_name//boto3"],
)
```

### Describe alternatives you've considered

None 🙃. I'm happy to hear some though.

Contributor guide

Open the contributing guide

Research direction

Start by locating Gazelle's Python dependency generation and how requirements.bzl is integrated. Review the existing directive handling and dependency-label generation before deciding where the per-package setting belongs. Done means the directive supports true, false, and the requested reset behavior, with coverage for generated labels, requirement() calls, and the load statement.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
build-system
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.