Metadata-Version: 2.2
Name: vdoc
Version: 0.5.0
Summary: Multi version documentation hosting.
Home-page: https://github.com/vorausrobotik/vdoc
Author: Jan-Frederik Schmidt
Author-email: jan-frederik.schmidt@vorausrobotik.com
License: MIT
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: POSIX :: Linux
Classifier: Natural Language :: English
Requires-Python: >=3.11
Description-Content-Type: text/x-rst
License-File: LICENSE.txt
Requires-Dist: importlib-metadata
Requires-Dist: packaging
Requires-Dist: fastapi
Requires-Dist: python-multipart
Requires-Dist: typer
Requires-Dist: rich
Requires-Dist: uvicorn
Requires-Dist: pydantic~=2.0
Requires-Dist: pydantic-settings~=2.0
Provides-Extra: dev
Requires-Dist: tox==4.23.2; extra == "dev"
Requires-Dist: tox-uv==1.16.0; extra == "dev"
Requires-Dist: isort==5.13.2; extra == "dev"
Requires-Dist: black==24.10.0; extra == "dev"
Requires-Dist: mypy==1.13.0; extra == "dev"
Requires-Dist: pylint==3.3.1; extra == "dev"
Requires-Dist: pytest==8.3.3; extra == "dev"
Requires-Dist: types-docutils; extra == "dev"
Requires-Dist: types-setuptools; extra == "dev"
Requires-Dist: jinja2==3.1.4; extra == "dev"
Requires-Dist: ruff==0.7.3; extra == "dev"
Requires-Dist: httpx; extra == "dev"
Requires-Dist: tenacity; extra == "dev"
Requires-Dist: requests; extra == "dev"
Requires-Dist: types-requests; extra == "dev"
Requires-Dist: pytest==8.3.3; extra == "dev"
Requires-Dist: pytest-randomly==3.16.0; extra == "dev"
Requires-Dist: pytest-cov==6.0.0; extra == "dev"
Requires-Dist: coverage[toml]==7.6.4; extra == "dev"
Requires-Dist: httpx; extra == "dev"
Requires-Dist: sphinx; extra == "dev"
Requires-Dist: tenacity; extra == "dev"
Requires-Dist: requests; extra == "dev"
Requires-Dist: sphinxawesome-theme; extra == "dev"
Requires-Dist: sphinx==8.1.3; extra == "dev"
Requires-Dist: sphinxawesome-theme==5.3.2; extra == "dev"
Requires-Dist: sphinx-selective-exclude==1.0.3; extra == "dev"
Requires-Dist: sphinx-autodoc-typehints==2.5.0; extra == "dev"
Requires-Dist: pip-licenses==5.0.0; extra == "dev"
Requires-Dist: jinja2==3.1.4; extra == "dev"
Requires-Dist: build[virtualenv]==1.2.1; extra == "dev"
Provides-Extra: lint
Requires-Dist: isort==5.13.2; extra == "lint"
Requires-Dist: black==24.10.0; extra == "lint"
Requires-Dist: mypy==1.13.0; extra == "lint"
Requires-Dist: pylint==3.3.1; extra == "lint"
Requires-Dist: pytest==8.3.3; extra == "lint"
Requires-Dist: types-docutils; extra == "lint"
Requires-Dist: types-setuptools; extra == "lint"
Requires-Dist: jinja2==3.1.4; extra == "lint"
Requires-Dist: ruff==0.7.3; extra == "lint"
Requires-Dist: httpx; extra == "lint"
Requires-Dist: tenacity; extra == "lint"
Requires-Dist: requests; extra == "lint"
Requires-Dist: types-requests; extra == "lint"
Provides-Extra: test
Requires-Dist: pytest==8.3.3; extra == "test"
Requires-Dist: pytest-randomly==3.16.0; extra == "test"
Requires-Dist: pytest-cov==6.0.0; extra == "test"
Requires-Dist: coverage[toml]==7.6.4; extra == "test"
Requires-Dist: httpx; extra == "test"
Requires-Dist: sphinx; extra == "test"
Requires-Dist: tenacity; extra == "test"
Requires-Dist: requests; extra == "test"
Requires-Dist: sphinxawesome-theme; extra == "test"
Provides-Extra: doc
Requires-Dist: sphinx==8.1.3; extra == "doc"
Requires-Dist: sphinxawesome-theme==5.3.2; extra == "doc"
Requires-Dist: sphinx-selective-exclude==1.0.3; extra == "doc"
Requires-Dist: sphinx-autodoc-typehints==2.5.0; extra == "doc"
Requires-Dist: pip-licenses==5.0.0; extra == "doc"
Requires-Dist: jinja2==3.1.4; extra == "doc"
Provides-Extra: build
Requires-Dist: build[virtualenv]==1.2.1; extra == "build"
Provides-Extra: tox
Requires-Dist: tox==4.23.2; extra == "tox"
Requires-Dist: tox-uv==1.16.0; extra == "tox"
Provides-Extra: lint-template
Requires-Dist: isort==5.13.2; extra == "lint-template"
Requires-Dist: black==24.10.0; extra == "lint-template"
Requires-Dist: mypy==1.13.0; extra == "lint-template"
Requires-Dist: pylint==3.3.1; extra == "lint-template"
Requires-Dist: pytest==8.3.3; extra == "lint-template"
Requires-Dist: types-docutils; extra == "lint-template"
Requires-Dist: types-setuptools; extra == "lint-template"
Requires-Dist: jinja2==3.1.4; extra == "lint-template"
Requires-Dist: ruff==0.7.3; extra == "lint-template"
Provides-Extra: test-template
Requires-Dist: pytest==8.3.3; extra == "test-template"
Requires-Dist: pytest-randomly==3.16.0; extra == "test-template"
Requires-Dist: pytest-cov==6.0.0; extra == "test-template"
Requires-Dist: coverage[toml]==7.6.4; extra == "test-template"
Provides-Extra: doc-template
Requires-Dist: sphinx==8.1.3; extra == "doc-template"
Requires-Dist: sphinxawesome-theme==5.3.2; extra == "doc-template"
Requires-Dist: sphinx-selective-exclude==1.0.3; extra == "doc-template"
Requires-Dist: sphinx-autodoc-typehints==2.5.0; extra == "doc-template"
Requires-Dist: pip-licenses==5.0.0; extra == "doc-template"
Requires-Dist: jinja2==3.1.4; extra == "doc-template"
Provides-Extra: build-template
Requires-Dist: build[virtualenv]==1.2.1; extra == "build-template"

