Skip to content

Commit 82c8f0a

Browse files
authored
Handling imports from sibling modules (bazel-contrib#1027)
1 parent 58c7958 commit 82c8f0a

6 files changed

Lines changed: 18 additions & 12 deletions

File tree

gazelle/python/generate.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
209209
}
210210
}
211211

212-
pyLibrary = newTargetBuilder(pyLibraryKind, pyLibraryTargetName, pythonProjectRoot, args.Rel).
212+
pyLibrary = newTargetBuilder(pyLibraryKind, pyLibraryTargetName, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)).
213213
setUUID(label.New("", args.Rel, pyLibraryTargetName).String()).
214214
addVisibility(visibility).
215215
addSrcs(pyLibraryFilenames).
@@ -246,7 +246,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
246246
}
247247
}
248248

249-
pyBinaryTarget := newTargetBuilder(pyBinaryKind, pyBinaryTargetName, pythonProjectRoot, args.Rel).
249+
pyBinaryTarget := newTargetBuilder(pyBinaryKind, pyBinaryTargetName, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)).
250250
setMain(pyBinaryEntrypointFilename).
251251
addVisibility(visibility).
252252
addSrc(pyBinaryEntrypointFilename).
@@ -286,7 +286,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
286286
}
287287
}
288288

289-
conftestTarget := newTargetBuilder(pyLibraryKind, conftestTargetname, pythonProjectRoot, args.Rel).
289+
conftestTarget := newTargetBuilder(pyLibraryKind, conftestTargetname, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)).
290290
setUUID(label.New("", args.Rel, conftestTargetname).String()).
291291
addSrc(conftestFilename).
292292
addModuleDependencies(deps).
@@ -322,7 +322,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes
322322
}
323323
}
324324
}
325-
return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel).
325+
return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel, pyLibraryFilenames.Union(pyTestFilenames)).
326326
addSrcs(pyTestFilenames).
327327
addModuleDependencies(deps).
328328
generateImportsAttribute()

gazelle/python/target.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type targetBuilder struct {
1717
bzlPackage string
1818
uuid string
1919
srcs *treeset.Set
20+
siblingSrcs *treeset.Set
2021
deps *treeset.Set
2122
resolvedDeps *treeset.Set
2223
visibility *treeset.Set
@@ -26,13 +27,14 @@ type targetBuilder struct {
2627
}
2728

2829
// newTargetBuilder constructs a new targetBuilder.
29-
func newTargetBuilder(kind, name, pythonProjectRoot, bzlPackage string) *targetBuilder {
30+
func newTargetBuilder(kind, name, pythonProjectRoot, bzlPackage string, siblingSrcs *treeset.Set) *targetBuilder {
3031
return &targetBuilder{
3132
kind: kind,
3233
name: name,
3334
pythonProjectRoot: pythonProjectRoot,
3435
bzlPackage: bzlPackage,
3536
srcs: treeset.NewWith(godsutils.StringComparator),
37+
siblingSrcs: siblingSrcs,
3638
deps: treeset.NewWith(moduleComparator),
3739
resolvedDeps: treeset.NewWith(godsutils.StringComparator),
3840
visibility: treeset.NewWith(godsutils.StringComparator),
@@ -65,15 +67,17 @@ func (t *targetBuilder) addSrcs(srcs *treeset.Set) *targetBuilder {
6567

6668
// addModuleDependency adds a single module dep to the target.
6769
func (t *targetBuilder) addModuleDependency(dep module) *targetBuilder {
68-
t.deps.Add(dep)
70+
if dep.Name+".py" == filepath.Base(dep.Filepath) || !t.siblingSrcs.Contains(dep.Name+".py") {
71+
t.deps.Add(dep)
72+
}
6973
return t
7074
}
7175

7276
// addModuleDependencies copies all values from the provided deps to the target.
7377
func (t *targetBuilder) addModuleDependencies(deps *treeset.Set) *targetBuilder {
7478
it := deps.Iterator()
7579
for it.Next() {
76-
t.deps.Add(it.Value().(module))
80+
t.addModuleDependency(it.Value().(module))
7781
}
7882
return t
7983
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Same package imports
2+
This test case asserts that no `deps` is needed when a module imports another module in the same package
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import foo.baz.baz as baz
2+
import three
23

34
_ = baz

gazelle/python/testdata/with_third_party_requirements/BUILD.out

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,5 @@ py_binary(
2020
srcs = ["__main__.py"],
2121
main = "__main__.py",
2222
visibility = ["//:__subpackages__"],
23-
deps = [
24-
":with_third_party_requirements",
25-
"@gazelle_python_test_baz//:pkg",
26-
],
23+
deps = [":with_third_party_requirements"],
2724
)
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# With third-party requirements
22

3-
This test case asserts that a `py_library` is generated with dependencies
3+
This test case asserts that
4+
* a `py_library` is generated with dependencies
45
extracted from its sources and a `py_binary` is generated embeding the
56
`py_library` and inherits its dependencies, without specifying the `deps` again.
7+
* when a third-party library and a module in the same package having the same name, the one in the same package takes precedence.

0 commit comments

Comments
 (0)