From d1738c806e9af8a6f39d8306bbb90e8d49c64be7 Mon Sep 17 00:00:00 2001
From: Javed Habib <100477031+JaeAeich@users.noreply.github.com>
Date: Thu, 30 May 2024 13:57:00 +0530
Subject: [PATCH] docs: add `sphinx` and `readthedocs` (#187)
---
.readthedocs.yml | 17 +
README.md | 3 +-
docs/Makefile | 20 ++
docs/make.bat | 35 +++
docs/source/conf.py | 100 ++++++
docs/source/index.rst | 31 ++
docs/source/pages/tesk/modules.rst | 7 +
docs/source/pages/tesk/tesk.rst | 18 ++
docs/source/pages/tesk/tesk.services.rst | 101 ++++++
poetry.lock | 379 ++++++++++++++++++++++-
pyproject.toml | 9 +
11 files changed, 718 insertions(+), 2 deletions(-)
create mode 100644 .readthedocs.yml
create mode 100644 docs/Makefile
create mode 100644 docs/make.bat
create mode 100644 docs/source/conf.py
create mode 100644 docs/source/index.rst
create mode 100644 docs/source/pages/tesk/modules.rst
create mode 100644 docs/source/pages/tesk/tesk.rst
create mode 100644 docs/source/pages/tesk/tesk.services.rst
diff --git a/.readthedocs.yml b/.readthedocs.yml
new file mode 100644
index 0000000..027b5dd
--- /dev/null
+++ b/.readthedocs.yml
@@ -0,0 +1,17 @@
+---
+version: 2
+
+build:
+ os: ubuntu-22.04
+ tools:
+ python: '3.12'
+ jobs:
+ post_create_environment:
+ - pip install poetry
+ - poetry config virtualenvs.create false
+ post_install:
+ - poetry install --only docs
+
+sphinx:
+ configuration: docs/source/conf.py
+...
diff --git a/README.md b/README.md
index 755baae..0dd388e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
[![codecov](https://codecov.io/gh/elixir-cloud-aai/TESK/branch/main/graph/badge.svg)](https://codecov.io/gh/elixir-cloud-aai/TESK)
+[![Documentation Status](https://readthedocs.org/projects/tesk/badge/?version=latest)](https://tesk.readthedocs.io/en/latest/?badge=latest)
[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](./LICENSE)
[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-311/)
[![Development Status](https://img.shields.io/badge/status-beta-yellow.svg)](https://github.com/elixir-cloud-aai/TESK)
@@ -7,7 +8,7 @@
[![Safety](https://img.shields.io/badge/security-safety-orange.svg)](https://safetycli.com/product/safety-cli)
[![Ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://docs.astral.sh/ruff/)
-
+
An implementation of a task execution engine based on the
[TES standard](https://github.com/ga4gh/task-execution-schemas) running on
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..d0c3cbf
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000..747ffb7
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/source/conf.py b/docs/source/conf.py
new file mode 100644
index 0000000..cd84ae5
--- /dev/null
+++ b/docs/source/conf.py
@@ -0,0 +1,100 @@
+"""Configuration file for the Sphinx documentation builder."""
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+import datetime
+import os
+import sys
+from pathlib import Path
+
+import tomli
+
+sys.path.insert(0, os.path.abspath('../..'))
+
+
+# -- Project information -----------------------------------------------------
+def _get_project_meta():
+ _pyproject_path = Path(__file__).parents[2] / 'pyproject.toml'
+ with open(_pyproject_path, mode='rb') as pyproject:
+ return tomli.load(pyproject)['tool']['poetry']
+
+
+pkg_meta = _get_project_meta()
+current_year = datetime.datetime.now().year
+project = str(pkg_meta['name'])
+project_copyright = f"{current_year}, {str(pkg_meta['authors'][0])}"
+author = str(pkg_meta['authors'][0])
+
+version = str(pkg_meta['version'])
+release = version
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+ 'sphinx.ext.autodoc',
+ 'sphinx.ext.doctest',
+ 'sphinx.ext.todo',
+ 'sphinx.ext.coverage',
+ 'sphinx.ext.viewcode',
+ 'sphinx.ext.autosummary',
+ # Used to write beautiful docstrings:
+ 'sphinx.ext.napoleon',
+ # Used to include .md files:
+ 'm2r2',
+ # Used to insert typehints into the final docs:
+ 'sphinx_autodoc_typehints',
+ # Used to embed values from the source code into the docs:
+ 'added_value',
+]
+
+# Set `typing.TYPE_CHECKING` to `True`:
+# https://pypi.org/project/sphinx-autodoc-typehints/
+set_type_checking_flag = False
+always_document_param_types = False
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+
+source_suffix = ['.rst', '.md']
+
+# The master toctree document.
+master_doc = 'index'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = 'en'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path .
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'furo'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# -- Extension configuration -------------------------------------------------
+napoleon_numpy_docstring = False
+
+# -- Options for todo extension ----------------------------------------------
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = True
diff --git a/docs/source/index.rst b/docs/source/index.rst
new file mode 100644
index 0000000..2845e52
--- /dev/null
+++ b/docs/source/index.rst
@@ -0,0 +1,31 @@
+TESK
+=================================
+
+.. toctree::
+ :maxdepth: 1
+ :caption: TESK
+
+.. mdinclude:: ../../README.md
+.. mdinclude:: ../tesintro.md
+
+.. Not adding a heading to separate deployment docs because
+.. these md files already have heading.
+.. mdinclude:: ../../deployment/documentation/deployment.md
+.. mdinclude:: ../../deployment/documentation/integrated_wes_tes.md
+.. mdinclude:: ../../deployment/documentation/local_ftp.md
+
+Package contents
+==================
+
+.. toctree::
+ :maxdepth: 2
+ :caption: package
+
+ pages/tesk/modules
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/source/pages/tesk/modules.rst b/docs/source/pages/tesk/modules.rst
new file mode 100644
index 0000000..cd5ce57
--- /dev/null
+++ b/docs/source/pages/tesk/modules.rst
@@ -0,0 +1,7 @@
+tesk
+====
+
+.. toctree::
+ :maxdepth: 4
+
+ tesk
diff --git a/docs/source/pages/tesk/tesk.rst b/docs/source/pages/tesk/tesk.rst
new file mode 100644
index 0000000..b023c8f
--- /dev/null
+++ b/docs/source/pages/tesk/tesk.rst
@@ -0,0 +1,18 @@
+tesk package
+============
+
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ tesk.services
+
+Module contents
+---------------
+
+.. automodule:: tesk
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/source/pages/tesk/tesk.services.rst b/docs/source/pages/tesk/tesk.services.rst
new file mode 100644
index 0000000..807c36e
--- /dev/null
+++ b/docs/source/pages/tesk/tesk.services.rst
@@ -0,0 +1,101 @@
+tesk.services package
+=====================
+
+Submodules
+----------
+
+tesk.services.constants module
+------------------------------
+
+.. automodule:: tesk.services.constants
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.exceptions module
+-------------------------------
+
+.. automodule:: tesk.services.exceptions
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.filer module
+--------------------------
+
+.. automodule:: tesk.services.filer
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.filer\_class module
+---------------------------------
+
+.. automodule:: tesk.services.filer_class
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.filer\_s3 module
+------------------------------
+
+.. automodule:: tesk.services.filer_s3
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.job module
+------------------------
+
+.. automodule:: tesk.services.job
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.path module
+-------------------------
+
+.. automodule:: tesk.services.path
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.pvc module
+------------------------
+
+.. automodule:: tesk.services.pvc
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.taskmaster module
+-------------------------------
+
+.. automodule:: tesk.services.taskmaster
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.transput module
+-----------------------------
+
+.. automodule:: tesk.services.transput
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+tesk.services.utils module
+--------------------------
+
+.. automodule:: tesk.services.utils
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: tesk.services
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/poetry.lock b/poetry.lock
index c65f2fc..424f4ca 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,5 +1,40 @@
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
+[[package]]
+name = "added-value"
+version = "0.24.0"
+description = "Sphinx extension for embedding values extracted from Python modules"
+optional = false
+python-versions = "*"
+files = [
+ {file = "added-value-0.24.0.tar.gz", hash = "sha256:4c71f756db1589b596a0f2a35c8a35ddd86dd70b9335504c9ee29e2b95d40440"},
+ {file = "added_value-0.24.0-py2.py3-none-any.whl", hash = "sha256:637464409e84759cfae1d3809a944ac000d0655bffd46bed958ffb5b8569c1f8"},
+]
+
+[package.dependencies]
+docutils = "*"
+les-iterables = ">=0.6.0"
+more-itertools = "*"
+natsort = "*"
+six = "*"
+sphinx = "*"
+
+[package.extras]
+dev = ["build", "bumpversion", "twine", "wheel"]
+doc = ["better-apidoc", "sphinx", "sphinx-rtd-theme"]
+test = ["beautifulsoup4", "hypothesis", "pytest"]
+
+[[package]]
+name = "alabaster"
+version = "0.7.16"
+description = "A light, configurable Sphinx theme"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"},
+ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"},
+]
+
[[package]]
name = "annotated-types"
version = "0.7.0"
@@ -36,6 +71,20 @@ files = [
[package.dependencies]
cryptography = "*"
+[[package]]
+name = "babel"
+version = "2.15.0"
+description = "Internationalization utilities"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"},
+ {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"},
+]
+
+[package.extras]
+dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
+
[[package]]
name = "bandit"
version = "1.7.8"
@@ -60,6 +109,27 @@ test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)",
toml = ["tomli (>=1.1.0)"]
yaml = ["PyYAML"]
+[[package]]
+name = "beautifulsoup4"
+version = "4.12.3"
+description = "Screen-scraping library"
+optional = false
+python-versions = ">=3.6.0"
+files = [
+ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"},
+ {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"},
+]
+
+[package.dependencies]
+soupsieve = ">1.2"
+
+[package.extras]
+cchardet = ["cchardet"]
+chardet = ["chardet"]
+charset-normalizer = ["charset-normalizer"]
+html5lib = ["html5lib"]
+lxml = ["lxml"]
+
[[package]]
name = "boto3"
version = "1.34.104"
@@ -848,6 +918,17 @@ ssh = ["bcrypt (>=3.1.5)"]
test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
test-randomorder = ["pytest-randomly"]
+[[package]]
+name = "docutils"
+version = "0.20.1"
+description = "Docutils -- Python Documentation Utilities"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"},
+ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
+]
+
[[package]]
name = "dparse"
version = "0.6.4b0"
@@ -887,6 +968,23 @@ six = ">=1.10,<2.0"
[package.extras]
scandir = ["scandir (>=1.5,<2.0)"]
+[[package]]
+name = "furo"
+version = "2024.5.6"
+description = "A clean customisable Sphinx documentation theme."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "furo-2024.5.6-py3-none-any.whl", hash = "sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de"},
+ {file = "furo-2024.5.6.tar.gz", hash = "sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b"},
+]
+
+[package.dependencies]
+beautifulsoup4 = "*"
+pygments = ">=2.7"
+sphinx = ">=6.0,<8.0"
+sphinx-basic-ng = ">=1.0.0.beta2"
+
[[package]]
name = "google-auth"
version = "2.29.0"
@@ -921,6 +1019,17 @@ files = [
{file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
]
+[[package]]
+name = "imagesize"
+version = "1.4.1"
+description = "Getting image size from png/jpeg/jpeg2000/gif file"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
+ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
+]
+
[[package]]
name = "iniconfig"
version = "2.0.0"
@@ -997,6 +1106,40 @@ files = [
{file = "kubernetes_stubs-22.6.0.post1-py2.py3-none-any.whl", hash = "sha256:46a4d6fc30458f245c54d2f5777dcb2ecc16bc86258fb37c7b87c631d2ac61da"},
]
+[[package]]
+name = "les-iterables"
+version = "1.11.1"
+description = "Iterable processing functions"
+optional = false
+python-versions = "*"
+files = [
+ {file = "les_iterables-1.11.1-py3-none-any.whl", hash = "sha256:c1f0d7ba6869e3785dc7a21aeb21c1c6a3b1a62cacf2e9ef8f67bf3f7f63cdf0"},
+ {file = "les_iterables-1.11.1.tar.gz", hash = "sha256:1e1d51f26efc01ae7e624ad9b806e6d251f31d81d981995d3fa6bbf99c78a6c8"},
+]
+
+[package.dependencies]
+more-itertools = "*"
+
+[package.extras]
+dev = ["bumpversion"]
+doc = ["better-apidoc", "sphinx", "sphinx-rtd-theme"]
+test = ["coverage", "hypothesis", "pytest", "pytest-cov", "tox"]
+
+[[package]]
+name = "m2r2"
+version = "0.3.3.post2"
+description = "Markdown and reStructuredText in a single file."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "m2r2-0.3.3.post2-py3-none-any.whl", hash = "sha256:86157721eb6eabcd54d4eea7195890cc58fa6188b8d0abea633383cfbb5e11e3"},
+ {file = "m2r2-0.3.3.post2.tar.gz", hash = "sha256:e62bcb0e74b3ce19cda0737a0556b04cf4a43b785072fcef474558f2c1482ca8"},
+]
+
+[package.dependencies]
+docutils = ">=0.19"
+mistune = "0.8.4"
+
[[package]]
name = "markdown-it-py"
version = "3.0.0"
@@ -1120,6 +1263,28 @@ files = [
{file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
]
+[[package]]
+name = "mistune"
+version = "0.8.4"
+description = "The fastest markdown parser in pure Python"
+optional = false
+python-versions = "*"
+files = [
+ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"},
+ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"},
+]
+
+[[package]]
+name = "more-itertools"
+version = "10.2.0"
+description = "More routines for operating on iterables, beyond itertools"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"},
+ {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"},
+]
+
[[package]]
name = "moto"
version = "5.0.8"
@@ -1221,6 +1386,21 @@ files = [
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
]
+[[package]]
+name = "natsort"
+version = "8.4.0"
+description = "Simple yet flexible natural sorting in Python."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"},
+ {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"},
+]
+
+[package.extras]
+fast = ["fastnumbers (>=2.0.0)"]
+icu = ["PyICU (>=1.0.0)"]
+
[[package]]
name = "oauthlib"
version = "3.2.2"
@@ -1919,6 +2099,192 @@ files = [
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
]
+[[package]]
+name = "snowballstemmer"
+version = "2.2.0"
+description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+optional = false
+python-versions = "*"
+files = [
+ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
+
+[[package]]
+name = "soupsieve"
+version = "2.5"
+description = "A modern CSS selector implementation for Beautiful Soup."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"},
+ {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"},
+]
+
+[[package]]
+name = "sphinx"
+version = "7.3.7"
+description = "Python documentation generator"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"},
+ {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"},
+]
+
+[package.dependencies]
+alabaster = ">=0.7.14,<0.8.0"
+babel = ">=2.9"
+colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
+docutils = ">=0.18.1,<0.22"
+imagesize = ">=1.3"
+Jinja2 = ">=3.0"
+packaging = ">=21.0"
+Pygments = ">=2.14"
+requests = ">=2.25.0"
+snowballstemmer = ">=2.0"
+sphinxcontrib-applehelp = "*"
+sphinxcontrib-devhelp = "*"
+sphinxcontrib-htmlhelp = ">=2.0.0"
+sphinxcontrib-jsmath = "*"
+sphinxcontrib-qthelp = "*"
+sphinxcontrib-serializinghtml = ">=1.1.9"
+
+[package.extras]
+docs = ["sphinxcontrib-websupport"]
+lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"]
+test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"]
+
+[[package]]
+name = "sphinx-autodoc-typehints"
+version = "2.1.0"
+description = "Type hints (PEP 484) support for the Sphinx autodoc extension"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinx_autodoc_typehints-2.1.0-py3-none-any.whl", hash = "sha256:46f1a710b3ed35904f63a77c5e68334c5ee1c2e22828b75fdcd147f1c52c199b"},
+ {file = "sphinx_autodoc_typehints-2.1.0.tar.gz", hash = "sha256:51bf8dc77c4fba747e32f0735002a91500747d0553cae616863848e8f5e49fe8"},
+]
+
+[package.dependencies]
+sphinx = ">=7.3.5"
+
+[package.extras]
+docs = ["furo (>=2024.1.29)"]
+numpy = ["nptyping (>=2.5)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.4.4)", "defusedxml (>=0.7.1)", "diff-cover (>=9)", "pytest (>=8.1.1)", "pytest-cov (>=5)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.11)"]
+
+[[package]]
+name = "sphinx-basic-ng"
+version = "1.0.0b2"
+description = "A modern skeleton for Sphinx themes."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"},
+ {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"},
+]
+
+[package.dependencies]
+sphinx = ">=4.0"
+
+[package.extras]
+docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"]
+
+[[package]]
+name = "sphinxcontrib-applehelp"
+version = "1.0.8"
+description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"},
+ {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"},
+]
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-devhelp"
+version = "1.0.6"
+description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"},
+ {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"},
+]
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.0.5"
+description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"},
+ {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"},
+]
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+standalone = ["Sphinx (>=5)"]
+test = ["html5lib", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+description = "A sphinx extension which renders display math in HTML via JavaScript"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
+ {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
+]
+
+[package.extras]
+test = ["flake8", "mypy", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-qthelp"
+version = "1.0.7"
+description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"},
+ {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"},
+]
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-serializinghtml"
+version = "1.1.10"
+description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"},
+ {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"},
+]
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
[[package]]
name = "stevedore"
version = "5.2.0"
@@ -1933,6 +2299,17 @@ files = [
[package.dependencies]
pbr = ">=2.0.0,<2.1.0 || >2.1.0"
+[[package]]
+name = "tomli"
+version = "2.0.1"
+description = "A lil' TOML parser"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+
[[package]]
name = "typer"
version = "0.12.3"
@@ -2105,4 +2482,4 @@ files = [
[metadata]
lock-version = "2.0"
python-versions = "^3.11"
-content-hash = "c2df384da836c81a949957e1148b650efb26832c2fb3fe67c57b81a6c32d0faf"
+content-hash = "c7ec62eb8ae419380f87b8d2492723d2b5ce3d7485b0df3dfbd10279a111c759"
diff --git a/pyproject.toml b/pyproject.toml
index 70586f9..0e0b7f6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -33,6 +33,15 @@ python = "^3.11"
requests = ">=2.20.0"
urllib3 = "^2.2.1"
+[tool.poetry.group.docs.dependencies]
+added-value = "^0.24.0"
+docutils = "0.20.1"
+furo = "^2024.5.6"
+m2r2 = "^0.3.3.post2"
+sphinx = "^7.3.7"
+sphinx-autodoc-typehints = "^2.1.0"
+tomli = "^2.0.1"
+
[tool.poetry.group.lint.dependencies]
ruff = "^0.4.4"
typos = "^1.21.0"