.. image:: https://github.com/vorausrobotik/vdoc/actions/workflows/pipeline.yml/badge.svg
    :target: https://github.com/vorausrobotik/vdoc/actions/workflows/pipeline.yml
    :class: badge
.. image:: https://codecov.io/gh/vorausrobotik/vdoc/graph/badge.svg
    :target: https://codecov.io/gh/vorausrobotik/vdoc
    :class: badge
.. image:: https://img.shields.io/pypi/pyversions/vdoc
    :target: https://pypi.org/project/vdoc
    :class: badge
.. image:: https://img.shields.io/pypi/v/vdoc
    :target: https://pypi.org/project/vdoc
    :class: badge
.. image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336
    :target: https://pycqa.github.io/isort/
    :class: badge
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
    :target: https://github.com/psf/black
    :class: badge

####
vdoc
####

Multi version documentation hosting.


Basic usage
###########


Run **vdoc** with python
************************

..  code-block:: shell

    pip install vdoc
    vdoc run


Run **vdoc** with docker
************************


..  code-block:: shell

    docker run -p 8080:8080 -v ./vdoc-docs:/srv/vdoc/docs/ voraus.jfrog.io/docker/vdoc:latest


Building vdoc
#############

..  code-block:: shell

    # Prepare development environment
    npm ci
    python -m venv venv
    source venv/bin/activate
    pip install --upgrade pip tox

    # Build UI
    npm run build

    # Build docs
    tox run -e docs

    # Build python package
    tox run -e build

    # Build local docker image
    docker build -t vdoc:latest .


Configuration
#############

**vdoc** can be configured via environment variables. Internally, it uses
`pydantic-settings <https://docs.pydantic.dev/latest/concepts/pydantic_settings/>`_ for building the configuration.
All configuration environment variables are prefixed with ``VDOC_``:


.. list-table:: VDoc Configuration
   :widths: 25 50 25
   :header-rows: 1

   * - Environment variable
     - Explanation
     - Default
   * - ``VDOC_DOCS_DIR``
     - The directory to which all project documentations will be uploaded.
     - ``/srv/vdoc/docs/``
   * - ``VDOC_API_USERNAME``
     - The username required for uploading documentations via the API.
     - ``admin``
   * - ``VDOC_API_PASSWORD``
     - The password required for uploading documentations via the API.
     - ``admin``
   * - ``VDOC_BIND_ADDRESS``
     - The application bind address.
     - ``0.0.0.0``
   * - ``VDOC_BIND_ADDRESS``
     - The application bind port.
     - ``8080``
