Source code for dwas.predefined._docformatter
from __future__ import annotations
import logging
import subprocess
from typing import Sequence
# XXX: All imports here should be done from the top level. If we need it,
# users might need it
from .. import Step, StepRunner, build_parameters, set_defaults
LOGGER = logging.getLogger(__name__)
@set_defaults(
{
"dependencies": ["docformatter"],
"additional_arguments": ["--recursive", "--check", "--diff"],
"files": ["."],
"expected_status_codes": [0],
}
)
class DocFormatter(Step):
def __init__(self) -> None:
self.__name__ = "docformatter"
def __call__(
self,
step: StepRunner,
files: Sequence[str],
additional_arguments: Sequence[str],
expected_status_codes: Sequence[int],
) -> None:
try:
step.run(["docformatter", *additional_arguments, *files])
except subprocess.CalledProcessError as exc:
if exc.returncode not in expected_status_codes:
raise
LOGGER.debug(
"Ignoring error code %d from subprocess, as it is expected",
exc.returncode,
)
[docs]
def docformatter(
*,
files: Sequence[str] | None = None,
additional_arguments: list[str] | None = None,
expected_status_codes: list[int] | None = None,
) -> Step:
"""
Run `docformatter`_ against your python source code.
By default, it will depend on :python:`["docformatter"]`, when registered
with :py:func:`dwas.register_managed_step`.
:param files: The list of files or directories to run ``docformatter`` against.
Defaults to :python:`["."]`.
:param additional_arguments: Additional arguments to pass to the ``docformatter``
invocation.
Defaults to :python:`["--recursive"]`.
:param expected_status_codes: Status codes that are acceptable from ``docformatter``.
Defaults to :python:`[0]`. When formatting in
place, you might want to set to :python:`[0, 3]`,
as ``docformatter`` always returns 3 if a file
was modified.
:return: The step so that you can add additional parameters to it if needed.
:Examples:
In order to verify your code but not change it, for a step
named **docformatter**:
.. code-block::
dwas.register_managed_step(
dwas.predefined.docformatter(files["src", "tests", "dwasfile.py", "setup.py"])
)
Or, in order to automatically fix your code, but only if requested:
.. code-block::
dwas.register_managed_step(
dwas.predefined.docformatter(
# NOTE: this name is arbitrary, you could omit it, or specify
# something else. We suffix in our documentation all
# operations that will have destructive effect on the source
# code by ``:fix``
name="docformatter:fix",
additional_arguments=["--in-place"],
expected_status_codes=[0, 3],
run_by_default=False,
files=["src,", "tests", "dwasfile.py", "setup.py"],
)
)
"""
return build_parameters(
files=files,
additional_arguments=additional_arguments,
expected_status_codes=expected_status_codes,
)(DocFormatter())