bazel-contrib / bazel-contrib/rules_python
Gazelle: `python_default_visibility` Not Applied to `py_test` Targets
- Ngôn ngữ chính
- Starlark
- Star
- 688
- Fork
- 721
- Merge trung bình
- 15 giờ 7 phút
- Pull request đã merge (30 ngày)
- 76
Mô tả
## Description
The `# gazelle:python_default_visibility` directive is not being applied to `py_test` targets, even though it correctly applies to `py_library` and `py_binary` targets. This occurs when using `# gazelle:map_kind` to map to custom rule macros.
## Environment
- **rules_python version**: Latest (tested with rules_python_gazelle_plugin)
- **Gazelle version**: Latest
- **Bazel version**: 8.0+
- **Operating System**: Linux
## Reproduction Steps
1. Create a BUILD file with the following directives:
```starlark
# gazelle:map_kind py_binary py_binary @aspect_rules_py//py:defs.bzl
# gazelle:map_kind py_library py_library @aspect_rules_py//py:defs.bzl
# gazelle:map_kind py_test py_test @aspect_rules_py//py:defs.bzl
# gazelle:python_default_visibility //visibility:public
```
2. Run `bazel run //:gazelle`
3. Observe generated BUILD files
## Expected Behavior
Both `py_library` and `py_test` targets should have `visibility = ["//visibility:public"]` added:
```starlark
py_library(
name = "mylib",
srcs = ["mylib.py"],
visibility = ["//visibility:public"], # ✓ Generated correctly
)
py_test(
name = "mylib_test",
srcs = ["mylib_test.py"],
visibility = ["//visibility:public"], # ✗ NOT generated
deps = [":mylib"],
)
```
## Actual Behavior
Only `py_library` targets get the visibility attribute. `py_test` targets are generated without any visibility:
```starlark
py_library(
name = "mylib",
srcs = ["mylib.py"],
visibility = ["//visibility:public"], # ✓ Generated correctly
)
ctc_py_test(
name = "mylib_test",
srcs = ["mylib_test.py"],
# visibility is missing
deps = [":mylib"],
)
```
## Impact
This causes visibility errors when test targets need to be referenced as dependencies elsewhere in the build graph (e.g., for creating development virtual environments that include test dependencies).
Example error:
```
ERROR: /path/to/BUILD:12:12: in _py_venv_binary rule //ctc_pylibs:dev_venv:
Visibility error: target '//ctc_pylibs/auth:vault_test' is not visible from
target '//ctc_pylibs:dev_venv'
```
## Root Cause
In `rules_python_gazelle_plugin/python/generate.go`, the visibility is correctly retrieved from configuration:
```go
visibility := cfg.Visibility()
```
However, when generating `py_test` targets, the `newPyTestTargetBuilder` function (line ~412) creates targets without calling `addVisibility(visibility)`:
```go
newPyTestTargetBuilder := func(srcs *treeset.Set, pyTestTargetName string) *targetBuilder {
// ... parsing logic ...
return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel, pyFileNames, cfg.ResolveSiblingImports()).
addSrcs(srcs).
addModuleDependencies(deps).
addResolvedDependencies(annotations.includeDeps).
setAnnotations(*annotations).
generateImportsAttribute()
// ❌ Missing: .addVisibility(visibility)
}
```
In contrast, `py_library` and `py_binary` targets correctly call `addVisibility(visibility)`.
## Proposed Fix
Add `.addVisibility(visibility)` to the test target builder in `generate.go`:
```go
return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel, pyFileNames, cfg.ResolveSiblingImports()).
addSrcs(srcs).
addModuleDependencies(deps).
addResolvedDependencies(annotations.includeDeps).
setAnnotations(*annotations).
generateImportsAttribute().
addVisibility(visibility) // ← Add this line
```
This should be added in both the per-package test generation path (line ~438) and the per-file test generation path (line ~460).
## Additional Context
The `python_default_visibility` directive is documented to apply to "all python targets" according to the [directives documentation](https://rules-python.readthedocs.io/en/latest/gazelle/docs/directives.html#python-default-visibility), but in practice it only applies to non-test targets.
Similarly, the `python_visibility` directive (which appends additional visibility labels) also does not affect test targets.
Hướng dẫn đóng góp
Hướng nghiên cứu
Start in rules_python_gazelle_plugin/python/generate.go at newPyTestTargetBuilder and inspect both the per-package and per-file test-generation paths. Reproduce the issue with the shown map_kind directives and bazel run //:gazelle; done means python_default_visibility and python_visibility are applied to generated py_test targets as they are to other Python targets.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- go, python
- Lĩnh vực
- build-system
- Loại issue
- Lỗi
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 55/100