api/modules: rename Frontmatter -> ModulesFrontmatter to make room for other disk templates metadata
This commit is contained in:
@@ -32,7 +32,7 @@ from typing import Any
|
|||||||
from clan_lib.errors import ClanError
|
from clan_lib.errors import ClanError
|
||||||
from clan_lib.services.modules import (
|
from clan_lib.services.modules import (
|
||||||
CategoryInfo,
|
CategoryInfo,
|
||||||
Frontmatter,
|
ModuleFrontmatter,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get environment variables
|
# Get environment variables
|
||||||
@@ -176,9 +176,8 @@ def print_options(
|
|||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def module_header(module_name: str, has_inventory_feature: bool = False) -> str:
|
def module_header(module_name: str) -> str:
|
||||||
indicator = " 🔹" if has_inventory_feature else ""
|
return f"# {module_name}\n\n"
|
||||||
return f"# {module_name}{indicator}\n\n"
|
|
||||||
|
|
||||||
|
|
||||||
clan_core_descr = """
|
clan_core_descr = """
|
||||||
@@ -385,7 +384,7 @@ Learn how to use `clanServices` in practice in the [Using clanServices guide](..
|
|||||||
# output += f"`clan.modules.{module_name}`\n"
|
# output += f"`clan.modules.{module_name}`\n"
|
||||||
output += f"*{module_info['manifest']['description']}*\n"
|
output += f"*{module_info['manifest']['description']}*\n"
|
||||||
|
|
||||||
fm = Frontmatter("")
|
fm = ModuleFrontmatter("")
|
||||||
# output += "## Categories\n\n"
|
# output += "## Categories\n\n"
|
||||||
output += render_categories(
|
output += render_categories(
|
||||||
module_info["manifest"]["categories"], fm.categories_info
|
module_info["manifest"]["categories"], fm.categories_info
|
||||||
@@ -417,7 +416,7 @@ Learn how to use `clanServices` in practice in the [Using clanServices guide](..
|
|||||||
of.write(output)
|
of.write(output)
|
||||||
|
|
||||||
|
|
||||||
def build_option_card(module_name: str, frontmatter: Frontmatter) -> str:
|
def build_option_card(module_name: str, frontmatter: ModuleFrontmatter) -> str:
|
||||||
"""
|
"""
|
||||||
Build the overview index card for each reference target option.
|
Build the overview index card for each reference target option.
|
||||||
"""
|
"""
|
||||||
@@ -431,7 +430,7 @@ def build_option_card(module_name: str, frontmatter: Frontmatter) -> str:
|
|||||||
indented_text = indent + ("\n" + indent).join(lines)
|
indented_text = indent + ("\n" + indent).join(lines)
|
||||||
return indented_text
|
return indented_text
|
||||||
|
|
||||||
def to_md_li(module_name: str, frontmatter: Frontmatter) -> str:
|
def to_md_li(module_name: str, frontmatter: ModuleFrontmatter) -> str:
|
||||||
md_li = (
|
md_li = (
|
||||||
f"""- **[{module_name}](./{"-".join(module_name.split(" "))}.md)**\n\n"""
|
f"""- **[{module_name}](./{"-".join(module_name.split(" "))}.md)**\n\n"""
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import re
|
|||||||
import tomllib
|
import tomllib
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, TypedDict
|
from typing import Any, TypedDict, TypeVar
|
||||||
|
|
||||||
from clan_lib.api import API
|
from clan_lib.api import API
|
||||||
from clan_lib.errors import ClanError
|
from clan_lib.errors import ClanError
|
||||||
@@ -22,7 +22,7 @@ class CategoryInfo(TypedDict):
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Frontmatter:
|
class ModuleFrontmatter:
|
||||||
description: str
|
description: str
|
||||||
categories: list[str] = field(default_factory=lambda: ["Uncategorized"])
|
categories: list[str] = field(default_factory=lambda: ["Uncategorized"])
|
||||||
features: list[str] = field(default_factory=list)
|
features: list[str] = field(default_factory=list)
|
||||||
@@ -87,14 +87,19 @@ def parse_frontmatter(readme_content: str) -> tuple[dict[str, Any] | None, str]:
|
|||||||
raise ClanError(
|
raise ClanError(
|
||||||
msg,
|
msg,
|
||||||
description="Invalid TOML frontmatter",
|
description="Invalid TOML frontmatter",
|
||||||
location="extract_frontmatter",
|
location="parse_frontmatter",
|
||||||
) from e
|
) from e
|
||||||
|
|
||||||
return frontmatter_parsed, remaining_content
|
return frontmatter_parsed, remaining_content
|
||||||
return None, readme_content
|
return None, readme_content
|
||||||
|
|
||||||
|
|
||||||
def extract_frontmatter(readme_content: str, err_scope: str) -> tuple[Frontmatter, str]:
|
T = TypeVar("T")
|
||||||
|
|
||||||
|
|
||||||
|
def extract_frontmatter[T](
|
||||||
|
readme_content: str, err_scope: str, fm_class: type[T]
|
||||||
|
) -> tuple[T, str]:
|
||||||
"""
|
"""
|
||||||
Extracts TOML frontmatter from a README file content.
|
Extracts TOML frontmatter from a README file content.
|
||||||
|
|
||||||
@@ -111,13 +116,13 @@ def extract_frontmatter(readme_content: str, err_scope: str) -> tuple[Frontmatte
|
|||||||
frontmatter_raw, remaining_content = parse_frontmatter(readme_content)
|
frontmatter_raw, remaining_content = parse_frontmatter(readme_content)
|
||||||
|
|
||||||
if frontmatter_raw:
|
if frontmatter_raw:
|
||||||
return Frontmatter(**frontmatter_raw), remaining_content
|
return fm_class(**frontmatter_raw), remaining_content
|
||||||
|
|
||||||
# If no frontmatter is found, raise an error
|
# If no frontmatter is found, raise an error
|
||||||
msg = "Invalid README: Frontmatter not found."
|
msg = "Invalid README: Frontmatter not found."
|
||||||
raise ClanError(
|
raise ClanError(
|
||||||
msg,
|
msg,
|
||||||
location="extract_frontmatter",
|
location="extract_module_frontmatter",
|
||||||
description=f"{err_scope} does not contain valid frontmatter.",
|
description=f"{err_scope} does not contain valid frontmatter.",
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -128,7 +133,9 @@ def has_inventory_feature(module_path: Path) -> bool:
|
|||||||
return False
|
return False
|
||||||
with readme_file.open() as f:
|
with readme_file.open() as f:
|
||||||
readme = f.read()
|
readme = f.read()
|
||||||
frontmatter, _ = extract_frontmatter(readme, f"{module_path}")
|
frontmatter, _ = extract_frontmatter(
|
||||||
|
readme, f"{module_path}", fm_class=ModuleFrontmatter
|
||||||
|
)
|
||||||
return "inventory" in frontmatter.features
|
return "inventory" in frontmatter.features
|
||||||
|
|
||||||
|
|
||||||
@@ -338,7 +345,7 @@ def get_module_info(
|
|||||||
with module_readme.open() as f:
|
with module_readme.open() as f:
|
||||||
readme = f.read()
|
readme = f.read()
|
||||||
frontmatter, readme_content = extract_frontmatter(
|
frontmatter, readme_content = extract_frontmatter(
|
||||||
readme, f"{module_path}/README.md"
|
readme, f"{module_path}/README.md", fm_class=ModuleFrontmatter
|
||||||
)
|
)
|
||||||
|
|
||||||
return LegacyModuleInfo(
|
return LegacyModuleInfo(
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ from clan_lib.errors import ClanError
|
|||||||
from clan_lib.git import commit_file
|
from clan_lib.git import commit_file
|
||||||
from clan_lib.machines.hardware import HardwareConfig, get_machine_hardware_config
|
from clan_lib.machines.hardware import HardwareConfig, get_machine_hardware_config
|
||||||
from clan_lib.machines.machines import Machine
|
from clan_lib.machines.machines import Machine
|
||||||
from clan_lib.services.modules import Frontmatter, extract_frontmatter
|
from clan_lib.services.modules import ModuleFrontmatter, extract_frontmatter
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ class Placeholder:
|
|||||||
class DiskSchema:
|
class DiskSchema:
|
||||||
name: str
|
name: str
|
||||||
readme: str
|
readme: str
|
||||||
frontmatter: Frontmatter
|
frontmatter: ModuleFrontmatter
|
||||||
placeholders: dict[str, Placeholder]
|
placeholders: dict[str, Placeholder]
|
||||||
|
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ def get_machine_disk_schemas(
|
|||||||
|
|
||||||
raw_readme = (disk_template / "README.md").read_text()
|
raw_readme = (disk_template / "README.md").read_text()
|
||||||
frontmatter, readme = extract_frontmatter(
|
frontmatter, readme = extract_frontmatter(
|
||||||
raw_readme, f"{disk_template}/README.md"
|
raw_readme, f"{disk_template}/README.md", fm_class=ModuleFrontmatter
|
||||||
)
|
)
|
||||||
|
|
||||||
disk_schemas[schema_name] = DiskSchema(
|
disk_schemas[schema_name] = DiskSchema(
|
||||||
|
|||||||
Reference in New Issue
Block a user