Repository: exasol/integration-test-docker-environment (language: python)

Issue:
Generate Sphinx documentation
## Background

We have now an API Layer which can be used by client projects to spawn the test environment, build test container, push test container and more. This API becomes more important because only with it one can start a test container in the test environment.
It's very important to have proper documentation of the API functions provided by this project. Also, documentation of the other classes need to be well documented, because some functionality (Populate Data, Upload) can be used by clients.

## Acceptance Criteria

1. Setup a Github workflow which leverages https://github.com/exasol/sphinx-github-pages-generator to generate and deploy the sphinx documentation correctly. 
Generate Sphinx documentation
## Background

We have now an API Layer which can be used by client projects to spawn the test environment, build test container, push test container and more. This API becomes more important because only with it one can start a test container in the test environment.
It's very important to have proper documentation of the API functions provided by this project. Also, documentation of the other classes need to be well documented, because some functionality (Populate Data, Upload) can be used by clients.

## Acceptance Criteria

1. Setup a Github workflow which leverages https://github.com/exasol/sphinx-github-pages-generator to generate and deploy the sphinx documentation correctly. 


Discussion / hints:

Fix patch:
diff --git a/.github/actions/prepare_poetry_env/action.yml b/.github/actions/prepare_poetry_env/action.yml
new file mode 100644
index 000000000..657781efa
--- /dev/null
+++ b/.github/actions/prepare_poetry_env/action.yml
@@ -0,0 +1,19 @@
+name: 'Prepare Poetry environment'
+description: 'This composite actions checks out out the project, installs Poetry, and install the project in the Poetry environment'
+inputs:
+  python-version:
+    description: 'The Python version to use'
+    required: true
+    default: '3.8'
+runs:
+  using: "composite"
+  steps:
+    - uses: actions/setup-python@v2
+      with:
+        python-version: ${{ inputs.python-version }}
+    - uses: abatilo/actions-poetry@v2
+      with:
+        poetry-version: 1.2.0
+    - name: Poetry install
+      run: poetry install
+      shell: bash
diff --git a/.github/workflows/check_setup_py.yaml b/.github/workflows/check_setup_py.yaml
index fc16024a0..98524894f 100644
--- a/.github/workflows/check_setup_py.yaml
+++ b/.github/workflows/check_setup_py.yaml
@@ -4,21 +4,13 @@ on: [push, pull_request]
 
 jobs:
   check_setup_py:
-    strategy:
-      fail-fast: false
-      matrix:
-        python-version: [3.8]
-    name: Check setup for Python ${{ matrix.python-version }}
+
+    name: Check setup
     runs-on: ubuntu-latest
 
     steps:
     - uses: actions/checkout@v3
-    - uses: actions/setup-python@v2
-      with:
-        python-version: ${{ matrix.python-version }}
-    - uses: abatilo/actions-poetry@v2
-      with:
-        poetry-version: 1.2.0
+    - uses: ./.github/actions/prepare_poetry_env
     - name: Run packaging update
       run: bash githooks/update_packaging.sh
     - name: Show changes on working copy
diff --git a/.github/workflows/check_version.yaml b/.github/workflows/check_version.yaml
index 8bb9829ca..8f767ab1e 100644
--- a/.github/workflows/check_version.yaml
+++ b/.github/workflows/check_version.yaml
@@ -9,15 +9,6 @@ jobs:
       - uses: actions/checkout@v3
         with:
           fetch-depth: 0
-      - name: Setup Python 3.8
-        uses: actions/setup-python@v2
-        with:
-          python-version: 3.8
-
-      - name: Install Poetry
-        uses: abatilo/actions-poetry@v2
-        with:
-          poetry-version: 1.2.0
-
+      - uses: ./.github/actions/prepare_poetry_env
       - name: Check Release
         run: ./scripts/build/check_release.sh
diff --git a/.github/workflows/create_release_docu.yaml b/.github/workflows/create_release_docu.yaml
new file mode 100644
index 000000000..2ecce074c
--- /dev/null
+++ b/.github/workflows/create_release_docu.yaml
@@ -0,0 +1,22 @@
+name: Generate release documentation
+
+on:
+  release:
+    types: [published]
+jobs:
+
+  publish-release-documentation:
+    runs-on: ubuntu-latest
+
+    environment: publish
+
+    steps:
+    - name: Checkout
+      uses: actions/checkout@v3
+    - uses: ./.github/actions/prepare_poetry_env
+    - name: Deploy release documentation to github-pages branch
+      run: |
+        git config --local user.email "opensource@exasol.com"
+        git config --local user.name "GitHub Action"
+        git fetch
+        poetry run python -m nox -s push-pages-release
\ No newline at end of file
diff --git a/.github/workflows/get_exasol_versions.yml b/.github/workflows/get_exasol_versions.yml
new file mode 100644
index 000000000..a67bf0ff7
--- /dev/null
+++ b/.github/workflows/get_exasol_versions.yml
@@ -0,0 +1,19 @@
+on:
+  workflow_call:
+    outputs:
+      matrix:
+        description: "The list of known db versions"
+        value: ${{ jobs.get_exasol_versions.outputs.matrix }}
+jobs:
+  get_exasol_versions:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: ./.github/actions/prepare_poetry_env
+      - name: Print matrix
+        run: poetry run nox --non-interactive -s "get-all-db-versions"
+      - id: set-matrix
+        run: |
+          echo "::set-output name=matrix::$(poetry run nox --non-interactive -s 'get-all-db-versions')"
+    outputs:
+      matrix: ${{ steps.set-matrix.outputs.matrix }}
diff --git a/.github/workflows/release_droid_upload_github_release_assets.yml b/.github/workflows/release_droid_upload_github_release_assets.yml
index 61dd4c338..af47902ef 100644
--- a/.github/workflows/release_droid_upload_github_release_assets.yml
+++ b/.github/workflows/release_droid_upload_github_release_assets.yml
@@ -15,15 +15,7 @@ jobs:
         with:
           fetch-depth: 0
 
