diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index a36b83b754..a1587991e3 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -209,7 +209,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } - pyLibrary = newTargetBuilder(pyLibraryKind, pyLibraryTargetName, pythonProjectRoot, args.Rel). + pyLibrary = newTargetBuilder(pyLibraryKind, pyLibraryTargetName, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)). setUUID(label.New("", args.Rel, pyLibraryTargetName).String()). addVisibility(visibility). addSrcs(pyLibraryFilenames). @@ -246,7 +246,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } - pyBinaryTarget := newTargetBuilder(pyBinaryKind, pyBinaryTargetName, pythonProjectRoot, args.Rel). + pyBinaryTarget := newTargetBuilder(pyBinaryKind, pyBinaryTargetName, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)). setMain(pyBinaryEntrypointFilename). addVisibility(visibility). addSrc(pyBinaryEntrypointFilename). @@ -286,7 +286,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } - conftestTarget := newTargetBuilder(pyLibraryKind, conftestTargetname, pythonProjectRoot, args.Rel). + conftestTarget := newTargetBuilder(pyLibraryKind, conftestTargetname, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)). setUUID(label.New("", args.Rel, conftestTargetname).String()). addSrc(conftestFilename). addModuleDependencies(deps). @@ -322,7 +322,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } } - return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel). + return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)). addSrcs(pyTestFilenames). addModuleDependencies(deps). generateImportsAttribute() diff --git a/gazelle/python/target.go b/gazelle/python/target.go index eef3aedd8d..84bbe29161 100644 --- a/gazelle/python/target.go +++ b/gazelle/python/target.go @@ -17,6 +17,7 @@ type targetBuilder struct { bzlPackage string uuid string srcs *treeset.Set + siblingSrcs *treeset.Set deps *treeset.Set resolvedDeps *treeset.Set visibility *treeset.Set @@ -26,13 +27,14 @@ type targetBuilder struct { } // newTargetBuilder constructs a new targetBuilder. -func newTargetBuilder(kind, name, pythonProjectRoot, bzlPackage string) *targetBuilder { +func newTargetBuilder(kind, name, pythonProjectRoot, bzlPackage string, siblingSrcs *treeset.Set) *targetBuilder { return &targetBuilder{ kind: kind, name: name, pythonProjectRoot: pythonProjectRoot, bzlPackage: bzlPackage, srcs: treeset.NewWith(godsutils.StringComparator), + siblingSrcs: siblingSrcs, deps: treeset.NewWith(moduleComparator), resolvedDeps: treeset.NewWith(godsutils.StringComparator), visibility: treeset.NewWith(godsutils.StringComparator), @@ -65,7 +67,9 @@ func (t *targetBuilder) addSrcs(srcs *treeset.Set) *targetBuilder { // addModuleDependency adds a single module dep to the target. func (t *targetBuilder) addModuleDependency(dep module) *targetBuilder { - t.deps.Add(dep) + if dep.Name+".py" == filepath.Base(dep.Filepath) || !t.siblingSrcs.Contains(dep.Name+".py") { + t.deps.Add(dep) + } return t } @@ -73,7 +77,7 @@ func (t *targetBuilder) addModuleDependency(dep module) *targetBuilder { func (t *targetBuilder) addModuleDependencies(deps *treeset.Set) *targetBuilder { it := deps.Iterator() for it.Next() { - t.deps.Add(it.Value().(module)) + t.addModuleDependency(it.Value().(module)) } return t } diff --git a/gazelle/python/testdata/subdir_sources/one/two/README.md b/gazelle/python/testdata/subdir_sources/one/two/README.md new file mode 100644 index 0000000000..ec4c15ddaa --- /dev/null +++ b/gazelle/python/testdata/subdir_sources/one/two/README.md @@ -0,0 +1,2 @@ +# Same package imports +This test case asserts that no `deps` is needed when a module imports another module in the same package \ No newline at end of file diff --git a/gazelle/python/testdata/subdir_sources/one/two/__init__.py b/gazelle/python/testdata/subdir_sources/one/two/__init__.py index f6c7d2a988..b6074a18d6 100644 --- a/gazelle/python/testdata/subdir_sources/one/two/__init__.py +++ b/gazelle/python/testdata/subdir_sources/one/two/__init__.py @@ -1,3 +1,4 @@ import foo.baz.baz as baz +import three _ = baz diff --git a/gazelle/python/testdata/with_third_party_requirements/BUILD.out b/gazelle/python/testdata/with_third_party_requirements/BUILD.out index a8261a9fae..2da7f2bd86 100644 --- a/gazelle/python/testdata/with_third_party_requirements/BUILD.out +++ b/gazelle/python/testdata/with_third_party_requirements/BUILD.out @@ -20,8 +20,5 @@ py_binary( srcs = ["__main__.py"], main = "__main__.py", visibility = ["//:__subpackages__"], - deps = [ - ":with_third_party_requirements", - "@gazelle_python_test_baz//:pkg", - ], + deps = [":with_third_party_requirements"], ) diff --git a/gazelle/python/testdata/with_third_party_requirements/README.md b/gazelle/python/testdata/with_third_party_requirements/README.md index b47101c8f8..a7ef7a3ca7 100644 --- a/gazelle/python/testdata/with_third_party_requirements/README.md +++ b/gazelle/python/testdata/with_third_party_requirements/README.md @@ -1,5 +1,7 @@ # With third-party requirements -This test case asserts that a `py_library` is generated with dependencies +This test case asserts that +* a `py_library` is generated with dependencies extracted from its sources and a `py_binary` is generated embeding the `py_library` and inherits its dependencies, without specifying the `deps` again. +* when a third-party library and a module in the same package having the same name, the one in the same package takes precedence.