bazel-contrib / bazel-contrib/rules_python

Gazelle: `python_default_visibility` Not Applied to `py_test` Targets

未关闭
#3,390 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
gazelle
主要语言
Starlark
星标
688
派生
721
平均合并
15 小时 7 分钟
30 天内合并 PR
76

描述

## 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.

贡献指南

打开贡献指南

调研方向

从 rules_python_gazelle_plugin/python/generate.go 中的 newPyTestTargetBuilder 开始,检查按包和按文件生成测试的两条路径。使用所示的 map_kind 指令和 bazel run //:gazelle 重现该问题;当 python_default_visibility 和 python_visibility 像应用于其他 Python 目标一样应用于生成的 py_test 目标时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
go, python
领域
build-system
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
停滞
描述清晰度
描述清楚
新手友好度
55/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。