From c85c56f0fc6f0f5b4fb63624375ea59f7897863f Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Wed, 2 Jul 2025 21:24:33 -0400 Subject: [PATCH 01/38] [wip] Start work on generating py_proto_library, by creating a bunch of scaffolding & tests --- gazelle/python/BUILD.bazel | 5 ++++- gazelle/python/configure.go | 7 ++++++ gazelle/python/kinds.go | 22 +++++++++++++------ .../directive_py_generate_proto/README.md | 11 ++++++++++ .../test1_default_with_proto/BUILD.in | 10 +++++++++ .../test1_default_with_proto/BUILD.out | 17 ++++++++++++++ .../test1_default_with_proto/foo.proto | 7 ++++++ .../test2_default_without_proto/BUILD.in | 2 ++ .../test2_default_without_proto/BUILD.out | 2 ++ .../test3_disabled_with_proto/BUILD.in | 9 ++++++++ .../test3_disabled_with_proto/BUILD.out | 9 ++++++++ .../test3_disabled_with_proto/foo.proto | 7 ++++++ .../test4_disabled_without_proto/BUILD.in | 1 + .../test4_disabled_without_proto/BUILD.out | 1 + .../test5_enabled_with_proto/BUILD.in | 9 ++++++++ .../test5_enabled_with_proto/BUILD.out | 15 +++++++++++++ .../test5_enabled_with_proto/foo.proto | 7 ++++++ .../test6_enabled_without_proto/BUILD.in | 1 + .../test6_enabled_without_proto/BUILD.out | 1 + gazelle/pythonconfig/pythonconfig.go | 18 +++++++++++++++ 20 files changed, 153 insertions(+), 8 deletions(-) create mode 100644 gazelle/python/testdata/directive_py_generate_proto/README.md create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.out create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/foo.proto create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out diff --git a/gazelle/python/BUILD.bazel b/gazelle/python/BUILD.bazel index eb2d72e5eb..3c47d5add2 100644 --- a/gazelle/python/BUILD.bazel +++ b/gazelle/python/BUILD.bazel @@ -91,7 +91,10 @@ gazelle_test( gazelle_binary( name = "gazelle_binary", - languages = [":python"], + languages = [ + "@bazel_gazelle//language/proto", + ":python", + ], visibility = ["//visibility:public"], ) diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index db80fc1a22..0be3c5fdf9 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -70,6 +70,7 @@ func (py *Configurer) KnownDirectives() []string { pythonconfig.LabelNormalization, pythonconfig.GeneratePyiDeps, pythonconfig.ExperimentalAllowRelativeImports, + pythonconfig.PyGenerateProto, } } @@ -237,6 +238,12 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { log.Fatal(err) } config.SetGeneratePyiDeps(v) + case pythonconfig.PyGenerateProto: + v, err := strconv.ParseBool(strings.TrimSpace(d.Value)) + if err != nil { + log.Fatal(err) + } + config.SetPyGenerateProto(v) } } diff --git a/gazelle/python/kinds.go b/gazelle/python/kinds.go index ff3f6ce829..19121fff2c 100644 --- a/gazelle/python/kinds.go +++ b/gazelle/python/kinds.go @@ -19,9 +19,10 @@ import ( ) const ( - pyBinaryKind = "py_binary" - pyLibraryKind = "py_library" - pyTestKind = "py_test" + pyBinaryKind = "py_binary" + pyLibraryKind = "py_library" + pyProtoLibraryKind = "py_proto_library" + pyTestKind = "py_test" ) // Kinds returns a map that maps rule names (kinds) and information on how to @@ -32,7 +33,7 @@ func (*Python) Kinds() map[string]rule.KindInfo { var pyKinds = map[string]rule.KindInfo{ pyBinaryKind: { - MatchAny: false, + MatchAny: false, MatchAttrs: []string{"srcs"}, NonEmptyAttrs: map[string]bool{ "deps": true, @@ -45,7 +46,7 @@ var pyKinds = map[string]rule.KindInfo{ "srcs": true, }, ResolveAttrs: map[string]bool{ - "deps": true, + "deps": true, "pyi_deps": true, }, }, @@ -62,10 +63,16 @@ var pyKinds = map[string]rule.KindInfo{ "srcs": true, }, ResolveAttrs: map[string]bool{ - "deps": true, + "deps": true, "pyi_deps": true, }, }, + pyProtoLibraryKind: { + NonEmptyAttrs: map[string]bool{ + "deps": true, + }, + ResolveAttrs: map[string]bool{"deps": true}, + }, pyTestKind: { MatchAny: false, NonEmptyAttrs: map[string]bool{ @@ -79,7 +86,7 @@ var pyKinds = map[string]rule.KindInfo{ "srcs": true, }, ResolveAttrs: map[string]bool{ - "deps": true, + "deps": true, "pyi_deps": true, }, }, @@ -98,6 +105,7 @@ var pyLoads = []rule.LoadInfo{ Symbols: []string{ pyBinaryKind, pyLibraryKind, + pyProtoLibraryKind, pyTestKind, }, }, diff --git a/gazelle/python/testdata/directive_py_generate_proto/README.md b/gazelle/python/testdata/directive_py_generate_proto/README.md new file mode 100644 index 0000000000..11dd6299ba --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/README.md @@ -0,0 +1,11 @@ +# Directive: `py_generate_proto` + +This test case asserts that the `# gazelle:py_generate_proto` directive +correctly: + +1. Uses the default value when `py_generate_proto` is not set. +2. Generates (or not) `py_proto_library` when `py_generate_proto` is set, based on whether a proto is present. +3. Generates new `py_proto_library` with dependencies, when appropriate. +4. Removes `py_proto_library` dependencies, when unnecessary. + +[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in new file mode 100644 index 0000000000..678becdbf9 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in @@ -0,0 +1,10 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# py_generate_proto is not set. +# nevertheless, py_proto_library is generated. + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//visibility:public"], +) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out new file mode 100644 index 0000000000..ae37f4ac55 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out @@ -0,0 +1,17 @@ +load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# py_generate_proto is not set. +# nevertheless, py_proto_library is generated. + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//visibility:public"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//visibility:public"], + deps = [":foo_proto"], +) \ No newline at end of file diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto new file mode 100644 index 0000000000..738dbd2657 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo.bar; + +message Foo { + string bar = 1; +} \ No newline at end of file diff --git a/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.in new file mode 100644 index 0000000000..1a0fb1aa51 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.in @@ -0,0 +1,2 @@ +# py_generate_proto is not set. +# Since no proto is present, no targets are generated. diff --git a/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.out new file mode 100644 index 0000000000..1a0fb1aa51 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.out @@ -0,0 +1,2 @@ +# py_generate_proto is not set. +# Since no proto is present, no targets are generated. diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in new file mode 100644 index 0000000000..681137d03d --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:py_generate_proto false + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//visibility:public"], +) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out new file mode 100644 index 0000000000..681137d03d --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:py_generate_proto false + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//visibility:public"], +) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/foo.proto b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/foo.proto new file mode 100644 index 0000000000..738dbd2657 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo.bar; + +message Foo { + string bar = 1; +} \ No newline at end of file diff --git a/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in new file mode 100644 index 0000000000..fe066d340c --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in @@ -0,0 +1 @@ +# gazelle:py_generate_proto false diff --git a/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out new file mode 100644 index 0000000000..fe066d340c --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out @@ -0,0 +1 @@ +# gazelle:py_generate_proto false diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in new file mode 100644 index 0000000000..9e5ffe7f5e --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:py_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//visibility:public"], +) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out new file mode 100644 index 0000000000..b79ac712e7 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out @@ -0,0 +1,15 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:py_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//visibility:public"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//visibility:public"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto new file mode 100644 index 0000000000..022e29ae69 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo.bar; + +message Foo { + string bar = 1; +} diff --git a/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in new file mode 100644 index 0000000000..0ef167c499 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in @@ -0,0 +1 @@ +# gazelle:py_generate_proto true diff --git a/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out new file mode 100644 index 0000000000..0ef167c499 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out @@ -0,0 +1 @@ +# gazelle:py_generate_proto true diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index 8bf79cbc15..a33b079a42 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -98,6 +98,9 @@ const ( // separate pyi_deps attribute or merge type-checking dependencies into deps. // Defaults to false for backward compatibility. GeneratePyiDeps = "python_generate_pyi_deps" + // PyGenerateProto represents the directive that controls whether to generate + // py_generate_proto targets. + PyGenerateProto = "py_generate_proto" ) // GenerationModeType represents one of the generation modes for the Python @@ -186,6 +189,7 @@ type Config struct { labelNormalization LabelNormalizationType experimentalAllowRelativeImports bool generatePyiDeps bool + pyGenerateProto bool } type LabelNormalizationType int @@ -223,6 +227,7 @@ func New( labelNormalization: DefaultLabelNormalizationType, experimentalAllowRelativeImports: false, generatePyiDeps: false, + pyGenerateProto: true, } } @@ -257,6 +262,7 @@ func (c *Config) NewChild() *Config { labelNormalization: c.labelNormalization, experimentalAllowRelativeImports: c.experimentalAllowRelativeImports, generatePyiDeps: c.generatePyiDeps, + pyGenerateProto: c.pyGenerateProto, } } @@ -555,6 +561,18 @@ func (c *Config) GeneratePyiDeps() bool { return c.generatePyiDeps } +// SetPyGenerateProto sets whether pyi_deps attribute should be generated separately +// or type-checking dependencies should be merged into the regular deps attribute. +func (c *Config) SetPyGenerateProto(pyGenerateProto bool) { + c.pyGenerateProto = pyGenerateProto +} + +// PyGenerateProto returns whether pyi_deps attribute should be generated separately +// or type-checking dependencies should be merged into the regular deps attribute. +func (c *Config) PyGenerateProto() bool { + return c.pyGenerateProto +} + // FormatThirdPartyDependency returns a label to a third-party dependency performing all formating and normalization. func (c *Config) FormatThirdPartyDependency(repositoryName string, distributionName string) label.Label { conventionalDistributionName := strings.ReplaceAll(c.labelConvention, distributionNameLabelConventionSubstitution, distributionName) From 8b5a91b434aec1975a9b750157f8b24901a39fb5 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 00:12:06 -0400 Subject: [PATCH 02/38] Remove test cases that don't make any sense; py_proto_library runs on the singular input proto --- gazelle/python/testdata/directive_py_generate_proto/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/gazelle/python/testdata/directive_py_generate_proto/README.md b/gazelle/python/testdata/directive_py_generate_proto/README.md index 11dd6299ba..dd3bf3b285 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/README.md +++ b/gazelle/python/testdata/directive_py_generate_proto/README.md @@ -5,7 +5,5 @@ correctly: 1. Uses the default value when `py_generate_proto` is not set. 2. Generates (or not) `py_proto_library` when `py_generate_proto` is set, based on whether a proto is present. -3. Generates new `py_proto_library` with dependencies, when appropriate. -4. Removes `py_proto_library` dependencies, when unnecessary. [gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 From d8f9b1a8a0111ab327249d4fab5b3d4bfa09cee1 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 00:17:12 -0400 Subject: [PATCH 03/38] Add additional test fixtures required to run tests --- .../directive_py_generate_proto/WORKSPACE | 1 + .../directive_py_generate_proto/test.yaml | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 gazelle/python/testdata/directive_py_generate_proto/WORKSPACE create mode 100644 gazelle/python/testdata/directive_py_generate_proto/test.yaml diff --git a/gazelle/python/testdata/directive_py_generate_proto/WORKSPACE b/gazelle/python/testdata/directive_py_generate_proto/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/directive_py_generate_proto/test.yaml b/gazelle/python/testdata/directive_py_generate_proto/test.yaml new file mode 100644 index 0000000000..2410223e59 --- /dev/null +++ b/gazelle/python/testdata/directive_py_generate_proto/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 From caf5d6ed4eef2bd32a40df3bbf6dc7928c13570a Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 00:54:02 -0400 Subject: [PATCH 04/38] [wip] Start working on generate.go --- gazelle/python/BUILD.bazel | 1 + gazelle/python/generate.go | 53 ++++++++++++++++--- .../test1_default_with_proto/foo.proto | 2 +- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/gazelle/python/BUILD.bazel b/gazelle/python/BUILD.bazel index 3c47d5add2..11b059771e 100644 --- a/gazelle/python/BUILD.bazel +++ b/gazelle/python/BUILD.bazel @@ -34,6 +34,7 @@ go_library( "@bazel_gazelle//config:go_default_library", "@bazel_gazelle//label:go_default_library", "@bazel_gazelle//language:go_default_library", + "@bazel_gazelle//language/proto:go_default_library", "@bazel_gazelle//repo:go_default_library", "@bazel_gazelle//resolve:go_default_library", "@bazel_gazelle//rule:go_default_library", diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index c1edec4731..f784bc8417 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -26,6 +26,7 @@ import ( "github.com/bazelbuild/bazel-gazelle/config" "github.com/bazelbuild/bazel-gazelle/label" "github.com/bazelbuild/bazel-gazelle/language" + "github.com/bazelbuild/bazel-gazelle/language/proto" "github.com/bazelbuild/bazel-gazelle/rule" "github.com/bmatcuk/doublestar/v4" "github.com/emirpasic/gods/lists/singlylinkedlist" @@ -88,12 +89,20 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } + var result language.GenerateResult + result.Gen = make([]*rule.Rule, 0) + + pythonProjectRoot := cfg.PythonProjectRoot() + visibility := cfg.Visibility() + + if cfg.PyGenerateProto() { + generateProtoLibraries(args, pythonProjectRoot, visibility, &result) + } + actualPyBinaryKind := GetActualKindName(pyBinaryKind, args) actualPyLibraryKind := GetActualKindName(pyLibraryKind, args) actualPyTestKind := GetActualKindName(pyTestKind, args) - pythonProjectRoot := cfg.PythonProjectRoot() - packageName := filepath.Base(args.Dir) pyLibraryFilenames := treeset.NewWith(godsutils.StringComparator) @@ -221,10 +230,6 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } parser := newPython3Parser(args.Config.RepoRoot, args.Rel, cfg.IgnoresDependency) - visibility := cfg.Visibility() - - var result language.GenerateResult - result.Gen = make([]*rule.Rule, 0) collisionErrors := singlylinkedlist.New() @@ -551,3 +556,39 @@ func ensureNoCollision(file *rule.File, targetName, kind string) error { } return nil } + +func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string, visibility []string, res *language.GenerateResult) { + // First, enumerate all the proto_library in this package. + var protoRuleNames []string + protoPackages := make(map[string]proto.Package) + protoFileInfo := make(map[string]proto.FileInfo) + for _, r := range args.OtherGen { + if r.Kind() != "proto_library" { + continue + } + pkg := r.PrivateAttr(proto.PackageKey).(proto.Package) + protoPackages[r.Name()] = pkg + for name, info := range pkg.Files { + protoFileInfo[name] = info + } + protoRuleNames = append(protoRuleNames, r.Name()) + } + sort.Strings(protoRuleNames) + + // Now generate a py_proto_library for each proto_library. + for _, protoRuleName := range protoRuleNames { + pyProtoLibraryName := protoRuleName + "_py_pb2" + + rppl := rule.NewRule("py_proto_library", pyProtoLibraryName) + rppl.SetAttr("deps", []string{":" + protoRuleName}) + + emptySiblings := treeset.Set{} + pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). + addVisibility(visibility). + addResolvedDependency(":" + protoRuleName). + generateImportsAttribute().build() + + res.Gen = append(res.Gen, pyProtoLibrary) + res.Imports = append(res.Imports, pyProtoLibrary.PrivateAttr(config.GazelleImportsKey)) + } +} diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto index 738dbd2657..cd95069975 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto +++ b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package foo.bar; +package foo; message Foo { string bar = 1; From b7126963ec3e29b0a2a109337beb57788ce0dfcf Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 01:00:18 -0400 Subject: [PATCH 05/38] Fix visibility in tests --- .../test1_default_with_proto/BUILD.in | 2 +- .../test1_default_with_proto/BUILD.out | 4 ++-- .../test3_disabled_with_proto/BUILD.in | 2 +- .../test3_disabled_with_proto/BUILD.out | 2 +- .../test5_enabled_with_proto/BUILD.in | 2 +- .../test5_enabled_with_proto/BUILD.out | 5 +++-- .../test5_enabled_with_proto/foo.proto | 2 +- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in index 678becdbf9..6ad58ea020 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in +++ b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in @@ -6,5 +6,5 @@ load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "foo_proto", srcs = ["foo.proto"], - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], ) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out index ae37f4ac55..6c0c09354a 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out @@ -7,11 +7,11 @@ load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "foo_proto", srcs = ["foo.proto"], - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], ) py_proto_library( name = "foo_proto_py_pb2", - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) \ No newline at end of file diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in index 681137d03d..48f0861a72 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in +++ b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in @@ -5,5 +5,5 @@ load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "foo_proto", srcs = ["foo.proto"], - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], ) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out index 681137d03d..48f0861a72 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out @@ -5,5 +5,5 @@ load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "foo_proto", srcs = ["foo.proto"], - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], ) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in index 9e5ffe7f5e..963ff1a03e 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in +++ b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in @@ -5,5 +5,5 @@ load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "foo_proto", srcs = ["foo.proto"], - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], ) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out index b79ac712e7..450f8000ee 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out @@ -1,3 +1,4 @@ +load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") # gazelle:py_generate_proto true @@ -5,11 +6,11 @@ load("@rules_proto//proto:defs.bzl", "proto_library") proto_library( name = "foo_proto", srcs = ["foo.proto"], - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], ) py_proto_library( name = "foo_proto_py_pb2", - visibility = ["//visibility:public"], + visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto index 022e29ae69..fe2af27aa6 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto +++ b/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package foo.bar; +package foo; message Foo { string bar = 1; From 3186761b94d53380afda14b971ee594a326175d6 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 01:00:25 -0400 Subject: [PATCH 06/38] Load py_proto_library from protobuf repository, since rules_proto's copy is deprecated --- gazelle/python/kinds.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gazelle/python/kinds.go b/gazelle/python/kinds.go index 19121fff2c..be38147ac2 100644 --- a/gazelle/python/kinds.go +++ b/gazelle/python/kinds.go @@ -105,8 +105,13 @@ var pyLoads = []rule.LoadInfo{ Symbols: []string{ pyBinaryKind, pyLibraryKind, - pyProtoLibraryKind, pyTestKind, }, }, + { + Name: "@protobuf//bazel:py_proto_library.bzl", + Symbols: []string{ + pyProtoLibraryKind, + }, + }, } From e0730559c38e82f41d7818618c90e71e9e582656 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 01:02:12 -0400 Subject: [PATCH 07/38] Remove unneessary code --- gazelle/python/generate.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index f784bc8417..a5a69a6068 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -26,7 +26,6 @@ import ( "github.com/bazelbuild/bazel-gazelle/config" "github.com/bazelbuild/bazel-gazelle/label" "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/language/proto" "github.com/bazelbuild/bazel-gazelle/rule" "github.com/bmatcuk/doublestar/v4" "github.com/emirpasic/gods/lists/singlylinkedlist" @@ -560,17 +559,10 @@ func ensureNoCollision(file *rule.File, targetName, kind string) error { func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string, visibility []string, res *language.GenerateResult) { // First, enumerate all the proto_library in this package. var protoRuleNames []string - protoPackages := make(map[string]proto.Package) - protoFileInfo := make(map[string]proto.FileInfo) for _, r := range args.OtherGen { if r.Kind() != "proto_library" { continue } - pkg := r.PrivateAttr(proto.PackageKey).(proto.Package) - protoPackages[r.Name()] = pkg - for name, info := range pkg.Files { - protoFileInfo[name] = info - } protoRuleNames = append(protoRuleNames, r.Name()) } sort.Strings(protoRuleNames) From aa9f4aaca736f8df342c56db7ca7be16641090e6 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 01:05:58 -0400 Subject: [PATCH 08/38] Delete some more unused stuff --- gazelle/python/generate.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index a5a69a6068..e44772c540 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -571,9 +571,6 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string for _, protoRuleName := range protoRuleNames { pyProtoLibraryName := protoRuleName + "_py_pb2" - rppl := rule.NewRule("py_proto_library", pyProtoLibraryName) - rppl.SetAttr("deps", []string{":" + protoRuleName}) - emptySiblings := treeset.Set{} pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). addVisibility(visibility). From b6df17b896f6466a554f94995839cf5e385b2c32 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 01:24:16 -0400 Subject: [PATCH 09/38] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index da59ecf8b5..0020dd4a65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,8 @@ END_UNRELEASED_TEMPLATE * (gazelle) New directive `gazelle:python_generate_pyi_deps`; when `true`, dependencies added to satisfy type-only imports (`if TYPE_CHECKING`) and type stub packages are added to `pyi_deps` instead of `deps`. +* (gazelle) New directive `gazelle:py_generate_proto`; when `true` (by default), + Gazelle generates `py_proto_library` rules for `proto_library`. {#v0-0-0-removed} ### Removed From d794ac144e236c9eb90af5ea1ca0c9f9cbc0ce84 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 01:30:32 -0400 Subject: [PATCH 10/38] Have a sudden change-of-heart and call it python_generate_proto, to align with the other directives --- CHANGELOG.md | 2 +- gazelle/python/configure.go | 6 ++--- gazelle/python/generate.go | 2 +- .../directive_py_generate_proto/README.md | 9 ------- .../test4_disabled_without_proto/BUILD.in | 1 - .../test4_disabled_without_proto/BUILD.out | 1 - .../test6_enabled_without_proto/BUILD.in | 1 - .../test6_enabled_without_proto/BUILD.out | 1 - .../directive_python_generate_proto/README.md | 9 +++++++ .../WORKSPACE | 0 .../test.yaml | 0 .../test1_default_with_proto/BUILD.in | 2 +- .../test1_default_with_proto/BUILD.out | 2 +- .../test1_default_with_proto/foo.proto | 0 .../test2_default_without_proto/BUILD.in | 2 +- .../test2_default_without_proto/BUILD.out | 2 +- .../test3_disabled_with_proto/BUILD.in | 2 +- .../test3_disabled_with_proto/BUILD.out | 2 +- .../test3_disabled_with_proto/foo.proto | 0 .../test4_disabled_without_proto/BUILD.in | 1 + .../test4_disabled_without_proto/BUILD.out | 1 + .../test5_enabled_with_proto/BUILD.in | 2 +- .../test5_enabled_with_proto/BUILD.out | 2 +- .../test5_enabled_with_proto/foo.proto | 0 .../test6_enabled_without_proto/BUILD.in | 1 + .../test6_enabled_without_proto/BUILD.out | 1 + gazelle/pythonconfig/pythonconfig.go | 26 +++++++++---------- 27 files changed, 38 insertions(+), 40 deletions(-) delete mode 100644 gazelle/python/testdata/directive_py_generate_proto/README.md delete mode 100644 gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in delete mode 100644 gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out delete mode 100644 gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in delete mode 100644 gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_generate_proto/README.md rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/WORKSPACE (100%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test.yaml (100%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test1_default_with_proto/BUILD.in (85%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test1_default_with_proto/BUILD.out (91%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test1_default_with_proto/foo.proto (100%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test2_default_without_proto/BUILD.in (60%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test2_default_without_proto/BUILD.out (60%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test3_disabled_with_proto/BUILD.in (81%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test3_disabled_with_proto/BUILD.out (81%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test3_disabled_with_proto/foo.proto (100%) create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.out rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test5_enabled_with_proto/BUILD.in (81%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test5_enabled_with_proto/BUILD.out (90%) rename gazelle/python/testdata/{directive_py_generate_proto => directive_python_generate_proto}/test5_enabled_with_proto/foo.proto (100%) create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.out diff --git a/CHANGELOG.md b/CHANGELOG.md index 0020dd4a65..0a429569e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,7 +78,7 @@ END_UNRELEASED_TEMPLATE * (gazelle) New directive `gazelle:python_generate_pyi_deps`; when `true`, dependencies added to satisfy type-only imports (`if TYPE_CHECKING`) and type stub packages are added to `pyi_deps` instead of `deps`. -* (gazelle) New directive `gazelle:py_generate_proto`; when `true` (by default), +* (gazelle) New directive `gazelle:python_generate_proto`; when `true` (by default), Gazelle generates `py_proto_library` rules for `proto_library`. {#v0-0-0-removed} diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index 0be3c5fdf9..7131be283d 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -70,7 +70,7 @@ func (py *Configurer) KnownDirectives() []string { pythonconfig.LabelNormalization, pythonconfig.GeneratePyiDeps, pythonconfig.ExperimentalAllowRelativeImports, - pythonconfig.PyGenerateProto, + pythonconfig.GenerateProto, } } @@ -238,12 +238,12 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { log.Fatal(err) } config.SetGeneratePyiDeps(v) - case pythonconfig.PyGenerateProto: + case pythonconfig.GenerateProto: v, err := strconv.ParseBool(strings.TrimSpace(d.Value)) if err != nil { log.Fatal(err) } - config.SetPyGenerateProto(v) + config.SetGenerateProto(v) } } diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index e44772c540..0ba6508c99 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -94,7 +94,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes pythonProjectRoot := cfg.PythonProjectRoot() visibility := cfg.Visibility() - if cfg.PyGenerateProto() { + if cfg.GenerateProto() { generateProtoLibraries(args, pythonProjectRoot, visibility, &result) } diff --git a/gazelle/python/testdata/directive_py_generate_proto/README.md b/gazelle/python/testdata/directive_py_generate_proto/README.md deleted file mode 100644 index dd3bf3b285..0000000000 --- a/gazelle/python/testdata/directive_py_generate_proto/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Directive: `py_generate_proto` - -This test case asserts that the `# gazelle:py_generate_proto` directive -correctly: - -1. Uses the default value when `py_generate_proto` is not set. -2. Generates (or not) `py_proto_library` when `py_generate_proto` is set, based on whether a proto is present. - -[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in deleted file mode 100644 index fe066d340c..0000000000 --- a/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.in +++ /dev/null @@ -1 +0,0 @@ -# gazelle:py_generate_proto false diff --git a/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out deleted file mode 100644 index fe066d340c..0000000000 --- a/gazelle/python/testdata/directive_py_generate_proto/test4_disabled_without_proto/BUILD.out +++ /dev/null @@ -1 +0,0 @@ -# gazelle:py_generate_proto false diff --git a/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in b/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in deleted file mode 100644 index 0ef167c499..0000000000 --- a/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.in +++ /dev/null @@ -1 +0,0 @@ -# gazelle:py_generate_proto true diff --git a/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out b/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out deleted file mode 100644 index 0ef167c499..0000000000 --- a/gazelle/python/testdata/directive_py_generate_proto/test6_enabled_without_proto/BUILD.out +++ /dev/null @@ -1 +0,0 @@ -# gazelle:py_generate_proto true diff --git a/gazelle/python/testdata/directive_python_generate_proto/README.md b/gazelle/python/testdata/directive_python_generate_proto/README.md new file mode 100644 index 0000000000..54261f47ca --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/README.md @@ -0,0 +1,9 @@ +# Directive: `python_generate_proto` + +This test case asserts that the `# gazelle:python_generate_proto` directive +correctly: + +1. Uses the default value when `python_generate_proto` is not set. +2. Generates (or not) `py_proto_library` when `python_generate_proto` is set, based on whether a proto is present. + +[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_py_generate_proto/WORKSPACE b/gazelle/python/testdata/directive_python_generate_proto/WORKSPACE similarity index 100% rename from gazelle/python/testdata/directive_py_generate_proto/WORKSPACE rename to gazelle/python/testdata/directive_python_generate_proto/WORKSPACE diff --git a/gazelle/python/testdata/directive_py_generate_proto/test.yaml b/gazelle/python/testdata/directive_python_generate_proto/test.yaml similarity index 100% rename from gazelle/python/testdata/directive_py_generate_proto/test.yaml rename to gazelle/python/testdata/directive_python_generate_proto/test.yaml diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in similarity index 85% rename from gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in rename to gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in index 6ad58ea020..3366a79fee 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in @@ -1,6 +1,6 @@ load("@rules_proto//proto:defs.bzl", "proto_library") -# py_generate_proto is not set. +# python_generate_proto is not set. # nevertheless, py_proto_library is generated. proto_library( diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out similarity index 91% rename from gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out rename to gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out index 6c0c09354a..9c702afa2f 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out @@ -1,7 +1,7 @@ load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") -# py_generate_proto is not set. +# python_generate_proto is not set. # nevertheless, py_proto_library is generated. proto_library( diff --git a/gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/foo.proto similarity index 100% rename from gazelle/python/testdata/directive_py_generate_proto/test1_default_with_proto/foo.proto rename to gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/foo.proto diff --git a/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in similarity index 60% rename from gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.in rename to gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in index 1a0fb1aa51..602431817f 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in @@ -1,2 +1,2 @@ -# py_generate_proto is not set. +# python_generate_proto is not set. # Since no proto is present, no targets are generated. diff --git a/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out similarity index 60% rename from gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.out rename to gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out index 1a0fb1aa51..602431817f 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test2_default_without_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out @@ -1,2 +1,2 @@ -# py_generate_proto is not set. +# python_generate_proto is not set. # Since no proto is present, no targets are generated. diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.in similarity index 81% rename from gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in rename to gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.in index 48f0861a72..62fd4be661 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.in @@ -1,6 +1,6 @@ load("@rules_proto//proto:defs.bzl", "proto_library") -# gazelle:py_generate_proto false +# gazelle:python_generate_proto false proto_library( name = "foo_proto", diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.out similarity index 81% rename from gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out rename to gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.out index 48f0861a72..62fd4be661 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/BUILD.out @@ -1,6 +1,6 @@ load("@rules_proto//proto:defs.bzl", "proto_library") -# gazelle:py_generate_proto false +# gazelle:python_generate_proto false proto_library( name = "foo_proto", diff --git a/gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/foo.proto b/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/foo.proto similarity index 100% rename from gazelle/python/testdata/directive_py_generate_proto/test3_disabled_with_proto/foo.proto rename to gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/foo.proto diff --git a/gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.in new file mode 100644 index 0000000000..b283b5fb51 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_generate_proto false diff --git a/gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.out new file mode 100644 index 0000000000..b283b5fb51 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test4_disabled_without_proto/BUILD.out @@ -0,0 +1 @@ +# gazelle:python_generate_proto false diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.in similarity index 81% rename from gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in rename to gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.in index 963ff1a03e..4713404b19 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.in @@ -1,6 +1,6 @@ load("@rules_proto//proto:defs.bzl", "proto_library") -# gazelle:py_generate_proto true +# gazelle:python_generate_proto true proto_library( name = "foo_proto", diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out similarity index 90% rename from gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out rename to gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out index 450f8000ee..2cb2c4c362 100644 --- a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out @@ -1,7 +1,7 @@ load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") -# gazelle:py_generate_proto true +# gazelle:python_generate_proto true proto_library( name = "foo_proto", diff --git a/gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/foo.proto similarity index 100% rename from gazelle/python/testdata/directive_py_generate_proto/test5_enabled_with_proto/foo.proto rename to gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/foo.proto diff --git a/gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.in new file mode 100644 index 0000000000..ce3eec6001 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_generate_proto true diff --git a/gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.out new file mode 100644 index 0000000000..ce3eec6001 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test6_enabled_without_proto/BUILD.out @@ -0,0 +1 @@ +# gazelle:python_generate_proto true diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index a33b079a42..136e5f4af2 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -98,9 +98,9 @@ const ( // separate pyi_deps attribute or merge type-checking dependencies into deps. // Defaults to false for backward compatibility. GeneratePyiDeps = "python_generate_pyi_deps" - // PyGenerateProto represents the directive that controls whether to generate - // py_generate_proto targets. - PyGenerateProto = "py_generate_proto" + // GenerateProto represents the directive that controls whether to generate + // python_generate_proto targets. + GenerateProto = "python_generate_proto" ) // GenerationModeType represents one of the generation modes for the Python @@ -189,7 +189,7 @@ type Config struct { labelNormalization LabelNormalizationType experimentalAllowRelativeImports bool generatePyiDeps bool - pyGenerateProto bool + generateProto bool } type LabelNormalizationType int @@ -227,7 +227,7 @@ func New( labelNormalization: DefaultLabelNormalizationType, experimentalAllowRelativeImports: false, generatePyiDeps: false, - pyGenerateProto: true, + generateProto: true, } } @@ -262,7 +262,7 @@ func (c *Config) NewChild() *Config { labelNormalization: c.labelNormalization, experimentalAllowRelativeImports: c.experimentalAllowRelativeImports, generatePyiDeps: c.generatePyiDeps, - pyGenerateProto: c.pyGenerateProto, + generateProto: c.generateProto, } } @@ -561,16 +561,14 @@ func (c *Config) GeneratePyiDeps() bool { return c.generatePyiDeps } -// SetPyGenerateProto sets whether pyi_deps attribute should be generated separately -// or type-checking dependencies should be merged into the regular deps attribute. -func (c *Config) SetPyGenerateProto(pyGenerateProto bool) { - c.pyGenerateProto = pyGenerateProto +// SetGenerateProto sets whether py_proto_library should be generated for proto_library. +func (c *Config) SetGenerateProto(generateProto bool) { + c.generateProto = generateProto } -// PyGenerateProto returns whether pyi_deps attribute should be generated separately -// or type-checking dependencies should be merged into the regular deps attribute. -func (c *Config) PyGenerateProto() bool { - return c.pyGenerateProto +// GenerateProto returns whether py_proto_library should be generated for proto_library. +func (c *Config) GenerateProto() bool { + return c.generateProto } // FormatThirdPartyDependency returns a label to a third-party dependency performing all formating and normalization. From cad6849a27161ba96d0e8e9c82cc8b99df6cde32 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Thu, 3 Jul 2025 01:32:35 -0400 Subject: [PATCH 11/38] Update README.md --- gazelle/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gazelle/README.md b/gazelle/README.md index 3dc8e12a0a..ceea53964d 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -224,6 +224,8 @@ Python-specific directives are as follows: | Controls whether Gazelle resolves dependencies for import statements that use paths relative to the current package. Can be "true" or "false".| | `# gazelle:python_generate_pyi_deps` | `false` | | Controls whether to generate a separate `pyi_deps` attribute for type-checking dependencies or merge them into the regular `deps` attribute. When `false` (default), type-checking dependencies are merged into `deps` for backward compatibility. When `true`, generates separate `pyi_deps`. Imports in blocks with the format `if typing.TYPE_CHECKING:`/`if TYPE_CHECKING:` and type-only stub packages (eg. boto3-stubs) are recognized as type-checking dependencies. | +| `# gazelle:python_generate_proto` | `true` | +| Controls whether to generate a `py_proto_library` for each `proto_library` in the package. By default we load this rule from the `@protobuf` repository; use `gazelle:map_kind` if you need to load this from somewhere else. | #### Directive: `python_root`: From a0e4f5f32451897e17013347946f1bc167aa2a7b Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Fri, 4 Jul 2025 20:32:28 -0400 Subject: [PATCH 12/38] Don't repeatedly initialize a variable --- gazelle/python/generate.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 0ba6508c99..3060eed845 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -568,10 +568,9 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string sort.Strings(protoRuleNames) // Now generate a py_proto_library for each proto_library. + emptySiblings := treeset.Set{} for _, protoRuleName := range protoRuleNames { pyProtoLibraryName := protoRuleName + "_py_pb2" - - emptySiblings := treeset.Set{} pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). addVisibility(visibility). addResolvedDependency(":" + protoRuleName). From 161cc518f0168dcd740c698a47934f78ffd3469f Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Fri, 4 Jul 2025 20:44:03 -0400 Subject: [PATCH 13/38] Add test enforcing that unnecessary rules are removed, and change logic to implement this --- gazelle/python/generate.go | 22 ++++++++++++++++++- .../test7_removes_when_unnecessary/BUILD.in | 16 ++++++++++++++ .../test7_removes_when_unnecessary/BUILD.out | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.out diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 3060eed845..0e9f2e7a6b 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -94,7 +94,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes pythonProjectRoot := cfg.PythonProjectRoot() visibility := cfg.Visibility() - if cfg.GenerateProto() { + if cfg.GenerateProto() && args.File != nil { generateProtoLibraries(args, pythonProjectRoot, visibility, &result) } @@ -567,6 +567,13 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string } sort.Strings(protoRuleNames) + pyProtoRules := map[string]bool{} + for _, r := range args.File.Rules { + if r.Kind() == "py_proto_library" { + pyProtoRules[r.Name()] = false + } + } + // Now generate a py_proto_library for each proto_library. emptySiblings := treeset.Set{} for _, protoRuleName := range protoRuleNames { @@ -578,5 +585,18 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string res.Gen = append(res.Gen, pyProtoLibrary) res.Imports = append(res.Imports, pyProtoLibrary.PrivateAttr(config.GazelleImportsKey)) + pyProtoRules[pyProtoLibrary.Name()] = true + + } + + // Finally, emit an empty rule for each pre-existing py_proto_library that we didn't already generate. + for ruleName, generated := range pyProtoRules { + if generated { + continue + } + + emptyRule := newTargetBuilder(pyProtoLibraryKind, ruleName, pythonProjectRoot, args.Rel, &emptySiblings).build() + res.Empty = append(res.Empty, emptyRule) } + } diff --git a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in new file mode 100644 index 0000000000..2cb2c4c362 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in @@ -0,0 +1,16 @@ +load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.out new file mode 100644 index 0000000000..ce3eec6001 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.out @@ -0,0 +1 @@ +# gazelle:python_generate_proto true From fc7fa08e99df1c26951014d9cb5452af5a575316 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Fri, 4 Jul 2025 20:48:00 -0400 Subject: [PATCH 14/38] Add a tiny comment --- gazelle/python/generate.go | 1 + 1 file changed, 1 insertion(+) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 0e9f2e7a6b..49f95e8e71 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -567,6 +567,7 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string } sort.Strings(protoRuleNames) + // Next, enumerate all the pre-existing py_proto_library in this package, so we can delete unnecessary rules later. pyProtoRules := map[string]bool{} for _, r := range args.File.Rules { if r.Kind() == "py_proto_library" { From 48532075e52972ca571c2f2e6261f13dfb12792a Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 17:48:08 -0400 Subject: [PATCH 15/38] Default python_generate_proto to false, and update tests --- CHANGELOG.md | 4 ++-- gazelle/README.md | 2 +- .../test1_default_with_proto/BUILD.in | 3 +-- .../test1_default_with_proto/BUILD.out | 10 +--------- .../test2_default_without_proto/BUILD.in | 3 +-- .../test2_default_without_proto/BUILD.out | 3 +-- gazelle/pythonconfig/pythonconfig.go | 2 +- 7 files changed, 8 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab6d4ae94a..a150b6e66d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,8 +91,8 @@ END_UNRELEASED_TEMPLATE * (gazelle) New directive `gazelle:python_generate_pyi_deps`; when `true`, dependencies added to satisfy type-only imports (`if TYPE_CHECKING`) and type stub packages are added to `pyi_deps` instead of `deps`. -* (gazelle) New directive `gazelle:python_generate_proto`; when `true` (by default), - Gazelle generates `py_proto_library` rules for `proto_library`. +* (gazelle) New directive `gazelle:python_generate_proto`; when `true`, + Gazelle generates `py_proto_library` rules for `proto_library`. `false` by default. {#v0-0-0-removed} ### Removed diff --git a/gazelle/README.md b/gazelle/README.md index ceea53964d..4ee7cd7818 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -224,7 +224,7 @@ Python-specific directives are as follows: | Controls whether Gazelle resolves dependencies for import statements that use paths relative to the current package. Can be "true" or "false".| | `# gazelle:python_generate_pyi_deps` | `false` | | Controls whether to generate a separate `pyi_deps` attribute for type-checking dependencies or merge them into the regular `deps` attribute. When `false` (default), type-checking dependencies are merged into `deps` for backward compatibility. When `true`, generates separate `pyi_deps`. Imports in blocks with the format `if typing.TYPE_CHECKING:`/`if TYPE_CHECKING:` and type-only stub packages (eg. boto3-stubs) are recognized as type-checking dependencies. | -| `# gazelle:python_generate_proto` | `true` | +| `# gazelle:python_generate_proto` | `false` | | Controls whether to generate a `py_proto_library` for each `proto_library` in the package. By default we load this rule from the `@protobuf` repository; use `gazelle:map_kind` if you need to load this from somewhere else. | #### Directive: `python_root`: diff --git a/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in index 3366a79fee..9784aafc17 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.in @@ -1,7 +1,6 @@ load("@rules_proto//proto:defs.bzl", "proto_library") -# python_generate_proto is not set. -# nevertheless, py_proto_library is generated. +# python_generate_proto is not set, so py_proto_library is not generated. proto_library( name = "foo_proto", diff --git a/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out index 9c702afa2f..9784aafc17 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/BUILD.out @@ -1,17 +1,9 @@ -load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") -# python_generate_proto is not set. -# nevertheless, py_proto_library is generated. +# python_generate_proto is not set, so py_proto_library is not generated. proto_library( name = "foo_proto", srcs = ["foo.proto"], visibility = ["//:__subpackages__"], ) - -py_proto_library( - name = "foo_proto_py_pb2", - visibility = ["//:__subpackages__"], - deps = [":foo_proto"], -) \ No newline at end of file diff --git a/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in index 602431817f..0a869d0fd5 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.in @@ -1,2 +1 @@ -# python_generate_proto is not set. -# Since no proto is present, no targets are generated. +# python_generate_proto is not set, so py_proto_library is not generated. diff --git a/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out index 602431817f..0a869d0fd5 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test2_default_without_proto/BUILD.out @@ -1,2 +1 @@ -# python_generate_proto is not set. -# Since no proto is present, no targets are generated. +# python_generate_proto is not set, so py_proto_library is not generated. diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index 136e5f4af2..b76e1f92ec 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -227,7 +227,7 @@ func New( labelNormalization: DefaultLabelNormalizationType, experimentalAllowRelativeImports: false, generatePyiDeps: false, - generateProto: true, + generateProto: false, } } From 9a44ef344da5cfd7ad2dc07595d6f3bb7f084a6d Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:01:06 -0400 Subject: [PATCH 16/38] In README.md add details section --- gazelle/README.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/gazelle/README.md b/gazelle/README.md index 4ee7cd7818..294683430a 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -224,7 +224,7 @@ Python-specific directives are as follows: | Controls whether Gazelle resolves dependencies for import statements that use paths relative to the current package. Can be "true" or "false".| | `# gazelle:python_generate_pyi_deps` | `false` | | Controls whether to generate a separate `pyi_deps` attribute for type-checking dependencies or merge them into the regular `deps` attribute. When `false` (default), type-checking dependencies are merged into `deps` for backward compatibility. When `true`, generates separate `pyi_deps`. Imports in blocks with the format `if typing.TYPE_CHECKING:`/`if TYPE_CHECKING:` and type-only stub packages (eg. boto3-stubs) are recognized as type-checking dependencies. | -| `# gazelle:python_generate_proto` | `false` | +| [`# gazelle:python_generate_proto`](#directive-python_generate_proto) | `false` | | Controls whether to generate a `py_proto_library` for each `proto_library` in the package. By default we load this rule from the `@protobuf` repository; use `gazelle:map_kind` if you need to load this from somewhere else. | #### Directive: `python_root`: @@ -486,6 +486,30 @@ def py_test(name, main=None, **kwargs): ) ``` +#### Directive: `python_generate_proto`: +When `# gazelle:python_generate_proto true`, Gazelle will generate one `py_proto_library` for each `proto_library`, generating Python clients for protobuf in each package. By default this is turned off. Gazelle will also generate a load for the `py_proto_library` - attempting to detect the configured name for the `@protobuf` / `@com_google_protobuf` repo in your `MODULE.bazel`, and otherwise falling back to `@com_google_protobuf` for compatibility with `WORKSPACE`. + +For example, in a package with `# gazelle:python_generate_proto true` and a `foo.proto`, if you have both the proto extension and the Python extension loaded into Gazelle, you'll get something like: + +```starlark +load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) +``` + ### Annotations *Annotations* refer to comments found _within Python files_ that configure how From 362dea91fcc80505de46087a18597199e9708f14 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:05:51 -0400 Subject: [PATCH 17/38] Plugin detects configured name for protobuf directory --- gazelle/python/kinds.go | 43 ++++++++++++------- .../test5_enabled_with_proto/BUILD.out | 2 +- .../test7_removes_when_unnecessary/BUILD.in | 2 +- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/gazelle/python/kinds.go b/gazelle/python/kinds.go index be38147ac2..a4ce572aaa 100644 --- a/gazelle/python/kinds.go +++ b/gazelle/python/kinds.go @@ -15,6 +15,8 @@ package python import ( + "fmt" + "github.com/bazelbuild/bazel-gazelle/rule" ) @@ -92,26 +94,37 @@ var pyKinds = map[string]rule.KindInfo{ }, } +func (py *Python) Loads() []rule.LoadInfo { + panic("ApparentLoads should be called instead") +} + // Loads returns .bzl files and symbols they define. Every rule generated by // GenerateRules, now or in the past, should be loadable from one of these // files. -func (py *Python) Loads() []rule.LoadInfo { - return pyLoads +func (py *Python) ApparentLoads(moduleToApparentName func(string) string) []rule.LoadInfo { + return apparentLoads(moduleToApparentName) } -var pyLoads = []rule.LoadInfo{ - { - Name: "@rules_python//python:defs.bzl", - Symbols: []string{ - pyBinaryKind, - pyLibraryKind, - pyTestKind, +func apparentLoads(moduleToApparentName func(string) string) []rule.LoadInfo { + protobuf := moduleToApparentName("protobuf") + if protobuf == "" { + protobuf = "com_google_protobuf" + } + + return []rule.LoadInfo{ + { + Name: "@rules_python//python:defs.bzl", + Symbols: []string{ + pyBinaryKind, + pyLibraryKind, + pyTestKind, + }, }, - }, - { - Name: "@protobuf//bazel:py_proto_library.bzl", - Symbols: []string{ - pyProtoLibraryKind, + { + Name: fmt.Sprintf("@%s//bazel:py_proto_library.bzl", protobuf), + Symbols: []string{ + pyProtoLibraryKind, + }, }, - }, + } } diff --git a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out index 2cb2c4c362..88c4fbe877 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out @@ -1,4 +1,4 @@ -load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") # gazelle:python_generate_proto true diff --git a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in index 2cb2c4c362..88c4fbe877 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in @@ -1,4 +1,4 @@ -load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") # gazelle:python_generate_proto true From 4e41e0eff03d975138eb890989e582548368ebc0 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:18:07 -0400 Subject: [PATCH 18/38] Update Gazelle, to bring in bzlmod support --- gazelle/MODULE.bazel | 2 +- gazelle/python/testdata/respect_kind_mapping/BUILD.out | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 6bbc74bc61..9f4e4a6e9b 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -7,7 +7,7 @@ module( bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_python", version = "0.18.0") bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go") -bazel_dep(name = "gazelle", version = "0.33.0", repo_name = "bazel_gazelle") +bazel_dep(name = "gazelle", version = "0.44.0", repo_name = "bazel_gazelle") bazel_dep(name = "rules_cc", version = "0.0.16") local_path_override( diff --git a/gazelle/python/testdata/respect_kind_mapping/BUILD.out b/gazelle/python/testdata/respect_kind_mapping/BUILD.out index 7c5fb0bd20..fa06e2af12 100644 --- a/gazelle/python/testdata/respect_kind_mapping/BUILD.out +++ b/gazelle/python/testdata/respect_kind_mapping/BUILD.out @@ -1,5 +1,5 @@ -load(":mytest.bzl", "my_test") load("@rules_python//python:defs.bzl", "py_library") +load(":mytest.bzl", "my_test") # gazelle:map_kind py_test my_test :mytest.bzl From dc27cda0840bf8a8871cb51b7741f48d35cfb1a3 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:18:07 -0400 Subject: [PATCH 19/38] Update Gazelle, to bring in bzlmod support --- gazelle/MODULE.bazel | 2 +- gazelle/python/testdata/respect_kind_mapping/BUILD.out | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 6bbc74bc61..9f4e4a6e9b 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -7,7 +7,7 @@ module( bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_python", version = "0.18.0") bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go") -bazel_dep(name = "gazelle", version = "0.33.0", repo_name = "bazel_gazelle") +bazel_dep(name = "gazelle", version = "0.44.0", repo_name = "bazel_gazelle") bazel_dep(name = "rules_cc", version = "0.0.16") local_path_override( diff --git a/gazelle/python/testdata/respect_kind_mapping/BUILD.out b/gazelle/python/testdata/respect_kind_mapping/BUILD.out index 7c5fb0bd20..fa06e2af12 100644 --- a/gazelle/python/testdata/respect_kind_mapping/BUILD.out +++ b/gazelle/python/testdata/respect_kind_mapping/BUILD.out @@ -1,5 +1,5 @@ -load(":mytest.bzl", "my_test") load("@rules_python//python:defs.bzl", "py_library") +load(":mytest.bzl", "my_test") # gazelle:map_kind py_test my_test :mytest.bzl From 5ee804a9b1bfbab99c525df88106818218c0398e Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:28:04 -0400 Subject: [PATCH 20/38] Add tests covering bzlmod & renaming functionality --- .../BUILD.in | 9 +++++++++ .../BUILD.out | 16 ++++++++++++++++ .../MODULE.bazel | 1 + .../README.md | 6 ++++++ .../foo.proto | 7 +++++++ .../test.yaml | 17 +++++++++++++++++ .../BUILD.in | 9 +++++++++ .../BUILD.out | 16 ++++++++++++++++ .../MODULE.bazel | 1 + .../README.md | 7 +++++++ .../foo.proto | 7 +++++++ .../test.yaml | 17 +++++++++++++++++ 12 files changed, 113 insertions(+) create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in new file mode 100644 index 0000000000..4713404b19 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out new file mode 100644 index 0000000000..2cb2c4c362 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out @@ -0,0 +1,16 @@ +load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel new file mode 100644 index 0000000000..66d64afe03 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel @@ -0,0 +1 @@ +bazel_dep(name = "protobuf", version = "29.3") diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md new file mode 100644 index 0000000000..2d91ccff56 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md @@ -0,0 +1,6 @@ +# Directive: `python_generate_proto` + +This test case asserts that the `# gazelle:python_generate_proto` directive +correctly reads the name of the protobuf repository when bzlmod is being used. + +[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto new file mode 100644 index 0000000000..fe2af27aa6 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo; + +message Foo { + string bar = 1; +} diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml new file mode 100644 index 0000000000..2410223e59 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/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 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in new file mode 100644 index 0000000000..4713404b19 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out new file mode 100644 index 0000000000..88c4fbe877 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out @@ -0,0 +1,16 @@ +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel new file mode 100644 index 0000000000..9ab4c175aa --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel @@ -0,0 +1 @@ +bazel_dep(name = "protobuf", version = "29.3", repo_name = "com_google_protobuf") diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md new file mode 100644 index 0000000000..7900d49084 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md @@ -0,0 +1,7 @@ +# Directive: `python_generate_proto` + +This test case asserts that the `# gazelle:python_generate_proto` directive +correctly reads the name of the protobuf repository when bzlmod is being used, +but the repository is renamed. + +[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto new file mode 100644 index 0000000000..fe2af27aa6 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo; + +message Foo { + string bar = 1; +} diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml new file mode 100644 index 0000000000..2410223e59 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/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 From e5fbed831577ff64e571bd5fdbadc5cc698a4a2a Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:29:08 -0400 Subject: [PATCH 21/38] Remove unnecessary licenses --- .../directive_python_generate_proto/test.yaml | 14 -------------- .../test.yaml | 14 -------------- .../test.yaml | 14 -------------- 3 files changed, 42 deletions(-) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test.yaml b/gazelle/python/testdata/directive_python_generate_proto/test.yaml index 2410223e59..36dd656b39 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test.yaml +++ b/gazelle/python/testdata/directive_python_generate_proto/test.yaml @@ -1,17 +1,3 @@ -# 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 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml index 2410223e59..36dd656b39 100644 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml @@ -1,17 +1,3 @@ -# 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 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml index 2410223e59..36dd656b39 100644 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml @@ -1,17 +1,3 @@ -# 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 From a2cb993ee930048bb47b5d51394d3d5f0ad3a8a2 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:29:48 -0400 Subject: [PATCH 22/38] Add trailing newlines to some protobuf --- .../test1_default_with_proto/foo.proto | 2 +- .../test3_disabled_with_proto/foo.proto | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/foo.proto b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/foo.proto index cd95069975..fe2af27aa6 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/foo.proto +++ b/gazelle/python/testdata/directive_python_generate_proto/test1_default_with_proto/foo.proto @@ -4,4 +4,4 @@ package foo; message Foo { string bar = 1; -} \ No newline at end of file +} diff --git a/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/foo.proto b/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/foo.proto index 738dbd2657..022e29ae69 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/foo.proto +++ b/gazelle/python/testdata/directive_python_generate_proto/test3_disabled_with_proto/foo.proto @@ -4,4 +4,4 @@ package foo.bar; message Foo { string bar = 1; -} \ No newline at end of file +} From 7c2706c1afa10cd913e105641b78a8b3a02c35ab Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:32:38 -0400 Subject: [PATCH 23/38] Add test covering "deletes only the py_proto_library rule" --- .../BUILD.in | 16 ++++++++++++++++ .../BUILD.out | 9 +++++++++ .../foo.proto | 7 +++++++ 3 files changed, 32 insertions(+) create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/foo.proto diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.in new file mode 100644 index 0000000000..889c2d4be9 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.in @@ -0,0 +1,16 @@ +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto false + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.out new file mode 100644 index 0000000000..62fd4be661 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.out @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto false + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/foo.proto b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/foo.proto new file mode 100644 index 0000000000..022e29ae69 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo.bar; + +message Foo { + string bar = 1; +} From 59561fc960fb1e2a707a321ba725e09a1dedc9b0 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:35:11 -0400 Subject: [PATCH 24/38] Always run generateProtoLibraries, to ensure we run deletion logic --- gazelle/python/generate.go | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 49f95e8e71..e0202c1074 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -94,9 +94,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes pythonProjectRoot := cfg.PythonProjectRoot() visibility := cfg.Visibility() - if cfg.GenerateProto() && args.File != nil { - generateProtoLibraries(args, pythonProjectRoot, visibility, &result) - } + generateProtoLibraries(cfg, args, pythonProjectRoot, visibility, &result) actualPyBinaryKind := GetActualKindName(pyBinaryKind, args) actualPyLibraryKind := GetActualKindName(pyLibraryKind, args) @@ -556,7 +554,7 @@ func ensureNoCollision(file *rule.File, targetName, kind string) error { return nil } -func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string, visibility []string, res *language.GenerateResult) { +func generateProtoLibraries(cfg *pythonconfig.Config, args language.GenerateArgs, pythonProjectRoot string, visibility []string, res *language.GenerateResult) { // First, enumerate all the proto_library in this package. var protoRuleNames []string for _, r := range args.OtherGen { @@ -569,25 +567,29 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string // Next, enumerate all the pre-existing py_proto_library in this package, so we can delete unnecessary rules later. pyProtoRules := map[string]bool{} - for _, r := range args.File.Rules { - if r.Kind() == "py_proto_library" { - pyProtoRules[r.Name()] = false + if args.File != nil { + for _, r := range args.File.Rules { + if r.Kind() == "py_proto_library" { + pyProtoRules[r.Name()] = false + } } } - // Now generate a py_proto_library for each proto_library. emptySiblings := treeset.Set{} - for _, protoRuleName := range protoRuleNames { - pyProtoLibraryName := protoRuleName + "_py_pb2" - pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). - addVisibility(visibility). - addResolvedDependency(":" + protoRuleName). - generateImportsAttribute().build() - - res.Gen = append(res.Gen, pyProtoLibrary) - res.Imports = append(res.Imports, pyProtoLibrary.PrivateAttr(config.GazelleImportsKey)) - pyProtoRules[pyProtoLibrary.Name()] = true + if cfg.GenerateProto() { + // Generate a py_proto_library for each proto_library. + for _, protoRuleName := range protoRuleNames { + pyProtoLibraryName := protoRuleName + "_py_pb2" + pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). + addVisibility(visibility). + addResolvedDependency(":" + protoRuleName). + generateImportsAttribute().build() + + res.Gen = append(res.Gen, pyProtoLibrary) + res.Imports = append(res.Imports, pyProtoLibrary.PrivateAttr(config.GazelleImportsKey)) + pyProtoRules[pyProtoLibrary.Name()] = true + } } // Finally, emit an empty rule for each pre-existing py_proto_library that we didn't already generate. From 634411cd7d77723d313be83f45fe6430cad9ed00 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:42:33 -0400 Subject: [PATCH 25/38] Update WORKSPACE, too --- gazelle/WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gazelle/WORKSPACE b/gazelle/WORKSPACE index ad428b10cd..f581a93ff8 100644 --- a/gazelle/WORKSPACE +++ b/gazelle/WORKSPACE @@ -13,10 +13,10 @@ http_archive( http_archive( name = "bazel_gazelle", - sha256 = "29d5dafc2a5582995488c6735115d1d366fcd6a0fc2e2a153f02988706349825", + sha256 = "bde9c2949e64d059c18d8f93566a64dafc6d2e8e259a70322fb804831dfd0b5b", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", ], ) From 1cabc1891ee981b1c77e7bf70487d0baf43cee9b Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 18:51:53 -0400 Subject: [PATCH 26/38] Update shasum --- gazelle/WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gazelle/WORKSPACE b/gazelle/WORKSPACE index f581a93ff8..cec97690a9 100644 --- a/gazelle/WORKSPACE +++ b/gazelle/WORKSPACE @@ -13,7 +13,7 @@ http_archive( http_archive( name = "bazel_gazelle", - sha256 = "bde9c2949e64d059c18d8f93566a64dafc6d2e8e259a70322fb804831dfd0b5b", + sha256 = "49b14c691ceec841f445f8642d28336e99457d1db162092fd5082351ea302f1d", urls = [ "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", From aa9e24ae35c5ae515cd0bb0957e9d0cd0fdb52b4 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 5 Jul 2025 19:01:20 -0400 Subject: [PATCH 27/38] Use golang 1.20.5 --- gazelle/WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gazelle/WORKSPACE b/gazelle/WORKSPACE index cec97690a9..b5ad029cb0 100644 --- a/gazelle/WORKSPACE +++ b/gazelle/WORKSPACE @@ -25,7 +25,7 @@ load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_depe go_rules_dependencies() -go_register_toolchains(version = "1.19.4") +go_register_toolchains(version = "1.20.5") gazelle_dependencies() From 3d3c3023efd437d330f2595d6401ff79383625c0 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sun, 6 Jul 2025 15:28:40 -0400 Subject: [PATCH 28/38] When python_proto_generate=false, ignore any pre-existing py_proto_library --- gazelle/README.md | 2 ++ gazelle/python/generate.go | 30 +++++++++---------- .../BUILD.in | 0 .../BUILD.out | 7 +++++ .../foo.proto | 0 5 files changed, 24 insertions(+), 15 deletions(-) rename gazelle/python/testdata/directive_python_generate_proto/{test8_disabled_removes_py_proto_library => test8_disabled_ignores_py_proto_library}/BUILD.in (100%) rename gazelle/python/testdata/directive_python_generate_proto/{test8_disabled_removes_py_proto_library => test8_disabled_ignores_py_proto_library}/BUILD.out (50%) rename gazelle/python/testdata/directive_python_generate_proto/{test8_disabled_removes_py_proto_library => test8_disabled_ignores_py_proto_library}/foo.proto (100%) diff --git a/gazelle/README.md b/gazelle/README.md index 294683430a..cea65d05b9 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -510,6 +510,8 @@ py_proto_library( ) ``` +When `false`, Gazelle will ignore any `py_proto_library`, including previously-generated or hand-created rules. + ### Annotations *Annotations* refer to comments found _within Python files_ that configure how diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index e0202c1074..a7526d1769 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -94,7 +94,9 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes pythonProjectRoot := cfg.PythonProjectRoot() visibility := cfg.Visibility() - generateProtoLibraries(cfg, args, pythonProjectRoot, visibility, &result) + if cfg.GenerateProto() { + generateProtoLibraries(args, pythonProjectRoot, visibility, &result) + } actualPyBinaryKind := GetActualKindName(pyBinaryKind, args) actualPyLibraryKind := GetActualKindName(pyLibraryKind, args) @@ -554,7 +556,7 @@ func ensureNoCollision(file *rule.File, targetName, kind string) error { return nil } -func generateProtoLibraries(cfg *pythonconfig.Config, args language.GenerateArgs, pythonProjectRoot string, visibility []string, res *language.GenerateResult) { +func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string, visibility []string, res *language.GenerateResult) { // First, enumerate all the proto_library in this package. var protoRuleNames []string for _, r := range args.OtherGen { @@ -576,20 +578,18 @@ func generateProtoLibraries(cfg *pythonconfig.Config, args language.GenerateArgs } emptySiblings := treeset.Set{} - if cfg.GenerateProto() { - // Generate a py_proto_library for each proto_library. - for _, protoRuleName := range protoRuleNames { - pyProtoLibraryName := protoRuleName + "_py_pb2" - pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). - addVisibility(visibility). - addResolvedDependency(":" + protoRuleName). - generateImportsAttribute().build() - - res.Gen = append(res.Gen, pyProtoLibrary) - res.Imports = append(res.Imports, pyProtoLibrary.PrivateAttr(config.GazelleImportsKey)) - pyProtoRules[pyProtoLibrary.Name()] = true + // Generate a py_proto_library for each proto_library. + for _, protoRuleName := range protoRuleNames { + pyProtoLibraryName := protoRuleName + "_py_pb2" + pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). + addVisibility(visibility). + addResolvedDependency(":" + protoRuleName). + generateImportsAttribute().build() + + res.Gen = append(res.Gen, pyProtoLibrary) + res.Imports = append(res.Imports, pyProtoLibrary.PrivateAttr(config.GazelleImportsKey)) + pyProtoRules[pyProtoLibrary.Name()] = true - } } // Finally, emit an empty rule for each pre-existing py_proto_library that we didn't already generate. diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in similarity index 100% rename from gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.in rename to gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out similarity index 50% rename from gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.out rename to gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out index 62fd4be661..889c2d4be9 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out @@ -1,3 +1,4 @@ +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") load("@rules_proto//proto:defs.bzl", "proto_library") # gazelle:python_generate_proto false @@ -7,3 +8,9 @@ proto_library( srcs = ["foo.proto"], visibility = ["//:__subpackages__"], ) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/foo.proto b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/foo.proto similarity index 100% rename from gazelle/python/testdata/directive_python_generate_proto/test8_disabled_removes_py_proto_library/foo.proto rename to gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/foo.proto From cdeafde0b43884a527d321f78e884d8f543fdbd0 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sun, 6 Jul 2025 15:34:09 -0400 Subject: [PATCH 29/38] Undo gazelle upgrade, and remove tests that depend on bzlmod support --- gazelle/MODULE.bazel | 2 +- gazelle/WORKSPACE | 8 ++++---- .../BUILD.in | 9 --------- .../BUILD.out | 16 ---------------- .../MODULE.bazel | 1 - .../README.md | 6 ------ .../foo.proto | 7 ------- .../test.yaml | 3 --- .../BUILD.in | 9 --------- .../BUILD.out | 16 ---------------- .../MODULE.bazel | 1 - .../README.md | 7 ------- .../foo.proto | 7 ------- .../test.yaml | 3 --- .../testdata/respect_kind_mapping/BUILD.out | 2 +- 15 files changed, 6 insertions(+), 91 deletions(-) delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto delete mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 9f4e4a6e9b..6bbc74bc61 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -7,7 +7,7 @@ module( bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_python", version = "0.18.0") bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go") -bazel_dep(name = "gazelle", version = "0.44.0", repo_name = "bazel_gazelle") +bazel_dep(name = "gazelle", version = "0.33.0", repo_name = "bazel_gazelle") bazel_dep(name = "rules_cc", version = "0.0.16") local_path_override( diff --git a/gazelle/WORKSPACE b/gazelle/WORKSPACE index b5ad029cb0..ad428b10cd 100644 --- a/gazelle/WORKSPACE +++ b/gazelle/WORKSPACE @@ -13,10 +13,10 @@ http_archive( http_archive( name = "bazel_gazelle", - sha256 = "49b14c691ceec841f445f8642d28336e99457d1db162092fd5082351ea302f1d", + sha256 = "29d5dafc2a5582995488c6735115d1d366fcd6a0fc2e2a153f02988706349825", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", ], ) @@ -25,7 +25,7 @@ load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_depe go_rules_dependencies() -go_register_toolchains(version = "1.20.5") +go_register_toolchains(version = "1.19.4") gazelle_dependencies() diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in deleted file mode 100644 index 4713404b19..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in +++ /dev/null @@ -1,9 +0,0 @@ -load("@rules_proto//proto:defs.bzl", "proto_library") - -# gazelle:python_generate_proto true - -proto_library( - name = "foo_proto", - srcs = ["foo.proto"], - visibility = ["//:__subpackages__"], -) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out deleted file mode 100644 index 2cb2c4c362..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out +++ /dev/null @@ -1,16 +0,0 @@ -load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") -load("@rules_proto//proto:defs.bzl", "proto_library") - -# gazelle:python_generate_proto true - -proto_library( - name = "foo_proto", - srcs = ["foo.proto"], - visibility = ["//:__subpackages__"], -) - -py_proto_library( - name = "foo_proto_py_pb2", - visibility = ["//:__subpackages__"], - deps = [":foo_proto"], -) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel deleted file mode 100644 index 66d64afe03..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel +++ /dev/null @@ -1 +0,0 @@ -bazel_dep(name = "protobuf", version = "29.3") diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md deleted file mode 100644 index 2d91ccff56..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Directive: `python_generate_proto` - -This test case asserts that the `# gazelle:python_generate_proto` directive -correctly reads the name of the protobuf repository when bzlmod is being used. - -[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto deleted file mode 100644 index fe2af27aa6..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -package foo; - -message Foo { - string bar = 1; -} diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml deleted file mode 100644 index 36dd656b39..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -expect: - exit_code: 0 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in deleted file mode 100644 index 4713404b19..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in +++ /dev/null @@ -1,9 +0,0 @@ -load("@rules_proto//proto:defs.bzl", "proto_library") - -# gazelle:python_generate_proto true - -proto_library( - name = "foo_proto", - srcs = ["foo.proto"], - visibility = ["//:__subpackages__"], -) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out deleted file mode 100644 index 88c4fbe877..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out +++ /dev/null @@ -1,16 +0,0 @@ -load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") -load("@rules_proto//proto:defs.bzl", "proto_library") - -# gazelle:python_generate_proto true - -proto_library( - name = "foo_proto", - srcs = ["foo.proto"], - visibility = ["//:__subpackages__"], -) - -py_proto_library( - name = "foo_proto_py_pb2", - visibility = ["//:__subpackages__"], - deps = [":foo_proto"], -) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel deleted file mode 100644 index 9ab4c175aa..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel +++ /dev/null @@ -1 +0,0 @@ -bazel_dep(name = "protobuf", version = "29.3", repo_name = "com_google_protobuf") diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md deleted file mode 100644 index 7900d49084..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Directive: `python_generate_proto` - -This test case asserts that the `# gazelle:python_generate_proto` directive -correctly reads the name of the protobuf repository when bzlmod is being used, -but the repository is renamed. - -[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto deleted file mode 100644 index fe2af27aa6..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -package foo; - -message Foo { - string bar = 1; -} diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml deleted file mode 100644 index 36dd656b39..0000000000 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -expect: - exit_code: 0 diff --git a/gazelle/python/testdata/respect_kind_mapping/BUILD.out b/gazelle/python/testdata/respect_kind_mapping/BUILD.out index fa06e2af12..7c5fb0bd20 100644 --- a/gazelle/python/testdata/respect_kind_mapping/BUILD.out +++ b/gazelle/python/testdata/respect_kind_mapping/BUILD.out @@ -1,5 +1,5 @@ -load("@rules_python//python:defs.bzl", "py_library") load(":mytest.bzl", "my_test") +load("@rules_python//python:defs.bzl", "py_library") # gazelle:map_kind py_test my_test :mytest.bzl From 763ef9d86c9a01efe626aff18caae9c73f8ea0de Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 01:45:21 -0400 Subject: [PATCH 30/38] Wrap README.md to 80 chars per line, and be less-disruptive to existing generate.go --- gazelle/README.md | 13 +++++++++++-- gazelle/python/generate.go | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/gazelle/README.md b/gazelle/README.md index cea65d05b9..7aafc44d56 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -487,9 +487,18 @@ def py_test(name, main=None, **kwargs): ``` #### Directive: `python_generate_proto`: -When `# gazelle:python_generate_proto true`, Gazelle will generate one `py_proto_library` for each `proto_library`, generating Python clients for protobuf in each package. By default this is turned off. Gazelle will also generate a load for the `py_proto_library` - attempting to detect the configured name for the `@protobuf` / `@com_google_protobuf` repo in your `MODULE.bazel`, and otherwise falling back to `@com_google_protobuf` for compatibility with `WORKSPACE`. -For example, in a package with `# gazelle:python_generate_proto true` and a `foo.proto`, if you have both the proto extension and the Python extension loaded into Gazelle, you'll get something like: +When `# gazelle:python_generate_proto true`, Gazelle will generate one +`py_proto_library` for each `proto_library`, generating Python clients for +protobuf in each package. By default this is turned off. Gazelle will also +generate a load for the `py_proto_library` - attempting to detect the +configured name for the `@protobuf` / `@com_google_protobuf` repo in your +`MODULE.bazel`, and otherwise falling back to `@com_google_protobuf` for +compatibility with `WORKSPACE`. + +For example, in a package with `# gazelle:python_generate_proto true` and a +`foo.proto`, if you have both the proto extension and the Python extension +loaded into Gazelle, you'll get something like: ```starlark load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index a7526d1769..28d41a7a62 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -88,20 +88,12 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } - var result language.GenerateResult - result.Gen = make([]*rule.Rule, 0) - - pythonProjectRoot := cfg.PythonProjectRoot() - visibility := cfg.Visibility() - - if cfg.GenerateProto() { - generateProtoLibraries(args, pythonProjectRoot, visibility, &result) - } - actualPyBinaryKind := GetActualKindName(pyBinaryKind, args) actualPyLibraryKind := GetActualKindName(pyLibraryKind, args) actualPyTestKind := GetActualKindName(pyTestKind, args) + pythonProjectRoot := cfg.PythonProjectRoot() + packageName := filepath.Base(args.Dir) pyLibraryFilenames := treeset.NewWith(godsutils.StringComparator) @@ -229,6 +221,14 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } parser := newPython3Parser(args.Config.RepoRoot, args.Rel, cfg.IgnoresDependency) + visibility := cfg.Visibility() + + var result language.GenerateResult + result.Gen = make([]*rule.Rule, 0) + + if cfg.GenerateProto() { + generateProtoLibraries(args, pythonProjectRoot, visibility, &result) + } collisionErrors := singlylinkedlist.New() From b3805a95fc0cdbdb5412dbf17fc52e93e461cef4 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 01:47:18 -0400 Subject: [PATCH 31/38] Fix some language again --- gazelle/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gazelle/README.md b/gazelle/README.md index 7aafc44d56..ca9532a190 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -491,8 +491,8 @@ def py_test(name, main=None, **kwargs): When `# gazelle:python_generate_proto true`, Gazelle will generate one `py_proto_library` for each `proto_library`, generating Python clients for protobuf in each package. By default this is turned off. Gazelle will also -generate a load for the `py_proto_library` - attempting to detect the -configured name for the `@protobuf` / `@com_google_protobuf` repo in your +generate a load statement for the `py_proto_library` - attempting to detect +the configured name for the `@protobuf` / `@com_google_protobuf` repo in your `MODULE.bazel`, and otherwise falling back to `@com_google_protobuf` for compatibility with `WORKSPACE`. From 3e0fdcc0a33406b2f7b38c31ec451f4b630ed046 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 02:05:49 -0400 Subject: [PATCH 32/38] Use _py_proto suffix, to align with java, go naming schemes --- gazelle/README.md | 2 +- gazelle/python/generate.go | 2 +- .../test5_enabled_with_proto/BUILD.out | 2 +- .../test7_removes_when_unnecessary/BUILD.in | 2 +- .../test8_disabled_ignores_py_proto_library/BUILD.in | 2 +- .../test8_disabled_ignores_py_proto_library/BUILD.out | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gazelle/README.md b/gazelle/README.md index ca9532a190..654c875478 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -513,7 +513,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_proto", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 28d41a7a62..54fe0b0b94 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -580,7 +580,7 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string emptySiblings := treeset.Set{} // Generate a py_proto_library for each proto_library. for _, protoRuleName := range protoRuleNames { - pyProtoLibraryName := protoRuleName + "_py_pb2" + pyProtoLibraryName := strings.TrimSuffix(protoRuleName, "_proto") + "_py_proto" pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). addVisibility(visibility). addResolvedDependency(":" + protoRuleName). diff --git a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out index 88c4fbe877..6aa79d357a 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_proto", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in index 88c4fbe877..6aa79d357a 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_proto", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in index 889c2d4be9..3a8b49a185 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_proto", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out index 889c2d4be9..3a8b49a185 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_proto", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) From 0c9d436fb6ef758e67f3a50c7d7ab1e2b2616cfb Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 22:16:44 -0400 Subject: [PATCH 33/38] Revert "Use _py_proto suffix, to align with java, go naming schemes" This reverts commit 3e0fdcc0a33406b2f7b38c31ec451f4b630ed046. --- gazelle/README.md | 2 +- gazelle/python/generate.go | 2 +- .../test5_enabled_with_proto/BUILD.out | 2 +- .../test7_removes_when_unnecessary/BUILD.in | 2 +- .../test8_disabled_ignores_py_proto_library/BUILD.in | 2 +- .../test8_disabled_ignores_py_proto_library/BUILD.out | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gazelle/README.md b/gazelle/README.md index 654c875478..ca9532a190 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -513,7 +513,7 @@ proto_library( ) py_proto_library( - name = "foo_py_proto", + name = "foo_proto_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 54fe0b0b94..28d41a7a62 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -580,7 +580,7 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string emptySiblings := treeset.Set{} // Generate a py_proto_library for each proto_library. for _, protoRuleName := range protoRuleNames { - pyProtoLibraryName := strings.TrimSuffix(protoRuleName, "_proto") + "_py_proto" + pyProtoLibraryName := protoRuleName + "_py_pb2" pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). addVisibility(visibility). addResolvedDependency(":" + protoRuleName). diff --git a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out index 6aa79d357a..88c4fbe877 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_py_proto", + name = "foo_proto_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in index 6aa79d357a..88c4fbe877 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_py_proto", + name = "foo_proto_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in index 3a8b49a185..889c2d4be9 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_py_proto", + name = "foo_proto_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out index 3a8b49a185..889c2d4be9 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_py_proto", + name = "foo_proto_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) From eb878011244b3b0f55cf351bfa4aea38d0eeda23 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 22:17:27 -0400 Subject: [PATCH 34/38] Revert "Undo gazelle upgrade, and remove tests that depend on bzlmod support" This reverts commit cdeafde0b43884a527d321f78e884d8f543fdbd0. --- gazelle/MODULE.bazel | 2 +- gazelle/WORKSPACE | 8 ++++---- .../BUILD.in | 9 +++++++++ .../BUILD.out | 16 ++++++++++++++++ .../MODULE.bazel | 1 + .../README.md | 6 ++++++ .../foo.proto | 7 +++++++ .../test.yaml | 3 +++ .../BUILD.in | 9 +++++++++ .../BUILD.out | 16 ++++++++++++++++ .../MODULE.bazel | 1 + .../README.md | 7 +++++++ .../foo.proto | 7 +++++++ .../test.yaml | 3 +++ .../testdata/respect_kind_mapping/BUILD.out | 2 +- 15 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 51352a0ba6..79d95fe2a3 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -7,7 +7,7 @@ module( bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_python", version = "0.18.0") bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go") -bazel_dep(name = "gazelle", version = "0.33.0", repo_name = "bazel_gazelle") +bazel_dep(name = "gazelle", version = "0.44.0", repo_name = "bazel_gazelle") bazel_dep(name = "rules_cc", version = "0.0.16") local_path_override( diff --git a/gazelle/WORKSPACE b/gazelle/WORKSPACE index ad428b10cd..b5ad029cb0 100644 --- a/gazelle/WORKSPACE +++ b/gazelle/WORKSPACE @@ -13,10 +13,10 @@ http_archive( http_archive( name = "bazel_gazelle", - sha256 = "29d5dafc2a5582995488c6735115d1d366fcd6a0fc2e2a153f02988706349825", + sha256 = "49b14c691ceec841f445f8642d28336e99457d1db162092fd5082351ea302f1d", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", ], ) @@ -25,7 +25,7 @@ load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_depe go_rules_dependencies() -go_register_toolchains(version = "1.19.4") +go_register_toolchains(version = "1.20.5") gazelle_dependencies() diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in new file mode 100644 index 0000000000..4713404b19 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.in @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out new file mode 100644 index 0000000000..2cb2c4c362 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out @@ -0,0 +1,16 @@ +load("@protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel new file mode 100644 index 0000000000..66d64afe03 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/MODULE.bazel @@ -0,0 +1 @@ +bazel_dep(name = "protobuf", version = "29.3") diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md new file mode 100644 index 0000000000..2d91ccff56 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/README.md @@ -0,0 +1,6 @@ +# Directive: `python_generate_proto` + +This test case asserts that the `# gazelle:python_generate_proto` directive +correctly reads the name of the protobuf repository when bzlmod is being used. + +[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto new file mode 100644 index 0000000000..fe2af27aa6 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo; + +message Foo { + string bar = 1; +} diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml new file mode 100644 index 0000000000..36dd656b39 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/test.yaml @@ -0,0 +1,3 @@ +--- +expect: + exit_code: 0 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in new file mode 100644 index 0000000000..4713404b19 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.in @@ -0,0 +1,9 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out new file mode 100644 index 0000000000..88c4fbe877 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out @@ -0,0 +1,16 @@ +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +# gazelle:python_generate_proto true + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], + visibility = ["//:__subpackages__"], +) + +py_proto_library( + name = "foo_proto_py_pb2", + visibility = ["//:__subpackages__"], + deps = [":foo_proto"], +) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel new file mode 100644 index 0000000000..9ab4c175aa --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/MODULE.bazel @@ -0,0 +1 @@ +bazel_dep(name = "protobuf", version = "29.3", repo_name = "com_google_protobuf") diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md new file mode 100644 index 0000000000..7900d49084 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/README.md @@ -0,0 +1,7 @@ +# Directive: `python_generate_proto` + +This test case asserts that the `# gazelle:python_generate_proto` directive +correctly reads the name of the protobuf repository when bzlmod is being used, +but the repository is renamed. + +[gh-2994]: https://github.com/bazel-contrib/rules_python/issues/2994 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto new file mode 100644 index 0000000000..fe2af27aa6 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo; + +message Foo { + string bar = 1; +} diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml new file mode 100644 index 0000000000..36dd656b39 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/test.yaml @@ -0,0 +1,3 @@ +--- +expect: + exit_code: 0 diff --git a/gazelle/python/testdata/respect_kind_mapping/BUILD.out b/gazelle/python/testdata/respect_kind_mapping/BUILD.out index 7c5fb0bd20..fa06e2af12 100644 --- a/gazelle/python/testdata/respect_kind_mapping/BUILD.out +++ b/gazelle/python/testdata/respect_kind_mapping/BUILD.out @@ -1,5 +1,5 @@ -load(":mytest.bzl", "my_test") load("@rules_python//python:defs.bzl", "py_library") +load(":mytest.bzl", "my_test") # gazelle:map_kind py_test my_test :mytest.bzl From 6791d4b965f77451d8a37cfce285554198b25eee Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 22:19:51 -0400 Subject: [PATCH 35/38] Undo version upgrade --- gazelle/MODULE.bazel | 2 +- gazelle/WORKSPACE | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 79d95fe2a3..51352a0ba6 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -7,7 +7,7 @@ module( bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_python", version = "0.18.0") bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go") -bazel_dep(name = "gazelle", version = "0.44.0", repo_name = "bazel_gazelle") +bazel_dep(name = "gazelle", version = "0.33.0", repo_name = "bazel_gazelle") bazel_dep(name = "rules_cc", version = "0.0.16") local_path_override( diff --git a/gazelle/WORKSPACE b/gazelle/WORKSPACE index b5ad029cb0..ad428b10cd 100644 --- a/gazelle/WORKSPACE +++ b/gazelle/WORKSPACE @@ -13,10 +13,10 @@ http_archive( http_archive( name = "bazel_gazelle", - sha256 = "49b14c691ceec841f445f8642d28336e99457d1db162092fd5082351ea302f1d", + sha256 = "29d5dafc2a5582995488c6735115d1d366fcd6a0fc2e2a153f02988706349825", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.44.0/bazel-gazelle-v0.44.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.31.0/bazel-gazelle-v0.31.0.tar.gz", ], ) @@ -25,7 +25,7 @@ load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_depe go_rules_dependencies() -go_register_toolchains(version = "1.20.5") +go_register_toolchains(version = "1.19.4") gazelle_dependencies() From 66966fefddf2c87dee81881b57f05eee53c9c666 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 22:21:18 -0400 Subject: [PATCH 36/38] Fix a test's load ordering --- gazelle/python/testdata/respect_kind_mapping/BUILD.out | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gazelle/python/testdata/respect_kind_mapping/BUILD.out b/gazelle/python/testdata/respect_kind_mapping/BUILD.out index fa06e2af12..7c5fb0bd20 100644 --- a/gazelle/python/testdata/respect_kind_mapping/BUILD.out +++ b/gazelle/python/testdata/respect_kind_mapping/BUILD.out @@ -1,5 +1,5 @@ -load("@rules_python//python:defs.bzl", "py_library") load(":mytest.bzl", "my_test") +load("@rules_python//python:defs.bzl", "py_library") # gazelle:map_kind py_test my_test :mytest.bzl From d61aad1bd5c7b30a6f96438b0accab6e10eb5de3 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sat, 12 Jul 2025 22:21:36 -0400 Subject: [PATCH 37/38] Check in empty WORKSPACE files to make tests pass --- .../directive_python_generate_proto_bzlmod_protobuf/WORKSPACE | 0 .../WORKSPACE | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/WORKSPACE create mode 100644 gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/WORKSPACE diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/WORKSPACE b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/WORKSPACE b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 From b0039ee9ce8a6f9eee5f800c16f3bf42400f77e1 Mon Sep 17 00:00:00 2001 From: Charles Guo Date: Sun, 13 Jul 2025 14:20:49 -0400 Subject: [PATCH 38/38] _proto_py_pb2 -> _py_pb2 --- examples/bzlmod/py_proto_library/BUILD.bazel | 4 ++-- .../py_proto_library/example.com/another_proto/BUILD.bazel | 2 +- .../bzlmod/py_proto_library/example.com/proto/BUILD.bazel | 2 +- examples/py_proto_library/BUILD.bazel | 4 ++-- .../py_proto_library/example.com/another_proto/BUILD.bazel | 2 +- examples/py_proto_library/example.com/proto/BUILD.bazel | 2 +- gazelle/README.md | 2 +- gazelle/python/generate.go | 2 +- .../test5_enabled_with_proto/BUILD.out | 2 +- .../test7_removes_when_unnecessary/BUILD.in | 2 +- .../test8_disabled_ignores_py_proto_library/BUILD.in | 2 +- .../test8_disabled_ignores_py_proto_library/BUILD.out | 2 +- .../directive_python_generate_proto_bzlmod_protobuf/BUILD.out | 2 +- .../BUILD.out | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/bzlmod/py_proto_library/BUILD.bazel b/examples/bzlmod/py_proto_library/BUILD.bazel index 969cb8e9f7..daea410365 100644 --- a/examples/bzlmod/py_proto_library/BUILD.bazel +++ b/examples/bzlmod/py_proto_library/BUILD.bazel @@ -6,7 +6,7 @@ py_test( srcs = ["test.py"], main = "test.py", deps = [ - "//py_proto_library/example.com/proto:pricetag_proto_py_pb2", + "//py_proto_library/example.com/proto:pricetag_py_pb2", ], ) @@ -14,7 +14,7 @@ py_test( name = "message_test", srcs = ["message_test.py"], deps = [ - "//py_proto_library/example.com/another_proto:message_proto_py_pb2", + "//py_proto_library/example.com/another_proto:message_py_pb2", ], ) diff --git a/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel b/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel index 785d90d01e..29f08c21ca 100644 --- a/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel +++ b/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel @@ -2,7 +2,7 @@ load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( - name = "message_proto_py_pb2", + name = "message_py_pb2", visibility = ["//visibility:public"], deps = [":message_proto"], ) diff --git a/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel b/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel index 72af672219..1f8e8f2818 100644 --- a/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel +++ b/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel @@ -2,7 +2,7 @@ load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( - name = "pricetag_proto_py_pb2", + name = "pricetag_py_pb2", visibility = ["//visibility:public"], deps = [":pricetag_proto"], ) diff --git a/examples/py_proto_library/BUILD.bazel b/examples/py_proto_library/BUILD.bazel index d782fb296d..b57c528511 100644 --- a/examples/py_proto_library/BUILD.bazel +++ b/examples/py_proto_library/BUILD.bazel @@ -5,7 +5,7 @@ py_test( srcs = ["test.py"], main = "test.py", deps = [ - "//example.com/proto:pricetag_proto_py_pb2", + "//example.com/proto:pricetag_py_pb2", ], ) @@ -13,6 +13,6 @@ py_test( name = "message_test", srcs = ["message_test.py"], deps = [ - "//example.com/another_proto:message_proto_py_pb2", + "//example.com/another_proto:message_py_pb2", ], ) diff --git a/examples/py_proto_library/example.com/another_proto/BUILD.bazel b/examples/py_proto_library/example.com/another_proto/BUILD.bazel index 3d841554e9..55e83a209a 100644 --- a/examples/py_proto_library/example.com/another_proto/BUILD.bazel +++ b/examples/py_proto_library/example.com/another_proto/BUILD.bazel @@ -2,7 +2,7 @@ load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( - name = "message_proto_py_pb2", + name = "message_py_pb2", visibility = ["//visibility:public"], deps = [":message_proto"], ) diff --git a/examples/py_proto_library/example.com/proto/BUILD.bazel b/examples/py_proto_library/example.com/proto/BUILD.bazel index f84454f531..fdf2e6fe32 100644 --- a/examples/py_proto_library/example.com/proto/BUILD.bazel +++ b/examples/py_proto_library/example.com/proto/BUILD.bazel @@ -2,7 +2,7 @@ load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( - name = "pricetag_proto_py_pb2", + name = "pricetag_py_pb2", visibility = ["//visibility:public"], deps = [":pricetag_proto"], ) diff --git a/gazelle/README.md b/gazelle/README.md index ca9532a190..35a1e4f701 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -513,7 +513,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 28d41a7a62..343743559f 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -580,7 +580,7 @@ func generateProtoLibraries(args language.GenerateArgs, pythonProjectRoot string emptySiblings := treeset.Set{} // Generate a py_proto_library for each proto_library. for _, protoRuleName := range protoRuleNames { - pyProtoLibraryName := protoRuleName + "_py_pb2" + pyProtoLibraryName := strings.TrimSuffix(protoRuleName, "_proto") + "_py_pb2" pyProtoLibrary := newTargetBuilder(pyProtoLibraryKind, pyProtoLibraryName, pythonProjectRoot, args.Rel, &emptySiblings). addVisibility(visibility). addResolvedDependency(":" + protoRuleName). diff --git a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out index 88c4fbe877..686252f27c 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test5_enabled_with_proto/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in index 88c4fbe877..686252f27c 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test7_removes_when_unnecessary/BUILD.in @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in index 889c2d4be9..f14ed4fc2d 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.in @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out index 889c2d4be9..f14ed4fc2d 100644 --- a/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto/test8_disabled_ignores_py_proto_library/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out index 2cb2c4c362..dab84a6777 100644 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], ) diff --git a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out index 88c4fbe877..686252f27c 100644 --- a/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out +++ b/gazelle/python/testdata/directive_python_generate_proto_bzlmod_protobuf_renamed/BUILD.out @@ -10,7 +10,7 @@ proto_library( ) py_proto_library( - name = "foo_proto_py_pb2", + name = "foo_py_pb2", visibility = ["//:__subpackages__"], deps = [":foo_proto"], )