Static Search Tool#

code_annotations static_find_annotations::

Usage: code_annotations static_find_annotations [OPTIONS]

Subcommand to find annotations via static file analysis.

--config_file FILE

Path to the configuration file

--source_path PATH

Location of the source code to search

--report_path TEXT

Location to write the report

-v, --verbosity

Verbosity level (-v through -vvv)


Enable or disable linting checks [default: True]


Enable or disable writing the report file [default: True]


Show this message and exit.


The Static Search Tool, or Static Tool, is written as an extensible way to find annotations in code. The tool performs static analysis on the files themselves instead of relying on the language’s runtime and introspection. It will optionally write a report file in YAML, and optionally check for annotation validity (linting).


When passed the --lint option, each annotation will be checked for the following:

  • Choice annotations must have one or more of the configured choices

  • Groups must have their annotations occur consecutively, though their order doesn’t matter

If any of these checks fails, all errors will be printed and the return code of the command will be non-zero. If the --report option was also provided no report will be written.


The YAML report is the main output of the Static Tool. It is a simple YAML document that contains a list of found annotations, grouped by file. Each annotation entry has the following keys:

    'found_by': 'python',  # The name of the extension which found the annotation
    'filename': 'foo/bar/',  # The filename where the extension was found
    'line_number': 101,  # The line number of the beginning of the comment which contained the annotation
    'annotation_token': '.. no_pii:',  # The annotation token found
    'annotation_data': 'This model contains no PII.',  # The comment, or choices, found with the annotation token

If an annotation is in a group, there will also be a report_group_id. This key is unique for each found group, allowing tools further down the toolchain to keep them together for presentation.

Extensions can also send back some additional data in an extra key, if desired. The Django Model Search Tool does this to return the Django app and model name.


The Static Tool uses Stevedore named extensions to allow for language-specific functionality. Python and Javascript extensions are included, many others can be made easily as needed. We will gladly accept pull requests for new languages or you can release them yourself on PyPI. For more information on extensions, see Extensions and Configuration.