view tasks/task_generate_doc.py @ 31:e3bf606a5519

roadmap: add "Oxidation"
author Goffi <goffi@goffi.org>
date Mon, 14 Aug 2023 17:12:54 +0200
parents e7c7327f9f25
children
line wrap: on
line source

#!/ur/bin/env python3

import sys
import os.path
from libervia.backend.core.i18n import _
from libervia.backend.core.log import getLogger
from libervia.backend.tools.common import regex
from libervia.web.server.tasks import task


log = getLogger(__name__)


class Task(task.Task):
    DOC_DIRS_DEFAULT = ('doc', 'docs')

    def prepare(self):
        to_watch = set()
        # root documentation
        self.doc_path = self.config_get("doc_path")
        if self.doc_path is not None:
            to_watch.add(self.doc_path)
        # sub docs will be generated before the root documentation
        self.sub_docs = self.config_get("sub_docs_dict", value_type="path")
        if self.sub_docs is not None:
            for d in list(self.sub_docs.values()):
                to_watch.add(d)
        self.WATCH_DIRS = list(to_watch)

    async def start(self):
        if self.doc_path is None:
            # we check if there is documentation inside the site
            for dirname in self.DOC_DIRS_DEFAULT:
                path = os.path.join(self.site_path, dirname)
                conf_file = os.path.join(path, 'conf.py')
                if os.path.isdir(path) and os.path.exists(conf_file):
                    self.doc_path = path
                    break

        if self.doc_path is None and self.sub_docs is None:
            log.info("No documentation found for {site_name}, skipping".format(
                site_name = self.site_name))
            return

        # we first generate the sub documentations
        for name, sub_doc_path in list(self.sub_docs.items()):
            sub_dir = regex.path_escape(name or '')
            build_path = os.path.join(self.build_path, 'doc', sub_dir)
            log.info(f"generating doc for {sub_doc_path}")
            await self.runCommand(
                sys.executable, "-m", "sphinx", sub_doc_path, build_path,
            )

        # then the root one
        if self.doc_path is not None:
            build_path = os.path.join(self.build_path, 'doc')
            log.info(f"generating doc for {self.doc_path}")
            await self.runCommand(
                sys.executable, "-m", "sphinx", self.doc_path, build_path,
            )

        log.info(_("documentation has been generated"))