From fb673ee47b3268a65a18a154edd574b6509c38c7 Mon Sep 17 00:00:00 2001 From: Alex Martani Date: Fri, 15 Mar 2024 17:49:44 -0700 Subject: [PATCH 1/4] fix(gazelle): Reproduce issue generating `py_test` rules with no test files in project mode --- .../testdata/project_generation_mode/BUILD.in | 2 ++ .../testdata/project_generation_mode/BUILD.out | 15 +++++++++++++++ .../testdata/project_generation_mode/WORKSPACE | 1 + .../testdata/project_generation_mode/__init__.py | 0 .../testdata/project_generation_mode/test.yaml | 15 +++++++++++++++ 5 files changed, 33 insertions(+) create mode 100644 gazelle/python/testdata/project_generation_mode/BUILD.in create mode 100644 gazelle/python/testdata/project_generation_mode/BUILD.out create mode 100644 gazelle/python/testdata/project_generation_mode/WORKSPACE create mode 100644 gazelle/python/testdata/project_generation_mode/__init__.py create mode 100644 gazelle/python/testdata/project_generation_mode/test.yaml diff --git a/gazelle/python/testdata/project_generation_mode/BUILD.in b/gazelle/python/testdata/project_generation_mode/BUILD.in new file mode 100644 index 0000000000..0d4f13bb25 --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_extension enabled +# gazelle:python_generation_mode project \ No newline at end of file diff --git a/gazelle/python/testdata/project_generation_mode/BUILD.out b/gazelle/python/testdata/project_generation_mode/BUILD.out new file mode 100644 index 0000000000..4e1891e9cb --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode/BUILD.out @@ -0,0 +1,15 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_extension enabled +# gazelle:python_generation_mode project + +py_library( + name = "project_generation_mode", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "project_generation_mode_test", + main = "__test__.py", +) diff --git a/gazelle/python/testdata/project_generation_mode/WORKSPACE b/gazelle/python/testdata/project_generation_mode/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/project_generation_mode/__init__.py b/gazelle/python/testdata/project_generation_mode/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode/test.yaml b/gazelle/python/testdata/project_generation_mode/test.yaml new file mode 100644 index 0000000000..fcea77710f --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode/test.yaml @@ -0,0 +1,15 @@ +# Copyright 2023 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- From 51728b26b4162a4bc06c22b14d079f41d50d322e Mon Sep 17 00:00:00 2001 From: Alex Martani Date: Wed, 20 Mar 2024 14:34:22 -0700 Subject: [PATCH 2/4] fix(gazelle): Only generate test target if there is a test file or a test target --- gazelle/python/generate.go | 28 ++++++++++--------- .../monorepo/coarse_grained/BUILD.out | 1 - .../project_generation_mode/BUILD.out | 7 +---- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 400c25e0b4..673076d350 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -393,20 +393,22 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes // the file exists on disk. pyTestFilenames.Add(pyTestEntrypointFilename) } - pyTestTargetName := cfg.RenderTestName(packageName) - pyTestTarget := newPyTestTargetBuilder(pyTestFilenames, pyTestTargetName) - - if hasPyTestEntryPointTarget { - entrypointTarget := fmt.Sprintf(":%s", pyTestEntrypointTargetname) - main := fmt.Sprintf(":%s", pyTestEntrypointFilename) - pyTestTarget. - addSrc(entrypointTarget). - addResolvedDependency(entrypointTarget). - setMain(main) - } else { - pyTestTarget.setMain(pyTestEntrypointFilename) + if (hasPyTestEntryPointTarget || !pyTestFilenames.Empty()) { + pyTestTargetName := cfg.RenderTestName(packageName) + pyTestTarget := newPyTestTargetBuilder(pyTestFilenames, pyTestTargetName) + + if hasPyTestEntryPointTarget { + entrypointTarget := fmt.Sprintf(":%s", pyTestEntrypointTargetname) + main := fmt.Sprintf(":%s", pyTestEntrypointFilename) + pyTestTarget. + addSrc(entrypointTarget). + addResolvedDependency(entrypointTarget). + setMain(main) + } else if hasPyTestEntryPointFile { + pyTestTarget.setMain(pyTestEntrypointFilename) + } + pyTestTargets = append(pyTestTargets, pyTestTarget) } - pyTestTargets = append(pyTestTargets, pyTestTarget) } else { // Create one py_test target per file pyTestFilenames.Each(func(index int, testFile interface{}) { diff --git a/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out b/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out index 3a331112e9..af01460694 100644 --- a/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out +++ b/gazelle/python/testdata/monorepo/coarse_grained/BUILD.out @@ -25,5 +25,4 @@ py_test( "bar/bar_test.py", "foo/bar/bar_test.py", ], - main = "__test__.py", ) diff --git a/gazelle/python/testdata/project_generation_mode/BUILD.out b/gazelle/python/testdata/project_generation_mode/BUILD.out index 4e1891e9cb..0781f61cd4 100644 --- a/gazelle/python/testdata/project_generation_mode/BUILD.out +++ b/gazelle/python/testdata/project_generation_mode/BUILD.out @@ -1,4 +1,4 @@ -load("@rules_python//python:defs.bzl", "py_library", "py_test") +load("@rules_python//python:defs.bzl", "py_library") # gazelle:python_extension enabled # gazelle:python_generation_mode project @@ -8,8 +8,3 @@ py_library( srcs = ["__init__.py"], visibility = ["//:__subpackages__"], ) - -py_test( - name = "project_generation_mode_test", - main = "__test__.py", -) From 3b6311fed445d079b01fc2bcd00e561bd9f81100 Mon Sep 17 00:00:00 2001 From: Alex Martani Date: Wed, 20 Mar 2024 14:48:57 -0700 Subject: [PATCH 3/4] tests(gazelle): Add more tests --- .../testdata/project_generation_mode/BUILD.in | 2 +- .../project_generation_mode/BUILD.out | 6 +++++- .../project_generation_mode/README.md | 3 +++ .../project_generation_mode/bar/bar.py | 0 .../project_generation_mode/foo/foo.py | 0 .../BUILD.in | 2 ++ .../BUILD.out | 19 +++++++++++++++++++ .../README.md | 3 +++ .../WORKSPACE | 1 + .../__init__.py | 0 .../__test__.py | 0 .../foo/foo_test.py | 0 .../test.yaml | 15 +++++++++++++++ .../BUILD.in | 2 ++ .../BUILD.out | 15 +++++++++++++++ .../README.md | 7 +++++++ .../WORKSPACE | 1 + .../__init__.py | 0 .../foo/foo_test.py | 0 .../test.yaml | 15 +++++++++++++++ 20 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 gazelle/python/testdata/project_generation_mode/README.md create mode 100644 gazelle/python/testdata/project_generation_mode/bar/bar.py create mode 100644 gazelle/python/testdata/project_generation_mode/foo/foo.py create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.in create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.out create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/README.md create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/WORKSPACE create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/__init__.py create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/__test__.py create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/foo/foo_test.py create mode 100644 gazelle/python/testdata/project_generation_mode_with_test_entrypoint/test.yaml create mode 100644 gazelle/python/testdata/project_generation_mode_with_tests/BUILD.in create mode 100644 gazelle/python/testdata/project_generation_mode_with_tests/BUILD.out create mode 100644 gazelle/python/testdata/project_generation_mode_with_tests/README.md create mode 100644 gazelle/python/testdata/project_generation_mode_with_tests/WORKSPACE create mode 100644 gazelle/python/testdata/project_generation_mode_with_tests/__init__.py create mode 100644 gazelle/python/testdata/project_generation_mode_with_tests/foo/foo_test.py create mode 100644 gazelle/python/testdata/project_generation_mode_with_tests/test.yaml diff --git a/gazelle/python/testdata/project_generation_mode/BUILD.in b/gazelle/python/testdata/project_generation_mode/BUILD.in index 0d4f13bb25..130a6251a7 100644 --- a/gazelle/python/testdata/project_generation_mode/BUILD.in +++ b/gazelle/python/testdata/project_generation_mode/BUILD.in @@ -1,2 +1,2 @@ # gazelle:python_extension enabled -# gazelle:python_generation_mode project \ No newline at end of file +# gazelle:python_generation_mode project diff --git a/gazelle/python/testdata/project_generation_mode/BUILD.out b/gazelle/python/testdata/project_generation_mode/BUILD.out index 0781f61cd4..1f30b6d6ab 100644 --- a/gazelle/python/testdata/project_generation_mode/BUILD.out +++ b/gazelle/python/testdata/project_generation_mode/BUILD.out @@ -5,6 +5,10 @@ load("@rules_python//python:defs.bzl", "py_library") py_library( name = "project_generation_mode", - srcs = ["__init__.py"], + srcs = [ + "__init__.py", + "bar/bar.py", + "foo/foo.py", + ], visibility = ["//:__subpackages__"], ) diff --git a/gazelle/python/testdata/project_generation_mode/README.md b/gazelle/python/testdata/project_generation_mode/README.md new file mode 100644 index 0000000000..6d8f1388f6 --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode/README.md @@ -0,0 +1,3 @@ +# Project generation mode + +Simple example using `gazelle:python_generation_mode project` in a project with no tests. diff --git a/gazelle/python/testdata/project_generation_mode/bar/bar.py b/gazelle/python/testdata/project_generation_mode/bar/bar.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode/foo/foo.py b/gazelle/python/testdata/project_generation_mode/foo/foo.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.in b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.in new file mode 100644 index 0000000000..130a6251a7 --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_extension enabled +# gazelle:python_generation_mode project diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.out b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.out new file mode 100644 index 0000000000..05cf353abd --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/BUILD.out @@ -0,0 +1,19 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_extension enabled +# gazelle:python_generation_mode project + +py_library( + name = "project_generation_mode_with_test_entrypoint", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "project_generation_mode_with_test_entrypoint_test", + srcs = [ + "__test__.py", + "foo/foo_test.py", + ], + main = "__test__.py", +) diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/README.md b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/README.md new file mode 100644 index 0000000000..8db5728862 --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/README.md @@ -0,0 +1,3 @@ +# Project generation mode with test entrypoint + +Example using `gazelle:python_generation_mode project` in a project with tests that use an explicit `__test__.py` entrypoint. diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/WORKSPACE b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/__init__.py b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/__test__.py b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/__test__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/foo/foo_test.py b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/foo/foo_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/test.yaml b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/test.yaml new file mode 100644 index 0000000000..fcea77710f --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_test_entrypoint/test.yaml @@ -0,0 +1,15 @@ +# Copyright 2023 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- diff --git a/gazelle/python/testdata/project_generation_mode_with_tests/BUILD.in b/gazelle/python/testdata/project_generation_mode_with_tests/BUILD.in new file mode 100644 index 0000000000..130a6251a7 --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_tests/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_extension enabled +# gazelle:python_generation_mode project diff --git a/gazelle/python/testdata/project_generation_mode_with_tests/BUILD.out b/gazelle/python/testdata/project_generation_mode_with_tests/BUILD.out new file mode 100644 index 0000000000..8756978b00 --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_tests/BUILD.out @@ -0,0 +1,15 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_extension enabled +# gazelle:python_generation_mode project + +py_library( + name = "project_generation_mode_with_tests", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "project_generation_mode_with_tests_test", + srcs = ["foo/foo_test.py"], +) diff --git a/gazelle/python/testdata/project_generation_mode_with_tests/README.md b/gazelle/python/testdata/project_generation_mode_with_tests/README.md new file mode 100644 index 0000000000..4a5f012d85 --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_tests/README.md @@ -0,0 +1,7 @@ +# Project generation mode with tests + +Example using `gazelle:python_generation_mode project` in a project with tests, but no `__test__.py` entrypoint. + +Note that, in this mode, the `py_test` rule will have no `main` set, which will fail to run with the standard +`py_test` rule. However, this can be used in conjunction with `gazelle:map_kind` to use some other implementation +of `py_test` that is able to handle this sitation (such as `rules_python_pytest`). \ No newline at end of file diff --git a/gazelle/python/testdata/project_generation_mode_with_tests/WORKSPACE b/gazelle/python/testdata/project_generation_mode_with_tests/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_tests/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/project_generation_mode_with_tests/__init__.py b/gazelle/python/testdata/project_generation_mode_with_tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode_with_tests/foo/foo_test.py b/gazelle/python/testdata/project_generation_mode_with_tests/foo/foo_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/project_generation_mode_with_tests/test.yaml b/gazelle/python/testdata/project_generation_mode_with_tests/test.yaml new file mode 100644 index 0000000000..fcea77710f --- /dev/null +++ b/gazelle/python/testdata/project_generation_mode_with_tests/test.yaml @@ -0,0 +1,15 @@ +# Copyright 2023 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- From 219aedfa8f401e9231e131511998e7fda575f9ce Mon Sep 17 00:00:00 2001 From: Alex Martani Date: Wed, 20 Mar 2024 16:24:38 -0700 Subject: [PATCH 4/4] chore: Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b7ab25545..af4c108fd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,9 @@ A brief description of the categories of changes: * (whl_library): Fix the experimental_target_platforms overriding for platform specific wheels when the wheels are for any python interpreter version. Fixes [#1810](https://github.com/bazelbuild/rules_python/issues/1810). +* (gazelle) In `project` or `package` generation modes, do not generate `py_test` + rules when there are no test files and do not set `main = "__test__.py"` when + that file doesn't exist. ### Added