Documentation
This page describes the documentation of the pyrealm package, which is hosted at:
https://pyrealm.readthedocs.io
Those pages include both written guides and overview pages and API documentation generated automatically from docstrings within the code.
Documentation guide
The docs/source directory contains the content and sphinx configuration to build the
package website. The content directories are:
The
usersdirectory contains user guides and code examples.The
developmentdirectory contains details on code development forpyrealm.The
apidirectory contains some simple stub files that are used to link to API content generated from docstrings.
MyST Markdown
All of the documentation in docs/source uses MyST
Markdown rather than the
reStructuredText (.rst) format. Markdown is easier to write and read and the MyST
Markdown extension is a literate programming format that allows Markdown pages to be run
using Jupyter to generate dynamic content to show package use.
We only include markdown format files (.md) in the repository and not the standard
Python Notebook (.ipynb) format. Although this means that the output of code cells
does not display on GitHub, the JSON format .ipynb files are much bulkier and also
change whenever the notebook is run, not just when there are meaningful changes to the
content.
MyST Markdown notebooks need to contain a YAML format header that provides details on
how to run the notebook. The content below should appear right at the top of the file.
---
jupytext:
formats: md:myst
text_representation:
extension: .md
format_name: myst
format_version: 0.13
jupytext_version: 1.13.8
kernelspec:
display_name: Python 3
language: python
name: python3
language_info:
codemirror_mode:
name: ipython
version: 3
file_extension: .py
mimetype: text/x-python
name: python
nbconvert_exporter: python
pygments_lexer: ipython3
version: 3.11.9
---
When the package documentation is built in sphinx the myst_nb extension
automatically runs any code in MyST markdown documents and renders the resulting code
and outputs into HTML. The documentation can therefore contain dynamically generated
examples of running code and output plots to demonstrate how to use the
package. This build process also ensures that code in documentation is kept up to date
with the package. The syntax for including code blocks in documents is shown below -
this example includes a tag that causes the code to be concealed in the built
documentation, but with a toggle button to allow it to be expanded.
```{code-cell} python
:tags: [hide-input]
# This is just an example code cell to demonstrate how code is included in
# the pyrealm documentation.
```
Table of contents
We use the sphinx_external_toc package to maintain a table of contents for the
package. The file docs/source/_toc.yml contains the structure of the table and you
will need to add new documentation files to this file for them to appear in the table.
The documentation build process will fail if it finds files in docs/source that are
not included in the table of contents!
Docstrings
The pyrealm package uses docstrings written in the Google
style.
This allows the function documentation to be stored alongside the code and it is included
in the documentation using the sphinx autodoc extension. See the code itself for
examples of the documentation formatting and typical content.
At the moment, we use the autodoc plugins for sphinx to convert docstrings to HTML
and build the online API documentation. Unfortunately, the autodoc package is
hard-coded to expect docstrings to use reStructuredText, which means that at the moment
all docstrings have to be written in rst format. At some point, we’d like to
switch away to using Markdown throughout, but for the moment look at the existing
docstrings to get examples of how the formatting differs.
Referencing
Both the docs/source and docstrings uses the sphinxcontrib-bibtex package to support
citations. This uses Latex like citation keys in the documentation to insert references
and build a bibliography. The sphinx configuration in docs/source/conf.py provides a
custom Author/Year citation style. The reference library in source/refs.bib needs to
be kept up to date with the literature for the project.
The three common use cases are shown below using a couple of reference tags
(Prentice:2014bc and Wang:2017go) that are provided in the current reference
library.
Cite with date in parentheses (
{cite:t}`Prentice:2014bc`): the model implemented in (Prentice et al., 2014).Cite with reference(s) in parentheses (
{cite:p}`Prentice:2014bc,Wang:2017go`): using the P Model Prentice et al. (2014), Wang et al. (2017).Cite as above but suppressing the parentheses to allow text before or after the citation (
(see {cite:alp}`Prentice:2014bc` for details)): the class implements the P Model (see Prentice et al., 2014 for details).
Building the documentation
The sphinx package is used to build an HTML version of the package documentation
provided in docs/source and to include the API documentation provided in the code
docstrings. The sphinx building process requires some extra packages, but these are
included in the docs group in pyproject.toml and should be installed.
In order to build the package documentation, Jupyter needs to be able to associate the
documentation files with the Python environment managed by poetry. Fortunately,
poetry run can be used to update the Jupyter kernel specifications so that the
python3 kernel name points to the poetry environment. For example:
$ poetry run jupyter kernelspec list
Available kernels:
...
python3 /Users/dorme/Library/Caches/pypoetry/virtualenvs/pyrealm-QywIOHcp-py3.10/share/jupyter/kernels/python3
In order to build the package documentation, the following command can then be used:
# Build docs using sphinx
cd docs
poetry run sphinx-build -W --keep-going source build