diff --git a/CHANGELOG.md b/CHANGELOG.md index d7c480582a..377f81af7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,30 @@ BEGIN_UNRELEASED_TEMPLATE END_UNRELEASED_TEMPLATE --> +{#v0-0-0} +## Unreleased + +[0.0.0]: https://github.com/bazel-contrib/rules_python/releases/tag/0.0.0 + +{#v0-0-0-removed} +### Removed + +* Nothing removed. +{#v0-0-0-changed} +### Changed +* Nothing changed. + +{#v0-0-0-fixed} +### Fixed +* Nothing fixed. + +{#v0-0-0-added} +### Added +* (gazelle) A new directive `python_generate_pyi_deps` has been added. When + `true`, a py_* target's `pyi_srcs` attribute will be set if any `.pyi` files + that are associated with the target's `srcs` are present. + ([#3354](https://github.com/bazel-contrib/rules_python/issues/3354)). + {#v1-7-0} ## [1.7.0] - 2025-10-11 @@ -1980,4 +2004,4 @@ Breaking changes: * (pip) Create all_data_requirements alias * Expose Python C headers through the toolchain. -[0.24.0]: https://github.com/bazel-contrib/rules_python/releases/tag/0.24.0 \ No newline at end of file +[0.24.0]: https://github.com/bazel-contrib/rules_python/releases/tag/0.24.0 diff --git a/gazelle/docs/directives.md b/gazelle/docs/directives.md index a553226a59..c7936d539d 100644 --- a/gazelle/docs/directives.md +++ b/gazelle/docs/directives.md @@ -155,6 +155,12 @@ The Python-specific directives are: * Default: `false` * Allowed Values: `true`, `false` +[`# gazelle:python_generate_pyi_srcs bool`](#python-generate-pyi-srcs) +: Controls whether to generate a `pyi_srcs` attribute if a sibling `.pyi` file + is found. When `false` (default), the `pyi_srcs` attribute is not added. + * Default: `false` + * Allowed Values: `true`, `false` + [`# gazelle:python_generate_proto bool`](#python-generate-proto) : Controls whether to generate a {bzl:obj}`py_proto_library` for each {bzl:obj}`proto_library` in the package. By default we load this rule from the @@ -626,6 +632,28 @@ Detailed docs are not yet written. ::: +## `python_generate_pyi_deps` + +When `true`, include any sibling `.pyi` files in the `pyi_srcs` target attribute. + +For example, assume you have the following files: + +``` +foo.py +foo.pyi +``` + +The generated target will be: + +```starlark +py_library( + name = "foo", + srcs = ["foo.py"], + pyi_srcs = ["foo.pyi"], +) +``` + + ## `python_generate_proto` When `# gazelle:python_generate_proto true`, Gazelle will generate one diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index 13ba6477cd..88b15e91eb 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -70,6 +70,7 @@ func (py *Configurer) KnownDirectives() []string { pythonconfig.LabelConvention, pythonconfig.LabelNormalization, pythonconfig.GeneratePyiDeps, + pythonconfig.GeneratePyiSrcs, pythonconfig.ExperimentalAllowRelativeImports, pythonconfig.GenerateProto, pythonconfig.PythonResolveSiblingImports, @@ -242,6 +243,12 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { log.Fatal(err) } config.SetGeneratePyiDeps(v) + case pythonconfig.GeneratePyiSrcs: + v, err := strconv.ParseBool(strings.TrimSpace(d.Value)) + if err != nil { + log.Fatal(err) + } + config.SetGeneratePyiSrcs(v) case pythonconfig.GenerateProto: v, err := strconv.ParseBool(strings.TrimSpace(d.Value)) if err != nil { diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index a180ec527d..5c2da13c9f 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -250,6 +250,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes srcs.Remove(name) } } + sort.Strings(mainFileNames) for _, filename := range mainFileNames { pyBinaryTargetName := strings.TrimSuffix(filepath.Base(filename), ".py") @@ -259,9 +260,15 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes fqTarget.String(), actualPyBinaryKind, err) continue } + + // Add any sibling .pyi files to pyi_srcs + filenames := treeset.NewWith(godsutils.StringComparator, filename) + pyiSrcs, _ := getPyiFilenames(filenames, cfg.GeneratePyiSrcs(), args.Dir) + pyBinary := newTargetBuilder(pyBinaryKind, pyBinaryTargetName, pythonProjectRoot, args.Rel, pyFileNames, cfg.ResolveSiblingImports()). addVisibility(visibility). addSrc(filename). + addPyiSrcs(pyiSrcs). addModuleDependencies(mainModules[filename]). addResolvedDependencies(annotations.includeDeps). generateImportsAttribute(). @@ -289,6 +296,9 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } + // Add any sibling .pyi files to pyi_srcs + pyiSrcs, _ := getPyiFilenames(srcs, cfg.GeneratePyiSrcs(), args.Dir) + // Check if a target with the same name we are generating already // exists, and if it is of a different kind from the one we are // generating. If so, we have to throw an error since Gazelle won't @@ -304,6 +314,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes pyLibrary := newTargetBuilder(pyLibraryKind, pyLibraryTargetName, pythonProjectRoot, args.Rel, pyFileNames, cfg.ResolveSiblingImports()). addVisibility(visibility). addSrcs(srcs). + addPyiSrcs(pyiSrcs). addModuleDependencies(allDeps). addResolvedDependencies(annotations.includeDeps). generateImportsAttribute(). @@ -354,10 +365,15 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes collisionErrors.Add(err) } + // Add any sibling .pyi files to pyi_srcs + filenames := treeset.NewWith(godsutils.StringComparator, pyBinaryEntrypointFilename) + pyiSrcs, _ := getPyiFilenames(filenames, cfg.GeneratePyiSrcs(), args.Dir) + pyBinaryTarget := newTargetBuilder(pyBinaryKind, pyBinaryTargetName, pythonProjectRoot, args.Rel, pyFileNames, cfg.ResolveSiblingImports()). setMain(pyBinaryEntrypointFilename). addVisibility(visibility). addSrc(pyBinaryEntrypointFilename). + addPyiSrcs(pyiSrcs). addModuleDependencies(deps). addResolvedDependencies(annotations.includeDeps). setAnnotations(*annotations). @@ -387,8 +403,13 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes collisionErrors.Add(err) } + // Add any sibling .pyi files to pyi_srcs + filenames := treeset.NewWith(godsutils.StringComparator, conftestFilename) + pyiSrcs, _ := getPyiFilenames(filenames, cfg.GeneratePyiSrcs(), args.Dir) + conftestTarget := newTargetBuilder(pyLibraryKind, conftestTargetname, pythonProjectRoot, args.Rel, pyFileNames, cfg.ResolveSiblingImports()). addSrc(conftestFilename). + addPyiSrcs(pyiSrcs). addModuleDependencies(deps). addResolvedDependencies(annotations.includeDeps). setAnnotations(*annotations). @@ -419,8 +440,13 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes fqTarget.String(), actualPyTestKind, err, pythonconfig.TestNamingConvention) collisionErrors.Add(err) } + + // Add any sibling .pyi files to pyi_srcs + pyiSrcs, _ := getPyiFilenames(srcs, cfg.GeneratePyiSrcs(), args.Dir) + return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel, pyFileNames, cfg.ResolveSiblingImports()). addSrcs(srcs). + addPyiSrcs(pyiSrcs). addModuleDependencies(deps). addResolvedDependencies(annotations.includeDeps). setAnnotations(*annotations). @@ -627,3 +653,23 @@ func generateProtoLibraries(args language.GenerateArgs, cfg *pythonconfig.Config } } + +// getPyiFilenames returns a set of existing .pyi source file names for a given set of source +// file names if GeneratePyiSrcs is set. Otherwise, returns an empty set. +func getPyiFilenames(filenames *treeset.Set, generatePyiSrcs bool, basePath string) (*treeset.Set, error) { + pyiSrcs := treeset.NewWith(godsutils.StringComparator) + if generatePyiSrcs { + it := filenames.Iterator() + for it.Next() { + pyiFilename := it.Value().(string) + "i" // foo.py --> foo.pyi + + _, err := os.Stat(filepath.Join(basePath, pyiFilename)) + // If the file DNE or there's some other error, there's nothing to do. + if err == nil { + // pyi file exists, add it + pyiSrcs.Add(pyiFilename) + } + } + } + return pyiSrcs, nil +} diff --git a/gazelle/python/kinds.go b/gazelle/python/kinds.go index a4ce572aaa..566cdf739d 100644 --- a/gazelle/python/kinds.go +++ b/gazelle/python/kinds.go @@ -50,6 +50,7 @@ var pyKinds = map[string]rule.KindInfo{ ResolveAttrs: map[string]bool{ "deps": true, "pyi_deps": true, + "pyi_srcs": true, }, }, pyLibraryKind: { @@ -67,6 +68,7 @@ var pyKinds = map[string]rule.KindInfo{ ResolveAttrs: map[string]bool{ "deps": true, "pyi_deps": true, + "pyi_srcs": true, }, }, pyProtoLibraryKind: { @@ -90,6 +92,7 @@ var pyKinds = map[string]rule.KindInfo{ ResolveAttrs: map[string]bool{ "deps": true, "pyi_deps": true, + "pyi_srcs": true, }, }, } diff --git a/gazelle/python/target.go b/gazelle/python/target.go index 3fe5819e00..c7009a6a84 100644 --- a/gazelle/python/target.go +++ b/gazelle/python/target.go @@ -30,6 +30,7 @@ type targetBuilder struct { pythonProjectRoot string bzlPackage string srcs *treeset.Set + pyiSrcs *treeset.Set siblingSrcs *treeset.Set deps *treeset.Set resolvedDeps *treeset.Set @@ -49,6 +50,7 @@ func newTargetBuilder(kind, name, pythonProjectRoot, bzlPackage string, siblingS pythonProjectRoot: pythonProjectRoot, bzlPackage: bzlPackage, srcs: treeset.NewWith(godsutils.StringComparator), + pyiSrcs: treeset.NewWith(godsutils.StringComparator), siblingSrcs: siblingSrcs, deps: treeset.NewWith(moduleComparator), resolvedDeps: treeset.NewWith(godsutils.StringComparator), @@ -73,6 +75,21 @@ func (t *targetBuilder) addSrcs(srcs *treeset.Set) *targetBuilder { return t } +// addPyiSrc adds a single pyi_src to the target. +func (t *targetBuilder) addPyiSrc(pyiSrc string) *targetBuilder { + t.pyiSrcs.Add(pyiSrc) + return t +} + +// addPyiSrcs adds multiple pyi_srcs to the target. +func (t *targetBuilder) addPyiSrcs(pyiSrcs *treeset.Set) *targetBuilder { + it := pyiSrcs.Iterator() + for it.Next() { + t.pyiSrcs.Add(it.Value().(string)) + } + return t +} + // addModuleDependency adds a single module dep to the target. func (t *targetBuilder) addModuleDependency(dep Module) *targetBuilder { fileName := dep.Name + ".py" @@ -165,6 +182,9 @@ func (t *targetBuilder) build() *rule.Rule { if !t.srcs.Empty() { r.SetAttr("srcs", t.srcs.Values()) } + if !t.pyiSrcs.Empty() { + r.SetAttr("pyi_srcs", t.pyiSrcs.Values()) + } if !t.visibility.Empty() { r.SetAttr("visibility", t.visibility.Values()) } diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/BUILD.in b/gazelle/python/testdata/directive_python_generate_pyi_srcs/BUILD.in new file mode 100644 index 0000000000..a8459ad349 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_generate_pyi_srcs true diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/BUILD.out b/gazelle/python/testdata/directive_python_generate_pyi_srcs/BUILD.out new file mode 100644 index 0000000000..5beb703423 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/BUILD.out @@ -0,0 +1,36 @@ +load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test") + +# gazelle:python_generate_pyi_srcs true + +py_library( + name = "directive_python_generate_pyi_srcs", + srcs = [ + "__init__.py", + "bar.py", + "baz.py", + "foo.py", + ], + pyi_srcs = [ + "baz.pyi", + "foo.pyi", + ], + visibility = ["//:__subpackages__"], +) + +py_binary( + name = "directive_python_generate_pyi_srcs_bin", + srcs = ["__main__.py"], + main = "__main__.py", + pyi_srcs = ["__main__.pyi"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "directive_python_generate_pyi_srcs_test", + srcs = [ + "__test__.py", + "foo_test.py", + ], + main = "__test__.py", + pyi_srcs = ["foo_test.pyi"], +) diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/README.md b/gazelle/python/testdata/directive_python_generate_pyi_srcs/README.md new file mode 100644 index 0000000000..3ef10bab06 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/README.md @@ -0,0 +1,13 @@ +# Directive: python_generate_pyi_srcs + +Test that the `python_generate_pyi_srcs` directive will add `pyi_srcs` to +generated targets and that it can be toggled on/off on a per-package basis. + +The root of the test case asserts that the default generation mode (package) +will compile multiple .pyi files into a single py_* target. + +The `per_file` directory asserts that the `file` generation mode will attach +a single .pyi file to a given target. + +Lastly, the `per_file/turn_off` directory asserts that we can turn off the +directive for subpackages. It continues with per-file generation mode. diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/WORKSPACE b/gazelle/python/testdata/directive_python_generate_pyi_srcs/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/__init__.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/__main__.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/__main__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/__main__.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/__main__.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/__test__.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/__test__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/bar.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/bar.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/baz.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/baz.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/baz.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/baz.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo_test.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo_test.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/foo_test.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/BUILD.in b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/BUILD.in new file mode 100644 index 0000000000..a7dbb7e4c1 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_generate_pyi_srcs true +# gazelle:python_generation_mode file diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/BUILD.out b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/BUILD.out new file mode 100644 index 0000000000..d0889fc46f --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/BUILD.out @@ -0,0 +1,30 @@ +load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test") + +# gazelle:python_generate_pyi_srcs true +# gazelle:python_generation_mode file + +py_library( + name = "bar", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], +) + +py_library( + name = "foo", + srcs = ["foo.py"], + pyi_srcs = ["foo.pyi"], + visibility = ["//:__subpackages__"], +) + +py_binary( + name = "my_binary", + srcs = ["my_binary.py"], + pyi_srcs = ["my_binary.pyi"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "bar_test", + srcs = ["bar_test.py"], + pyi_srcs = ["bar_test.pyi"], +) diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/__init__.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/bar.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/bar.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/bar_test.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/bar_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/bar_test.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/bar_test.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/foo.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/foo.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/foo.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/foo.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/my_binary.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/my_binary.py new file mode 100644 index 0000000000..6a81382943 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/my_binary.py @@ -0,0 +1,2 @@ +if __name__ == "__main__": + print("hey") diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/my_binary.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/my_binary.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/BUILD.in b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/BUILD.in new file mode 100644 index 0000000000..7a24055cd0 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_generate_pyi_srcs false diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/BUILD.out b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/BUILD.out new file mode 100644 index 0000000000..25b508a7f0 --- /dev/null +++ b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/BUILD.out @@ -0,0 +1,9 @@ +load("@rules_python//python:defs.bzl", "py_library") + +# gazelle:python_generate_pyi_srcs false + +py_library( + name = "foo", + srcs = ["foo.py"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/foo.py b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/foo.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/foo.pyi b/gazelle/python/testdata/directive_python_generate_pyi_srcs/per_file/turn_off/foo.pyi new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_generate_pyi_srcs/test.yaml b/gazelle/python/testdata/directive_python_generate_pyi_srcs/test.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index ed9b914e82..a1271af3be 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -104,6 +104,10 @@ const ( // separate pyi_deps attribute or merge type-checking dependencies into deps. // Defaults to false for backward compatibility. GeneratePyiDeps = "python_generate_pyi_deps" + // GeneratePyiSrcs represents the directive that controls whether to include + // a pyi_srcs attribute if a sibling .pyi file is found. + // Defaults to false for backward compatibility. + GeneratePyiSrcs = "python_generate_pyi_srcs" // GenerateProto represents the directive that controls whether to generate // python_generate_proto targets. GenerateProto = "python_generate_proto" @@ -202,6 +206,7 @@ type Config struct { labelNormalization LabelNormalizationType experimentalAllowRelativeImports bool generatePyiDeps bool + generatePyiSrcs bool generateProto bool resolveSiblingImports bool } @@ -242,6 +247,7 @@ func New( labelNormalization: DefaultLabelNormalizationType, experimentalAllowRelativeImports: false, generatePyiDeps: false, + generatePyiSrcs: false, generateProto: false, resolveSiblingImports: false, } @@ -279,6 +285,7 @@ func (c *Config) NewChild() *Config { labelNormalization: c.labelNormalization, experimentalAllowRelativeImports: c.experimentalAllowRelativeImports, generatePyiDeps: c.generatePyiDeps, + generatePyiSrcs: c.generatePyiSrcs, generateProto: c.generateProto, resolveSiblingImports: c.resolveSiblingImports, } @@ -590,6 +597,18 @@ func (c *Config) GeneratePyiDeps() bool { return c.generatePyiDeps } +// SetGeneratePyiSrcs sets whether pyi_srcs attribute should be generated if a sibling +// .pyi file is found. +func (c *Config) SetGeneratePyiSrcs(generatePyiSrcs bool) { + c.generatePyiSrcs = generatePyiSrcs +} + +// GeneratePyiSrcs returns whether pyi_srcs attribute should be generated if a sibling +// .pyi file is found. +func (c *Config) GeneratePyiSrcs() bool { + return c.generatePyiSrcs +} + // SetGenerateProto sets whether py_proto_library should be generated for proto_library. func (c *Config) SetGenerateProto(generateProto bool) { c.generateProto = generateProto