"""
Provide demonstration site functionality.
"""
from __future__ import annotations
from asyncio import to_thread
from contextlib import suppress
from shutil import rmtree
from typing import TYPE_CHECKING, final, Sequence
from typing_extensions import override
from betty.html import NavigationLinkProvider, NavigationLink
from betty.locale.localizable import static, _
from betty.plugin import ShorthandPluginBase
from betty.project import generate
from betty.project.extension import Extension
from betty.project.extension.demo.project import load_ancestry
from betty.project.extension.deriver import Deriver
from betty.project.extension.http_api_doc import HttpApiDoc
from betty.project.extension.maps import Maps
from betty.project.extension.raspberry_mint import RaspberryMint
from betty.project.extension.trees import Trees
from betty.project.extension.wikipedia import Wikipedia
from betty.project.load import LoadAncestryEvent
from betty.typing import internal
if TYPE_CHECKING:
from betty.project import Project
from betty.plugin import PluginIdentifier
from betty.event_dispatcher import EventHandlerRegistry
[docs]
@internal
async def generate_with_cleanup(project: Project) -> None:
"""
Generate a demonstration site, and clean up the project directory on any errors.
"""
with suppress(FileNotFoundError):
await to_thread(rmtree, project.configuration.project_directory_path)
try:
await generate.generate(project)
except BaseException:
with suppress(FileNotFoundError):
await to_thread(rmtree, project.configuration.project_directory_path)
raise
[docs]
@final
class Demo(ShorthandPluginBase, NavigationLinkProvider, Extension):
"""
Provide demonstration site functionality.
"""
_plugin_id = "demo"
_plugin_label = static("Demo")