Skip to content

Commit

Permalink
Handling imports from sibling modules (#1027)
Browse files Browse the repository at this point in the history
  • Loading branch information
linzhp authored Jan 28, 2023
1 parent 58c7958 commit 82c8f0a
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 12 deletions.
8 changes: 4 additions & 4 deletions gazelle/python/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down Expand Up @@ -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).
Expand Down Expand Up @@ -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).
Expand Down Expand Up @@ -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()
Expand Down
10 changes: 7 additions & 3 deletions gazelle/python/target.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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),
Expand Down Expand Up @@ -65,15 +67,17 @@ 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
}

// addModuleDependencies copies all values from the provided deps to the target.
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
}
Expand Down
2 changes: 2 additions & 0 deletions gazelle/python/testdata/subdir_sources/one/two/README.md
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions gazelle/python/testdata/subdir_sources/one/two/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import foo.baz.baz as baz
import three

_ = baz
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
)
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 82c8f0a

Please sign in to comment.