Skip to main content

Enforce docstrings on complex function and methods

Project description

doc901

doc901 is a simple tool designed to ensure that Python methods and functions with a high cyclomatic complexity have proper docstrings. It uses ruff to analyze complexity and missing docstring on the same line.

Why?

Maintaining clean and readable code is crucial. Methods or functions with high complexity can be challenging to understand, especially without documentation.

While ruff provides rules for checking complexity (C901) and missing docstrings on methods and functions (D102 and D103, respectively), there is no built-in way to link them together. Enabling D10x project-wide flagging all methods and functions without a docstring (even if they are simple and self-explanatory) could be overwhelming in large projects.

doc901 bridges this gap by flagging errors only when the complexity is enough to demand a docstring, so you can improve your code incrementally,

Of course, the name comes after the C901 rule code ;-)

Use and install

The easiest way is via uvx.

uvx doc901 path/to/file.py

To analyze an entire directory:

uvx doc901 path/to/directory/

The default allowed complexity is 4, meaning any function or method with McCabe 5 or more will require a docstring.

uvx doc901 --max-complexity=3 path/to/file.py 

See --help for more options.

To install the tool permanently:

uv tool install doc901

Example

Imagine you have a file example.py with the following methods:

def complex_function_without_docstring():
    for i in range(10):
        if i % 2 == 0:
            for j in range(5):
                print(i, j)

Running doc901 on this file:

python doc901.py example.py

Output:

example.py:1: `complex_function_without_docstring` is too complex (5 > 4). Add a docstring.

Ignoring legacy errors

There are several ways to ignore errors:

  • Since ruff is used under the hood, you can add noqa: D102 or noqa: D103 comments to the line that defines the method or function.

Alternatively, if you have a large codebase with many existing errors, you can use the --ignore flag and pass a JSON file containing the errors to ignore.

You can generate this file by running the tool with the --json flag:

uvx doc901 --json ... > ignored.jwill output a JSON file son

This will output a JSON file listing the errors found. You can then edit this file to remove any errors you don't want to ignore. For example, the output might look like this:

[
    {
        "path": "example.py", 
        "row": 8, 
        "name": "complex_method_without_docstring",
        "complexity": 5
    }
]

Then in your normal runs, pass this file to the --ignore flag:

uvx doc901 --ignore ignored.json ...

Any violation that matches both the path and the name will be ignored. Note that the row is intentionally omitted because the exact line where a function is defined might change frequently. You can also add additional metadata to the JSON file, such as the person responsible for fixing the issue.

Contribution

Feel free to open issues or submit pull requests if you encounter bugs or have suggestions for improvement. This tool is lightweight but can be extended to cover more advanced checks.

License

This project is open-source and available under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

doc901-0.2.1.tar.gz (3.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

doc901-0.2.1-py3-none-any.whl (4.4 kB view details)

Uploaded Python 3

File details

Details for the file doc901-0.2.1.tar.gz.

File metadata

  • Download URL: doc901-0.2.1.tar.gz
  • Upload date:
  • Size: 3.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for doc901-0.2.1.tar.gz
Algorithm Hash digest
SHA256 0fe95e0dd70c249f3d606b52bd7c13f8ea129a9318eaee241a3a4fc80cf9b422
MD5 9b730173f6665f3a182a76f92c83932d
BLAKE2b-256 ed8241958fcc4a28ccaffd620d68f40e51cd6325ac49f60e35177c9e9ac15665

See more details on using hashes here.

Provenance

The following attestation bundles were made for doc901-0.2.1.tar.gz:

Publisher: cd.yml on Shiphero/doc901

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file doc901-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: doc901-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 4.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for doc901-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cbf65ae26f423a4f168259ee310e86fd7299daf510afaa2049a0704774030b6b
MD5 7fef20134b82b39d6d7633ca44cdf2e8
BLAKE2b-256 6fd0b488a9b5b1b2f1b7912d031b89230d94b78317d09b8213e00df8f3089bfb

See more details on using hashes here.

Provenance

The following attestation bundles were made for doc901-0.2.1-py3-none-any.whl:

Publisher: cd.yml on Shiphero/doc901

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page