Handling imports from sibling modules (#1027)
diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index a36b83b..a158799 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go
@@ -209,7 +209,7 @@ } } - 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 @@ } } - 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 @@ } } - 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 @@ } } } - 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 eef3aed..84bbe29 100644 --- a/gazelle/python/target.go +++ b/gazelle/python/target.go
@@ -17,6 +17,7 @@ bzlPackage string uuid string srcs *treeset.Set + siblingSrcs *treeset.Set deps *treeset.Set resolvedDeps *treeset.Set visibility *treeset.Set @@ -26,13 +27,14 @@ } // 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 @@ // 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) 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 0000000..ec4c15d --- /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 f6c7d2a..b6074a1 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 a8261a9..2da7f2b 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 @@ 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 b47101c..a7ef7a3 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.