bazel-contrib/rules_python

[Continuing Discussion] `python_no_test_files` directive

Open

#1,826 opened on Mar 28, 2024

View on GitHub
 (0 comments) (0 reactions) (0 assignees)Starlark (705 forks)auto 404
gazellehelp wanted

Repository metrics

Stars
 (679 stars)
PR merge metrics
 (PR metrics pending)

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 and here) 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