-      - name: Setup Python 3.8 for integration-test-docker-environment
-        uses: actions/setup-python@v2
-        with:
-          python-version: 3.8
-
-      - name: Install Poetry
-        uses: abatilo/actions-poetry@v2
-        with:
-          poetry-version: 1.2.0
+      - uses: ./.github/actions/prepare_poetry_env
 
       - name: Check Release
         run: ./scripts/build/check_release.sh
@@ -45,15 +37,7 @@ jobs:
     steps:
     - uses: actions/checkout@v3
 
-    - name: Setup Python 3.8
-      uses: actions/setup-python@v2
-      with:
-        python-version: 3.8
-
-    - name: Install Poetry
-      uses: abatilo/actions-poetry@v2
-      with:
-        poetry-version: 1.2.0
+    - uses: ./.github/actions/prepare_poetry_env
 
     - name: Build Release
       run: |
diff --git a/.github/workflows/update_docu.yml b/.github/workflows/update_docu.yml
new file mode 100644
index 000000000..a25d899c0
--- /dev/null
+++ b/.github/workflows/update_docu.yml
@@ -0,0 +1,20 @@
+name: update-docu
+
+on:
+  push:
+    branches:
+      - main
+
+jobs:
+  publish-docs:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: ./.github/actions/prepare_poetry_env
+
+      - name: Publish Documentation
+        run: |
+          git config --local user.email "opensource@exasol.com"
+          git config --local user.name "GitHub Action"
+          git fetch
+          poetry run python3 -m nox -s push-pages-main
diff --git a/.github/workflows/validate_docu.yml b/.github/workflows/validate_docu.yml
new file mode 100644
index 000000000..4a39fc860
--- /dev/null
+++ b/.github/workflows/validate_docu.yml
@@ -0,0 +1,17 @@
+name: validate-docu
+
+on:
+  push:
+    branches-ignore:
+      - "github-pages/*"
+      - "main"
+
+jobs:
+  validate-docs:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: ./.github/actions/prepare_poetry_env
+      - name: Build Documentation
+        run: poetry run nox -s build-html-doc
+
diff --git a/README.rst b/README.rst
index f09beb57a..c44d1e6e2 100644
--- a/README.rst
+++ b/README.rst
@@ -8,12 +8,8 @@ Exasol Docker-DB container, but the API Layer has extended functionality
 and also can start an associated test container for whose content the
 client is responsible.
 
+Documentation
+-------------
 
-Table of Contents
-=================
-
-Information for Users
----------------------
-
-* `User Guide <doc/user_guide/user_guide.md>`_
-* `Changelog <doc/changes/changelog.md>`_
+`Documentation for the current main branch <https://exasol.github.io/integration-test-docker-environment/main>`_ is hosted on the Github Pages of this project.
+`Here <https://exasol.github.io/integration-test-docker-environment>`_  is a list of documentations for previous releases.
diff --git a/doc/_static/.gitkeep b/doc/_static/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/doc/_template/.gitkeep b/doc/_template/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/doc/api.rst b/doc/api.rst
new file mode 100644
index 000000000..5d78ec477
--- /dev/null
+++ b/doc/api.rst
@@ -0,0 +1,30 @@
+API Reference
+-------------
+
+Public API
+==========
+
+The following references the API which provides the same functionality (plus more) as the CLI:
+    - Spawn the test environment
+        - optionally with a test container
+    - Health check
+    - Build a test container
+    - Push a test container to a docker repository
+
+.. autosummary::
+   :toctree: api
+   :recursive:
+
+    exasol_integration_test_docker_environment.lib.api
+
+Complete API
+============
+
+The following references the complete API of this project.
+
+.. autosummary::
+   :toctree: api
+   :recursive:
+
+
+    exasol_integration_test_docker_environment
diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md
index 4d3eb820c..e0183a0e1 100644
--- a/doc/changes/changelog.md
+++ b/doc/changes/changelog.md
@@ -14,3 +14,24 @@
 * [0.3.0](changes_0.3.0.md)
 * [0.2.0](changes_0.2.0.md)
 * [0.1.0](changes_0.1.0.md)
+
+<!--- This MyST Parser Sphinx directive is necessary to keep Sphinx happy. We need list here all release letters again, because release droid and other scripts assume Markdown --->
+```{toctree}
+---
+hidden:
+---
+changes_0.12.0
+changes_0.11.0
+changes_0.10.0
+changes_0.9.0
+changes_0.8.0
+changes_0.7.0
+changes_0.6.0
+changes_0.5.0
+changes_0.4.1
+changes_0.4.0
+changes_0.3.1
+changes_0.3.0
+changes_0.2.0
+changes_0.1.0
+```
\ No newline at end of file
diff --git a/doc/changes/changes_0.1.0.md b/doc/changes/changes_0.1.0.md
index a3b411975..45a865a08 100644
--- a/doc/changes/changes_0.1.0.md
+++ b/doc/changes/changes_0.1.0.md
@@ -7,7 +7,7 @@ In this first release we created an docker test environment for Exasol. The test
 ### Currently supported Operating Systems
 
 * Linux
-* Mac OS X with Intel processors (please consult the [README](../../README.md) for more details)
+* Mac OS X with Intel processors (please consult the README for more details)
 
 ### Currently supported Exasol Versions
 
diff --git a/doc/changes/changes_0.12.0.md b/doc/changes/changes_0.12.0.md
index aca34d512..56d590e34 100644
--- a/doc/changes/changes_0.12.0.md
+++ b/doc/changes/changes_0.12.0.md
@@ -38,6 +38,7 @@ TBD
 - #251: Updated Poetry
 
 ## Documentation:
+- #255: Added support for sphinx based documentation
 - #185: Restructured README.md and converted to RST
 
 ## Security:
