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.