Source code for gnomish_army_knife.macro.database
"""
A module implementing a macro database structure.
"""
# built-in
from os import linesep
from pathlib import Path
# third-party
from vcorelib.io.types import JsonObject as _JsonObject
from vcorelib.paths.find import find_file
# internal
from gnomish_army_knife import PKG_NAME, PKG_SLUG
from gnomish_army_knife.macro.category import MacroCategory
from gnomish_army_knife.schemas import BasicGakCodec
DEFAULT_MACRO_DATABASE = f"package://{PKG_SLUG}/macros.yaml"
DEFAULT_OUT = f"{PKG_NAME}-markdown"
[docs]
class MacroDatabase(BasicGakCodec):
"""A class implementing an interface for macros."""
[docs]
@staticmethod
def load(path: Path | str = DEFAULT_MACRO_DATABASE) -> "MacroDatabase":
"""Load a macro database from disk."""
return MacroDatabase.decode(
find_file(path, include_cwd=True, strict=True)
)
[docs]
def init(self, data: _JsonObject) -> None:
"""Perform implementation-specific initialization."""
super().init(data)
self.categories: list[MacroCategory] = [
# Schema has already been validated.
MacroCategory(x, verify=False) # type: ignore
for x in data.get( # type: ignore
"categories",
[],
)
]
self.title: str = data["title"] # type: ignore
[docs]
def write_markdown_dir(self, path: Path, name: str = "index.md") -> None:
"""Write markdown contents to disk."""
assert self.categories, "No macro categories loaded!"
path.mkdir(parents=True, exist_ok=True)
link_strs: list[str] = []
for category in self.categories:
link = f"{category.slug}/index.html"
link_strs.append(
f"## [{category.icon_url}]({link}) [{category.name}]({link})"
)
if category.groups:
link_strs.append("")
# Direct links to groups.
for group in category.groups:
link = f"{category.slug}/{group.slug}.html"
link_strs.append(
f" * [{group.icon_url}]({link}) [{group.name}]({link})"
)
category.write_markdown_dir(
path.joinpath(category.slug), name=name
)
link_strs.append("")
# Index.
with path.joinpath(name).open("w") as path_fd:
path_fd.write(
linesep.join(
[f"# {self.title}", ""]
+ link_strs
+ list(self.markdown_footer)
)
)