diff --git a/doc/conf.py b/doc/conf.py
new file mode 100644
index 000000000..b78897421
--- /dev/null
+++ b/doc/conf.py
@@ -0,0 +1,71 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+import os
+import sys
+# sys.path.insert(0, os.path.abspath('.'))
+sys.path.insert(0, os.path.abspath('../'))
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'Exasol Integration Test Docker Environment'
+copyright = '2022, Exasol AG'
+author = 'Exasol AG'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.napoleon',
+    'sphinx.ext.intersphinx',
+    'sphinx.ext.autosummary',
+    'myst_parser',
+    'sphinx.ext.autosectionlabel',
+]
+
+intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}
+
+# Make sure the target is unique
+autosectionlabel_prefix_document = True
+source_suffix = {
+    '.rst': 'restructuredtext',
+    '.txt': 'markdown',
+    '.md': 'markdown',
+}
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# 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', '.build-docu']
+
+suppress_warnings = ['myst.header']
+
+
+# -- 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']
diff --git a/doc/developer_guide/developer_guide.rst b/doc/developer_guide/developer_guide.rst
new file mode 100644
index 000000000..d38735309
--- /dev/null
+++ b/doc/developer_guide/developer_guide.rst
@@ -0,0 +1,9 @@
+***************
+Developer Guide
+***************
+
+In this developer guide we explain how you can build this project.
+
+.. toctree::
+   :maxdepth: 1
+
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 000000000..d861a5cd1
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,20 @@
+.. include:: ../README.rst
+
+*****************
+Table of Contents
+*****************
+
+.. toctree::
+   :maxdepth: 1
+
+   user_guide/user_guide
+   developer_guide/developer_guide
+   api
+   changes/changelog
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/doc/user_guide/user_guide.rst b/doc/user_guide/user_guide.rst
index 49a374dee..30a0b208d 100644
--- a/doc/user_guide/user_guide.rst
+++ b/doc/user_guide/user_guide.rst
@@ -1,4 +1,4 @@
-Integration Test Docker Environment
+User Guide
 ===================================
 
 About
@@ -302,3 +302,6 @@ It is important, that the repository gets cloned to the Mac OS X host
 and not to a docker container, because the python scripts tries to start
 further docker container which use host mounts to share the tests
 directory of the test environment with the docker container.
+
+.. toctree::
+   :maxdepth: 1
diff --git a/noxfile.py b/noxfile.py
new file mode 100644
index 000000000..56fd044b9
--- /dev/null
+++ b/noxfile.py
@@ -0,0 +1,167 @@
+import json
+import webbrowser
+from pathlib import Path
+from typing import List
+
+import nox
+
+ROOT = Path(__file__).parent
+LOCAL_DOC = ROOT / "doc"
+
+nox.options.sessions = []
+
+
+def _build_html_doc(session: nox.Session):
+    session.run("sphinx-apidoc", "-T", "-e", "-o", "api", "../exasol_integration_test_docker_environment")
+    session.run("sphinx-build", "-b", "html", "-W", ".", ".build-docu")
+
+
+def _open_docs_in_browser(session: nox.Session):
+    index_file_path = Path(".build-docu/index.html").resolve()
+    webbrowser.open_new_tab(index_file_path.as_uri())
+
+
+@nox.session(name="build-html-doc", python=False)
+def build_html_doc(session: nox.Session):
+    """Build the documentation for current checkout"""
+    with session.chdir(LOCAL_DOC):
+        _build_html_doc(session)
+
+
+@nox.session(name="open-html-doc", python=False)
+def open_html_doc(session: nox.Session):
+    """Open the documentation for current checkout in the browser"""
+    with session.chdir(LOCAL_DOC):
+        _open_docs_in_browser(session)
+
+
+@nox.session(name="build-and-open-html-doc", python=False)
+def build_and_open_html_doc(session: nox.Session):
+    """Build and open the documentation for current checkout in browser"""
+    with session.chdir(LOCAL_DOC):
+        _build_html_doc(session)
+        _open_docs_in_browser(session)
+
+
+@nox.session(name="commit-pages-main", python=False)
+def commit_pages_main(session: nox.Session):
+    """
+    Generate the GitHub pages documentation for the main branch and
+    commit it to the branch github-pages/main
+    """
+    with session.chdir(ROOT):
+        session.run("sgpg",
+                    "--target_branch", "github-pages/main",
+                    "--push_origin", "origin",
+                    "--commit",
+                    "--source_branch", "main",
+                    "--module_path", "${StringArray[@]}",
+                    env={"StringArray": ("../integration-test-docker-environment")})
+
+
+@nox.session(name="commit-pages-current", python=False)
+def commit_pages_current(session: nox.Session):
+    """
+    Generate the GitHub pages documentation for the current branch and
+    commit it to the branch github-pages/<current_branch>
+    """
+    branch = session.run("git", "branch", "--show-current", silent=True)
+    with session.chdir(ROOT):
+        session.run("sgpg",
+                    "--target_branch", "github-pages/" + branch[:-1],
+                    "--push_origin", "origin",
+                    "--commit",
+                    "--module_path", "${StringArray[@]}",
+                    env={"StringArray": ("../integration-test-docker-environment")})
+
+
+@nox.session(name="push-pages-main", python=False)
+def push_pages_main(session: nox.Session):
+    """
+    Generate the GitHub pages documentation for the main branch and
+    pushes it to the remote branch github-pages/main
+    """
+    with session.chdir(ROOT):
+        session.run("sgpg",
+                    "--target_branch", "github-pages/main",
+                    "--push",
+                    "--source_branch", "main",
+                    "--module_path", "${StringArray[@]}",
+                    env={"StringArray": ("../integration-test-docker-environment")})
+
+
+@nox.session(name="push-pages-current", python=False)
+def push_pages_current(session: nox.Session):
+    """
+    Generate the GitHub pages documentation for the current branch and
+    pushes it to the remote branch github-pages/<current_branch>
+    """
+    branch = session.run("git", "branch", "--show-current", silent=True)
+    with session.chdir(ROOT):
+        session.run("sgpg",
+                    "--target-branch", "github-pages/" + branch[:-1],
+                    "--push",
+                    "--module-path", "${StringArray[@]}",
+                    env={"StringArray": ("../integration-test-docker-environment")})
+
+
+@nox.session(name="push-pages-release", python=False)
+def push_pages_release(session: nox.Session):
+    """Generate the GitHub pages documentation for the release and pushes it to the remote branch github-pages/main"""
+    tags = session.run("git", "tag", "--sort=committerdate", silent=True)
+    # get the latest tag. last element in list is empty string, so choose second to last
+    tag = tags.split("\n")[-2]
+    with session.chdir(ROOT):
+        session.run("sgpg",
+                    "--target_branch", "github-pages/main",
+                    "--push_origin", "origin",
+                    "--push",
+                    "--source_branch", tag,
+                    "--source_origin", "tags",
+                    "--module_path", "${StringArray[@]}",
+                    env={"StringArray": ("../integration-test-docker-environment")})
+
+
+def get_db_versions() -> List[str]:
+    template_path = ROOT / "docker_db_config_template"
+    db_versions = [str(path.name) for path in template_path.iterdir() if path.is_dir()]
+    db_versions.append("default")
+    db_versions.append("7.1.0-d1")
+    return db_versions
+
+
+@nox.session(name="run-tests", python=False)
+@nox.parametrize('db_version', get_db_versions())
+def run_tests(session: nox.Session, db_version: str):
+    """Run the tests in the poetry environment"""
+    with session.chdir(ROOT):
+        env = {"EXASOL_VERSION": db_version}
+        session.run("python",
+                    "-u",
+                    "-m",
+                    "unittest",
+                    "discover",
+                    "./exasol_integration_test_docker_environment/test", env=env)
+
+
+@nox.session(name="run-minimal-tests", python=False)
+@nox.parametrize('db_version', get_db_versions())
+def run_minimal_tests(session: nox.Session, db_version: str):
+    """Run the minimal tests in the poetry environment"""
+    with session.chdir(ROOT):
+        env = {"EXASOL_VERSION": db_version}
+        minimal_tests = ("test_api_test_environment.py", "test_cli_test_environment.py",
+                         "test_doctor.py", "test_termination_handler.py")
+        for test in minimal_tests:
+            session.run(
+                "python",
+                "-u",
+                f"./exasol_integration_test_docker_environment/test/{test}",
+                env=env
+            )
+
+
+@nox.session(name="get-all-db-versions", python=False)
+def get_all_db_versions(session: nox.Session):
+    """Returns all, known, db-versions as JSON string"""
+    print(json.dumps(get_db_versions()))
diff --git a/poetry.lock b/poetry.lock
index 51709fc52..1118de4ad 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,3 +1,48 @@
+[[package]]
+name = "alabaster"
+version = "0.7.12"
+description = "A configurable sidebar-enabled Sphinx theme"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "argcomplete"
+version = "2.0.0"
+description = "Bash tab completion for argparse"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+test = ["coverage", "flake8", "pexpect", "wheel"]
+
+[[package]]
+name = "Babel"
+version = "2.10.3"
+description = "Internationalization utilities"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pytz = ">=2015.7"
+
+[[package]]
+name = "beautifulsoup4"
+version = "4.11.1"
+description = "Screen-scraping library"
+category = "dev"
+optional = false
+python-versions = ">=3.6.0"
+
+[package.dependencies]
+soupsieve = ">1.2"
+
+[package.extras]
+html5lib = ["html5lib"]
+lxml = ["lxml"]
+
 [[package]]
 name = "certifi"
 version = "2022.9.24"
