bazel-contrib / bazel-contrib/rules_python
[Continuing Discussion] `python_no_test_files` directive
- Dominant language
- Starlark
- Stars
- 688
- Forks
- 721
- Avg merge
- 15h 7m
- Merged PRs (30d)
- 76
Description
This is a continuation of the discussion from https://github.com/bazelbuild/rules_python/pull/1819#discussion_r1542543260.
# 🚀 feature request
### Relevant Rules
+ gazelle
### Description
The summary of the discussion in https://github.com/bazelbuild/rules_python/pull/1819#discussion_r1542543260 so far is:
+ Having `python_test_file_pattern` accept no value is unintuitive and should raise an error. #1819 includes this.
+ Setting `python_test_file_pattern` back to "default" should be done manually, not through magic strings.
+ Eg: `# gazelle:python_test_file_pattern *_test.py,test_*.py`
+ There's still not a _nice_ way to tell gazelle that there are _no files in the bazel package_ that should be mapped to `py_test` targets _but should still be processed as py_library or py_binary_ (see example below).
+ Workaround: set `python_test_file_pattern` to a value that ends in something other than `.py`, such as `gazelle:python_test_file_pattern ignore_me.txt`. This will work because a prior check ([here](https://github.com/bazelbuild/rules_python/blob/5631f05024ec02e04d2b9c74a93b06f934cbfac6/gazelle/python/generate.go#L108) and [here](https://github.com/bazelbuild/rules_python/blob/5631f05024ec02e04d2b9c74a93b06f934cbfac6/gazelle/python/generate.go#L179)) asserts that the files being processed by gazelle end in `.py`.
+ All of the above led to the conclusion that there should be a `python_no_test_files` directive.
```
# example of project structure
project/
+ BUILD.bazel
+ MODULE.bazel
+ src/mypackage/ # guaranteed to have no py_test targets
+ BUILD.bazel
+ run_electrical_test.py # py_binary
+ electrical_test.py # py_library
+ tests/ # will have any py_* targets
+ BUILD.bazel
+ foo_test.py # py_test
+ bar_test.py # py_test
+ test_utils.py # py_library
+ run_all_test.py # py_binary
```
How does `python_no_test_files` behave? Does it:
1. cause gazelle to simply _ignore_ all files that match `python_test_file_pattern`? or
2. cause gazelle to map all files that match `python_test_file_pattern` to `py_library` or `py_binary` (if they have `if __name__ ...`)?
### Describe the solution you'd like
With behavior (1), there's still a feature gap for the example case above, and the workaround feels a bit hacky.
For behavior (2) we'd probably want to name the directive something else.
### Describe alternatives you've considered
Using `python_ignore_files` and then manually generating the py_library targets for files that match `python_test_file_pattern`. This is less than ideal when adding things to large projects.
Contributor guide
Assessment
This issue has not been assessed yet.