.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
.. For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt

.. This file is processed with cog to create the tabbed multi-syntax
   configuration examples.  If those are wrong, the quality checks will fail.
   Running "make prebuild" checks them and produces the output.

.. [[[cog
    from cog_helpers import show_configs
.. ]]]
.. [[[end]]] (checksum: d41d8cd98f00b204e9800998ecf8427e)


.. _source:

=======================
Specifying source files
=======================

When coverage.py is running your program and measuring its execution, it needs
to know what code to measure and what code not to.  Measurement imposes a speed
penalty, and the collected data must be stored in memory and then on disk.
More importantly, when reviewing your coverage reports, you don't want to be
distracted with modules that aren't your concern.

Coverage.py has a number of ways you can focus it in on the code you care
about.


.. _source_execution:

Execution
---------

When running your code, the ``coverage run`` command will by default measure
all code, unless it is part of the Python standard library.

You can specify source to measure with the ``--source`` command-line switch, or
the ``[run] source`` configuration value.  The value is a comma- or
newline-separated list of directories or importable names (packages or
modules).

If the source option is specified, only code in those locations will be
measured.  Specifying the source option also enables coverage.py to report on
un-executed files, since it can search the source tree for files that haven't
been measured at all.  Only importable files (ones at the root of the tree, or
in directories with a ``__init__.py`` file) will be considered. Files with
unusual punctuation in their names will be skipped (they are assumed to be
scratch files written by text editors). Files that do not end with ``.py``,
``.pyw``, ``.pyo``, or ``.pyc`` will also be skipped.

.. note::

    Modules named as sources may be imported twice, once by coverage.py to find
    their location, then again by your own code or test suite.  Usually this
    isn't a problem, but could cause trouble if a module has side-effects at
    import time.

    Exceptions during the early import are suppressed and ignored.

You can further fine-tune coverage.py's attention with the ``--include`` and
``--omit`` switches (or ``[run] include`` and ``[run] omit`` configuration
values). ``--include`` is a list of file name patterns. If specified, only
files matching those patterns will be measured. ``--omit`` is also a list of
file name patterns, specifying files not to measure.  If both ``include`` and
``omit`` are specified, first the set of files is reduced to only those that
match the include patterns, then any files that match the omit pattern are
removed from the set.

.. highlight:: ini

The ``include`` and ``omit`` file name patterns follow common shell syntax,
described below in :ref:`source_glob`.  Patterns that start with a wildcard
character are used as-is, other patterns are interpreted relative to the
current directory:

.. [[[cog
    show_configs(
        ini=r"""
            [run]
            omit =
                # omit anything in a .local directory anywhere
                */.local/*
                # omit everything in /usr
                /usr/*
                # omit this single file
                utils/tirefire.py
            """,
        toml=r"""
            [tool.coverage.run]
            omit = [
                # omit anything in a .local directory anywhere
                "*/.local/*",
                # omit everything in /usr
                "/usr/*",
                # omit this single file
                "utils/tirefire.py",
                ]
            """,
        )
.. ]]]

.. tabs::

    .. code-tab:: ini
        :caption: .coveragerc

        [run]
        omit =
            # omit anything in a .local directory anywhere
            */.local/*
            # omit everything in /usr
            /usr/*
            # omit this single file
            utils/tirefire.py

    .. code-tab:: toml
        :caption: pyproject.toml

        [tool.coverage.run]
        omit = [
            # omit anything in a .local directory anywhere
            "*/.local/*",
            # omit everything in /usr
            "/usr/*",
            # omit this single file
            "utils/tirefire.py",
            ]

    .. code-tab:: ini
        :caption: setup.cfg or tox.ini

        [coverage:run]
        omit =
            # omit anything in a .local directory anywhere
            */.local/*
            # omit everything in /usr
            /usr/*
            # omit this single file
            utils/tirefire.py

.. [[[end]]] (checksum: 84ad2743cc0c7a077770e50fcedab29d)

The ``source``, ``include``, and ``omit`` values all work together to determine
the source that will be measured.

If both ``source`` and ``include`` are set, the ``include`` value is ignored
and a warning is issued.


.. _source_reporting:

Reporting
---------

Once your program is measured, you can specify the source files you want
reported.  Usually you want to see all the code that was measured, but if you
are measuring a large project, you may want to get reports for just certain
parts.

The report commands (``report``, ``html``, ``json``, ``lcov``, ``annotate``,
and ``xml``)
all take optional ``modules`` arguments, and ``--include`` and ``--omit``
switches. The ``modules`` arguments specify particular modules to report on.
The ``include`` and ``omit`` values are lists of file name patterns, just as
with the ``run`` command.

Remember that the reporting commands can only report on the data that has been
collected, so the data you're looking for may not be in the data available for
reporting.

Note that these are ways of specifying files to measure.  You can also exclude
individual source lines.  See :ref:`excluding` for details.


.. _source_glob:

File patterns
-------------

File path patterns are used for :ref:`include <config_run_include>` and
:ref:`omit <config_run_omit>`, and for :ref:`combining path remapping
<cmd_combine_remapping>`.  They follow common shell syntax:

- ``?`` matches a single file name character.

- ``*`` matches any number of file name characters, not including the directory
  separator.  As a special case, if a pattern starts with ``*/``, it is treated
  as ``**/``, and if a pattern ends with ``/*``, it is treated as ``/**``.

- ``**`` matches any number of nested directory names, including none. It must
  be used as a full component of the path, not as part of a word: ``/**/`` is
  allowed, but ``/a**/`` is not.

- Both ``/`` and ``\`` will match either a slash or a backslash, to make
  cross-platform matching easier.

- A pattern with no directory separators matches the file name in any
  directory.

Some examples:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    * - Pattern
      - Matches
      - Doesn't Match
    * - ``a*.py``
      - | anything.py
        | sub1/sub2/another.py
      - | cat.py
    * - ``sub/*/*.py``
      - | sub/a/main.py
        | sub/b/another.py
      - | sub/foo.py
        | sub/m1/m2/foo.py
    * - ``sub/**/*.py``
      - | sub/something.py
        | sub/a/main.py
        | sub/b/another.py
        | sub/m1/m2/foo.py
      - | sub1/anything.py
        | sub1/more/code/main.py
    * - ``*/sub/*``
      - | some/where/sub/more/something.py
        | sub/hello.py
      - | sub1/anything.py
    * - ``*/sub*/*``
      - | some/where/sub/more/something.py
        | sub/hello.py
        | sub1/anything.py
      - | some/more/something.py
    * - ``*/*sub/test_*.py``
      - | some/where/sub/test_everything.py
        | moresub/test_things.py
      - | some/where/sub/more/test_everything.py
        | more/test_things.py
    * - ``*/*sub/*sub/**``
      - | sub/sub/something.py
        | asub/bsub/more/thing.py
        | code/sub/sub/code.py
      - | sub/something.py