@@ -36,6 +81,28 @@ category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package]]
+name = "colorlog"
+version = "6.7.0"
+description = "Add colours to the output of Python's logging module."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+
+[package.extras]
+development = ["black", "flake8", "mypy", "pytest", "types-colorama"]
+
+[[package]]
+name = "distlib"
+version = "0.3.6"
+description = "Distribution utilities"
+category = "dev"
+optional = false
+python-versions = "*"
+
 [[package]]
 name = "docker"
 version = "6.0.0"
@@ -55,11 +122,11 @@ ssh = ["paramiko (>=2.4.3)"]
 
 [[package]]
 name = "docutils"
-version = "0.19"
+version = "0.17.1"
 description = "Docutils -- Python Documentation Utilities"
 category = "main"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [[package]]
 name = "exasol-bucketfs-utils-python"
@@ -77,6 +144,56 @@ typeguard = ">=2.11.1"
 [package.source]
 type = "url"
 url = "https://github.com/exasol/bucketfs-utils-python/releases/download/0.3.0/exasol_bucketfs_utils_python-0.3.0-py3-none-any.whl"
+
+[[package]]
+name = "exasol-sphinx-github-pages-generator"
+version = "0.1.1"
+description = "Generates Sphinx GitHub pages for a given Git Repository"
+category = "dev"
+optional = false
+python-versions = ">=3.8,<4.0"
+develop = false
+
+[package.dependencies]
+click = "^8.1.3"
+furo = "^2022.02.14.1"
+importlib_resources = ">=5.4.0"
+Jinja2 = "^3.0.3"
+myst-parser = "^0.17.0"
+Sphinx = "^4.5"
+
+[package.source]
+type = "git"
+url = "https://github.com/exasol/sphinx-github-pages-generator.git"
+reference = "HEAD"
+resolved_reference = "8140484ecb999f5af023b84f2ade3db2ed9722ce"
+
+[[package]]
+name = "filelock"
+version = "3.8.0"
+description = "A platform independent file lock."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["furo (>=2022.6.21)", "sphinx (>=5.1.1)", "sphinx-autodoc-typehints (>=1.19.1)"]
+testing = ["covdefaults (>=2.2)", "coverage (>=6.4.2)", "pytest (>=7.1.2)", "pytest-cov (>=3)", "pytest-timeout (>=2.1)"]
+
+[[package]]
+name = "furo"
+version = "2022.9.15"
+description = "A clean customisable Sphinx documentation theme."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+beautifulsoup4 = "*"
+pygments = ">=2.7"
+sphinx = ">=4.0,<6.0"
+sphinx-basic-ng = "*"
+
 [[package]]
 name = "gitdb"
 version = "4.0.9"
@@ -118,6 +235,30 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
+[[package]]
+name = "imagesize"
+version = "1.4.1"
+description = "Getting image size from png/jpeg/jpeg2000/gif file"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "importlib-metadata"
+version = "4.12.0"
+description = "Read metadata from Python packages"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"]
+perf = ["ipython"]
+testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"]
+
 [[package]]
 name = "importlib-resources"
 version = "5.9.0"
@@ -194,6 +335,27 @@ tornado = ">=5.0,<7"
 prometheus = ["prometheus-client (>=0.5,<0.15)"]
 toml = ["toml (<2.0.0)"]
 
