diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 27930c1025..62dac4d6a5 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -48,8 +48,8 @@ var ( buildFilenames = []string{"BUILD", "BUILD.bazel"} ) -func GetActualKindName(kind string, args language.GenerateArgs) string { - if kindOverride, ok := args.Config.KindMap[kind]; ok { +func GetActualKindName(kind string, c *config.Config) string { + if kindOverride, ok := c.KindMap[kind]; ok { return kindOverride.KindName } return kind @@ -90,9 +90,9 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } - actualPyBinaryKind := GetActualKindName(pyBinaryKind, args) - actualPyLibraryKind := GetActualKindName(pyLibraryKind, args) - actualPyTestKind := GetActualKindName(pyTestKind, args) + actualPyBinaryKind := GetActualKindName(pyBinaryKind, args.Config) + actualPyLibraryKind := GetActualKindName(pyLibraryKind, args.Config) + actualPyTestKind := GetActualKindName(pyTestKind, args.Config) pythonProjectRoot := cfg.PythonProjectRoot() diff --git a/gazelle/python/python_test.go b/gazelle/python/python_test.go index dd8c2411f1..157b989c4f 100644 --- a/gazelle/python/python_test.go +++ b/gazelle/python/python_test.go @@ -141,7 +141,6 @@ func testPath(t *testing.T, gazellePath, name string, files []bazel.RunfileEntry if err != nil { return err } - t.Logf("%q exists", strings.TrimPrefix(path, testdataDir)) return nil }) }) diff --git a/gazelle/python/resolve.go b/gazelle/python/resolve.go index 7a2ec3d68a..87a7bf5950 100644 --- a/gazelle/python/resolve.go +++ b/gazelle/python/resolve.go @@ -57,6 +57,11 @@ func (*Resolver) Name() string { return languageName } func (py *Resolver) Imports(c *config.Config, r *rule.Rule, f *rule.File) []resolve.ImportSpec { cfgs := c.Exts[languageName].(pythonconfig.Configs) cfg := cfgs[f.Pkg] + if !cfg.PerFileGeneration() && GetActualKindName(r.Kind(), c) == pyBinaryKind { + // Don't index py_binary in except in file mode, because all non-test Python files + // are in py_library already. + return nil + } srcs := r.AttrStrings("srcs") provides := make([]resolve.ImportSpec, 0, len(srcs)+1) for _, src := range srcs { diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/BUILD.in b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/BUILD.in new file mode 100644 index 0000000000..fc43208db2 --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/BUILD.in @@ -0,0 +1,3 @@ +# gazelle:python_extension enabled +# gazelle:python_library_naming_convention py_default_library +# gazelle:python_generation_mode package diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/BUILD.out b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/BUILD.out new file mode 100644 index 0000000000..fc43208db2 --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/BUILD.out @@ -0,0 +1,3 @@ +# gazelle:python_extension enabled +# gazelle:python_library_naming_convention py_default_library +# gazelle:python_generation_mode package diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/README.md b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/README.md new file mode 100644 index 0000000000..39095b5aff --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/README.md @@ -0,0 +1,2 @@ +# Import with same srcs for library and binary +This test case asserts a file with py_library and py_binary rules that include the same .py file in srcs will resolve to the py_library rule correctly. diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/WORKSPACE b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/BUILD.in b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/BUILD.in new file mode 100644 index 0000000000..f976ef1c58 --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/BUILD.in @@ -0,0 +1,8 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "bar", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = ["//foo"], +) diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/BUILD.out b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/BUILD.out new file mode 100644 index 0000000000..a93d3710cb --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/BUILD.out @@ -0,0 +1,8 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "bar", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = ["//foo:py_default_library"], +) diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/bar.py b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/bar.py new file mode 100644 index 0000000000..9935a64811 --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/bar/bar.py @@ -0,0 +1 @@ +import foo.script diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/BUILD.in b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/BUILD.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/BUILD.out b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/BUILD.out new file mode 100644 index 0000000000..fe6482a492 --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/BUILD.out @@ -0,0 +1,13 @@ +load("@rules_python//python:defs.bzl", "py_binary", "py_library") + +py_binary( + name = "script", + srcs = ["script.py"], + visibility = ["//:__subpackages__"], +) + +py_library( + name = "py_default_library", + srcs = ["script.py"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/script.py b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/script.py new file mode 100644 index 0000000000..165f69654f --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/foo/script.py @@ -0,0 +1,3 @@ + +if __name__ == "__main__": + print("Hello, world!") diff --git a/gazelle/python/testdata/import_with_same_srcs_library_and_binary/test.yaml b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/test.yaml new file mode 100644 index 0000000000..2410223e59 --- /dev/null +++ b/gazelle/python/testdata/import_with_same_srcs_library_and_binary/test.yaml @@ -0,0 +1,17 @@ +# Copyright 2023 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +expect: + exit_code: 0