Skip to main content

Checks syntax of reStructuredText and code blocks nested within it

Project description

Build status

Checks syntax of reStructuredText and code blocks nested within it.

Installation

From pip:

$ pip install rstcheck

Supported languages in code blocks

  • Bash

  • Doctest

  • C (C99)

  • C++ (C++11)

  • JSON

  • XML

  • Python

  • reStructuredText

Examples

With bad Python syntax:

====
Test
====

.. code:: python

    print(
$ rstcheck bad_python.rst
bad_python.rst:7: (ERROR/3) (python) unexpected EOF while parsing

With bad C++ syntax:

====
Test
====

.. code:: cpp

    int main()
    {
        return x;
    }
$ rstcheck bad_cpp.rst
bad_cpp.rst:9: (ERROR/3) (cpp) error: 'x' was not declared in this scope

With bad syntax in the reStructuredText document itself:

====
Test
===
$ rstcheck bad_rst.rst
bad_rst.rst:1: (SEVERE/4) Title overline & underline mismatch.

Options

usage: rstcheck [-h] [--config CONFIG] [-r] [--report level]
                [--ignore-language language] [--ignore-messages messages]
                [--ignore-directives directives]
                [--ignore-substitutions substitutions] [--ignore-roles roles]
                [--debug] [--version]
                files [files ...]

Checks code blocks in reStructuredText. Sphinx is enabled.

positional arguments:
  files                 files to check

optional arguments:
  -h, --help            show this help message and exit
  --config CONFIG       location of config file
  -r, --recursive       run recursively over directories
  --report level        report system messages at or higher than level; info,
                        warning, error, severe, none (default: info)
  --ignore-language language, --ignore language
                        comma-separated list of languages to ignore
  --ignore-messages messages
                        python regex that match the messages to ignore
  --ignore-directives directives
                        comma-separated list of directives to ignore
  --ignore-substitutions substitutions
                        comma-separated list of substitutions to ignore
  --ignore-roles roles  comma-separated list of roles to ignore
  --debug               show messages helpful for debugging
  --version             show program's version number and exit

Ignore specific languages

You can ignore checking of nested code blocks by language. Either use the command-line option --ignore or put a comment in the document:

.. rstcheck: ignore-language=cpp,python,rst

Ignore specific errors

Since docutils doesn’t categorize their error messages beyond the high-level categories of: info, warning, error, and severe; we need filter them out at a textual level. This is done by passing a Python regex. As example you can pass a regex like this to ignore several errors:

(Title underline too short.*|Duplicate implicit target.*')

Configuration file

You can use the same arguments from the command line as options in the local configuration file of the project (just replace - for _). rstcheck looks for a file .rstcheck.cfg or setup.cfg in the directory or ancestor directories of the file it is checking.

For example, consider a project with the following directory structure:

foo
├── docs
│   └── bar.rst
├── index.rst
└── .rstcheck.cfg

.rstcheck.cfg contains:

[rstcheck]
ignore_directives=one,two,three
ignore_roles=src,RFC
ignore_messages=(Document or section may not begin with a transition\.$)
report=warning

bar.rst contains:

Bar
===

:src:`hello_world.py`
:RFC:`793`

.. one::

   Hello

rstcheck will make use of the .rstcheck.cfg:

$ rstcheck foo/docs/bar.rst

For a Python project, you should put the configuration settings for rstcheck inside the general setup.cfg distutils configuration file, in the project root.

You can override the location of the config file with the --config argument:

$ rstcheck --config $HOME/.rstcheck.ini foo/docs/bar.rst

will use the file .rstcheck.ini in your home directory. If the argument to --config is a directory, rstcheck will search that directory and any any of its ancestors for a file .rstcheck.cfg or setup.cfg:

$ rstcheck --config foo /tmp/bar.rst

would use the project configuration in ./foo/.rstcheck.cfg to check the unrelated file /tmp/bar.rst. Calling rstcheck with the --debug option will show the location of the config file that is being used, if any.

Sphinx

To enable Sphinx:

$ pip install sphinx

The installed Sphinx version must be at least 1.5.

To check that Sphinx support is enabled:

$ rstcheck -h | grep 'Sphinx is enabled'

Usage in Vim

Using with Syntastic:

let g:syntastic_rst_checkers = ['rstcheck']

Using with ALE:

Just install rstcheck and make sure is on your path.

Use as a module

rstcheck.check() yields a series of tuples. The first value of each tuple is the line number (not the line index). The second value is the error message.

>>> import rstcheck
>>> list(rstcheck.check('Example\n==='))
[(2, '(INFO/1) Possible title underline, too short for the title.')]

Note that this does not load any configuration as that would mutate the docutils registries.

Use as a pre-commit hook

Add this to your .pre-commit-config.yaml

-   repo: https://github.com/myint/rstcheck
    rev: ''  # Use the sha / tag you want to point at
    hooks:
    -   id: rstcheck

Testing

To run all the tests, do:

$ make test

Unit tests are in test_rstcheck.py.

System tests are composed of example good/bad input. The test inputs are contained in the examples directory. For basic tests, adding a test should just be a matter of adding files to examples/good or examples/bad.

History

(next version)

3.5.0 (2022-04-14)

  • Deprecate python versions prior 3.7

3.4.0 (2022-04-12)

  • Add --config option to change the location of the config file.

  • Add pre-commit hooks config.

3.3.1 (2018-10-09)

  • Make compatible with Sphinx >= 1.8.

3.3 (2018-03-17)

  • Parse more options from configuration file (thanks to Santos Gallegos).

  • Allow ignoring specific (info/warning/error) messages via --ignore-messages (thanks to Santos Gallegos).

3.2 (2018-02-17)

  • Check for invalid Markdown-style links (thanks to biscuitsnake).

  • Allow configuration to be stored in setup.cfg (thanks to Maël Pedretti).

  • Add --recursive option to recursively drill down directories to check for all *.rst files.

3.1 (2017-03-08)

  • Add support for checking XML code blocks (thanks to Sameer Singh).

3.0.1 (2017-03-01)

  • Support UTF-8 byte order marks (BOM). Previously, docutils would interpret the BOM as a visible character, which would lead to false positives about underlines being too short.

3.0 (2016-12-19)

  • Optionally support Sphinx 1.5. Sphinx support will be enabled if Sphinx is installed.

2.0 (2015-07-27)

  • Support loading settings from configuration files.

1.0 (2015-03-14)

  • Add Sphinx support.

0.1 (2013-12-02)

  • Initial version.

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

rstcheck-3.5.0.tar.gz (21.4 kB view details)

Uploaded Source

Built Distribution

rstcheck-3.5.0-py3-none-any.whl (14.5 kB view details)

Uploaded Python 3

File details

Details for the file rstcheck-3.5.0.tar.gz.

File metadata

  • Download URL: rstcheck-3.5.0.tar.gz
  • Upload date:
  • Size: 21.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.8.10

File hashes

Hashes for rstcheck-3.5.0.tar.gz
Algorithm Hash digest
SHA256 d4b035300b7d898403544f38c3a4980171ce85f487d25e188347bbafb6ee58c0
MD5 bc41b8d7a250e805bae741a08a6ad213
BLAKE2b-256 ada8e7301def742678b63fd28d167f5e3f3fc5c9f9c0d9d053b73d94f54a8616

See more details on using hashes here.

File details

Details for the file rstcheck-3.5.0-py3-none-any.whl.

File metadata

  • Download URL: rstcheck-3.5.0-py3-none-any.whl
  • Upload date:
  • Size: 14.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.8.10

File hashes

Hashes for rstcheck-3.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 30c36768c4bd617a85ab93c31facaf410582e53803fde624845eb00c1430070c
MD5 e80dabd43f42c1db55dd6172d6692696
BLAKE2b-256 7b75eea3c31eb467fa4ed3efefaed8e10fad686e9a76215cb3179f86b35bddee

See more details on using hashes here.

Supported by

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