+[[package]]
+name = "markdown-it-py"
+version = "2.1.0"
+description = "Python port of markdown-it. Markdown parsing, done right!"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+mdurl = ">=0.1,<1.0"
+
+[package.extras]
+benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"]
+code_style = ["pre-commit (==2.6)"]
+compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"]
+linkify = ["linkify-it-py (>=1.0,<2.0)"]
+plugins = ["mdit-py-plugins"]
+profiling = ["gprof2dot"]
+rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+
 [[package]]
 name = "MarkupSafe"
 version = "2.1.1"
@@ -202,6 +364,53 @@ category = "main"
 optional = false
 python-versions = ">=3.7"
 
+[[package]]
+name = "mdit-py-plugins"
+version = "0.3.1"
+description = "Collection of plugins for markdown-it-py"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+markdown-it-py = ">=1.0.0,<3.0.0"
+
+[package.extras]
+code_style = ["pre-commit"]
+rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+description = "Markdown URL utilities"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "myst-parser"
+version = "0.17.2"
+description = "An extended commonmark compliant parser, with bridges to docutils & sphinx."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+docutils = ">=0.15,<0.18"
+jinja2 = "*"
+markdown-it-py = ">=1.0.0,<3.0.0"
+mdit-py-plugins = ">=0.3.0,<0.4.0"
+pyyaml = "*"
+sphinx = ">=3.1,<5"
+typing-extensions = "*"
+
+[package.extras]
+code_style = ["pre-commit (>=2.12,<3.0)"]
+linkify = ["linkify-it-py (>=1.0,<2.0)"]
+rtd = ["ipython", "sphinx-book-theme", "sphinx-panels", "sphinxcontrib-bibtex (>=2.4,<3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"]
+testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions"]
+
 [[package]]
 name = "netaddr"
 version = "0.8.0"
