bazel-contrib / bazel-contrib/rules_python

[Continuing Discussion] `python_no_test_files` directive

Open
#1,826 0 comments 0 reactions 0 assignees View on GitHub
gazelle help wanted
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

Open the contributing guide

Research direction

Start by reading the linked discussion on pull request #1819, then inspect gazelle/python/generate.go at the referenced checks around lines 108 and 179. The issue needs a decided behavior and directive name before implementation can be scoped; done means Gazelle handles packages with no py_test targets without the documented workaround.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
build-system, tooling
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.