Skip to content

Commit eb7f396

Browse files
authored
Split the docs (#1963)
* generate individual conf.py files * Generate individual html documentation for each nimi-python package * Clean up index page * Add TODO for release process * Fix flake8 error * Delete now-unused Root VERSION file * Split LATEST_RELEASE file used for generating example.rst * Tweak wording; nimi-python is not a package, but a repo. * Add another TODO * Forgot to regenerate in a previous commit * Update nidcpower readthedocs link * Update readthedocs links * Delete variable that I don't need after all * Remove TODO about leaving project name unchanged. That value controls what appears in the top left corner of the built html docs. * Remove CHANGELOG todo in build_release.py CHANGELOG split is being handled in a separate PR * Remove update links todo We should use redirects in the ReadTheDocs project for that. * Use mako comments so that TODO only appears in one place * Use api-specific start year for docs copyright date * FIgure out new release process and update build_release.py * Undo all build_release.py changes * Add .readthedocs.yaml - Gives us better control over how documentation is built. - Allows contributors who don't have the readthedocs maintenance permission to update the configuration (with permission from repo maintainers) * Restore original conf.py until we've updated the documentation for the original ReadTheDocs projct. * Update the original index.rst to help users find documentation * don't delete docs/conf.py during clean; we no longer codegen it * Update clean recipe to also delete .readthedocs.yaml Any codegen'd file should be delete by make clean * For new projects, add link to original project. * Update intersphinx_mapping format * Fix "Read the Docs" spelling * lead with spaces on continued lines in modified GNU Make recipes * Add empty line to end of conf.py * Reword support.inc to not visibly mention nimi-python
1 parent 161f598 commit eb7f396

File tree

110 files changed

+2869
-286
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+2869
-286
lines changed

README.rst

+13-15
Original file line numberDiff line numberDiff line change
@@ -419,17 +419,17 @@ NI-TClk Python API Status
419419
Installation
420420
============
421421

422-
Driver specific installation instructions can be found on Read The Docs:
422+
Driver specific installation instructions can be found on **Read the Docs**:
423423

424-
* `nidcpower <http://nimi-python.readthedocs.io/en/master/nidcpower.html#installation>`_
425-
* `nidigital <http://nimi-python.readthedocs.io/en/master/nidigital.html#installation>`_
426-
* `nidmm <http://nimi-python.readthedocs.io/en/master/nidmm.html#installation>`_
427-
* `nifgen <http://nimi-python.readthedocs.io/en/master/nifgen.html#installation>`_
428-
* `nimodinst <http://nimi-python.readthedocs.io/en/master/nimodinst.html#installation>`_
429-
* `niscope <http://nimi-python.readthedocs.io/en/master/niscope.html#installation>`_
430-
* `nise <http://nimi-python.readthedocs.io/en/master/nise.html#installation>`_
431-
* `niswitch <http://nimi-python.readthedocs.io/en/master/niswitch.html#installation>`_
432-
* `nitclk <http://nimi-python.readthedocs.io/en/master/nitclk.html#installation>`_
424+
* `nidcpower <https://nidcpower.readthedocs.io/en/latest/nidcpower.html#installation>`_
425+
* `nidigital <https://nidigital.readthedocs.io/en/latest/nidigital.html#installation>`_
426+
* `nidmm <https://nidmm.readthedocs.io/en/latest/nidmm.html#installation>`_
427+
* `nifgen <https://nifgen.readthedocs.io/en/latest/nifgen.html#installation>`_
428+
* `nimodinst <https://nimodinst.readthedocs.io/en/latest/nimodinst.html#installation>`_
429+
* `niscope <https://niscope.readthedocs.io/en/latest/niscope.html#installation>`_
430+
* `nise <https://nise.readthedocs.io/en/latest/nise.html#installation>`_
431+
* `niswitch <https://niswitch.readthedocs.io/en/latest/niswitch.html#installation>`_
432+
* `nitclk <https://nitclk.readthedocs.io/en/latest/nitclk.html#installation>`_
433433

434434

435435
Contributing
@@ -456,22 +456,20 @@ The following is a basic example of using the **nidmm** module to open a session
456456
Support / Feedback
457457
==================
458458

459-
The packages included in **nimi-python** package are supported by NI. For support, open
460-
a request through the NI support portal at `ni.com <http://www.ni.com>`_.
459+
For support specific to the Python API, follow the processs in `Bugs / Feature Requests`_.
460+
For support with hardware, the driver runtime or any other questions not specific to the Python API, please visit `NI Community Forums <https://forums.ni.com/>`_.
461461

462462
.. _bugs-section:
463463

464464
Bugs / Feature Requests
465465
=======================
466466

467-
To report a bug or submit a feature request specific to NI Modular Instruments Python bindings (nimi-python), please use the
467+
To report a bug or submit a feature request specific to Python API, please use the
468468
`GitHub issues page <https://github.com/ni/nimi-python/issues>`_.
469469

470470
Fill in the issue template as completely as possible and we will respond as soon
471471
as we can.
472472

473-
For hardware support or any other questions not specific to this GitHub project, please visit `NI Community Forums <https://forums.ni.com/>`_.
474-
475473

476474
.. _documentation-section:
477475

VERSION

-1
This file was deleted.

build/Makefile

+10-13
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ endif
2323
ifeq (,$(MAKECMDGOALS))
2424
ROOT_FILES := \
2525
$(ROOT_DIR)/README.rst \
26-
$(ROOT_DIR)/VERSION \
27-
$(DOCS_DIR)/conf.py \
2826

2927
endif
3028

@@ -79,9 +77,9 @@ clean: start
7977
-$(_hide_cmds)find $(ROOT_DIR)/build -name __pycache__ -exec rmdir {} \; $(SUPPRESS_ERROR_OUTPUT) ||:
8078
-$(_hide_cmds)find $(ROOT_DIR)/build -name '*.pyc' -exec rm {} \; $(SUPPRESS_ERROR_OUTPUT) ||:
8179
-$(_hide_cmds)rm $(foreach d,$(DRIVERS), $(ROOT_DIR)/docs/$(d)/*) $(SUPPRESS_ERROR_OUTPUT) ||:
80+
-$(_hide_cmds)rm $(foreach d,$(DRIVERS), $(ROOT_DIR)/docs/$(d)/.readthedocs.yaml) $(SUPPRESS_ERROR_OUTPUT) ||:
8281
-$(_hide_cmds)rm -Rf $(ROOT_DIR)/.coverage $(SUPPRESS_ERROR_OUTPUT) ||:
8382
-$(_hide_cmds)rm -Rf $(ROOT_DIR)/README.rst $(SUPPRESS_ERROR_OUTPUT) ||:
84-
-$(_hide_cmds)rm -Rf $(ROOT_DIR)/docs/conf.py $(SUPPRESS_ERROR_OUTPUT) ||:
8583
-$(_hide_cmds)mkdir $(GENERATED_DIR) $(SUPPRESS_ERROR_OUTPUT) ||:
8684

8785
start:
@@ -147,16 +145,15 @@ endef
147145

148146
$(ROOT_DIR)/README.rst: $(GLOBAL_FILES_STARTED_FILE)
149147
$(call trace_to_console, "Creating Root",$(notdir $@))
150-
$(_hide_cmds)$(call global_log_command,cat $(STATIC_DOCS_DIR)/status_project.inc $(STATIC_DOCS_DIR)/about.inc $(DOCS_DIR)/*/status.inc $(STATIC_DOCS_DIR)/installation.inc $(STATIC_DOCS_DIR)/contributing.inc $(STATIC_DOCS_DIR)/nidmm_usage.inc $(STATIC_DOCS_DIR)/support.inc $(STATIC_DOCS_DIR)/documentation.inc $(STATIC_DOCS_DIR)/license.inc > $@)
151-
152-
$(ROOT_DIR)/VERSION: $(GLOBAL_FILES_STARTED_FILE)
153-
$(call trace_to_console, "Creating Root",$(notdir $@)) tools/update_version_file.py
154-
$(_hide_cmds)$(call global_log_command,$(PYTHON_CMD) tools/update_version_file.py --output-file $@ $(foreach d,$(DRIVERS),--input-file $(GENERATED_DIR)/$(d)/$(d)/VERSION ))
155-
156-
$(DOCS_DIR)/conf.py: build/templates/conf.py.mako $(ROOT_DIR)/VERSION tools/simple_mako.py $(GLOBAL_FILES_STARTED_FILE)
157-
$(call trace_to_console, "Creating Root",$(notdir $@))
158-
$(_hide_cmds)$(call global_log_command,$(PYTHON_CMD) tools/simple_mako.py --output-file $@ --template $<)
159-
148+
$(_hide_cmds)$(call global_log_command,cat $(STATIC_DOCS_DIR)/status_project.inc \
149+
$(STATIC_DOCS_DIR)/about.inc \
150+
$(DOCS_DIR)/*/status.inc \
151+
$(STATIC_DOCS_DIR)/installation.inc \
152+
$(STATIC_DOCS_DIR)/contributing.inc \
153+
$(STATIC_DOCS_DIR)/nidmm_usage.inc \
154+
$(STATIC_DOCS_DIR)/support.inc \
155+
$(STATIC_DOCS_DIR)/documentation.inc \
156+
$(STATIC_DOCS_DIR)/license.inc > $@)
160157

161158
# Any step that any driver build does that would invalidate unit testing, flake8 or generated html
162159
# needs to delete this file. This will trigger a tox run.

build/defines.mak

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ GRPC_SUPPORTED := $(if $(wildcard $(PROTO_FILE)),$(true))
3232
PYTHON_CMD ?= python
3333
GRPC_SUPPORT_PARAM := $(if $(GRPC_SUPPORTED),--include-grpc-support)
3434
define GENERATE_SCRIPT
35-
$(PYTHON_CMD) -m build --template $1 --dest-dir $2 --metadata $3 $(if $(PRINT),-v,) $(GRPC_SUPPORT_PARAM)
35+
$(PYTHON_CMD) -m build --template $1 --dest-dir $2 --metadata $3 $(if $4,--dest-file $4) $(if $(PRINT),-v,) $(GRPC_SUPPORT_PARAM)
3636
endef
3737

3838
ifeq (,$(PRINT))
@@ -75,6 +75,8 @@ DEFAULT_PY_FILES_TO_COPY := \
7575
_visatype.py \
7676

7777
DEFAULT_RST_FILES_TO_GENERATE := \
78+
index.rst \
79+
$(DRIVER).rst \
7880
enums.rst \
7981
examples.rst \
8082
installation.inc \
@@ -87,6 +89,8 @@ DEFAULT_RST_FILES_TO_GENERATE := \
8789
grpc_session_options.rst \
8890
) \
8991

92+
DEFAULT_SPHINX_CONF_PY := $(DRIVER_DOCS_DIR)/conf.py
93+
DEFAULT_READTHEDOCS_CONFIG := $(DRIVER_DOCS_DIR)/.readthedocs.yaml
9094

9195
# Files for tracking parts of the build
9296
SDIST_WHEEL_BUILD_DONE := $(LOG_DIR)/sdist_wheel_build_done

build/rules.mak

+22-4
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ endif # ifneq (,$(EXAMPLE_FILES))
3030

3131
MKDIR: $(MKDIRECTORIES)
3232

33-
CURRENT_DIR := $(shell pwd)
34-
3533
define mkdir_rule
3634
$1:
3735
$(call trace_to_console, "Making dir",$1)
@@ -82,10 +80,22 @@ $(DRIVER_DOCS_DIR)/%.rst: %.rst.mako $(BUILD_HELPER_SCRIPTS) $(METADATA_FILES)
8280
$(call trace_to_console, "Generating",$@)
8381
$(_hide_cmds)$(call log_command,$(call GENERATE_SCRIPT, $<, $(dir $@), $(METADATA_DIR)))
8482

83+
$(DRIVER_DOCS_DIR)/$(DRIVER).rst: driver.rst.mako $(BUILD_HELPER_SCRIPTS) $(METADATA_FILES)
84+
$(call trace_to_console, "Generating",$@)
85+
$(_hide_cmds)$(call log_command,$(call GENERATE_SCRIPT, $<, $(dir $@), $(METADATA_DIR), $(notdir $@)))
86+
8587
$(DRIVER_DOCS_DIR)/%.inc: %.inc.mako $(BUILD_HELPER_SCRIPTS) $(METADATA_FILES)
8688
$(call trace_to_console, "Generating",$@)
8789
$(_hide_cmds)$(call log_command,$(call GENERATE_SCRIPT, $<, $(dir $@), $(METADATA_DIR)))
8890

91+
$(SPHINX_CONF_PY): $(TEMPLATE_DIR)/conf.py.mako $(BUILD_HELPER_SCRIPTS) $(METADATA_FILES)
92+
$(call trace_to_console, "Generating",$@)
93+
$(_hide_cmds)$(call log_command,$(call GENERATE_SCRIPT, $<, $(dir $@), $(METADATA_DIR)))
94+
95+
$(READTHEDOCS_CONFIG): $(TEMPLATE_DIR)/.readthedocs.yaml.mako $(BUILD_HELPER_SCRIPTS) $(METADATA_FILES)
96+
$(call trace_to_console, "Generating",$@)
97+
$(_hide_cmds)$(call log_command,$(call GENERATE_SCRIPT, $<, $(dir $@), $(METADATA_DIR)))
98+
8999
$(DRIVER_EXAMPLES_ZIP_FILE): $(EXAMPLE_FILES)
90100
$(call trace_to_console, "Zipping",$@)
91101
$(_hide_cmds)$(call log_command,cd src/$(DRIVER)/examples && zip -u -r -9 $@ * || ([ $$? -eq 12 ] && exit 0) || exit)
@@ -101,7 +111,7 @@ clean:
101111

102112
.PHONY: module doc_files sdist wheel installers
103113
module: $(MODULE_FILES) $(UNIT_TEST_FILES)
104-
doc_files: $(RST_FILES)
114+
doc_files: $(RST_FILES) $(SPHINX_CONF_PY) $(READTHEDOCS_CONFIG)
105115
installers: sdist wheel
106116

107117
$(UNIT_TEST_FILES): $(MODULE_FILES)
@@ -131,7 +141,15 @@ else
131141
# We piece together the readme files instead of relying on the rst include directive because we need these files to be standalone and not require any additional files that are in specific locations.
132142
$(README): $(RST_FILES) $(wildcard $(STATIC_DOCS_DIR)/*)
133143
$(call trace_to_console, "Creating",$@)
134-
$(_hide_cmds)$(call log_command,cat $(STATIC_DOCS_DIR)/status_project.inc $(STATIC_DOCS_DIR)/about.inc $(DRIVER_DOCS_DIR)/status.inc $(DRIVER_DOCS_DIR)/installation.inc $(STATIC_DOCS_DIR)/contributing.inc $(STATIC_DOCS_DIR)/$(DRIVER)_usage.inc $(STATIC_DOCS_DIR)/support.inc $(STATIC_DOCS_DIR)/documentation.inc $(STATIC_DOCS_DIR)/license.inc > $@)
144+
$(_hide_cmds)$(call log_command,cat $(STATIC_DOCS_DIR)/status_project.inc \
145+
$(STATIC_DOCS_DIR)/about.inc \
146+
$(DRIVER_DOCS_DIR)/status.inc \
147+
$(DRIVER_DOCS_DIR)/installation.inc \
148+
$(STATIC_DOCS_DIR)/contributing.inc \
149+
$(STATIC_DOCS_DIR)/$(DRIVER)_usage.inc \
150+
$(STATIC_DOCS_DIR)/support.inc \
151+
$(STATIC_DOCS_DIR)/documentation.inc \
152+
$(STATIC_DOCS_DIR)/license.inc > $@)
135153

136154
endif
137155

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# .readthedocs.yaml
2+
# Read the Docs configuration file
3+
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4+
<%
5+
config = template_parameters['metadata'].config
6+
module_name = config['module_name']
7+
# All of the files used to configure and build docs and readthedocs are in these 2 folders
8+
build_trigger_paths = f'docs/_static/ docs/{module_name}/'
9+
conf_py_path = f'docs/{module_name}/conf.py'
10+
%>\
11+
12+
# Why Use A Configuration File?
13+
# https://docs.readthedocs.io/en/stable/config-file/index.html
14+
# The main advantages of using a configuration file over the web interface are:
15+
# * Settings are per version rather than per project.
16+
# * Settings live in your VCS.
17+
# * They enable reproducible build environments over time.
18+
# * Some settings are only available using a configuration file
19+
20+
# Required
21+
version: 2
22+
23+
# Set the version of Python and other tools you might need
24+
build:
25+
os: ubuntu-22.04
26+
tools:
27+
python: "3.11"
28+
jobs:
29+
# pre_build:
30+
# # Check for broken external links
31+
# - python -m sphinx -b linkcheck -D linkcheck_timeout=1 docs/ _build/linkcheck
32+
post_checkout:
33+
# https://docs.readthedocs.io/en/stable/build-customization.html#cancel-build-based-on-a-condition
34+
# Build-cancellation rules are recommended for monorepos.
35+
# Cancel building pull requests when there aren't changes in any of these paths: ${build_trigger_paths}.
36+
#
37+
# If there are no changes (git diff exits with 0) we force the command to return with 183.
38+
# This is a special exit code on Read the Docs that will cancel the build immediately.
39+
- |
40+
if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && git diff --quiet origin/master -- ${build_trigger_paths};
41+
then
42+
exit 183;
43+
fi
44+
45+
# Have Read the Docs build documentation with Sphinx
46+
sphinx:
47+
builder: html
48+
configuration: ${conf_py_path}
49+
50+
# If using Sphinx, optionally build your docs in additional formats such as PDF
51+
formats:
52+
- epub
53+
- pdf
54+
55+
# Optionally declare the Python requirements required to build your docs
56+
## TODO(ni-jfitzger): Create requirements file for docs to make builds reproducible. See https://github.com/ni/nimi-python/issues/1968
57+
## Note: Our nimi-python readthedocs project used the defaults here: https://docs.readthedocs.io/en/stable/build-default-versions.html#external-dependencies
58+
# python:
59+
# install:
60+
# - requirements: docs/requirements.txt

build/templates/conf.py.mako

+18-13
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22
import datetime
33
current_year = datetime.datetime.today().year
44
5-
with open('./VERSION') as vf:
6-
global_version = vf.read().strip()
5+
config = template_parameters['metadata'].config
6+
copyright_start_year = config['initial_release_year']
7+
version = config['module_version']
78
9+
api_name = f"{config['driver_name']} Python API"
10+
api_name_no_spaces_or_hyphens = api_name.replace(" ", "").replace("-", "")
11+
api_name_no_spaces_or_hyphens_lower = api_name_no_spaces_or_hyphens.lower()
812
%>\
913
#!/usr/bin/env python3
1014
# -*- coding: utf-8 -*-
1115
#
12-
# NI Modular Instruments Python API documentation build configuration file, created by
16+
# ${api_name} documentation build configuration file, created by
1317
# sphinx-quickstart on Fri Jul 14 13:04:36 2017.
1418
#
1519
# This file is execfile()d with the current directory set to its
@@ -62,16 +66,16 @@ source_suffix = '.rst'
6266
master_doc = 'index'
6367

6468
# General information about the project.
65-
project = 'NI Modular Instruments Python API'
66-
copyright = '2017-${current_year}, National Instruments Corporation'
69+
project = '${api_name}'
70+
copyright = '${copyright_start_year}-${current_year}, National Instruments Corporation'
6771
author = 'NI'
6872

6973
# The version info for the project you're documenting, acts as replacement for
7074
# |version| and |release|, also used in various other places throughout the
7175
# built documents.
7276
#
7377
# The full version, including alpha/beta/rc tags.
74-
release = '${global_version}'
78+
release = '${version}'
7579
# The short X.Y version.
7680
version = release[:3]
7781

@@ -112,7 +116,7 @@ html_theme_options = {
112116
# Add any paths that contain custom static files (such as style sheets) here,
113117
# relative to this directory. They are copied after the builtin static files,
114118
# so a file named "default.css" will overwrite the builtin "default.css".
115-
html_static_path = ['_static']
119+
html_static_path = ['../_static']
116120

117121
# Fix wide tables of RTD per https://github.com/rtfd/sphinx_rtd_theme/issues/117#issuecomment-41571653
118122
def setup(app):
@@ -164,7 +168,7 @@ latex_elements = {
164168
# (source start file, target name, title,
165169
# author, documentclass [howto, manual, or own class]).
166170
latex_documents = [
167-
(master_doc, 'NIModularInstrumentsPythonAPI.tex', 'NI Modular Instruments Python API Documentation',
171+
(master_doc, '${api_name_no_spaces_or_hyphens}.tex', '${api_name} Documentation',
168172
'NI', 'manual'),
169173
]
170174

@@ -174,7 +178,7 @@ latex_documents = [
174178
# One entry per manual page. List of tuples
175179
# (source start file, name, description, authors, manual section).
176180
man_pages = [
177-
(master_doc, 'nimodularinstrumentspythonapi', 'NI Modular Instruments Python API Documentation',
181+
(master_doc, '${api_name_no_spaces_or_hyphens_lower}', '${api_name} Documentation',
178182
[author], 1)
179183
]
180184

@@ -185,11 +189,12 @@ man_pages = [
185189
# (source start file, target name, title, author,
186190
# dir menu entry, description, category)
187191
texinfo_documents = [
188-
(master_doc, 'NIModularInstrumentsPythonAPI', 'NI Modular Instruments Python API Documentation',
189-
author, 'NIModularInstrumentsPythonAPI', 'One line description of project.',
192+
(master_doc, '${api_name_no_spaces_or_hyphens}', '${api_name} Documentation',
193+
author, '${api_name_no_spaces_or_hyphens}', 'One line description of project.',
190194
'Miscellaneous'),
191195
]
192196

193197
# Example configuration for intersphinx: refer to the Python standard library.
194-
intersphinx_mapping = {'https://docs.python.org/': None}
195-
198+
## TODO(ni-jfitzger): Add mappings for nimi-python APIs that reference other nimi-python APIs.
199+
## We can probably just list all of the mappings (other than maybe the current module, I think)
200+
intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}

build/templates/driver.rst.mako

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<%
2+
'''This is a template for the module-specific .rst'''
3+
4+
config = template_parameters['metadata'].config
5+
module_name = config['module_name']
6+
doc_header = f"{module_name} module"
7+
%>\
8+
${doc_header}
9+
${"=" * len(doc_header)}
10+
11+
.. include:: installation.inc
12+
13+
.. include:: ../_static/${module_name}_usage.inc
14+
15+
.. include:: toc.inc
16+

build/templates/examples.rst.mako

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
# - (1) will link to the zip file for the current release
2626
# - (2) will include current code snippet and URL will point to release version
2727
28-
with open('./LATEST_RELEASE') as vf:
28+
with open(f'./src/{module_name}/LATEST_RELEASE') as vf:
2929
latest_release_version = vf.read().strip()
3030
released_zip_url = 'https://github.com/ni/nimi-python/releases/download/{0}/{1}_examples.zip'.format(latest_release_version, module_name)
3131

build/templates/index.rst.mako

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<%
2+
config = template_parameters['metadata'].config
3+
doc_header = f"{config['driver_name']} Python API Documentation"
4+
module_name = config['module_name']
5+
driver_name = config['driver_name']
6+
%>\
7+
8+
${doc_header}
9+
${"=" * len(doc_header)}
10+
11+
.. include:: ../_static/about_driver.inc
12+
13+
.. include:: ../_static/contributing.inc
14+
15+
.. include:: ../_static/support.inc
16+
17+
.. toctree::
18+
:maxdepth: 3
19+
:caption: Documentation
20+
21+
${module_name}
22+
23+
Additional Documentation
24+
------------------------
25+
26+
Refer to your driver documentation for device-specific information and detailed API documentation.
27+
28+
Refer to the `nimi-python Read the Docs project <https://nimi-python.readthedocs.io/en/stable/>`_ for documentation of versions 1.4.4 of the module or earlier.
29+
30+
.. include:: ../_static/license.inc
31+
32+
Indices and tables
33+
==================
34+
35+
* :ref:`genindex`
36+
* :ref:`modindex`
37+
* :ref:`search`

0 commit comments

Comments
 (0)