@@ -225,6 +434,24 @@ doc = ["nb2plots (>=0.6)", "numpydoc (>=1.4)", "pillow (>=9.1)", "pydata-sphinx-
 extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"]
 test = ["codecov (>=2.1)", "pytest (>=7.1)", "pytest-cov (>=3.0)"]
 
+[[package]]
+name = "nox"
+version = "2022.8.7"
+description = "Flexible test automation."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+argcomplete = ">=1.9.4,<3.0"
+colorlog = ">=2.6.1,<7.0.0"
+packaging = ">=20.9"
+py = ">=1.4,<2.0.0"
+virtualenv = ">=14"
+
+[package.extras]
+tox_to_nox = ["jinja2", "tox"]
+
 [[package]]
 name = "packaging"
 version = "21.3"
@@ -236,6 +463,26 @@ python-versions = ">=3.6"
 [package.dependencies]
 pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
 
+[[package]]
+name = "platformdirs"
+version = "2.5.2"
+description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"]
+test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
+
+[[package]]
+name = "py"
+version = "1.11.0"
+description = "library with cross-python path, ini-parsing, io, code, log facilities"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
 [[package]]
 name = "pydot"
 version = "1.4.2"
@@ -247,6 +494,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 [package.dependencies]
 pyparsing = ">=2.1.4"
 
+[[package]]
+name = "Pygments"
+version = "2.13.0"
+description = "Pygments is a syntax highlighting package written in Python."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+plugins = ["importlib-metadata"]
+
 [[package]]
 name = "pyparsing"
 version = "3.0.9"
@@ -293,6 +551,22 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 [package.dependencies]
 six = ">=1.5"
 
+[[package]]
+name = "pytz"
+version = "2022.2.1"
+description = "World timezone definitions, modern and historical"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "PyYAML"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
 [[package]]
 name = "requests"
 version = "2.28.1"
@@ -348,6 +622,139 @@ category = "main"
 optional = false
 python-versions = ">=3.6"
 
+[[package]]
+name = "snowballstemmer"
+version = "2.2.0"
+description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "soupsieve"
+version = "2.3.2.post1"
+description = "A modern CSS selector implementation for Beautiful Soup."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "Sphinx"
+version = "4.5.0"
+description = "Python documentation generator"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+alabaster = ">=0.7,<0.8"
+babel = ">=1.3"
+colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
+docutils = ">=0.14,<0.18"
+imagesize = "*"
+importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
+Jinja2 = ">=2.3"
+packaging = "*"
+Pygments = ">=2.0"
+requests = ">=2.5.0"
+snowballstemmer = ">=1.1"
+sphinxcontrib-applehelp = "*"
+sphinxcontrib-devhelp = "*"
+sphinxcontrib-htmlhelp = ">=2.0.0"
+sphinxcontrib-jsmath = "*"
+sphinxcontrib-qthelp = "*"
+sphinxcontrib-serializinghtml = ">=1.1.5"
+
+[package.extras]
+docs = ["sphinxcontrib-websupport"]
+lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"]
+test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"]
+
+[[package]]
+name = "sphinx-basic-ng"
+version = "0.0.1a12"
+description = "A modern skeleton for Sphinx themes."
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+sphinx = ">=4.0,<6.0"
+
+[package.extras]
+docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"]
+
+[[package]]
+name = "sphinxcontrib-applehelp"
+version = "1.0.2"
+description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-devhelp"
+version = "1.0.2"
+description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.0.0"
+description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+test = ["html5lib", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+description = "A sphinx extension which renders display math in HTML via JavaScript"
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[package.extras]
+test = ["flake8", "mypy", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-qthelp"
+version = "1.0.3"
+description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-serializinghtml"
+version = "1.1.5"
+description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[package.extras]
+lint = ["docutils-stubs", "flake8", "mypy"]
+test = ["pytest"]
+
 [[package]]
 name = "stopwatch.py"
 version = "2.0.1"
@@ -395,6 +802,14 @@ python-versions = ">=3.5.3"
 doc = ["sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
 test = ["mypy", "pytest", "typing-extensions"]
 
+[[package]]
+name = "typing-extensions"
+version = "4.3.0"
+description = "Backported and Experimental Type Hints for Python 3.7+"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
 [[package]]
 name = "urllib3"
 version = "1.26.12"
@@ -408,6 +823,23 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
 secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
 socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 
+[[package]]
+name = "virtualenv"
+version = "20.16.5"
+description = "Virtual Python Environment builder"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+distlib = ">=0.3.5,<1"
+filelock = ">=3.4.1,<4"
+platformdirs = ">=2.4,<3"
+
+[package.extras]
+docs = ["proselint (>=0.13)", "sphinx (>=5.1.1)", "sphinx-argparse (>=0.3.1)", "sphinx-rtd-theme (>=1)", "towncrier (>=21.9)"]
+testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"]
+
 [[package]]
 name = "websocket-client"
 version = "1.4.1"
@@ -436,9 +868,25 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=
 [metadata]
 lock-version = "1.1"
 python-versions = ">=3.8,<4"
-content-hash = "3ad6fa8eb2d2e9329b33db9ab6cd220d8071e1d47a439ac37e88afad5c881184"
+content-hash = "0131cbfbd4f64344bc92fdbb76417d006450e883a8242ce6e9ea175f1913d2a2"
 
 [metadata.files]
+alabaster = [
+    {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"},
+    {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
+]
+argcomplete = [
+    {file = "argcomplete-2.0.0-py2.py3-none-any.whl", hash = "sha256:cffa11ea77999bb0dd27bb25ff6dc142a6796142f68d45b1a26b11f58724561e"},
+    {file = "argcomplete-2.0.0.tar.gz", hash = "sha256:6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20"},
+]
+Babel = [
+    {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"},
+    {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"},
+]
+beautifulsoup4 = [
+    {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"},
+    {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"},
+]
 certifi = [
     {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"},
     {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"},
@@ -455,15 +903,32 @@ colorama = [
     {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
     {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
 ]
+colorlog = [
+    {file = "colorlog-6.7.0-py2.py3-none-any.whl", hash = "sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662"},
+    {file = "colorlog-6.7.0.tar.gz", hash = "sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5"},
+]
+distlib = [
+    {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"},
+    {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"},
+]
 docker = [
     {file = "docker-6.0.0-py3-none-any.whl", hash = "sha256:6e06ee8eca46cd88733df09b6b80c24a1a556bc5cb1e1ae54b2c239886d245cf"},
     {file = "docker-6.0.0.tar.gz", hash = "sha256:19e330470af40167d293b0352578c1fa22d74b34d3edf5d4ff90ebc203bbb2f1"},
 ]
 docutils = [
-    {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"},
-    {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"},
+    {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"},
+    {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"},
 ]
 exasol-bucketfs-utils-python = []
+exasol-sphinx-github-pages-generator = []
+filelock = [
+    {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"},
+    {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"},
+]
+furo = [
+    {file = "furo-2022.9.15-py3-none-any.whl", hash = "sha256:9129dead1f75e9fb4fa407612f1d5a0d0320767e6156c925aafe36f362f9b11a"},
+    {file = "furo-2022.9.15.tar.gz", hash = "sha256:4a7ef1c8a3b615171592da4d2ad8a53cc4aacfbe111958890f5f9ff7279066ab"},
+]
 gitdb = [
     {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
     {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
@@ -480,6 +945,14 @@ idna = [
     {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
     {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
 ]
+imagesize = [
+    {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
+    {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"},
+    {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"},
+]
 importlib-resources = [
     {file = "importlib_resources-5.9.0-py3-none-any.whl", hash = "sha256:f78a8df21a79bcc30cfd400bdc38f314333de7c0fb619763f6b9dabab8268bb7"},
     {file = "importlib_resources-5.9.0.tar.gz", hash = "sha256:5481e97fb45af8dcf2f798952625591c58fe599d0735d86b10f54de086a61681"},
@@ -503,6 +976,10 @@ lockfile = [
 luigi = [
     {file = "luigi-3.1.1.tar.gz", hash = "sha256:29961582db2704d8df4ec01f6b8f7f0d529cc8f27cff67733ccd809299771218"},
 ]
+markdown-it-py = [
+    {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"},
+    {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"},
+]
 MarkupSafe = [
     {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
     {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
@@ -545,6 +1022,18 @@ MarkupSafe = [
     {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"},
     {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"},
 ]
+mdit-py-plugins = [
+    {file = "mdit-py-plugins-0.3.1.tar.gz", hash = "sha256:3fc13298497d6e04fe96efdd41281bfe7622152f9caa1815ea99b5c893de9441"},
+    {file = "mdit_py_plugins-0.3.1-py3-none-any.whl", hash = "sha256:606a7f29cf56dbdfaf914acb21709b8f8ee29d857e8f29dcc33d8cb84c57bfa1"},
+]
+mdurl = [
+    {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
+    {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
+]
+myst-parser = [
+    {file = "myst-parser-0.17.2.tar.gz", hash = "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"},
+    {file = "myst_parser-0.17.2-py3-none-any.whl", hash = "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98"},
+]
 netaddr = [
     {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"},
     {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"},
@@ -553,14 +1042,30 @@ networkx = [
     {file = "networkx-2.8.6-py3-none-any.whl", hash = "sha256:2a30822761f34d56b9a370d96a4bf4827a535f5591a4078a453425caeba0c5bb"},
     {file = "networkx-2.8.6.tar.gz", hash = "sha256:bd2b7730300860cbd2dafe8e5af89ff5c9a65c3975b352799d87a6238b4301a6"},
 ]
+nox = [
+    {file = "nox-2022.8.7-py3-none-any.whl", hash = "sha256:96cca88779e08282a699d672258ec01eb7c792d35bbbf538c723172bce23212c"},
+    {file = "nox-2022.8.7.tar.gz", hash = "sha256:1b894940551dc5c389f9271d197ca5d655d40bdc6ccf93ed6880e4042760a34b"},
+]
 packaging = [
     {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
     {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
 ]
+platformdirs = [
+    {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
+    {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
+]
+py = [
+    {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
+    {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
+]
 pydot = [
     {file = "pydot-1.4.2-py2.py3-none-any.whl", hash = "sha256:66c98190c65b8d2e2382a441b4c0edfdb4f4c025ef9cb9874de478fb0793a451"},
     {file = "pydot-1.4.2.tar.gz", hash = "sha256:248081a39bcb56784deb018977e428605c1c758f10897a339fce1dd728ff007d"},
 ]
+Pygments = [
+    {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"},
+    {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"},
+]
 pyparsing = [
     {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
     {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
@@ -577,6 +1082,45 @@ python-dateutil = [
     {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
     {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
 ]
+pytz = [
+    {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"},
+    {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"},
+]
+PyYAML = [
+    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
 requests = [
     {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"},
     {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"},
@@ -656,6 +1200,46 @@ smmap = [
     {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
     {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
 ]
+snowballstemmer = [
+    {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+    {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
+soupsieve = [
+    {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"},
+    {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"},
+]
+Sphinx = [
+    {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"},
+    {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"},
+]
+sphinx-basic-ng = [
+    {file = "sphinx_basic_ng-0.0.1a12-py3-none-any.whl", hash = "sha256:e8b6efd2c5ece014156de76065eda01ddfca0fee465aa020b1e3c12f84570bbe"},
+    {file = "sphinx_basic_ng-0.0.1a12.tar.gz", hash = "sha256:cffffb14914ddd26c94b1330df1d72dab5a42e220aaeb5953076a40b9c50e801"},
+]
+sphinxcontrib-applehelp = [
+    {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
+    {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"},
+]
+sphinxcontrib-devhelp = [
+    {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"},
+    {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"},
+]
+sphinxcontrib-htmlhelp = [
+    {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"},
+    {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"},
+]
+sphinxcontrib-jsmath = [
+    {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"},
+]
+sphinxcontrib-qthelp = [
+    {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"},
+    {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"},
+]
+sphinxcontrib-serializinghtml = [
+    {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"},
+    {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
+]
 "stopwatch.py" = [
     {file = "stopwatch.py-2.0.1-py3-none-any.whl", hash = "sha256:5802a0178d766120c11dd5df8ae838e9beccb8c88329dbd5f0f7ac4b7fed9107"},
     {file = "stopwatch.py-2.0.1.tar.gz", hash = "sha256:8cc94ba0f6469d434eabd8b227166e595fd42350e7f66dbf1a1a80697f60cc79"},
@@ -685,10 +1269,18 @@ typeguard = [
     {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"},
     {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"},
 ]
+typing-extensions = [
+    {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"},
+    {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"},
+]
 urllib3 = [
     {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"},
     {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"},
 ]
+virtualenv = [
+    {file = "virtualenv-20.16.5-py3-none-any.whl", hash = "sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27"},
+    {file = "virtualenv-20.16.5.tar.gz", hash = "sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da"},
+]
 websocket-client = [
     {file = "websocket-client-1.4.1.tar.gz", hash = "sha256:f9611eb65c8241a67fb373bef040b3cf8ad377a9f6546a12b620b6511e8ea9ef"},
     {file = "websocket_client-1.4.1-py3-none-any.whl", hash = "sha256:398909eb7e261f44b8f4bd474785b6ec5f5b499d4953342fe9755e01ef624090"},
diff --git a/pyproject.toml b/pyproject.toml
index 18c89d7fd..cd00219a1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,6 +39,7 @@ importlib_resources = ">=5.4.0" #Needed to copy resource files, can be removed a
 exasol-bucketfs-utils-python = {url = "https://github.com/exasol/bucketfs-utils-python/releases/download/0.3.0/exasol_bucketfs_utils_python-0.3.0-py3-none-any.whl"}
 
 
-
 [tool.poetry.dev-dependencies]
 toml = ">=0.10.2"
+nox = "^2022.1.7"
+exasol-sphinx-github-pages-generator = {git = "https://github.com/exasol/sphinx-github-pages-generator.git"}
diff --git a/setup.py b/setup.py
index 2770c35a9..1724d7768 100644
--- a/setup.py
+++ b/setup.py
@@ -95,7 +95,7 @@
     'name': 'exasol-integration-test-docker-environment',
     'version': '0.12.0',
     'description': 'Integration Test Docker Environment for Exasol',
-    'long_description': 'Integration Test Docker Environment\n===================================\n\nThis project provides a command line interface and a Python API layer to\nstart a test environment with an `Exasol\nDocker-DB <https://hub.docker.com/r/exasol/docker-db>`_. Both start an\nExasol Docker-DB container, but the API Layer has extended functionality\nand also can start an associated test container for whose content the\nclient is responsible.\n\n\nTable of Contents\n=================\n\nInformation for Users\n---------------------\n\n* `User Guide <doc/user_guide/user_guide.md>`_\n* `Changelog <doc/changes/changelog.md>`_\n',
+    'long_description': 'Integration Test Docker Environment\n===================================\n\nThis project provides a command line interface and a Python API layer to\nstart a test environment with an `Exasol\nDocker-DB <https://hub.docker.com/r/exasol/docker-db>`_. Both start an\nExasol Docker-DB container, but the API Layer has extended functionality\nand also can start an associated test container for whose content the\nclient is responsible.\n\nDocumentation\n-------------\n\n`Documentation for the current main branch <https://exasol.github.io/integration-test-docker-environment/main>`_ is hosted on the Github Pages of this project.\n`Here <https://exasol.github.io/integration-test-docker-environment>`_  is a list of documentations for previous releases.\n',
     'author': 'Torsten Kilias',
     'author_email': 'torsten.kilias@exasol.com',
     'maintainer': 'None',


Test patch:
diff --git a/.github/workflows/test_db_versions_all_tests.yml b/.github/workflows/test_db_versions_all_tests.yml
index 48bebcc3a..e8fc600a2 100644
--- a/.github/workflows/test_db_versions_all_tests.yml
+++ b/.github/workflows/test_db_versions_all_tests.yml
@@ -8,18 +8,7 @@ on:
 
 jobs:
   get_exasol_versions:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v3
-      - name: Install jq
-        run: sudo apt-get install jq
-      - name: Print matrix
-        run: bash ./scripts/test/get_exasol_versions.sh
-      - id: set-matrix
-        run: |
-          echo "::set-output name=matrix::$(bash ./scripts/test/get_exasol_versions.sh)"
-    outputs:
-      matrix: ${{ steps.set-matrix.outputs.matrix }}
+    uses: ./.github/workflows/get_exasol_versions.yml
 
   test-db-versions-all-tests:
     needs: get_exasol_versions
@@ -32,14 +21,7 @@ jobs:
     steps:
     - uses: actions/checkout@v3
 
-    - name: Setup Python 3.8 for integration-test-docker-environment
-      uses: actions/setup-python@v2
-      with:
-        python-version: 3.8
-    - name: Install Poetry
-      uses: abatilo/actions-poetry@v2
-      with:
-        poetry-version: 1.2.0
+    - uses: ./.github/actions/prepare_poetry_env
 
     - name: Fail, because not all tests are activated
       run: |
@@ -59,6 +41,4 @@ jobs:
       if: ${{ github.event_name == 'pull_request' }}
 
     - name: Run all tests
-      run: ./scripts/test/run_all_tests.sh
-      env:
-        EXASOL_VERSION: "${{ matrix.exasol_version }}"
+      run: poetry run nox -s "run-tests(db_version='${{ matrix.exasol_version }}')"
diff --git a/.github/workflows/test_db_versions_minimal.yml b/.github/workflows/test_db_versions_minimal.yml
index 84d30933e..b6f6012a0 100644
--- a/.github/workflows/test_db_versions_minimal.yml
+++ b/.github/workflows/test_db_versions_minimal.yml
@@ -9,18 +9,7 @@ on:
 
 jobs:
   get_exasol_versions:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v3
-      - name: Install jq
-        run: sudo apt-get install jq
-      - name: Print matrix
-        run: bash ./scripts/test/get_exasol_versions.sh
-      - id: set-matrix
-        run: |
-          echo "::set-output name=matrix::$(bash ./scripts/test/get_exasol_versions.sh)"
-    outputs:
-      matrix: ${{ steps.set-matrix.outputs.matrix }}
+    uses: ./.github/workflows/get_exasol_versions.yml
 
   test-db-versions-minimal:
     needs: get_exasol_versions
@@ -33,20 +22,7 @@ jobs:
     steps:
     - uses: actions/checkout@v3
 
-    - name: Setup Python 3.8 for integration-test-docker-environment
-      uses: actions/setup-python@v2
-      with:
-        python-version: 3.8
-    - name: Install Poetry
-      uses: abatilo/actions-poetry@v2
-      with:
-        poetry-version: 1.2.0
+    - uses: ./.github/actions/prepare_poetry_env
 
     - name: Run minimal tests
-      run: |
-          ./scripts/test/run_test.sh exasol_integration_test_docker_environment/test/test_api_test_environment.py
-          ./scripts/test/run_test.sh exasol_integration_test_docker_environment/test/test_cli_test_environment.py
-          ./scripts/test/run_test.sh exasol_integration_test_docker_environment/test/test_doctor.py
-          ./scripts/test/run_test.sh exasol_integration_test_docker_environment/test/test_termination_handler.py
-      env:
-        EXASOL_VERSION: "${{ matrix.exasol_version }}"
+      run: poetry run nox -s "run-minimal-tests(db_version='${{ matrix.exasol_version }}')"
diff --git a/.github/workflows/test_python_version.yml b/.github/workflows/test_python_version.yml
index e51d263c9..6e235b90d 100644
--- a/.github/workflows/test_python_version.yml
+++ b/.github/workflows/test_python_version.yml
@@ -21,17 +21,8 @@ jobs:
     steps:
     - uses: actions/checkout@v3
 
-    - name: Setup Python for integration-test-docker-environment
-      uses: actions/setup-python@v2
+    - uses: ./.github/actions/prepare_poetry_env
       with:
-        python-version: "${{ matrix.python_version }}"
-
-    - name: Install Poetry
-      uses: abatilo/actions-poetry@v2
-      with:
-        poetry-version: 1.2.0
-
+        python_version: "${{ matrix.python_version }}"
     - name: Run all tests
-      run: ./scripts/test/run_all_tests.sh
-      env:
-        EXASOL_VERSION: "${{ matrix.exasol_version }}"
+      run: poetry run nox -s "run-tests(db_version='${{ matrix.exasol_version }}')"
diff --git a/scripts/test/get_exasol_versions.sh b/scripts/test/get_exasol_versions.sh
deleted file mode 100644
index 4894e6d20..000000000
--- a/scripts/test/get_exasol_versions.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
-# Ignore shellcheck rule here, as we want to split result by space
-# shellcheck disable=SC2046
-DOCKER_DBS=$(basename -a $(ls -d "${SCRIPT_DIR}/../../docker_db_config_template"/*/))
-
-
-DOCKER_DBS+=($'\ndefault\n')
-DOCKER_DBS+=($'7.1.0-d1\n')
-
-printf '%s' "${DOCKER_DBS[@]}" | jq -R . | jq -cs .
-
diff --git a/scripts/test/run_all_tests.sh b/scripts/test/run_all_tests.sh
deleted file mode 100755
index 5c8551f58..000000000
--- a/scripts/test/run_all_tests.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash 
-   
-SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-#shellcheck source=./scripts/build/poetry_utils.sh
-source "$SCRIPT_DIR/../build/poetry_utils.sh"
-
-check_requirements
-
-set -euo pipefail
-
-init_poetry
-
-if [ -n "$POETRY_BIN" ]
-then
-  PYTHONPATH="$SCRIPT_DIR/../.." $POETRY_BIN run python3 -u -m unittest discover "$SCRIPT_DIR/../../exasol_integration_test_docker_environment/test"
-else
-  echo "Could not find poetry!"
-  exit 1
-fi
-
diff --git a/scripts/test/run_test.sh b/scripts/test/run_test.sh
deleted file mode 100755
index 137066b75..000000000
--- a/scripts/test/run_test.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-  
-SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-#shellcheck source=./scripts/build/poetry_utils.sh
-source "$SCRIPT_DIR/../build/poetry_utils.sh"
-
-check_requirements
-
-set -euo pipefail
-
-init_poetry
-
-if [ -n "$POETRY_BIN" ]
-then
-  PYTHONPATH=$SCRIPT_DIR/../.. $POETRY_BIN run python3 -u "${@}"
-else
-  echo "Could not find poetry!"
-  exit 1
-fi
-