| # Annotations | |
| *Annotations* refer to comments found _within Python files_ that configure how | |
| Gazelle acts for that particular file. | |
| Annotations have the form: | |
| ```python | |
| # gazelle:annotation_name value | |
| ``` | |
| and can reside anywhere within a Python file where comments are valid. For example: | |
| ```python | |
| import foo | |
| # gazelle:annotation_name value | |
| def bar(): # gazelle:annotation_name value | |
| pass | |
| ``` | |
| The annotations are: | |
| {.glossary} | |
| [`# gazelle:ignore imports`](#annotation-ignore) | |
| : Tells Gazelle to ignore import statements. `imports` is a comma-separated | |
| list of imports to ignore. | |
| * Default: n/a | |
| * Allowed Values: A comma-separated string of python package names | |
| [`# gazelle:include_dep targets`](#annotation-include-dep) | |
| : Tells Gazelle to include a set of dependencies, even if they are not imported | |
| in a Python module. `targets` is a comma-separated list of target names | |
| to include as dependencies. | |
| * Default: n/a | |
| * Allowed Values: A comma-separated string of targets | |
| [`# gazelle:include_pytest_conftest bool`](#annotation-include-pytest-conftest) | |
| : Whether or not to include a sibling `:conftest` target in the `deps` | |
| of a {bzl:obj}`py_test` target. The default behaviour is to include `:conftest` | |
| (i.e.: `# gazelle:include_pytest_conftest true`). | |
| * Default: n/a | |
| * Allowed Values: `true`, `false` | |
| (annotation-ignore)= | |
| ## `ignore` | |
| This annotation accepts a comma-separated string of values. Values are names of | |
| Python imports that Gazelle should _not_ include in target dependencies. | |
| The annotation can be added multiple times, and all values are combined and | |
| de-duplicated. | |
| For `python_generation_mode = "package"`, the `ignore` annotations | |
| found across all files included in the generated target are removed from | |
| `deps`. | |
| ### Example: | |
| ```python | |
| import numpy # a pypi package | |
| # gazelle:ignore bar.baz.hello,foo | |
| import bar.baz.hello | |
| import foo | |
| # Ignore this import because _reasons_ | |
| import baz # gazelle:ignore baz | |
| ``` | |
| will cause Gazelle to generate: | |
| ```starlark | |
| deps = ["@pypi//numpy"], | |
| ``` | |
| (annotation-include-dep)= | |
| ## `include_dep` | |
| This annotation accepts a comma-separated string of values. Values _must_ | |
| be Python targets, but _no validation is done_. If a value is not a Python | |
| target, building will result in an error saying: | |
| ``` | |
| <target> does not have mandatory providers: 'PyInfo' or 'CcInfo' or 'PyInfo'. | |
| ``` | |
| Adding non-Python targets to the generated target is a feature request being | |
| tracked in {gh-issue}`1865`. | |
| The annotation can be added multiple times, and all values are combined | |
| and de-duplicated. | |
| For `python_generation_mode = "package"`, the `include_dep` annotations | |
| found across all files included in the generated target are included in | |
| `deps`. | |
| ### Example: | |
| ```python | |
| # gazelle:include_dep //foo:bar,:hello_world,//:abc | |
| # gazelle:include_dep //:def,//foo:bar | |
| import numpy # a pypi package | |
| ``` | |
| will cause Gazelle to generate: | |
| ```starlark | |
| deps = [ | |
| ":hello_world", | |
| "//:abc", | |
| "//:def", | |
| "//foo:bar", | |
| "@pypi//numpy", | |
| ] | |
| ``` | |
| (annotation-include-pytest-conftest)= | |
| ## `include_pytest_conftest` | |
| :::{versionadded} 1.6.0 | |
| {gh-pr}`3080` | |
| ::: | |
| This annotation accepts any string that can be parsed by go's | |
| [`strconv.ParseBool`][ParseBool]. If an unparsable string is passed, the | |
| annotation is ignored. | |
| [ParseBool]: https://pkg.go.dev/strconv#ParseBool | |
| Starting with [`rules_python` 0.14.0][rules-python-0.14.0] (specifically | |
| {gh-pr}`879`), Gazelle will include a `:conftest` dependency to a | |
| {bzl:obj}`py_test` target that is in the same directory as `conftest.py`. | |
| [rules-python-0.14.0]: https://github.com/bazel-contrib/rules_python/releases/tag/0.14.0 | |
| This annotation allows users to adjust that behavior. To disable the behavior, | |
| set the annotation value to `false`: | |
| ``` | |
| # some_file_test.py | |
| # gazelle:include_pytest_conftest false | |
| ``` | |
| ### Example: | |
| Given a directory tree like: | |
| ``` | |
| . | |
| ├── BUILD.bazel | |
| ├── conftest.py | |
| └── some_file_test.py | |
| ``` | |
| The default Gazelle behavior would create: | |
| ```starlark | |
| py_library( | |
| name = "conftest", | |
| testonly = True, | |
| srcs = ["conftest.py"], | |
| visibility = ["//:__subpackages__"], | |
| ) | |
| py_test( | |
| name = "some_file_test", | |
| srcs = ["some_file_test.py"], | |
| deps = [":conftest"], | |
| ) | |
| ``` | |
| When `# gazelle:include_pytest_conftest false` is found in | |
| `some_file_test.py` | |
| ```python | |
| # some_file_test.py | |
| # gazelle:include_pytest_conftest false | |
| ``` | |
| Gazelle will generate: | |
| ```starlark | |
| py_library( | |
| name = "conftest", | |
| testonly = True, | |
| srcs = ["conftest.py"], | |
| visibility = ["//:__subpackages__"], | |
| ) | |
| py_test( | |
| name = "some_file_test", | |
| srcs = ["some_file_test.py"], | |
| ) | |
| ``` | |
| See {gh-issue}`3076` for more information. |