chore(release): 0.0.7
Squash-merge lib-standardisation: adopt repo standards across packaging, tooling, docs, and CI. - standardize pyproject.toml (canonical packaging, lint config, extras, GSDFC pydoclint) - add py.typed marker, modernize type hints and Google-style docstrings - nest generated docs under docs/lib and docs/mcp; add hand-written wiki - adopt standard Type A PyPI CI pipeline (tag==version guard + quality gate) - promote generated CHANGELOG.md; bump version to 0.0.7
This commit is contained in:
@@ -3,12 +3,19 @@ Navigation resolution utilities.
|
||||
|
||||
This module resolves a ``NavSpec`` against the filesystem by expanding glob
|
||||
patterns and validating that referenced documentation files exist.
|
||||
|
||||
---
|
||||
|
||||
Notes:
|
||||
- Glob resolution is recursive and returns paths in sorted order.
|
||||
- Unmatched patterns raise ``FileNotFoundError`` to fail fast on typos.
|
||||
|
||||
---
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Dict, Iterable, List
|
||||
|
||||
import glob
|
||||
from collections.abc import Iterable
|
||||
from pathlib import Path
|
||||
|
||||
from docforge.nav.spec import NavSpec
|
||||
|
||||
@@ -29,16 +36,19 @@ class ResolvedNav:
|
||||
def __init__(
|
||||
self,
|
||||
home: str | None,
|
||||
groups: Dict[str, List[Path]],
|
||||
groups: dict[str, list[Path]],
|
||||
docs_root: Path | None = None,
|
||||
) -> None:
|
||||
"""
|
||||
Initialize a ResolvedNav instance.
|
||||
|
||||
Args:
|
||||
home: Relative path to the home page within the documentation root.
|
||||
groups: Mapping of group titles to resolved documentation file paths.
|
||||
docs_root: Root directory of the documentation source files.
|
||||
home (str | None):
|
||||
Relative path to the home page within the documentation root.
|
||||
groups (dict[str, list[Path]]):
|
||||
Mapping of group titles to resolved documentation file paths.
|
||||
docs_root (Path | None):
|
||||
Root directory of the documentation source files.
|
||||
"""
|
||||
self.home = home
|
||||
self.groups = groups
|
||||
@@ -48,8 +58,10 @@ class ResolvedNav:
|
||||
"""
|
||||
Iterate over all files referenced by the navigation structure.
|
||||
|
||||
Returns:
|
||||
An iterable of ``Path`` objects representing documentation files.
|
||||
Yields:
|
||||
Path:
|
||||
A documentation file referenced by the navigation, including
|
||||
the home page when defined.
|
||||
|
||||
Raises:
|
||||
RuntimeError: If the home page is defined but the documentation
|
||||
@@ -61,8 +73,7 @@ class ResolvedNav:
|
||||
yield self._docs_root / self.home
|
||||
|
||||
for paths in self.groups.values():
|
||||
for p in paths:
|
||||
yield p
|
||||
yield from paths
|
||||
|
||||
|
||||
def resolve_nav(
|
||||
@@ -76,11 +87,14 @@ def resolve_nav(
|
||||
that referenced documentation files exist within the documentation root.
|
||||
|
||||
Args:
|
||||
spec: Navigation specification describing documentation layout.
|
||||
docs_root: Root directory containing documentation Markdown files.
|
||||
spec (NavSpec):
|
||||
Navigation specification describing documentation layout.
|
||||
docs_root (Path):
|
||||
Root directory containing documentation Markdown files.
|
||||
|
||||
Returns:
|
||||
A ``ResolvedNav`` instance containing validated navigation paths.
|
||||
ResolvedNav:
|
||||
A `ResolvedNav` instance containing validated navigation paths.
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: If the documentation root does not exist or a
|
||||
@@ -89,23 +103,23 @@ def resolve_nav(
|
||||
if not docs_root.exists():
|
||||
raise FileNotFoundError(docs_root)
|
||||
|
||||
def resolve_pattern(pattern: str) -> List[Path]:
|
||||
def resolve_pattern(pattern: str) -> list[Path]:
|
||||
"""
|
||||
Resolve a glob pattern relative to the documentation root.
|
||||
|
||||
Args:
|
||||
pattern: Glob pattern used to match documentation files.
|
||||
pattern (str):
|
||||
Glob pattern used to match documentation files.
|
||||
|
||||
Returns:
|
||||
A sorted list of matching ``Path`` objects.
|
||||
list[Path]:
|
||||
A sorted list of matching `Path` objects.
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: If the pattern does not match any files.
|
||||
"""
|
||||
full = docs_root / pattern
|
||||
matches = sorted(
|
||||
Path(p) for p in glob.glob(str(full), recursive=True)
|
||||
)
|
||||
matches = sorted(Path(p) for p in glob.glob(str(full), recursive=True))
|
||||
|
||||
if not matches:
|
||||
raise FileNotFoundError(pattern)
|
||||
@@ -121,10 +135,10 @@ def resolve_nav(
|
||||
home = spec.home
|
||||
|
||||
# Resolve navigation groups
|
||||
resolved_groups: Dict[str, List[Path]] = {}
|
||||
resolved_groups: dict[str, list[Path]] = {}
|
||||
|
||||
for group, patterns in spec.groups.items():
|
||||
files: List[Path] = []
|
||||
files: list[Path] = []
|
||||
for pattern in patterns:
|
||||
files.extend(resolve_pattern(pattern))
|
||||
resolved_groups[group] = files
|
||||
|
||||
Reference in New Issue
Block a user