Compare commits
34 Commits
778a986262
...
0.0.2
| Author | SHA1 | Date | |
|---|---|---|---|
| e33133cb0e | |||
| f76d8ccce4 | |||
| f6a596ab62 | |||
| ef378e676b | |||
| 751bbe8949 | |||
| 5370a7faa2 | |||
| ce2eafac85 | |||
| 0d0959c95b | |||
| 427e407d26 | |||
| 9a5e356039 | |||
| b1544c9610 | |||
| 4a876abc62 | |||
| b6e5114532 | |||
| 81e8a8cd49 | |||
| be8f23c8ab | |||
| 9392d2c999 | |||
| 9d0b6e78d1 | |||
| 4fa3bc0533 | |||
| 46b7cc52e1 | |||
| c8ecc6a476 | |||
| 5c8d9dcc9c | |||
| b497c5d2e9 | |||
| 0061dbe2eb | |||
| 6f9776dff2 | |||
| 6c9fb433cb | |||
| 6b334fd181 | |||
| dca19caaf3 | |||
| 2e5d330fca | |||
| 5073f9d73f | |||
| 94b90f2ccf | |||
| a8ba02c57b | |||
| 726e7ca6d2 | |||
| 869b1730c4 | |||
| 09aca78ba1 |
129
.drone.yml
Normal file
129
.drone.yml
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: build-and-publish-pypi
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: arm64
|
||||||
|
|
||||||
|
workspace:
|
||||||
|
path: /drone/src
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: check-version
|
||||||
|
image: curlimages/curl:latest
|
||||||
|
environment:
|
||||||
|
PIP_REPO_URL:
|
||||||
|
from_secret: PIP_REPO_URL
|
||||||
|
PIP_USERNAME:
|
||||||
|
from_secret: PIP_USERNAME
|
||||||
|
PIP_PASSWORD:
|
||||||
|
from_secret: PIP_PASSWORD
|
||||||
|
commands:
|
||||||
|
- PACKAGE_NAME=$(grep -E '^name\s*=' pyproject.toml | head -1 | cut -d'"' -f2)
|
||||||
|
- VERSION=$(grep -E '^version\s*=' pyproject.toml | head -1 | cut -d'"' -f2)
|
||||||
|
- echo "🔍 Checking if $PACKAGE_NAME==$VERSION exists on $PIP_REPO_URL ..."
|
||||||
|
- |
|
||||||
|
if curl -fsSL -u "$PIP_USERNAME:$PIP_PASSWORD" "$PIP_REPO_URL/simple/$PACKAGE_NAME/" | grep -q "$VERSION"; then
|
||||||
|
echo "✅ $PACKAGE_NAME==$VERSION already exists — skipping build."
|
||||||
|
exit 78
|
||||||
|
else
|
||||||
|
echo "🆕 New version detected: $PACKAGE_NAME==$VERSION"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: build-package
|
||||||
|
image: python:3.13-slim
|
||||||
|
commands:
|
||||||
|
- pip install --upgrade pip build
|
||||||
|
- echo "📦 Building Python package..."
|
||||||
|
- python -m build
|
||||||
|
- ls -l dist
|
||||||
|
|
||||||
|
- name: upload-to-private-pypi
|
||||||
|
image: python:3.13-slim
|
||||||
|
environment:
|
||||||
|
PIP_REPO_URL:
|
||||||
|
from_secret: PIP_REPO_URL
|
||||||
|
PIP_USERNAME:
|
||||||
|
from_secret: PIP_USERNAME
|
||||||
|
PIP_PASSWORD:
|
||||||
|
from_secret: PIP_PASSWORD
|
||||||
|
commands:
|
||||||
|
- pip install --upgrade twine
|
||||||
|
- echo "🚀 Uploading to private PyPI at $PIP_REPO_URL ..."
|
||||||
|
- |
|
||||||
|
twine upload \
|
||||||
|
--repository-url "$PIP_REPO_URL" \
|
||||||
|
-u "$PIP_USERNAME" \
|
||||||
|
-p "$PIP_PASSWORD" \
|
||||||
|
dist/*
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- tag
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: backfill-pypi-from-tags
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: arm64
|
||||||
|
|
||||||
|
workspace:
|
||||||
|
path: /drone/src
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: fetch-tags
|
||||||
|
image: alpine/git
|
||||||
|
commands:
|
||||||
|
- git fetch --tags --force
|
||||||
|
|
||||||
|
- name: build-and-upload-missing
|
||||||
|
image: python:3.13-slim
|
||||||
|
environment:
|
||||||
|
PIP_REPO_URL:
|
||||||
|
from_secret: PIP_REPO_URL
|
||||||
|
PIP_USERNAME:
|
||||||
|
from_secret: PIP_USERNAME
|
||||||
|
PIP_PASSWORD:
|
||||||
|
from_secret: PIP_PASSWORD
|
||||||
|
commands:
|
||||||
|
- apt-get update
|
||||||
|
- apt-get install -y git curl ca-certificates
|
||||||
|
- pip install --upgrade pip build twine
|
||||||
|
- |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PACKAGE_NAME=$(grep -E '^name\s*=' pyproject.toml | cut -d'"' -f2)
|
||||||
|
echo "📦 Package: $PACKAGE_NAME"
|
||||||
|
|
||||||
|
for TAG in $(git tag --sort=version:refname); do
|
||||||
|
VERSION="$TAG"
|
||||||
|
echo "🔁 Version: $VERSION"
|
||||||
|
|
||||||
|
if curl -fsSL -u "$PIP_USERNAME:$PIP_PASSWORD" \
|
||||||
|
"$PIP_REPO_URL/simple/$PACKAGE_NAME/" | grep -q "$VERSION"; then
|
||||||
|
echo "⏭️ Exists, skipping"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
git checkout --force "$TAG"
|
||||||
|
|
||||||
|
echo "🏗️ Building $VERSION"
|
||||||
|
rm -rf dist
|
||||||
|
python -m build
|
||||||
|
|
||||||
|
echo "⬆️ Uploading $VERSION"
|
||||||
|
twine upload \
|
||||||
|
--repository-url "$PIP_REPO_URL" \
|
||||||
|
-u "$PIP_USERNAME" \
|
||||||
|
-p "$PIP_PASSWORD" \
|
||||||
|
dist/*
|
||||||
|
done
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- custom
|
||||||
90
.gitignore
vendored
90
.gitignore
vendored
@@ -1 +1,89 @@
|
|||||||
.idea
|
# =========================
|
||||||
|
# Python bytecode & caches
|
||||||
|
# =========================
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# C extensions
|
||||||
|
# =========================
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Distribution / packaging
|
||||||
|
# =========================
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
*.egg-info/
|
||||||
|
.eggs/
|
||||||
|
pip-wheel-metadata/
|
||||||
|
wheels/
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Virtual environments
|
||||||
|
# =========================
|
||||||
|
.venv/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env/
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Test / coverage outputs
|
||||||
|
# =========================
|
||||||
|
.pytest_cache/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
htmlcov/
|
||||||
|
.coverage.xml
|
||||||
|
test-results/
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Lint / type checking
|
||||||
|
# =========================
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Docs build artifacts
|
||||||
|
# =========================
|
||||||
|
site/
|
||||||
|
docs/_site/
|
||||||
|
docs/build/
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# MkDocs / Sphinx output
|
||||||
|
# =========================
|
||||||
|
site/
|
||||||
|
.build/
|
||||||
|
_doctrees/
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# IDEs & editors
|
||||||
|
# =========================
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# OS-specific
|
||||||
|
# =========================
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Logs
|
||||||
|
# =========================
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Local config overrides
|
||||||
|
# =========================
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ doc-forge server mypackage
|
|||||||
### Python API
|
### Python API
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from docforge.loader import GriffeLoader
|
from docforge.loaders import GriffeLoader
|
||||||
from docforge.renderers import MkDocsRenderer
|
from docforge.renderers import MkDocsRenderer
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
@@ -70,6 +70,7 @@ renderer.generate_sources(project, Path("docs"))
|
|||||||
|
|
||||||
# Build final documentation
|
# Build final documentation
|
||||||
from docforge.renderers.base import RendererConfig
|
from docforge.renderers.base import RendererConfig
|
||||||
|
|
||||||
config = RendererConfig(Path("docs"), project)
|
config = RendererConfig(Path("docs"), project)
|
||||||
renderer.build(config)
|
renderer.build(config)
|
||||||
```
|
```
|
||||||
|
|||||||
24
docforge.nav.yml
Normal file
24
docforge.nav.yml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
home: docforge/index.md
|
||||||
|
groups:
|
||||||
|
Loaders:
|
||||||
|
- docforge/loaders/index.md
|
||||||
|
- docforge/loaders/griffe_loader.md
|
||||||
|
Models:
|
||||||
|
- docforge/models/index.md
|
||||||
|
- docforge/models/module.md
|
||||||
|
- docforge/models/object.md
|
||||||
|
- docforge/models/project.md
|
||||||
|
Navigation:
|
||||||
|
- docforge/nav/index.md
|
||||||
|
- docforge/nav/spec.md
|
||||||
|
- docforge/nav/resolver.md
|
||||||
|
- docforge/nav/mkdocs.md
|
||||||
|
Renderers:
|
||||||
|
- docforge/renderers/index.md
|
||||||
|
- docforge/renderers/base.md
|
||||||
|
- docforge/renderers/mkdocs_renderer.md
|
||||||
|
- docforge/renderers/mcp_renderer.md
|
||||||
|
CLI:
|
||||||
|
- docforge/cli/index.md
|
||||||
|
- docforge/cli/main.md
|
||||||
|
- docforge/cli/mkdocs.md
|
||||||
@@ -1,19 +1,66 @@
|
|||||||
"""
|
"""
|
||||||
doc-forge — renderer-agnostic Python documentation compiler.
|
# doc-forge
|
||||||
|
|
||||||
At this stage, doc-forge publicly exposes only the Introspection Layer.
|
`doc-forge` is a renderer-agnostic Python documentation compiler designed for
|
||||||
All the rendering, exporting, and serving APIs are intentionally private
|
speed, flexibility, and beautiful output. It decouples the introspection of
|
||||||
until their contracts are finalized.
|
your code from the rendering process, allowing you to generate documentation
|
||||||
|
for various platforms (starting with MkDocs) from a single internal models.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Install using `pip` with the optional `mkdocs` dependencies for a complete setup:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install doc-forge
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. **Generate Markdown Sources**:
|
||||||
|
Introspect your package and create ready-to-use Markdown files:
|
||||||
|
```bash
|
||||||
|
doc-forge generate --module my_package --docs-dir docs
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Define Navigation**:
|
||||||
|
Create a `docforge.nav.yml` to organize your documentation:
|
||||||
|
```yaml
|
||||||
|
home: my_package/index.md
|
||||||
|
groups:
|
||||||
|
Core API:
|
||||||
|
- my_package/core/*.md
|
||||||
|
Utilities:
|
||||||
|
- my_package/utils.md
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Generate MkDocs Configuration**:
|
||||||
|
```bash
|
||||||
|
doc-forge mkdocs --site-name "My Awesome Docs"
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Preview**:
|
||||||
|
```bash
|
||||||
|
doc-forge serve
|
||||||
|
```
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
- `docforge.loaders`: Introspects source code using static analysis (`griffe`).
|
||||||
|
- `docforge.models`: The internal representation of your project, modules, and objects.
|
||||||
|
- `docforge.renderers`: Converters that turn the models into physical files.
|
||||||
|
- `docforge.nav`: Managers for logical-to-physical path mapping and navigation.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from .loader import GriffeLoader
|
from .loaders import GriffeLoader, discover_module_paths
|
||||||
from .renderers import MkDocsRenderer
|
from .renderers import MkDocsRenderer, MCPRenderer
|
||||||
from .cli import main
|
from .cli import main
|
||||||
from . import model
|
from . import models
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"GriffeLoader",
|
"GriffeLoader",
|
||||||
|
"discover_module_paths",
|
||||||
"MkDocsRenderer",
|
"MkDocsRenderer",
|
||||||
"model",
|
"MCPRenderer",
|
||||||
|
"models",
|
||||||
"main",
|
"main",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
from .loader import GriffeLoader
|
from .loaders import GriffeLoader, discover_module_paths
|
||||||
from .renderers import MkDocsRenderer
|
from .renderers import MkDocsRenderer, MCPRenderer
|
||||||
from .cli import main
|
from .cli import main
|
||||||
from . import model
|
from . import models
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"GriffeLoader",
|
"GriffeLoader",
|
||||||
|
"discover_module_paths",
|
||||||
"MkDocsRenderer",
|
"MkDocsRenderer",
|
||||||
"model",
|
"MCPRenderer",
|
||||||
|
"models",
|
||||||
"main",
|
"main",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,3 +1,18 @@
|
|||||||
|
"""
|
||||||
|
# CLI Layer
|
||||||
|
|
||||||
|
The `docforge.cli` package provides the command-line interface for interacting
|
||||||
|
with doc-forge.
|
||||||
|
|
||||||
|
## Available Commands
|
||||||
|
|
||||||
|
- **tree**: Visualize the introspected project structure.
|
||||||
|
- **generate**: Create Markdown source files from Python code.
|
||||||
|
- **mkdocs**: Generate the primary `mkdocs.yml` configuration.
|
||||||
|
- **build**: Build the final documentation site.
|
||||||
|
- **serve**: Launch a local development server with live-reloading.
|
||||||
|
"""
|
||||||
|
|
||||||
from .main import main
|
from .main import main
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
|||||||
@@ -1,20 +1,29 @@
|
|||||||
from __future__ import annotations
|
"""
|
||||||
|
Main entry point for the doc-forge CLI. This module defines the core command
|
||||||
|
group and the 'tree', 'generate', 'build', and 'serve' commands.
|
||||||
|
"""
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Sequence, Optional
|
from typing import Sequence, Optional
|
||||||
|
|
||||||
import click
|
import click
|
||||||
|
|
||||||
from docforge.loader import GriffeLoader
|
from docforge.loaders import GriffeLoader, discover_module_paths
|
||||||
from docforge.renderers.mkdocs import MkDocsRenderer
|
from docforge.renderers import MkDocsRenderer, MCPRenderer
|
||||||
|
from docforge.cli.mkdocs import mkdocs_cmd
|
||||||
|
|
||||||
|
|
||||||
@click.group()
|
@click.group()
|
||||||
def cli() -> None:
|
def cli() -> None:
|
||||||
"""doc-forge command-line interface."""
|
"""
|
||||||
|
doc-forge CLI: A tool for introspecting Python projects and generating
|
||||||
|
documentation.
|
||||||
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
cli.add_command(mkdocs_cmd)
|
||||||
|
|
||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
# tree
|
# tree
|
||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
@@ -34,7 +43,13 @@ def tree(
|
|||||||
modules: Sequence[str],
|
modules: Sequence[str],
|
||||||
project_name: Optional[str],
|
project_name: Optional[str],
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Show introspection tree."""
|
"""
|
||||||
|
Visualize the project structure including modules and their members.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
modules: List of module paths to introspect.
|
||||||
|
project_name: Optional project name override.
|
||||||
|
"""
|
||||||
loader = GriffeLoader()
|
loader = GriffeLoader()
|
||||||
project = loader.load_project(list(modules), project_name)
|
project = loader.load_project(list(modules), project_name)
|
||||||
|
|
||||||
@@ -48,6 +63,9 @@ def tree(
|
|||||||
|
|
||||||
|
|
||||||
def _print_object(obj, indent: str) -> None:
|
def _print_object(obj, indent: str) -> None:
|
||||||
|
"""
|
||||||
|
Recursive helper to print doc objects.
|
||||||
|
"""
|
||||||
click.echo(f"{indent}├── {obj.name}")
|
click.echo(f"{indent}├── {obj.name}")
|
||||||
for member in obj.get_all_members():
|
for member in obj.get_all_members():
|
||||||
_print_object(member, indent + "│ ")
|
_print_object(member, indent + "│ ")
|
||||||
@@ -59,8 +77,7 @@ def _print_object(obj, indent: str) -> None:
|
|||||||
|
|
||||||
@cli.command()
|
@cli.command()
|
||||||
@click.option(
|
@click.option(
|
||||||
"--modules",
|
"--module",
|
||||||
multiple=True,
|
|
||||||
required=True,
|
required=True,
|
||||||
help="Python module import paths to document",
|
help="Python module import paths to document",
|
||||||
)
|
)
|
||||||
@@ -74,13 +91,26 @@ def _print_object(obj, indent: str) -> None:
|
|||||||
default=Path("docs"),
|
default=Path("docs"),
|
||||||
)
|
)
|
||||||
def generate(
|
def generate(
|
||||||
modules: Sequence[str],
|
module: str,
|
||||||
project_name: Optional[str],
|
project_name: Optional[str],
|
||||||
docs_dir: Path,
|
docs_dir: Path,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Generate documentation source files using MkDocs renderer."""
|
"""
|
||||||
|
Generate Markdown source files for the specified module.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module: The primary module path to document.
|
||||||
|
project_name: Optional project name override.
|
||||||
|
docs_dir: Directory where documentation sources will be written.
|
||||||
|
"""
|
||||||
loader = GriffeLoader()
|
loader = GriffeLoader()
|
||||||
project = loader.load_project(list(modules), project_name)
|
discovered_paths = discover_module_paths(
|
||||||
|
module,
|
||||||
|
)
|
||||||
|
project = loader.load_project(
|
||||||
|
discovered_paths,
|
||||||
|
project_name
|
||||||
|
)
|
||||||
|
|
||||||
renderer = MkDocsRenderer()
|
renderer = MkDocsRenderer()
|
||||||
renderer.generate_sources(project, docs_dir)
|
renderer.generate_sources(project, docs_dir)
|
||||||
@@ -88,6 +118,52 @@ def generate(
|
|||||||
click.echo(f"Documentation sources generated in {docs_dir}")
|
click.echo(f"Documentation sources generated in {docs_dir}")
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------
|
||||||
|
# mcp-build
|
||||||
|
# ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
@cli.command(name="generate-mcp")
|
||||||
|
@click.option(
|
||||||
|
"--module",
|
||||||
|
required=True,
|
||||||
|
help="Python module import path to document",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--project-name",
|
||||||
|
help="Project name (defaults to first module)",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--out-dir",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("mcp_docs"),
|
||||||
|
)
|
||||||
|
def generate_mcp(
|
||||||
|
module: str,
|
||||||
|
project_name: str | None,
|
||||||
|
out_dir: Path,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Generate MCP-compatible documentation resources for the specified module.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module: The primary module path to document.
|
||||||
|
project_name: Optional project name override.
|
||||||
|
out_dir: Directory where MCP resources will be written.
|
||||||
|
"""
|
||||||
|
loader = GriffeLoader()
|
||||||
|
discovered_paths = discover_module_paths(module)
|
||||||
|
|
||||||
|
project = loader.load_project(
|
||||||
|
discovered_paths,
|
||||||
|
project_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
renderer = MCPRenderer()
|
||||||
|
renderer.generate_sources(project, out_dir)
|
||||||
|
|
||||||
|
click.echo(f"MCP documentation resources generated in {out_dir}")
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
# build
|
# build
|
||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
@@ -99,7 +175,12 @@ def generate(
|
|||||||
default=Path("mkdocs.yml"),
|
default=Path("mkdocs.yml"),
|
||||||
)
|
)
|
||||||
def build(mkdocs_yml: Path) -> None:
|
def build(mkdocs_yml: Path) -> None:
|
||||||
"""Build documentation using MkDocs."""
|
"""
|
||||||
|
Build the documentation site using MkDocs.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
mkdocs_yml: Path to the mkdocs.yml configuration file.
|
||||||
|
"""
|
||||||
if not mkdocs_yml.exists():
|
if not mkdocs_yml.exists():
|
||||||
raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}")
|
raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}")
|
||||||
|
|
||||||
@@ -111,6 +192,40 @@ def build(mkdocs_yml: Path) -> None:
|
|||||||
click.echo("MkDocs build completed")
|
click.echo("MkDocs build completed")
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------
|
||||||
|
# serve-mcp
|
||||||
|
# ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
@cli.command(name="serve-mcp")
|
||||||
|
def serve_mcp() -> None:
|
||||||
|
"""
|
||||||
|
Serve MCP documentation from the local mcp_docs directory.
|
||||||
|
"""
|
||||||
|
from docforge.servers import MCPServer
|
||||||
|
|
||||||
|
mcp_root = Path.cwd() / "mcp_docs"
|
||||||
|
|
||||||
|
if not mcp_root.exists():
|
||||||
|
raise click.ClickException("mcp_docs directory not found")
|
||||||
|
|
||||||
|
required = [
|
||||||
|
mcp_root / "index.json",
|
||||||
|
mcp_root / "nav.json",
|
||||||
|
mcp_root / "modules",
|
||||||
|
]
|
||||||
|
|
||||||
|
for path in required:
|
||||||
|
if not path.exists():
|
||||||
|
raise click.ClickException(f"Invalid MCP bundle, missing: {path.name}")
|
||||||
|
|
||||||
|
server = MCPServer(
|
||||||
|
mcp_root=mcp_root,
|
||||||
|
name="doc-forge-mcp",
|
||||||
|
)
|
||||||
|
|
||||||
|
server.run()
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
# serve
|
# serve
|
||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
@@ -122,11 +237,22 @@ def build(mkdocs_yml: Path) -> None:
|
|||||||
default=Path("mkdocs.yml"),
|
default=Path("mkdocs.yml"),
|
||||||
)
|
)
|
||||||
def serve(mkdocs_yml: Path) -> None:
|
def serve(mkdocs_yml: Path) -> None:
|
||||||
"""Serve documentation using MkDocs."""
|
"""
|
||||||
|
Serve the documentation site with live-reload using MkDocs.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
mkdocs_yml: Path to the mkdocs.yml configuration file.
|
||||||
|
"""
|
||||||
if not mkdocs_yml.exists():
|
if not mkdocs_yml.exists():
|
||||||
raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}")
|
raise click.ClickException(f"mkdocs.yml not found: {mkdocs_yml}")
|
||||||
|
|
||||||
from mkdocs.commands.serve import serve as mkdocs_serve
|
from mkdocs.commands.serve import serve as mkdocs_serve
|
||||||
|
|
||||||
|
host = "127.0.0.1"
|
||||||
|
port = 8000
|
||||||
|
url = f"http://{host}:{port}/"
|
||||||
|
|
||||||
|
click.echo(f"Serving documentation at {url}")
|
||||||
mkdocs_serve(config_file=str(mkdocs_yml))
|
mkdocs_serve(config_file=str(mkdocs_yml))
|
||||||
|
|
||||||
|
|
||||||
@@ -135,6 +261,9 @@ def serve(mkdocs_yml: Path) -> None:
|
|||||||
# ---------------------------------------------------------------------
|
# ---------------------------------------------------------------------
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
|
"""
|
||||||
|
CLI Entry point.
|
||||||
|
"""
|
||||||
cli()
|
cli()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,7 @@ def tree(
|
|||||||
|
|
||||||
@cli.command()
|
@cli.command()
|
||||||
@click.option(
|
@click.option(
|
||||||
"--modules",
|
"--module",
|
||||||
multiple=True,
|
|
||||||
help="Python module import paths to document",
|
help="Python module import paths to document",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
@@ -42,12 +41,40 @@ def tree(
|
|||||||
default=Path("docs"),
|
default=Path("docs"),
|
||||||
)
|
)
|
||||||
def generate(
|
def generate(
|
||||||
modules: Sequence[str],
|
module: str,
|
||||||
project_name: str | None,
|
project_name: str | None,
|
||||||
docs_dir: Path,
|
docs_dir: Path,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Generate documentation source files using MkDocs renderer."""
|
"""Generate documentation source files using MkDocs renderer."""
|
||||||
|
|
||||||
|
@cli.command(name="generate-mcp")
|
||||||
|
@click.option(
|
||||||
|
"--module",
|
||||||
|
required=True,
|
||||||
|
help="Python module import path to document",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--project-name",
|
||||||
|
help="Project name (defaults to first module)",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--out-dir",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("mcp_docs"),
|
||||||
|
)
|
||||||
|
def generate_mcp(
|
||||||
|
module: str,
|
||||||
|
project_name: str | None,
|
||||||
|
out_dir: Path,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Generate MCP-compatible documentation resources for the specified module.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module: The primary module path to document.
|
||||||
|
project_name: Optional project name override.
|
||||||
|
out_dir: Directory where MCP resources will be written.
|
||||||
|
"""
|
||||||
|
|
||||||
@cli.command()
|
@cli.command()
|
||||||
@click.option(
|
@click.option(
|
||||||
@@ -73,5 +100,10 @@ def serve(
|
|||||||
"""Serve documentation using MkDocs."""
|
"""Serve documentation using MkDocs."""
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command(name="serve-mcp")
|
||||||
|
def serve_mcp() -> None:
|
||||||
|
"""Serve MCP documentation."""
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
"""CLI entry point."""
|
"""CLI entry point."""
|
||||||
|
|||||||
116
docforge/cli/mkdocs.py
Normal file
116
docforge/cli/mkdocs.py
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
"""
|
||||||
|
This module contains the 'mkdocs' CLI command, which orchestrates the generation
|
||||||
|
of the main mkdocs.yml configuration file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from importlib import resources
|
||||||
|
|
||||||
|
import click
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from docforge.nav import load_nav_spec
|
||||||
|
from docforge.nav import resolve_nav
|
||||||
|
from docforge.nav import MkDocsNavEmitter
|
||||||
|
|
||||||
|
|
||||||
|
def _load_template(template: Path | None) -> dict:
|
||||||
|
"""
|
||||||
|
Load a YAML template for mkdocs.yml. If no template is provided,
|
||||||
|
loads the built-in sample template.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
template: Path to the template file, or None.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The loaded template data as a dictionary.
|
||||||
|
"""
|
||||||
|
if template is not None:
|
||||||
|
if not template.exists():
|
||||||
|
raise click.FileError(str(template), hint="Template not found")
|
||||||
|
return yaml.safe_load(template.read_text(encoding="utf-8"))
|
||||||
|
|
||||||
|
# Load built-in default
|
||||||
|
text = (
|
||||||
|
resources.files("docforge.templates")
|
||||||
|
.joinpath("mkdocs.sample.yml")
|
||||||
|
.read_text(encoding="utf-8")
|
||||||
|
)
|
||||||
|
return yaml.safe_load(text)
|
||||||
|
|
||||||
|
|
||||||
|
@click.command("mkdocs")
|
||||||
|
@click.option(
|
||||||
|
"--site-name",
|
||||||
|
required=True,
|
||||||
|
help="MkDocs site_name (required)",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--docs-dir",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("docs"),
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--nav",
|
||||||
|
"nav_file",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("docforge.nav.yml"),
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--template",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=None,
|
||||||
|
help="Override the built-in mkdocs template",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--out",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("mkdocs.yml"),
|
||||||
|
)
|
||||||
|
def mkdocs_cmd(
|
||||||
|
docs_dir: Path,
|
||||||
|
nav_file: Path,
|
||||||
|
template: Path | None,
|
||||||
|
out: Path,
|
||||||
|
site_name: str,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Generate an mkdocs.yml configuration file by combining a template with
|
||||||
|
the navigation structure resolved from a docforge.nav.yml file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
docs_dir: Path to the directory containing documentation Markdown files.
|
||||||
|
nav_file: Path to the docforge.nav.yml specification.
|
||||||
|
template: Optional path to an mkdocs.yml template.
|
||||||
|
out: Path where the final mkdocs.yml will be written.
|
||||||
|
site_name: The name of the documentation site.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not nav_file.exists():
|
||||||
|
raise click.FileError(str(nav_file), hint="Nav spec not found")
|
||||||
|
|
||||||
|
# Load nav spec
|
||||||
|
spec = load_nav_spec(nav_file)
|
||||||
|
|
||||||
|
# Resolve nav
|
||||||
|
resolved = resolve_nav(spec, docs_dir)
|
||||||
|
|
||||||
|
# Emit mkdocs nav
|
||||||
|
nav_block = MkDocsNavEmitter().emit(resolved)
|
||||||
|
|
||||||
|
# Load template (user or built-in)
|
||||||
|
data = _load_template(template)
|
||||||
|
|
||||||
|
# Inject site_name
|
||||||
|
data["site_name"] = site_name
|
||||||
|
|
||||||
|
# Inject nav
|
||||||
|
data["nav"] = nav_block
|
||||||
|
|
||||||
|
# Write output
|
||||||
|
out.write_text(
|
||||||
|
yaml.safe_dump(data, sort_keys=False),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
click.echo(f"mkdocs.yml written to {out}")
|
||||||
45
docforge/cli/mkdocs.pyi
Normal file
45
docforge/cli/mkdocs.pyi
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import Any, Dict, Optional
|
||||||
|
|
||||||
|
import click
|
||||||
|
|
||||||
|
|
||||||
|
def _load_template(template: Optional[Path]) -> Dict[str, Any]:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
@click.command("mkdocs")
|
||||||
|
@click.option(
|
||||||
|
"--site-name",
|
||||||
|
required=True,
|
||||||
|
help="MkDocs site_name (required)",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--docs-dir",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("docs"),
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--nav",
|
||||||
|
"nav_file",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("docforge.nav.yml"),
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--template",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=None,
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--out",
|
||||||
|
type=click.Path(path_type=Path),
|
||||||
|
default=Path("mkdocs.yml"),
|
||||||
|
)
|
||||||
|
def mkdocs_cmd(
|
||||||
|
docs_dir: Path,
|
||||||
|
nav_file: Path,
|
||||||
|
template: Optional[Path],
|
||||||
|
out: Path,
|
||||||
|
site_name: str,
|
||||||
|
) -> None:
|
||||||
|
...
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
from .griffe_loader import GriffeLoader
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"GriffeLoader"
|
|
||||||
]
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
from .griffe_loader import GriffeLoader
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"GriffeLoader"
|
|
||||||
]
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
import logging
|
|
||||||
from typing import List, Optional
|
|
||||||
|
|
||||||
from griffe import (
|
|
||||||
GriffeLoader as _GriffeLoader,
|
|
||||||
ModulesCollection,
|
|
||||||
LinesCollection,
|
|
||||||
Object,
|
|
||||||
AliasResolutionError,
|
|
||||||
)
|
|
||||||
|
|
||||||
from docforge.model import Module, Project, DocObject
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class GriffeLoader:
|
|
||||||
"""Loads Python modules using Griffe introspection."""
|
|
||||||
|
|
||||||
def __init__(self) -> None:
|
|
||||||
self._loader = _GriffeLoader(
|
|
||||||
modules_collection=ModulesCollection(),
|
|
||||||
lines_collection=LinesCollection(),
|
|
||||||
)
|
|
||||||
|
|
||||||
def load_project(
|
|
||||||
self,
|
|
||||||
module_paths: List[str],
|
|
||||||
project_name: Optional[str] = None,
|
|
||||||
) -> Project:
|
|
||||||
if not module_paths:
|
|
||||||
raise ValueError("At least one module path must be provided")
|
|
||||||
|
|
||||||
if project_name is None:
|
|
||||||
project_name = module_paths[0].split(".")[0]
|
|
||||||
|
|
||||||
project = Project(name=project_name)
|
|
||||||
|
|
||||||
for module_path in module_paths:
|
|
||||||
try:
|
|
||||||
module = self.load_module(module_path)
|
|
||||||
project.add_module(module)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error("Failed to load module %s: %s", module_path, e)
|
|
||||||
continue
|
|
||||||
|
|
||||||
return project
|
|
||||||
|
|
||||||
def load_module(self, path: str) -> Module:
|
|
||||||
try:
|
|
||||||
self._loader.load(path)
|
|
||||||
griffe_module = self._loader.modules_collection[path]
|
|
||||||
except Exception as e:
|
|
||||||
raise ImportError(f"Failed to load module '{path}': {e}") from e
|
|
||||||
|
|
||||||
return self._convert_module(griffe_module)
|
|
||||||
|
|
||||||
# -------------------------
|
|
||||||
# Conversion helpers
|
|
||||||
# -------------------------
|
|
||||||
|
|
||||||
def _convert_module(self, obj: Object) -> Module:
|
|
||||||
module = Module(
|
|
||||||
path=obj.path,
|
|
||||||
docstring=self._safe_docstring(obj),
|
|
||||||
)
|
|
||||||
|
|
||||||
for name, member in obj.members.items():
|
|
||||||
if name.startswith("_"):
|
|
||||||
continue
|
|
||||||
try:
|
|
||||||
module.add_object(self._convert_object(member))
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning("Skipping member %s: %s", name, e)
|
|
||||||
|
|
||||||
return module
|
|
||||||
|
|
||||||
def _convert_object(self, obj: Object) -> DocObject:
|
|
||||||
kind = obj.kind.value
|
|
||||||
signature = self._safe_signature(obj)
|
|
||||||
|
|
||||||
doc_obj = DocObject(
|
|
||||||
name=obj.name,
|
|
||||||
kind=kind,
|
|
||||||
path=obj.path,
|
|
||||||
signature=signature,
|
|
||||||
docstring=self._safe_docstring(obj),
|
|
||||||
)
|
|
||||||
|
|
||||||
if hasattr(obj, "members"):
|
|
||||||
for name, member in obj.members.items():
|
|
||||||
if name.startswith("_"):
|
|
||||||
continue
|
|
||||||
try:
|
|
||||||
doc_obj.add_member(self._convert_object(member))
|
|
||||||
except Exception:
|
|
||||||
continue
|
|
||||||
|
|
||||||
return doc_obj
|
|
||||||
|
|
||||||
# -------------------------
|
|
||||||
# Safe extractors
|
|
||||||
# -------------------------
|
|
||||||
|
|
||||||
def _safe_docstring(self, obj: Object) -> Optional[str]:
|
|
||||||
try:
|
|
||||||
return obj.docstring.value if obj.docstring else None
|
|
||||||
except AliasResolutionError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def _safe_signature(self, obj: Object) -> Optional[str]:
|
|
||||||
try:
|
|
||||||
if hasattr(obj, "signature") and obj.signature:
|
|
||||||
return str(obj.signature)
|
|
||||||
except AliasResolutionError:
|
|
||||||
return None
|
|
||||||
return None
|
|
||||||
22
docforge/loaders/__init__.py
Normal file
22
docforge/loaders/__init__.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
"""
|
||||||
|
# Loader Layer
|
||||||
|
|
||||||
|
The `docforge.loaders` package is responsible for discovering Python source files
|
||||||
|
and extracting their documentation using static analysis.
|
||||||
|
|
||||||
|
## Core Features
|
||||||
|
|
||||||
|
- **Discovery**: Automatically find all modules and packages in a project
|
||||||
|
directory.
|
||||||
|
- **Introspection**: Uses `griffe` to parse docstrings, signatures, and
|
||||||
|
hierarchical relationships without executing the code.
|
||||||
|
- **Filtering**: Automatically excludes private members (prefixed with `_`) to
|
||||||
|
ensure clean public documentation.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .griffe_loader import GriffeLoader, discover_module_paths
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"GriffeLoader",
|
||||||
|
"discover_module_paths",
|
||||||
|
]
|
||||||
6
docforge/loaders/__init__.pyi
Normal file
6
docforge/loaders/__init__.pyi
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from .griffe_loader import GriffeLoader, discover_module_paths
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"GriffeLoader",
|
||||||
|
"discover_module_paths",
|
||||||
|
]
|
||||||
188
docforge/loaders/griffe_loader.py
Normal file
188
docforge/loaders/griffe_loader.py
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
"""
|
||||||
|
This module provides the GriffeLoader, which uses the 'griffe' library to
|
||||||
|
introspect Python source code and populate the doc-forge Project models.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
|
from griffe import (
|
||||||
|
GriffeLoader as _GriffeLoader,
|
||||||
|
ModulesCollection,
|
||||||
|
LinesCollection,
|
||||||
|
Object,
|
||||||
|
AliasResolutionError,
|
||||||
|
)
|
||||||
|
|
||||||
|
from docforge.models import Module, Project, DocObject
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def discover_module_paths(
|
||||||
|
module_name: str,
|
||||||
|
project_root: Path | None = None,
|
||||||
|
) -> List[str]:
|
||||||
|
"""
|
||||||
|
Discover all Python modules under a package via filesystem traversal.
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
- Directory with __init__.py is treated as a package.
|
||||||
|
- Any .py file is treated as a module.
|
||||||
|
- All paths are converted to dotted module paths.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module_name: The name of the package to discover.
|
||||||
|
project_root: The root directory of the project. Defaults to current working directory.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A sorted list of dotted module paths.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if project_root is None:
|
||||||
|
project_root = Path.cwd()
|
||||||
|
|
||||||
|
pkg_dir = project_root / module_name
|
||||||
|
if not pkg_dir.exists():
|
||||||
|
raise FileNotFoundError(f"Package not found: {pkg_dir}")
|
||||||
|
|
||||||
|
module_paths: List[str] = []
|
||||||
|
|
||||||
|
for path in pkg_dir.rglob("*.py"):
|
||||||
|
if path.name == "__init__.py":
|
||||||
|
module_path = path.parent
|
||||||
|
else:
|
||||||
|
module_path = path
|
||||||
|
|
||||||
|
rel = module_path.relative_to(project_root)
|
||||||
|
dotted = ".".join(rel.with_suffix("").parts)
|
||||||
|
module_paths.append(dotted)
|
||||||
|
|
||||||
|
return sorted(set(module_paths))
|
||||||
|
|
||||||
|
|
||||||
|
class GriffeLoader:
|
||||||
|
"""
|
||||||
|
Loads Python modules and extracts documentation using the Griffe introspection engine.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
"""
|
||||||
|
Initialize the GriffeLoader.
|
||||||
|
"""
|
||||||
|
self._loader = _GriffeLoader(
|
||||||
|
modules_collection=ModulesCollection(),
|
||||||
|
lines_collection=LinesCollection(),
|
||||||
|
)
|
||||||
|
|
||||||
|
def load_project(
|
||||||
|
self,
|
||||||
|
module_paths: List[str],
|
||||||
|
project_name: Optional[str] = None,
|
||||||
|
skip_import_errors: bool = None,
|
||||||
|
) -> Project:
|
||||||
|
"""
|
||||||
|
Load multiple modules and combine them into a single Project models.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module_paths: A list of dotted paths to the modules to load.
|
||||||
|
project_name: Optional name for the project. Defaults to the first module name.
|
||||||
|
skip_import_errors: If True, modules that fail to import will be skipped.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A Project instance containing the loaded modules.
|
||||||
|
"""
|
||||||
|
if not module_paths:
|
||||||
|
raise ValueError("At least one module path must be provided")
|
||||||
|
|
||||||
|
if project_name is None:
|
||||||
|
project_name = module_paths[0].split(".")[0]
|
||||||
|
|
||||||
|
project = Project(name=project_name)
|
||||||
|
|
||||||
|
for module_path in module_paths:
|
||||||
|
try:
|
||||||
|
module = self.load_module(module_path)
|
||||||
|
except ImportError as import_error:
|
||||||
|
if skip_import_errors:
|
||||||
|
logger.debug("Could not load %s: %s", module_path, import_error)
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
raise import_error
|
||||||
|
project.add_module(module)
|
||||||
|
|
||||||
|
return project
|
||||||
|
|
||||||
|
def load_module(self, path: str) -> Module:
|
||||||
|
"""
|
||||||
|
Load a single module and convert its introspection data into the docforge models.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The dotted path of the module to load.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A Module instance.
|
||||||
|
"""
|
||||||
|
self._loader.load(path)
|
||||||
|
griffe_module = self._loader.modules_collection[path]
|
||||||
|
|
||||||
|
return self._convert_module(griffe_module)
|
||||||
|
|
||||||
|
# -------------------------
|
||||||
|
# Conversion helpers
|
||||||
|
# -------------------------
|
||||||
|
|
||||||
|
def _convert_module(self, obj: Object) -> Module:
|
||||||
|
module = Module(
|
||||||
|
path=obj.path,
|
||||||
|
docstring=self._safe_docstring(obj),
|
||||||
|
)
|
||||||
|
|
||||||
|
for name, member in obj.members.items():
|
||||||
|
if name.startswith("_"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
module.add_object(self._convert_object(member))
|
||||||
|
|
||||||
|
return module
|
||||||
|
|
||||||
|
def _convert_object(self, obj: Object) -> DocObject:
|
||||||
|
kind = obj.kind.value
|
||||||
|
signature = self._safe_signature(obj)
|
||||||
|
|
||||||
|
doc_obj = DocObject(
|
||||||
|
name=obj.name,
|
||||||
|
kind=kind,
|
||||||
|
path=obj.path,
|
||||||
|
signature=signature,
|
||||||
|
docstring=self._safe_docstring(obj),
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
for name, member in obj.members.items():
|
||||||
|
if name.startswith("_"):
|
||||||
|
continue
|
||||||
|
doc_obj.add_member(self._convert_object(member))
|
||||||
|
except AliasResolutionError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return doc_obj
|
||||||
|
|
||||||
|
# -------------------------
|
||||||
|
# Safe extractors
|
||||||
|
# -------------------------
|
||||||
|
|
||||||
|
def _safe_docstring(self, obj: Object) -> Optional[str]:
|
||||||
|
try:
|
||||||
|
return obj.docstring.value if obj.docstring else None
|
||||||
|
except AliasResolutionError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _safe_signature(self, obj: Object) -> Optional[str]:
|
||||||
|
try:
|
||||||
|
if hasattr(obj, "signature") and obj.signature:
|
||||||
|
return str(obj.signature)
|
||||||
|
except AliasResolutionError:
|
||||||
|
return None
|
||||||
|
return None
|
||||||
@@ -1,10 +1,18 @@
|
|||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from docforge.model import Module, Project
|
from docforge.models import Module, Project
|
||||||
|
|
||||||
|
|
||||||
|
def discover_module_paths(
|
||||||
|
module_name: str,
|
||||||
|
project_root: Path | None = None,
|
||||||
|
) -> List[str]:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
class GriffeLoader:
|
class GriffeLoader:
|
||||||
"""Griffe-based introspection loader.
|
"""Griffe-based introspection loaders.
|
||||||
|
|
||||||
This is the only supported introspection backend in doc-forge.
|
This is the only supported introspection backend in doc-forge.
|
||||||
"""
|
"""
|
||||||
@@ -15,6 +23,7 @@ class GriffeLoader:
|
|||||||
self,
|
self,
|
||||||
module_paths: List[str],
|
module_paths: List[str],
|
||||||
project_name: Optional[str] = ...,
|
project_name: Optional[str] = ...,
|
||||||
|
skip_import_errors: bool = ...,
|
||||||
) -> Project:
|
) -> Project:
|
||||||
"""Load a documentation project from Python modules."""
|
"""Load a documentation project from Python modules."""
|
||||||
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
"""
|
|
||||||
Core documentation model for doc-forge.
|
|
||||||
|
|
||||||
These classes form the renderer-agnostic, introspection-derived
|
|
||||||
representation of Python documentation.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from .project import Project
|
|
||||||
from .module import Module
|
|
||||||
from .object import DocObject
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"Project",
|
|
||||||
"Module",
|
|
||||||
"DocObject",
|
|
||||||
]
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from typing import Dict, Iterable, Optional
|
|
||||||
|
|
||||||
from docforge.model.object import DocObject
|
|
||||||
|
|
||||||
|
|
||||||
class Module:
|
|
||||||
"""Represents a documented Python module."""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
path: str,
|
|
||||||
docstring: Optional[str] = None,
|
|
||||||
) -> None:
|
|
||||||
self.path = path
|
|
||||||
self.docstring = docstring
|
|
||||||
self.members: Dict[str, DocObject] = {}
|
|
||||||
|
|
||||||
def add_object(self, obj: DocObject) -> None:
|
|
||||||
self.members[obj.name] = obj
|
|
||||||
|
|
||||||
def get_object(self, name: str) -> DocObject:
|
|
||||||
return self.members[name]
|
|
||||||
|
|
||||||
def get_all_objects(self) -> Iterable[DocObject]:
|
|
||||||
return self.members.values()
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from typing import Dict, Iterable, Optional
|
|
||||||
|
|
||||||
|
|
||||||
class DocObject:
|
|
||||||
"""Represents a documented Python object."""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
name: str,
|
|
||||||
kind: str,
|
|
||||||
path: str,
|
|
||||||
signature: Optional[str] = None,
|
|
||||||
docstring: Optional[str] = None,
|
|
||||||
) -> None:
|
|
||||||
self.name = name
|
|
||||||
self.kind = kind
|
|
||||||
self.path = path
|
|
||||||
self.signature = signature
|
|
||||||
self.docstring = docstring
|
|
||||||
self.members: Dict[str, DocObject] = {}
|
|
||||||
|
|
||||||
def add_member(self, obj: DocObject) -> None:
|
|
||||||
self.members[obj.name] = obj
|
|
||||||
|
|
||||||
def get_member(self, name: str) -> DocObject:
|
|
||||||
return self.members[name]
|
|
||||||
|
|
||||||
def get_all_members(self) -> Iterable[DocObject]:
|
|
||||||
return self.members.values()
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from typing import Dict, Iterable
|
|
||||||
|
|
||||||
from docforge.model.module import Module
|
|
||||||
|
|
||||||
|
|
||||||
class Project:
|
|
||||||
"""Represents a documentation project."""
|
|
||||||
|
|
||||||
def __init__(self, name: str) -> None:
|
|
||||||
self.name = name
|
|
||||||
self.modules: Dict[str, Module] = {}
|
|
||||||
|
|
||||||
def add_module(self, module: Module) -> None:
|
|
||||||
self.modules[module.path] = module
|
|
||||||
|
|
||||||
def get_module(self, path: str) -> Module:
|
|
||||||
return self.modules[path]
|
|
||||||
|
|
||||||
def get_all_modules(self) -> Iterable[Module]:
|
|
||||||
return self.modules.values()
|
|
||||||
|
|
||||||
def get_module_list(self) -> list[str]:
|
|
||||||
return list(self.modules.keys())
|
|
||||||
25
docforge/models/__init__.py
Normal file
25
docforge/models/__init__.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
"""
|
||||||
|
# Model Layer
|
||||||
|
|
||||||
|
The `docforge.models` package provides the core data structures used to represent
|
||||||
|
Python source code in a documentation-focused hierarchy.
|
||||||
|
|
||||||
|
## Key Components
|
||||||
|
|
||||||
|
- **Project**: The root container for all documented modules.
|
||||||
|
- **Module**: Represents a Python module or package, containing members.
|
||||||
|
- **DocObject**: A recursive structure for classes, functions, and attributes.
|
||||||
|
|
||||||
|
These classes are designed to be renderer-agnostic, allowing the same internal
|
||||||
|
representation to be transformed into various output formats (currently MkDocs).
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .project import Project
|
||||||
|
from .module import Module
|
||||||
|
from .object import DocObject
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"Project",
|
||||||
|
"Module",
|
||||||
|
"DocObject",
|
||||||
|
]
|
||||||
66
docforge/models/module.py
Normal file
66
docforge/models/module.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
"""
|
||||||
|
This module defines the Module class, which represents a Python module or package
|
||||||
|
in the doc-forge documentation models. It acts as a container for top-level
|
||||||
|
documented objects.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import Dict, Iterable, Optional
|
||||||
|
|
||||||
|
from docforge.models.object import DocObject
|
||||||
|
|
||||||
|
|
||||||
|
class Module:
|
||||||
|
"""
|
||||||
|
Represents a documented Python module or package.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
path: Dotted import path of the module.
|
||||||
|
docstring: Module-level docstring content.
|
||||||
|
members: Dictionary mapping object names to their DocObject representations.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
path: str,
|
||||||
|
docstring: Optional[str] = None,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Initialize a new Module.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The dotted path of the module.
|
||||||
|
docstring: The module's docstring, if any.
|
||||||
|
"""
|
||||||
|
self.path = path
|
||||||
|
self.docstring = docstring
|
||||||
|
self.members: Dict[str, DocObject] = {}
|
||||||
|
|
||||||
|
def add_object(self, obj: DocObject) -> None:
|
||||||
|
"""
|
||||||
|
Add a documented object to the module.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
obj: The object to add.
|
||||||
|
"""
|
||||||
|
self.members[obj.name] = obj
|
||||||
|
|
||||||
|
def get_object(self, name: str) -> DocObject:
|
||||||
|
"""
|
||||||
|
Retrieve a member object by name.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: The name of the object.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The requested DocObject.
|
||||||
|
"""
|
||||||
|
return self.members[name]
|
||||||
|
|
||||||
|
def get_all_objects(self) -> Iterable[DocObject]:
|
||||||
|
"""
|
||||||
|
Get all top-level objects in the module.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An iterable of DocObject instances.
|
||||||
|
"""
|
||||||
|
return self.members.values()
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
from typing import Dict, Iterable, Optional
|
from typing import Dict, Iterable, Optional
|
||||||
|
|
||||||
from docforge.model.object import DocObject
|
from docforge.models.object import DocObject
|
||||||
|
|
||||||
|
|
||||||
class Module:
|
class Module:
|
||||||
76
docforge/models/object.py
Normal file
76
docforge/models/object.py
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
"""
|
||||||
|
This module defines the DocObject class, the fundamental recursive unit of the
|
||||||
|
doc-forge documentation models. A DocObject represents a single Python entity
|
||||||
|
(class, function, method, or attribute) and its nested members.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import Dict, Iterable, Optional
|
||||||
|
|
||||||
|
|
||||||
|
class DocObject:
|
||||||
|
"""
|
||||||
|
Represents a documented Python object (class, function, method, etc.).
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
name: Local name of the object.
|
||||||
|
kind: Type of object (e.g., 'class', 'function', 'attribute').
|
||||||
|
path: Full dotted import path to the object.
|
||||||
|
signature: Callable signature, if applicable.
|
||||||
|
docstring: Raw docstring content extracted from the source.
|
||||||
|
members: Dictionary mapping member names to their DocObject representations.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
name: str,
|
||||||
|
kind: str,
|
||||||
|
path: str,
|
||||||
|
signature: Optional[str] = None,
|
||||||
|
docstring: Optional[str] = None,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Initialize a new DocObject.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: The local name of the object.
|
||||||
|
kind: The kind of object (e.g., 'class', 'function').
|
||||||
|
path: The full dotted path to the object.
|
||||||
|
signature: The object's signature (for callable objects).
|
||||||
|
docstring: The object's docstring, if any.
|
||||||
|
"""
|
||||||
|
self.name = name
|
||||||
|
self.kind = kind
|
||||||
|
self.path = path
|
||||||
|
self.signature = signature
|
||||||
|
self.docstring = docstring
|
||||||
|
self.members: Dict[str, 'DocObject'] = {}
|
||||||
|
|
||||||
|
def add_member(self, obj: 'DocObject') -> None:
|
||||||
|
"""
|
||||||
|
Add a child member to this object (e.g., a method to a class).
|
||||||
|
|
||||||
|
Args:
|
||||||
|
obj: The child DocObject to add.
|
||||||
|
"""
|
||||||
|
self.members[obj.name] = obj
|
||||||
|
|
||||||
|
def get_member(self, name: str) -> 'DocObject':
|
||||||
|
"""
|
||||||
|
Retrieve a child member by name.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: The name of the member.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The requested DocObject.
|
||||||
|
"""
|
||||||
|
return self.members[name]
|
||||||
|
|
||||||
|
def get_all_members(self) -> Iterable['DocObject']:
|
||||||
|
"""
|
||||||
|
Get all members of this object.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An iterable of child DocObject instances.
|
||||||
|
"""
|
||||||
|
return self.members.values()
|
||||||
67
docforge/models/project.py
Normal file
67
docforge/models/project.py
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
"""
|
||||||
|
This module defines the Project class, the top-level container for a documented
|
||||||
|
project. It aggregates multiple Module instances into a single named entity.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import Dict, Iterable
|
||||||
|
|
||||||
|
from docforge.models.module import Module
|
||||||
|
|
||||||
|
|
||||||
|
class Project:
|
||||||
|
"""
|
||||||
|
Represents a documentation project, serving as a container for modules.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
name: Name of the project.
|
||||||
|
modules: Dictionary mapping module paths to Module instances.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, name: str) -> None:
|
||||||
|
"""
|
||||||
|
Initialize a new Project.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: The name of the project.
|
||||||
|
"""
|
||||||
|
self.name = name
|
||||||
|
self.modules: Dict[str, Module] = {}
|
||||||
|
|
||||||
|
def add_module(self, module: Module) -> None:
|
||||||
|
"""
|
||||||
|
Add a module to the project.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module: The module to add.
|
||||||
|
"""
|
||||||
|
self.modules[module.path] = module
|
||||||
|
|
||||||
|
def get_module(self, path: str) -> Module:
|
||||||
|
"""
|
||||||
|
Retrieve a module by its dotted path.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The dotted path of the module (e.g., 'pkg.mod').
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The requested Module.
|
||||||
|
"""
|
||||||
|
return self.modules[path]
|
||||||
|
|
||||||
|
def get_all_modules(self) -> Iterable[Module]:
|
||||||
|
"""
|
||||||
|
Get all modules in the project.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An iterable of Module objects.
|
||||||
|
"""
|
||||||
|
return self.modules.values()
|
||||||
|
|
||||||
|
def get_module_list(self) -> list[str]:
|
||||||
|
"""
|
||||||
|
Get the list of all module dotted paths.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of module paths.
|
||||||
|
"""
|
||||||
|
return list(self.modules.keys())
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
from typing import Dict, Iterable
|
from typing import Dict, Iterable
|
||||||
|
|
||||||
from docforge.model.module import Module
|
from docforge.models.module import Module
|
||||||
|
|
||||||
|
|
||||||
class Project:
|
class Project:
|
||||||
27
docforge/nav/__init__.py
Normal file
27
docforge/nav/__init__.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
"""
|
||||||
|
# Navigation Layer
|
||||||
|
|
||||||
|
The `docforge.nav` package manages the mapping between the logical documentation
|
||||||
|
structure and the physical files on disk.
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
1. **Spec Definition**: Users define navigation intent in `docforge.nav.yml`.
|
||||||
|
2. **Resolution**: `resolve_nav` matches patterns in the spec to generated `.md` files.
|
||||||
|
3. **Emission**: `MkDocsNavEmitter` produces the final YAML structure for `mkdocs.yml`.
|
||||||
|
|
||||||
|
This abstraction allows doc-forge to support complex grouping and ordering
|
||||||
|
independently of the source code's physical layout.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .spec import NavSpec, load_nav_spec
|
||||||
|
from .resolver import ResolvedNav, resolve_nav
|
||||||
|
from .mkdocs import MkDocsNavEmitter
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"NavSpec",
|
||||||
|
"ResolvedNav",
|
||||||
|
"MkDocsNavEmitter",
|
||||||
|
"resolve_nav",
|
||||||
|
"load_nav_spec",
|
||||||
|
]
|
||||||
11
docforge/nav/__init__.pyi
Normal file
11
docforge/nav/__init__.pyi
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
from .spec import NavSpec, load_nav_spec
|
||||||
|
from .resolver import ResolvedNav, resolve_nav
|
||||||
|
from .mkdocs import MkDocsNavEmitter
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"NavSpec",
|
||||||
|
"ResolvedNav",
|
||||||
|
"MkDocsNavEmitter",
|
||||||
|
"resolve_nav",
|
||||||
|
"load_nav_spec",
|
||||||
|
]
|
||||||
72
docforge/nav/mkdocs.py
Normal file
72
docforge/nav/mkdocs.py
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
"""
|
||||||
|
This module provides the MkDocsNavEmitter, which converts a ResolvedNav instance
|
||||||
|
into the specific YAML-ready list structure expected by the MkDocs 'nav'
|
||||||
|
configuration.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import List, Dict, Any
|
||||||
|
|
||||||
|
from docforge.nav.resolver import ResolvedNav
|
||||||
|
|
||||||
|
|
||||||
|
class MkDocsNavEmitter:
|
||||||
|
"""
|
||||||
|
Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible
|
||||||
|
navigation structure.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def emit(self, nav: ResolvedNav) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Generate a list of navigation entries for mkdocs.yml.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
nav: The resolved navigation data.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of dictionary mappings representing the MkDocs navigation.
|
||||||
|
"""
|
||||||
|
result: List[Dict[str, Any]] = []
|
||||||
|
|
||||||
|
# Home entry (semantic path)
|
||||||
|
if nav.home:
|
||||||
|
result.append({"Home": nav.home})
|
||||||
|
|
||||||
|
# Group entries
|
||||||
|
for group, paths in nav.groups.items():
|
||||||
|
entries: List[str] = []
|
||||||
|
for p in paths:
|
||||||
|
# Convert filesystem path back to docs-relative path
|
||||||
|
rel_path = self._to_relative(p, nav._docs_root)
|
||||||
|
entries.append(rel_path)
|
||||||
|
result.append({group: entries})
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _to_relative(self, path: Path, docs_root: Path | None) -> str:
|
||||||
|
"""
|
||||||
|
Convert a filesystem path to a path relative to the documentation root.
|
||||||
|
This handles both absolute and relative filesystem paths, ensuring the
|
||||||
|
output is compatible with MkDocs navigation requirements.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The path to convert.
|
||||||
|
docs_root: The root directory for documentation.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A string representing the relative POSIX-style path.
|
||||||
|
"""
|
||||||
|
if docs_root and path.is_absolute():
|
||||||
|
try:
|
||||||
|
path = path.relative_to(docs_root.resolve())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
elif docs_root:
|
||||||
|
# Handle relative paths (e.g. starting with 'docs/')
|
||||||
|
path_str = path.as_posix()
|
||||||
|
docs_root_str = docs_root.as_posix()
|
||||||
|
if path_str.startswith(docs_root_str + "/"):
|
||||||
|
return path_str[len(docs_root_str) + 1:]
|
||||||
|
|
||||||
|
# Fallback for other cases
|
||||||
|
return path.as_posix().split("/docs/", 1)[-1]
|
||||||
34
docforge/nav/mkdocs.pyi
Normal file
34
docforge/nav/mkdocs.pyi
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
from typing import Dict, List, Any
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from docforge.nav.resolver import ResolvedNav
|
||||||
|
|
||||||
|
|
||||||
|
class MkDocsNavEmitter:
|
||||||
|
"""
|
||||||
|
Converts a ResolvedNav into MkDocs-compatible `nav` data.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def emit(self, nav: ResolvedNav) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Emit a structure suitable for insertion into mkdocs.yml.
|
||||||
|
|
||||||
|
Example return value:
|
||||||
|
|
||||||
|
[
|
||||||
|
{"Home": "openapi_first/index.md"},
|
||||||
|
{
|
||||||
|
"Core": [
|
||||||
|
{"OpenAPI-First App": "openapi_first/app.md"},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
def _to_relative(self, path: Path, docs_root: Path | None) -> str:
|
||||||
|
"""
|
||||||
|
Convert a filesystem path to a docs-relative path.
|
||||||
|
"""
|
||||||
|
...
|
||||||
112
docforge/nav/resolver.py
Normal file
112
docforge/nav/resolver.py
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
"""
|
||||||
|
This module contains the logic for resolving a NavSpec against the physical
|
||||||
|
filesystem. It expands globs and validates that all referenced documents
|
||||||
|
actually exist on disk.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, Iterable, List
|
||||||
|
|
||||||
|
import glob
|
||||||
|
|
||||||
|
from docforge.nav.spec import NavSpec
|
||||||
|
|
||||||
|
|
||||||
|
class ResolvedNav:
|
||||||
|
"""
|
||||||
|
Represents a navigation structure where all patterns and paths have been
|
||||||
|
resolved against the actual filesystem contents.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
home: Resolved relative path to the home page.
|
||||||
|
groups: Mapping of group titles to lists of absolute or relative Path objects.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
home: str | None,
|
||||||
|
groups: Dict[str, List[Path]],
|
||||||
|
docs_root: Path | None = None,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Initialize a ResolvedNav instance.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
home: The relative path to the project home page.
|
||||||
|
groups: A mapping of group names to their resolved filesystem paths.
|
||||||
|
docs_root: The root documentation directory.
|
||||||
|
"""
|
||||||
|
self.home = home
|
||||||
|
self.groups = groups
|
||||||
|
self._docs_root = docs_root
|
||||||
|
|
||||||
|
def all_files(self) -> Iterable[Path]:
|
||||||
|
"""
|
||||||
|
Get an iterable of all resolved files in the navigation structure.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An iterable of Path objects.
|
||||||
|
"""
|
||||||
|
if self.home:
|
||||||
|
if self._docs_root is None:
|
||||||
|
raise RuntimeError("docs_root is required to resolve home path")
|
||||||
|
yield self._docs_root / self.home
|
||||||
|
for paths in self.groups.values():
|
||||||
|
for p in paths:
|
||||||
|
yield p
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_nav(
|
||||||
|
spec: NavSpec,
|
||||||
|
docs_root: Path,
|
||||||
|
) -> ResolvedNav:
|
||||||
|
"""
|
||||||
|
Create a ResolvedNav by processing a NavSpec against the filesystem.
|
||||||
|
This expands globs and validates the existence of referenced files.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
spec: The navigation specification to resolve.
|
||||||
|
docs_root: The root directory for documentation files.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A ResolvedNav instance.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist.
|
||||||
|
"""
|
||||||
|
if not docs_root.exists():
|
||||||
|
raise FileNotFoundError(docs_root)
|
||||||
|
|
||||||
|
def resolve_pattern(pattern: str) -> List[Path]:
|
||||||
|
full = docs_root / pattern
|
||||||
|
matches = sorted(
|
||||||
|
Path(p) for p in glob.glob(str(full), recursive=True)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not matches:
|
||||||
|
raise FileNotFoundError(pattern)
|
||||||
|
|
||||||
|
return matches
|
||||||
|
|
||||||
|
# Resolve home
|
||||||
|
home: str | None = None
|
||||||
|
if spec.home:
|
||||||
|
home_path = docs_root / spec.home
|
||||||
|
if not home_path.exists():
|
||||||
|
raise FileNotFoundError(spec.home)
|
||||||
|
home = spec.home
|
||||||
|
|
||||||
|
# Resolve groups
|
||||||
|
resolved_groups: Dict[str, List[Path]] = {}
|
||||||
|
|
||||||
|
for group, patterns in spec.groups.items():
|
||||||
|
files: List[Path] = []
|
||||||
|
for pattern in patterns:
|
||||||
|
files.extend(resolve_pattern(pattern))
|
||||||
|
resolved_groups[group] = files
|
||||||
|
|
||||||
|
return ResolvedNav(
|
||||||
|
home=home,
|
||||||
|
groups=resolved_groups,
|
||||||
|
docs_root=docs_root,
|
||||||
|
)
|
||||||
51
docforge/nav/resolver.pyi
Normal file
51
docforge/nav/resolver.pyi
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List, Iterable, Optional
|
||||||
|
|
||||||
|
from docforge.nav.spec import NavSpec
|
||||||
|
|
||||||
|
|
||||||
|
class ResolvedNav:
|
||||||
|
"""
|
||||||
|
Fully-resolved navigation tree.
|
||||||
|
|
||||||
|
- `home` is a semantic, docs-root–relative path (string)
|
||||||
|
- `groups` contain resolved filesystem Paths
|
||||||
|
- Order is preserved
|
||||||
|
"""
|
||||||
|
|
||||||
|
home: Optional[str]
|
||||||
|
groups: Dict[str, List[Path]]
|
||||||
|
_docs_root: Optional[Path]
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
home: str | None,
|
||||||
|
groups: Dict[str, List[Path]],
|
||||||
|
docs_root: Path | None = ...,
|
||||||
|
) -> None: ...
|
||||||
|
|
||||||
|
def all_files(self) -> Iterable[Path]:
|
||||||
|
"""
|
||||||
|
Return all resolved documentation files in nav order.
|
||||||
|
|
||||||
|
Includes the home file (resolved against docs_root)
|
||||||
|
followed by all group files.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_nav(
|
||||||
|
spec: NavSpec,
|
||||||
|
docs_root: Path,
|
||||||
|
) -> ResolvedNav:
|
||||||
|
"""
|
||||||
|
Resolve a NavSpec against a docs directory.
|
||||||
|
|
||||||
|
Expands wildcards, validates existence, and
|
||||||
|
resolves filesystem paths relative to docs_root.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FileNotFoundError: if any referenced file is missing
|
||||||
|
ValueError: if resolution fails
|
||||||
|
"""
|
||||||
|
...
|
||||||
114
docforge/nav/spec.py
Normal file
114
docforge/nav/spec.py
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
"""
|
||||||
|
This module defines the NavSpec class, which represents the user's intent for
|
||||||
|
documentation navigation as defined in a YAML specification (usually
|
||||||
|
docforge.nav.yml).
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
|
class NavSpec:
|
||||||
|
"""
|
||||||
|
Parsed representation of the docforge navigation specification file.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
home: Path to the home document (e.g., 'index.md').
|
||||||
|
groups: Mapping of group titles to lists of path patterns/globs.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
home: Optional[str],
|
||||||
|
groups: Dict[str, List[str]],
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Initialize a NavSpec.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
home: The path to the home document.
|
||||||
|
groups: A mapping of group names to lists of path patterns (globs).
|
||||||
|
"""
|
||||||
|
self.home = home
|
||||||
|
self.groups = groups
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def load(cls, path: Path) -> "NavSpec":
|
||||||
|
"""
|
||||||
|
Load a NavSpec from a YAML file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The filesystem path to the YAML file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A NavSpec instance.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FileNotFoundError: If the path does not exist.
|
||||||
|
ValueError: If the file content is not a valid NavSpec mapping.
|
||||||
|
"""
|
||||||
|
if not path.exists():
|
||||||
|
raise FileNotFoundError(path)
|
||||||
|
|
||||||
|
data = yaml.safe_load(path.read_text(encoding="utf-8"))
|
||||||
|
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
raise ValueError("Nav spec must be a mapping")
|
||||||
|
|
||||||
|
home = data.get("home")
|
||||||
|
groups = data.get("groups", {})
|
||||||
|
|
||||||
|
if home is not None and not isinstance(home, str):
|
||||||
|
raise ValueError("home must be a string")
|
||||||
|
|
||||||
|
if not isinstance(groups, dict):
|
||||||
|
raise ValueError("groups must be a mapping")
|
||||||
|
|
||||||
|
for key, value in groups.items():
|
||||||
|
if not isinstance(key, str):
|
||||||
|
raise ValueError("group names must be strings")
|
||||||
|
if not isinstance(value, list) or not all(
|
||||||
|
isinstance(v, str) for v in value
|
||||||
|
):
|
||||||
|
raise ValueError(f"group '{key}' must be a list of strings")
|
||||||
|
|
||||||
|
return cls(home=home, groups=groups)
|
||||||
|
|
||||||
|
def all_patterns(self) -> List[str]:
|
||||||
|
"""
|
||||||
|
Get all path patterns referenced in the specification.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of all patterns (home plus all groups).
|
||||||
|
"""
|
||||||
|
patterns: List[str] = []
|
||||||
|
if self.home:
|
||||||
|
patterns.append(self.home)
|
||||||
|
for items in self.groups.values():
|
||||||
|
patterns.extend(items)
|
||||||
|
return patterns
|
||||||
|
|
||||||
|
|
||||||
|
def load_nav_spec(path: Path) -> NavSpec:
|
||||||
|
"""
|
||||||
|
Utility function to load a NavSpec from a file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: Path to the navigation specification file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A loaded NavSpec instance.
|
||||||
|
"""
|
||||||
|
if not path.exists():
|
||||||
|
raise FileNotFoundError(path)
|
||||||
|
|
||||||
|
data = yaml.safe_load(path.read_text(encoding="utf-8"))
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
raise ValueError("Nav spec must be a YAML mapping")
|
||||||
|
|
||||||
|
return NavSpec(
|
||||||
|
home=data.get("home"),
|
||||||
|
groups=data.get("groups", {}),
|
||||||
|
)
|
||||||
42
docforge/nav/spec.pyi
Normal file
42
docforge/nav/spec.pyi
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
|
|
||||||
|
class NavSpec:
|
||||||
|
"""
|
||||||
|
Parsed representation of `docforge.nav.yml`.
|
||||||
|
|
||||||
|
This object represents *semantic intent* and is independent
|
||||||
|
of filesystem structure or MkDocs specifics.
|
||||||
|
"""
|
||||||
|
|
||||||
|
home: Optional[str]
|
||||||
|
groups: Dict[str, List[str]]
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
home: Optional[str],
|
||||||
|
groups: Dict[str, List[str]],
|
||||||
|
) -> None:
|
||||||
|
...
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def load(cls, path: Path) -> "NavSpec":
|
||||||
|
"""
|
||||||
|
Load and validate a nav specification from YAML.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FileNotFoundError: if the file does not exist
|
||||||
|
ValueError: if the schema is invalid
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
def all_patterns(self) -> List[str]:
|
||||||
|
"""
|
||||||
|
Return all path patterns referenced by the spec
|
||||||
|
(including home and group entries).
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def load_nav_spec(path: Path) -> NavSpec: ...
|
||||||
@@ -1,5 +1,26 @@
|
|||||||
from .mkdocs import MkDocsRenderer
|
"""
|
||||||
|
# Renderers Layer
|
||||||
|
|
||||||
|
The `docforge.renderers` package handles the transformation of the internal
|
||||||
|
documentation models into physical files formatted for specific documentation
|
||||||
|
engines.
|
||||||
|
|
||||||
|
## Current Implementations
|
||||||
|
|
||||||
|
- **MkDocsRenderer**: Generates Markdown files utilizing the `mkdocstrings`
|
||||||
|
syntax. It automatically handles package/module hierarchy and generates
|
||||||
|
`index.md` files for packages.
|
||||||
|
|
||||||
|
## Extending
|
||||||
|
|
||||||
|
To add a new renderer, implement the `DocRenderer` protocol defined in
|
||||||
|
`docforge.renderers.base`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .mkdocs_renderer import MkDocsRenderer
|
||||||
|
from .mcp_renderer import MCPRenderer
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"MkDocsRenderer",
|
"MkDocsRenderer",
|
||||||
|
"MCPRenderer",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
from .mkdocs import MkDocsRenderer
|
from .mkdocs_renderer import MkDocsRenderer
|
||||||
|
from .mcp_renderer import MCPRenderer
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"MkDocsRenderer",
|
"MkDocsRenderer",
|
||||||
|
"MCPRenderer",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,13 +1,46 @@
|
|||||||
from __future__ import annotations
|
"""
|
||||||
|
This module defines the base interfaces and configuration containers for
|
||||||
|
doc-forge renderers. All renderer implementations should adhere to the
|
||||||
|
DocRenderer protocol.
|
||||||
|
"""
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import Protocol
|
||||||
|
|
||||||
from docforge.model import Project
|
from docforge.models import Project
|
||||||
|
|
||||||
|
|
||||||
class RendererConfig:
|
class RendererConfig:
|
||||||
"""Renderer configuration container."""
|
"""
|
||||||
|
Configuration container for documentation renderers.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
out_dir: The directory where documentation files should be written.
|
||||||
|
project: The introspected project models to be rendered.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, out_dir: Path, project: Project) -> None:
|
def __init__(self, out_dir: Path, project: Project) -> None:
|
||||||
self.out_dir = out_dir
|
self.out_dir = out_dir
|
||||||
self.project = project
|
self.project = project
|
||||||
|
|
||||||
|
|
||||||
|
class DocRenderer(Protocol):
|
||||||
|
"""
|
||||||
|
Protocol defining the interface for documentation renderers.
|
||||||
|
"""
|
||||||
|
|
||||||
|
name: str
|
||||||
|
|
||||||
|
def generate_sources(
|
||||||
|
self,
|
||||||
|
project: Project,
|
||||||
|
out_dir: Path,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Generate renderer-specific source files for the given project.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
project: The project models containing modules and objects.
|
||||||
|
out_dir: Target directory for the generated files.
|
||||||
|
"""
|
||||||
|
...
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Protocol
|
from typing import Protocol
|
||||||
|
|
||||||
from docforge.model import Project
|
from docforge.models import Project
|
||||||
|
|
||||||
|
|
||||||
class RendererConfig:
|
class RendererConfig:
|
||||||
|
|||||||
102
docforge/renderers/mcp_renderer.py
Normal file
102
docforge/renderers/mcp_renderer.py
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List
|
||||||
|
|
||||||
|
from docforge.models import Project, Module, DocObject
|
||||||
|
|
||||||
|
|
||||||
|
class MCPRenderer:
|
||||||
|
"""
|
||||||
|
Renderer that emits MCP-native JSON resources from docforge models.
|
||||||
|
"""
|
||||||
|
|
||||||
|
name = "mcp"
|
||||||
|
|
||||||
|
def generate_sources(self, project: Project, out_dir: Path) -> None:
|
||||||
|
"""
|
||||||
|
Generate MCP-compatible JSON resources and navigation for the project.
|
||||||
|
"""
|
||||||
|
modules_dir = out_dir / "modules"
|
||||||
|
modules_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
nav: List[Dict[str, str]] = []
|
||||||
|
|
||||||
|
for module in project.get_all_modules():
|
||||||
|
self._write_module(module, modules_dir)
|
||||||
|
|
||||||
|
nav.append({
|
||||||
|
"module": module.path,
|
||||||
|
"resource": f"doc://modules/{module.path}",
|
||||||
|
})
|
||||||
|
|
||||||
|
# Write nav.json
|
||||||
|
(out_dir / "nav.json").write_text(
|
||||||
|
self._json(nav),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Write index.json
|
||||||
|
index = {
|
||||||
|
"project": project.name,
|
||||||
|
"type": "docforge-model",
|
||||||
|
"modules_count": len(nav),
|
||||||
|
"source": "docforge",
|
||||||
|
}
|
||||||
|
|
||||||
|
(out_dir / "index.json").write_text(
|
||||||
|
self._json(index),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
def _write_module(self, module: Module, modules_dir: Path) -> None:
|
||||||
|
"""
|
||||||
|
Serialize a module into an MCP JSON resource.
|
||||||
|
"""
|
||||||
|
payload = {
|
||||||
|
"module": module.path,
|
||||||
|
"content": self._render_module(module),
|
||||||
|
}
|
||||||
|
|
||||||
|
out = modules_dir / f"{module.path}.json"
|
||||||
|
out.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
out.write_text(self._json(payload), encoding="utf-8")
|
||||||
|
|
||||||
|
def _render_module(self, module: Module) -> Dict:
|
||||||
|
"""
|
||||||
|
Render a Module into MCP-friendly structured data.
|
||||||
|
"""
|
||||||
|
data: Dict = {
|
||||||
|
"path": module.path,
|
||||||
|
"docstring": module.docstring,
|
||||||
|
"objects": {},
|
||||||
|
}
|
||||||
|
|
||||||
|
for obj in module.get_all_objects():
|
||||||
|
data["objects"][obj.name] = self._render_object(obj)
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
def _render_object(self, obj: DocObject) -> Dict:
|
||||||
|
"""
|
||||||
|
Recursively render a DocObject into structured MCP data.
|
||||||
|
"""
|
||||||
|
data: Dict = {
|
||||||
|
"name": obj.name,
|
||||||
|
"kind": obj.kind,
|
||||||
|
"path": obj.path,
|
||||||
|
"signature": obj.signature,
|
||||||
|
"docstring": obj.docstring,
|
||||||
|
}
|
||||||
|
|
||||||
|
members = list(obj.get_all_members())
|
||||||
|
if members:
|
||||||
|
data["members"] = {
|
||||||
|
member.name: self._render_object(member)
|
||||||
|
for member in members
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _json(data: Dict) -> str:
|
||||||
|
return json.dumps(data, indent=2, ensure_ascii=False)
|
||||||
26
docforge/renderers/mcp_renderer.pyi
Normal file
26
docforge/renderers/mcp_renderer.pyi
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List
|
||||||
|
|
||||||
|
from docforge.models import Project, Module, DocObject
|
||||||
|
|
||||||
|
|
||||||
|
class MCPRenderer:
|
||||||
|
"""Renderer that emits MCP-native JSON resources from docforge models."""
|
||||||
|
|
||||||
|
name: str
|
||||||
|
|
||||||
|
def generate_sources(self, project: Project, out_dir: Path) -> None:
|
||||||
|
"""Generate MCP-compatible JSON resources and navigation for the project."""
|
||||||
|
|
||||||
|
def _write_module(self, module: Module, modules_dir: Path) -> None:
|
||||||
|
"""Serialize a module into an MCP JSON resource."""
|
||||||
|
|
||||||
|
def _render_module(self, module: Module) -> Dict:
|
||||||
|
"""Render a Module into MCP-friendly structured data."""
|
||||||
|
|
||||||
|
def _render_object(self, obj: DocObject) -> Dict:
|
||||||
|
"""Recursively render a DocObject into structured MCP data."""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _json(data: Dict) -> str:
|
||||||
|
"""Serialize structured data to formatted JSON."""
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from docforge.model import Project
|
|
||||||
|
|
||||||
|
|
||||||
class MkDocsRenderer:
|
|
||||||
"""MkDocs source generator using mkdocstrings."""
|
|
||||||
|
|
||||||
name = "mkdocs"
|
|
||||||
|
|
||||||
def generate_sources(self, project: Project, out_dir: Path) -> None:
|
|
||||||
"""
|
|
||||||
Generate Markdown files with mkdocstrings directives.
|
|
||||||
|
|
||||||
Structure rules:
|
|
||||||
- Each top-level package gets a directory
|
|
||||||
- Modules become .md files
|
|
||||||
- Packages (__init__) become index.md
|
|
||||||
"""
|
|
||||||
for module in project.get_all_modules():
|
|
||||||
self._write_module(project, module, out_dir)
|
|
||||||
|
|
||||||
# -------------------------
|
|
||||||
# Internal helpers
|
|
||||||
# -------------------------
|
|
||||||
|
|
||||||
def _write_module(self, project: Project, module, out_dir: Path) -> None:
|
|
||||||
parts = module.path.split(".")
|
|
||||||
|
|
||||||
# Root package directory
|
|
||||||
pkg_dir = out_dir / parts[0]
|
|
||||||
pkg_dir.mkdir(parents=True, exist_ok=True)
|
|
||||||
|
|
||||||
# Package (__init__.py) → index.md
|
|
||||||
if module.path == parts[0]:
|
|
||||||
md_path = pkg_dir / "index.md"
|
|
||||||
title = parts[0].replace("_", " ").title()
|
|
||||||
else:
|
|
||||||
# Submodule → <name>.md
|
|
||||||
md_path = pkg_dir / f"{parts[-1]}.md"
|
|
||||||
title = parts[-1].replace("_", " ").title()
|
|
||||||
|
|
||||||
content = self._render_markdown(title, module.path)
|
|
||||||
|
|
||||||
# Idempotent write
|
|
||||||
if md_path.exists():
|
|
||||||
if md_path.read_text(encoding="utf-8") == content:
|
|
||||||
return
|
|
||||||
|
|
||||||
md_path.write_text(content, encoding="utf-8")
|
|
||||||
|
|
||||||
def _render_markdown(self, title: str, module_path: str) -> str:
|
|
||||||
return (
|
|
||||||
f"# {title}\n\n"
|
|
||||||
f"::: {module_path}\n"
|
|
||||||
)
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from docforge.model import Project
|
|
||||||
from docforge.renderers.base import DocRenderer
|
|
||||||
|
|
||||||
|
|
||||||
class MkDocsRenderer:
|
|
||||||
"""MkDocs source generator using mkdocstrings."""
|
|
||||||
|
|
||||||
name: str
|
|
||||||
|
|
||||||
def generate_sources(
|
|
||||||
self,
|
|
||||||
project: Project,
|
|
||||||
out_dir: Path,
|
|
||||||
) -> None:
|
|
||||||
"""Generate Markdown files with mkdocstrings directives."""
|
|
||||||
91
docforge/renderers/mkdocs_renderer.py
Normal file
91
docforge/renderers/mkdocs_renderer.py
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
"""
|
||||||
|
This module implements the MkDocsRenderer, which generates Markdown source files
|
||||||
|
compatible with the MkDocs 'material' theme and 'mkdocstrings' extension.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from docforge.models import Project
|
||||||
|
|
||||||
|
|
||||||
|
class MkDocsRenderer:
|
||||||
|
"""
|
||||||
|
Renderer that generates Markdown source files formatted for the MkDocs
|
||||||
|
'mkdocstrings' plugin.
|
||||||
|
"""
|
||||||
|
|
||||||
|
name = "mkdocs"
|
||||||
|
|
||||||
|
def generate_sources(self, project: Project, out_dir: Path) -> None:
|
||||||
|
"""
|
||||||
|
Produce a set of Markdown files in the output directory based on the
|
||||||
|
provided Project models.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
project: The project models to render.
|
||||||
|
out_dir: Target directory for documentation files.
|
||||||
|
"""
|
||||||
|
modules = list(project.get_all_modules())
|
||||||
|
paths = {m.path for m in modules}
|
||||||
|
|
||||||
|
# Package detection (level-agnostic)
|
||||||
|
packages = {
|
||||||
|
p for p in paths
|
||||||
|
if any(other.startswith(p + ".") for other in paths)
|
||||||
|
}
|
||||||
|
|
||||||
|
for module in modules:
|
||||||
|
self._write_module(module, packages, out_dir)
|
||||||
|
|
||||||
|
# -------------------------
|
||||||
|
# Internal helpers
|
||||||
|
# -------------------------
|
||||||
|
def _write_module(self, module, packages: set[str], out_dir: Path) -> None:
|
||||||
|
"""
|
||||||
|
Write a single module's documentation file. Packages are written as
|
||||||
|
'index.md' inside their respective directories.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module: The module to write.
|
||||||
|
packages: A set of module paths that are identified as packages.
|
||||||
|
out_dir: The base output directory.
|
||||||
|
"""
|
||||||
|
parts = module.path.split(".")
|
||||||
|
|
||||||
|
if module.path in packages:
|
||||||
|
# package → index.md
|
||||||
|
dir_path = out_dir.joinpath(*parts)
|
||||||
|
dir_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
md_path = dir_path / "index.md"
|
||||||
|
title = parts[-1].replace("_", " ").title()
|
||||||
|
else:
|
||||||
|
# leaf module → <name>.md
|
||||||
|
dir_path = out_dir.joinpath(*parts[:-1])
|
||||||
|
dir_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
md_path = dir_path / f"{parts[-1]}.md"
|
||||||
|
title = parts[-1].replace("_", " ").title()
|
||||||
|
|
||||||
|
content = self._render_markdown(title, module.path)
|
||||||
|
|
||||||
|
if md_path.exists() and md_path.read_text(encoding="utf-8") == content:
|
||||||
|
return
|
||||||
|
|
||||||
|
md_path.write_text(content, encoding="utf-8")
|
||||||
|
|
||||||
|
def _render_markdown(self, title: str, module_path: str) -> str:
|
||||||
|
"""
|
||||||
|
Generate the Markdown content for a module file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
title: The display title for the page.
|
||||||
|
module_path: The dotted path of the module to document.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A string containing the Markdown source.
|
||||||
|
"""
|
||||||
|
return (
|
||||||
|
f"# {title}\n\n"
|
||||||
|
f"::: {module_path}\n"
|
||||||
|
)
|
||||||
17
docforge/renderers/mkdocs_renderer.pyi
Normal file
17
docforge/renderers/mkdocs_renderer.pyi
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import Set
|
||||||
|
|
||||||
|
from docforge.models import Project, Module
|
||||||
|
|
||||||
|
|
||||||
|
class MkDocsRenderer:
|
||||||
|
name: str
|
||||||
|
|
||||||
|
def generate_sources(self, project: Project, out_dir: Path) -> None: ...
|
||||||
|
def _write_module(
|
||||||
|
self,
|
||||||
|
module: Module,
|
||||||
|
packages: Set[str],
|
||||||
|
out_dir: Path,
|
||||||
|
) -> None: ...
|
||||||
|
def _render_markdown(self, title: str, module_path: str) -> str: ...
|
||||||
5
docforge/servers/__init__.py
Normal file
5
docforge/servers/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
from .mcp_server import MCPServer
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"MCPServer",
|
||||||
|
]
|
||||||
5
docforge/servers/__init__.pyi
Normal file
5
docforge/servers/__init__.pyi
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
from .mcp_server import MCPServer
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"MCPServer",
|
||||||
|
]
|
||||||
73
docforge/servers/mcp_server.py
Normal file
73
docforge/servers/mcp_server.py
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any, Literal
|
||||||
|
|
||||||
|
from mcp.server.fastmcp import FastMCP
|
||||||
|
|
||||||
|
|
||||||
|
class MCPServer:
|
||||||
|
"""
|
||||||
|
MCP server for serving a pre-built MCP documentation bundle.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, mcp_root: Path, name: str) -> None:
|
||||||
|
self.mcp_root = mcp_root
|
||||||
|
self.app = FastMCP(name)
|
||||||
|
|
||||||
|
self._register_resources()
|
||||||
|
self._register_tools()
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# Internal helpers
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _read_json(self, path: Path) -> Any:
|
||||||
|
if not path.exists():
|
||||||
|
return {
|
||||||
|
"error": "not_found",
|
||||||
|
"path": str(path),
|
||||||
|
}
|
||||||
|
return json.loads(path.read_text(encoding="utf-8"))
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# MCP resources
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _register_resources(self) -> None:
|
||||||
|
@self.app.resource("docs://index")
|
||||||
|
def index():
|
||||||
|
return self._read_json(self.mcp_root / "index.json")
|
||||||
|
|
||||||
|
@self.app.resource("docs://nav")
|
||||||
|
def nav():
|
||||||
|
return self._read_json(self.mcp_root / "nav.json")
|
||||||
|
|
||||||
|
@self.app.resource("docs://modules/{module}")
|
||||||
|
def module(module: str):
|
||||||
|
return self._read_json(
|
||||||
|
self.mcp_root / "modules" / f"{module}.json"
|
||||||
|
)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# MCP tools (optional / diagnostic)
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _register_tools(self) -> None:
|
||||||
|
@self.app.tool()
|
||||||
|
def ping() -> str:
|
||||||
|
return "pong"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# Server lifecycle
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
def run(self, transport: Literal["stdio", "sse", "streamable-http"] = "streamable-http") -> None:
|
||||||
|
"""
|
||||||
|
Start the MCP server.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
transport: MCP transport (default: streamable-http)
|
||||||
|
"""
|
||||||
|
self.app.run(transport=transport)
|
||||||
22
docforge/servers/mcp_server.pyi
Normal file
22
docforge/servers/mcp_server.pyi
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import Literal, Any
|
||||||
|
|
||||||
|
from mcp.server.fastmcp import FastMCP
|
||||||
|
|
||||||
|
|
||||||
|
class MCPServer:
|
||||||
|
"""MCP server for serving documentation."""
|
||||||
|
|
||||||
|
mcp_root: Path
|
||||||
|
app: FastMCP
|
||||||
|
|
||||||
|
def __init__(self, mcp_root: Path, name: str) -> None: ...
|
||||||
|
|
||||||
|
def _read_json(self, path: Path) -> Any: ...
|
||||||
|
|
||||||
|
def _register_resources(self) -> None: ...
|
||||||
|
|
||||||
|
def _register_tools(self) -> None: ...
|
||||||
|
|
||||||
|
def run(self, transport: Literal["stdio", "sse", "streamable-http"] = ...) -> None:
|
||||||
|
"""Start the MCP server."""
|
||||||
33
docforge/templates/mkdocs.sample.yml
Normal file
33
docforge/templates/mkdocs.sample.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
theme:
|
||||||
|
name: material
|
||||||
|
palette:
|
||||||
|
- scheme: slate
|
||||||
|
primary: deep purple
|
||||||
|
accent: cyan
|
||||||
|
font:
|
||||||
|
text: Inter
|
||||||
|
code: JetBrains Mono
|
||||||
|
features:
|
||||||
|
- navigation.tabs
|
||||||
|
- navigation.expand
|
||||||
|
- navigation.top
|
||||||
|
- navigation.instant
|
||||||
|
- content.code.copy
|
||||||
|
- content.code.annotate
|
||||||
|
|
||||||
|
plugins:
|
||||||
|
- search
|
||||||
|
- mkdocstrings:
|
||||||
|
handlers:
|
||||||
|
python:
|
||||||
|
paths: ["."]
|
||||||
|
options:
|
||||||
|
docstring_style: google
|
||||||
|
show_source: false
|
||||||
|
show_signature_annotations: true
|
||||||
|
separate_signature: true
|
||||||
|
merge_init_into_class: true
|
||||||
|
inherited_members: true
|
||||||
|
annotations_path: brief
|
||||||
|
show_root_heading: true
|
||||||
|
group_by_category: true
|
||||||
3
docs/docforge/cli/index.md
Normal file
3
docs/docforge/cli/index.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Cli
|
||||||
|
|
||||||
|
::: docforge.cli
|
||||||
3
docs/docforge/cli/main.md
Normal file
3
docs/docforge/cli/main.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Main
|
||||||
|
|
||||||
|
::: docforge.cli.main
|
||||||
3
docs/docforge/cli/mkdocs.md
Normal file
3
docs/docforge/cli/mkdocs.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Mkdocs
|
||||||
|
|
||||||
|
::: docforge.cli.mkdocs
|
||||||
3
docs/docforge/index.md
Normal file
3
docs/docforge/index.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Docforge
|
||||||
|
|
||||||
|
::: docforge
|
||||||
3
docs/docforge/loaders/griffe_loader.md
Normal file
3
docs/docforge/loaders/griffe_loader.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Griffe Loader
|
||||||
|
|
||||||
|
::: docforge.loaders.griffe_loader
|
||||||
3
docs/docforge/loaders/index.md
Normal file
3
docs/docforge/loaders/index.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Loaders
|
||||||
|
|
||||||
|
::: docforge.loaders
|
||||||
3
docs/docforge/models/index.md
Normal file
3
docs/docforge/models/index.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Models
|
||||||
|
|
||||||
|
::: docforge.models
|
||||||
3
docs/docforge/models/module.md
Normal file
3
docs/docforge/models/module.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Module
|
||||||
|
|
||||||
|
::: docforge.models.module
|
||||||
3
docs/docforge/models/object.md
Normal file
3
docs/docforge/models/object.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Object
|
||||||
|
|
||||||
|
::: docforge.models.object
|
||||||
3
docs/docforge/models/project.md
Normal file
3
docs/docforge/models/project.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Project
|
||||||
|
|
||||||
|
::: docforge.models.project
|
||||||
3
docs/docforge/nav/index.md
Normal file
3
docs/docforge/nav/index.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Nav
|
||||||
|
|
||||||
|
::: docforge.nav
|
||||||
3
docs/docforge/nav/mkdocs.md
Normal file
3
docs/docforge/nav/mkdocs.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Mkdocs
|
||||||
|
|
||||||
|
::: docforge.nav.mkdocs
|
||||||
3
docs/docforge/nav/resolver.md
Normal file
3
docs/docforge/nav/resolver.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Resolver
|
||||||
|
|
||||||
|
::: docforge.nav.resolver
|
||||||
3
docs/docforge/nav/spec.md
Normal file
3
docs/docforge/nav/spec.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Spec
|
||||||
|
|
||||||
|
::: docforge.nav.spec
|
||||||
3
docs/docforge/renderers/base.md
Normal file
3
docs/docforge/renderers/base.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Base
|
||||||
|
|
||||||
|
::: docforge.renderers.base
|
||||||
3
docs/docforge/renderers/index.md
Normal file
3
docs/docforge/renderers/index.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Renderers
|
||||||
|
|
||||||
|
::: docforge.renderers
|
||||||
3
docs/docforge/renderers/mcp_renderer.md
Normal file
3
docs/docforge/renderers/mcp_renderer.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Mcp Renderer
|
||||||
|
|
||||||
|
::: docforge.renderers.mcp_renderer
|
||||||
3
docs/docforge/renderers/mkdocs_renderer.md
Normal file
3
docs/docforge/renderers/mkdocs_renderer.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Mkdocs Renderer
|
||||||
|
|
||||||
|
::: docforge.renderers.mkdocs_renderer
|
||||||
6
mcp_docs/index.json
Normal file
6
mcp_docs/index.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"project": "docforge",
|
||||||
|
"type": "docforge-model",
|
||||||
|
"modules_count": 20,
|
||||||
|
"source": "docforge"
|
||||||
|
}
|
||||||
280
mcp_docs/modules/docforge.cli.json
Normal file
280
mcp_docs/modules/docforge.cli.json
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.cli",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.cli",
|
||||||
|
"docstring": "# CLI Layer\n\nThe `docforge.cli` package provides the command-line interface for interacting\nwith doc-forge.\n\n## Available Commands\n\n- **tree**: Visualize the introspected project structure.\n- **generate**: Create Markdown source files from Python code.\n- **mkdocs**: Generate the primary `mkdocs.yml` configuration.\n- **build**: Build the final documentation site.\n- **serve**: Launch a local development server with live-reloading.",
|
||||||
|
"objects": {
|
||||||
|
"main": {
|
||||||
|
"name": "main",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.cli.main",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "Main entry point for the doc-forge CLI. This module defines the core command\ngroup and the 'tree', 'generate', 'build', and 'serve' commands.",
|
||||||
|
"members": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Sequence": {
|
||||||
|
"name": "Sequence",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.Sequence",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Sequence', 'typing.Sequence')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"click": {
|
||||||
|
"name": "click",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.click",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('click', 'click')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"GriffeLoader": {
|
||||||
|
"name": "GriffeLoader",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.main.GriffeLoader",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('GriffeLoader', 'docforge.loaders.GriffeLoader')>",
|
||||||
|
"docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.",
|
||||||
|
"members": {
|
||||||
|
"load_project": {
|
||||||
|
"name": "load_project",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.GriffeLoader.load_project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_project', 'docforge.loaders.griffe_loader.GriffeLoader.load_project')>",
|
||||||
|
"docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules."
|
||||||
|
},
|
||||||
|
"load_module": {
|
||||||
|
"name": "load_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.GriffeLoader.load_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_module', 'docforge.loaders.griffe_loader.GriffeLoader.load_module')>",
|
||||||
|
"docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"discover_module_paths": {
|
||||||
|
"name": "discover_module_paths",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.discover_module_paths",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('discover_module_paths', 'docforge.loaders.discover_module_paths')>",
|
||||||
|
"docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths."
|
||||||
|
},
|
||||||
|
"MkDocsRenderer": {
|
||||||
|
"name": "MkDocsRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.main.MkDocsRenderer",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MkDocsRenderer', 'docforge.renderers.MkDocsRenderer')>",
|
||||||
|
"docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.cli.main.MkDocsRenderer.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.renderers.mkdocs_renderer.MkDocsRenderer.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.MkDocsRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('generate_sources', 'docforge.renderers.mkdocs_renderer.MkDocsRenderer.generate_sources')>",
|
||||||
|
"docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MCPRenderer": {
|
||||||
|
"name": "MCPRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.main.MCPRenderer",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MCPRenderer', 'docforge.renderers.MCPRenderer')>",
|
||||||
|
"docstring": "Renderer that emits MCP-native JSON resources from docforge models.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.cli.main.MCPRenderer.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.renderers.mcp_renderer.MCPRenderer.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.MCPRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('generate_sources', 'docforge.renderers.mcp_renderer.MCPRenderer.generate_sources')>",
|
||||||
|
"docstring": "Generate MCP-compatible JSON resources and navigation for the project."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mkdocs_cmd": {
|
||||||
|
"name": "mkdocs_cmd",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.mkdocs_cmd",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('mkdocs_cmd', 'docforge.cli.mkdocs.mkdocs_cmd')>",
|
||||||
|
"docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site."
|
||||||
|
},
|
||||||
|
"cli": {
|
||||||
|
"name": "cli",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.cli",
|
||||||
|
"signature": "<bound method Function.signature of Function('cli', 16, 22)>",
|
||||||
|
"docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation."
|
||||||
|
},
|
||||||
|
"tree": {
|
||||||
|
"name": "tree",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.tree",
|
||||||
|
"signature": "<bound method Function.signature of Function('tree', 31, 62)>",
|
||||||
|
"docstring": "Visualize the project structure including modules and their members.\n\nArgs:\n modules: List of module paths to introspect.\n project_name: Optional project name override."
|
||||||
|
},
|
||||||
|
"generate": {
|
||||||
|
"name": "generate",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.generate",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate', 78, 118)>",
|
||||||
|
"docstring": "Generate Markdown source files for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n docs_dir: Directory where documentation sources will be written."
|
||||||
|
},
|
||||||
|
"generate_mcp": {
|
||||||
|
"name": "generate_mcp",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.generate_mcp",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_mcp', 125, 164)>",
|
||||||
|
"docstring": "Generate MCP-compatible documentation resources for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n out_dir: Directory where MCP resources will be written."
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"name": "build",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.build",
|
||||||
|
"signature": "<bound method Function.signature of Function('build', 171, 192)>",
|
||||||
|
"docstring": "Build the documentation site using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file."
|
||||||
|
},
|
||||||
|
"serve_mcp": {
|
||||||
|
"name": "serve_mcp",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.serve_mcp",
|
||||||
|
"signature": "<bound method Function.signature of Function('serve_mcp', 199, 226)>",
|
||||||
|
"docstring": "Serve MCP documentation from the local mcp_docs directory."
|
||||||
|
},
|
||||||
|
"serve": {
|
||||||
|
"name": "serve",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.serve",
|
||||||
|
"signature": "<bound method Function.signature of Function('serve', 233, 256)>",
|
||||||
|
"docstring": "Serve the documentation site with live-reload using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file."
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"name": "main",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.main",
|
||||||
|
"signature": "<bound method Function.signature of Function('main', 263, 267)>",
|
||||||
|
"docstring": "CLI Entry point."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mkdocs": {
|
||||||
|
"name": "mkdocs",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.cli.mkdocs",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module contains the 'mkdocs' CLI command, which orchestrates the generation\nof the main mkdocs.yml configuration file.",
|
||||||
|
"members": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"name": "resources",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.resources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('resources', 'importlib.resources')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"click": {
|
||||||
|
"name": "click",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.click",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('click', 'click')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"yaml": {
|
||||||
|
"name": "yaml",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.yaml",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('yaml', 'yaml')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"load_nav_spec": {
|
||||||
|
"name": "load_nav_spec",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.load_nav_spec",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_nav_spec', 'docforge.nav.load_nav_spec')>",
|
||||||
|
"docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance."
|
||||||
|
},
|
||||||
|
"resolve_nav": {
|
||||||
|
"name": "resolve_nav",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.resolve_nav",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('resolve_nav', 'docforge.nav.resolve_nav')>",
|
||||||
|
"docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist."
|
||||||
|
},
|
||||||
|
"MkDocsNavEmitter": {
|
||||||
|
"name": "MkDocsNavEmitter",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.mkdocs.MkDocsNavEmitter",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MkDocsNavEmitter', 'docforge.nav.MkDocsNavEmitter')>",
|
||||||
|
"docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.",
|
||||||
|
"members": {
|
||||||
|
"emit": {
|
||||||
|
"name": "emit",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.MkDocsNavEmitter.emit",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('emit', 'docforge.nav.mkdocs.MkDocsNavEmitter.emit')>",
|
||||||
|
"docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mkdocs_cmd": {
|
||||||
|
"name": "mkdocs_cmd",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.mkdocs_cmd",
|
||||||
|
"signature": "<bound method Function.signature of Function('mkdocs_cmd', 42, 116)>",
|
||||||
|
"docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site."
|
||||||
|
},
|
||||||
|
"Any": {
|
||||||
|
"name": "Any",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Any",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
176
mcp_docs/modules/docforge.cli.main.json
Normal file
176
mcp_docs/modules/docforge.cli.main.json
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.cli.main",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.cli.main",
|
||||||
|
"docstring": "Main entry point for the doc-forge CLI. This module defines the core command\ngroup and the 'tree', 'generate', 'build', and 'serve' commands.",
|
||||||
|
"objects": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Sequence": {
|
||||||
|
"name": "Sequence",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.Sequence",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Sequence', 'typing.Sequence')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"click": {
|
||||||
|
"name": "click",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.main.click",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('click', 'click')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"GriffeLoader": {
|
||||||
|
"name": "GriffeLoader",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.main.GriffeLoader",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('GriffeLoader', 'docforge.loaders.GriffeLoader')>",
|
||||||
|
"docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.",
|
||||||
|
"members": {
|
||||||
|
"load_project": {
|
||||||
|
"name": "load_project",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.GriffeLoader.load_project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_project', 'docforge.loaders.griffe_loader.GriffeLoader.load_project')>",
|
||||||
|
"docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules."
|
||||||
|
},
|
||||||
|
"load_module": {
|
||||||
|
"name": "load_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.GriffeLoader.load_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_module', 'docforge.loaders.griffe_loader.GriffeLoader.load_module')>",
|
||||||
|
"docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"discover_module_paths": {
|
||||||
|
"name": "discover_module_paths",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.discover_module_paths",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('discover_module_paths', 'docforge.loaders.discover_module_paths')>",
|
||||||
|
"docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths."
|
||||||
|
},
|
||||||
|
"MkDocsRenderer": {
|
||||||
|
"name": "MkDocsRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.main.MkDocsRenderer",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MkDocsRenderer', 'docforge.renderers.MkDocsRenderer')>",
|
||||||
|
"docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.cli.main.MkDocsRenderer.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.renderers.mkdocs_renderer.MkDocsRenderer.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.MkDocsRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('generate_sources', 'docforge.renderers.mkdocs_renderer.MkDocsRenderer.generate_sources')>",
|
||||||
|
"docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MCPRenderer": {
|
||||||
|
"name": "MCPRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.main.MCPRenderer",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MCPRenderer', 'docforge.renderers.MCPRenderer')>",
|
||||||
|
"docstring": "Renderer that emits MCP-native JSON resources from docforge models.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.cli.main.MCPRenderer.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.renderers.mcp_renderer.MCPRenderer.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.MCPRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('generate_sources', 'docforge.renderers.mcp_renderer.MCPRenderer.generate_sources')>",
|
||||||
|
"docstring": "Generate MCP-compatible JSON resources and navigation for the project."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mkdocs_cmd": {
|
||||||
|
"name": "mkdocs_cmd",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.mkdocs_cmd",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('mkdocs_cmd', 'docforge.cli.mkdocs.mkdocs_cmd')>",
|
||||||
|
"docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site."
|
||||||
|
},
|
||||||
|
"cli": {
|
||||||
|
"name": "cli",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.cli",
|
||||||
|
"signature": "<bound method Function.signature of Function('cli', 16, 22)>",
|
||||||
|
"docstring": "doc-forge CLI: A tool for introspecting Python projects and generating\ndocumentation."
|
||||||
|
},
|
||||||
|
"tree": {
|
||||||
|
"name": "tree",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.tree",
|
||||||
|
"signature": "<bound method Function.signature of Function('tree', 31, 62)>",
|
||||||
|
"docstring": "Visualize the project structure including modules and their members.\n\nArgs:\n modules: List of module paths to introspect.\n project_name: Optional project name override."
|
||||||
|
},
|
||||||
|
"generate": {
|
||||||
|
"name": "generate",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.generate",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate', 78, 118)>",
|
||||||
|
"docstring": "Generate Markdown source files for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n docs_dir: Directory where documentation sources will be written."
|
||||||
|
},
|
||||||
|
"generate_mcp": {
|
||||||
|
"name": "generate_mcp",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.generate_mcp",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_mcp', 125, 164)>",
|
||||||
|
"docstring": "Generate MCP-compatible documentation resources for the specified module.\n\nArgs:\n module: The primary module path to document.\n project_name: Optional project name override.\n out_dir: Directory where MCP resources will be written."
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"name": "build",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.build",
|
||||||
|
"signature": "<bound method Function.signature of Function('build', 171, 192)>",
|
||||||
|
"docstring": "Build the documentation site using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file."
|
||||||
|
},
|
||||||
|
"serve_mcp": {
|
||||||
|
"name": "serve_mcp",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.serve_mcp",
|
||||||
|
"signature": "<bound method Function.signature of Function('serve_mcp', 199, 226)>",
|
||||||
|
"docstring": "Serve MCP documentation from the local mcp_docs directory."
|
||||||
|
},
|
||||||
|
"serve": {
|
||||||
|
"name": "serve",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.serve",
|
||||||
|
"signature": "<bound method Function.signature of Function('serve', 233, 256)>",
|
||||||
|
"docstring": "Serve the documentation site with live-reload using MkDocs.\n\nArgs:\n mkdocs_yml: Path to the mkdocs.yml configuration file."
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"name": "main",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.main.main",
|
||||||
|
"signature": "<bound method Function.signature of Function('main', 263, 267)>",
|
||||||
|
"docstring": "CLI Entry point."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
95
mcp_docs/modules/docforge.cli.mkdocs.json
Normal file
95
mcp_docs/modules/docforge.cli.mkdocs.json
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.cli.mkdocs",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.cli.mkdocs",
|
||||||
|
"docstring": "This module contains the 'mkdocs' CLI command, which orchestrates the generation\nof the main mkdocs.yml configuration file.",
|
||||||
|
"objects": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"name": "resources",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.resources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('resources', 'importlib.resources')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"click": {
|
||||||
|
"name": "click",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.click",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('click', 'click')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"yaml": {
|
||||||
|
"name": "yaml",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.yaml",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('yaml', 'yaml')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"load_nav_spec": {
|
||||||
|
"name": "load_nav_spec",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.load_nav_spec",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_nav_spec', 'docforge.nav.load_nav_spec')>",
|
||||||
|
"docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance."
|
||||||
|
},
|
||||||
|
"resolve_nav": {
|
||||||
|
"name": "resolve_nav",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.resolve_nav",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('resolve_nav', 'docforge.nav.resolve_nav')>",
|
||||||
|
"docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist."
|
||||||
|
},
|
||||||
|
"MkDocsNavEmitter": {
|
||||||
|
"name": "MkDocsNavEmitter",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.cli.mkdocs.MkDocsNavEmitter",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MkDocsNavEmitter', 'docforge.nav.MkDocsNavEmitter')>",
|
||||||
|
"docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.",
|
||||||
|
"members": {
|
||||||
|
"emit": {
|
||||||
|
"name": "emit",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.MkDocsNavEmitter.emit",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('emit', 'docforge.nav.mkdocs.MkDocsNavEmitter.emit')>",
|
||||||
|
"docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mkdocs_cmd": {
|
||||||
|
"name": "mkdocs_cmd",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.cli.mkdocs.mkdocs_cmd",
|
||||||
|
"signature": "<bound method Function.signature of Function('mkdocs_cmd', 42, 116)>",
|
||||||
|
"docstring": "Generate an mkdocs.yml configuration file by combining a template with\nthe navigation structure resolved from a docforge.nav.yml file.\n\nArgs:\n docs_dir: Path to the directory containing documentation Markdown files.\n nav_file: Path to the docforge.nav.yml specification.\n template: Optional path to an mkdocs.yml template.\n out: Path where the final mkdocs.yml will be written.\n site_name: The name of the documentation site."
|
||||||
|
},
|
||||||
|
"Any": {
|
||||||
|
"name": "Any",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Any",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.cli.mkdocs.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2498
mcp_docs/modules/docforge.json
Normal file
2498
mcp_docs/modules/docforge.json
Normal file
File diff suppressed because it is too large
Load Diff
276
mcp_docs/modules/docforge.loaders.griffe_loader.json
Normal file
276
mcp_docs/modules/docforge.loaders.griffe_loader.json
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.loaders.griffe_loader",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.loaders.griffe_loader",
|
||||||
|
"docstring": "This module provides the GriffeLoader, which uses the 'griffe' library to\nintrospect Python source code and populate the doc-forge Project models.",
|
||||||
|
"objects": {
|
||||||
|
"logging": {
|
||||||
|
"name": "logging",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.logging",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('logging', 'logging')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"ModulesCollection": {
|
||||||
|
"name": "ModulesCollection",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.ModulesCollection",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('ModulesCollection', 'griffe.ModulesCollection')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"LinesCollection": {
|
||||||
|
"name": "LinesCollection",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.LinesCollection",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('LinesCollection', 'griffe.LinesCollection')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Object": {
|
||||||
|
"name": "Object",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Object', 'griffe.Object')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"AliasResolutionError": {
|
||||||
|
"name": "AliasResolutionError",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.AliasResolutionError",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('AliasResolutionError', 'griffe.AliasResolutionError')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('DocObject', 'docforge.models.DocObject')>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.object.DocObject.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.kind",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('kind', 'docforge.models.object.DocObject.kind')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.object.DocObject.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.signature",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('signature', 'docforge.models.object.DocObject.signature')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.object.DocObject.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.object.DocObject.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.add_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_member', 'docforge.models.object.DocObject.add_member')>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.get_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_member', 'docforge.models.object.DocObject.get_member')>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_members', 'docforge.models.object.DocObject.get_all_members')>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"logger": {
|
||||||
|
"name": "logger",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.logger",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"discover_module_paths": {
|
||||||
|
"name": "discover_module_paths",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.discover_module_paths",
|
||||||
|
"signature": "<bound method Function.signature of Function('discover_module_paths', 23, 62)>",
|
||||||
|
"docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths."
|
||||||
|
},
|
||||||
|
"GriffeLoader": {
|
||||||
|
"name": "GriffeLoader",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.GriffeLoader",
|
||||||
|
"signature": "<bound method Class.signature of Class('GriffeLoader', 65, 188)>",
|
||||||
|
"docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.",
|
||||||
|
"members": {
|
||||||
|
"load_project": {
|
||||||
|
"name": "load_project",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.GriffeLoader.load_project",
|
||||||
|
"signature": "<bound method Function.signature of Function('load_project', 79, 115)>",
|
||||||
|
"docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules."
|
||||||
|
},
|
||||||
|
"load_module": {
|
||||||
|
"name": "load_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.GriffeLoader.load_module",
|
||||||
|
"signature": "<bound method Function.signature of Function('load_module', 117, 130)>",
|
||||||
|
"docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
315
mcp_docs/modules/docforge.loaders.json
Normal file
315
mcp_docs/modules/docforge.loaders.json
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.loaders",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.loaders",
|
||||||
|
"docstring": "# Loader Layer\n\nThe `docforge.loaders` package is responsible for discovering Python source files\nand extracting their documentation using static analysis.\n\n## Core Features\n\n- **Discovery**: Automatically find all modules and packages in a project\n directory.\n- **Introspection**: Uses `griffe` to parse docstrings, signatures, and\n hierarchical relationships without executing the code.\n- **Filtering**: Automatically excludes private members (prefixed with `_`) to\n ensure clean public documentation.",
|
||||||
|
"objects": {
|
||||||
|
"GriffeLoader": {
|
||||||
|
"name": "GriffeLoader",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.GriffeLoader",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('GriffeLoader', 'docforge.loaders.griffe_loader.GriffeLoader')>",
|
||||||
|
"docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.",
|
||||||
|
"members": {
|
||||||
|
"load_project": {
|
||||||
|
"name": "load_project",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.GriffeLoader.load_project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_project', 'docforge.loaders.griffe_loader.GriffeLoader.load_project')>",
|
||||||
|
"docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules."
|
||||||
|
},
|
||||||
|
"load_module": {
|
||||||
|
"name": "load_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.GriffeLoader.load_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_module', 'docforge.loaders.griffe_loader.GriffeLoader.load_module')>",
|
||||||
|
"docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"discover_module_paths": {
|
||||||
|
"name": "discover_module_paths",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.discover_module_paths",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('discover_module_paths', 'docforge.loaders.griffe_loader.discover_module_paths')>",
|
||||||
|
"docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths."
|
||||||
|
},
|
||||||
|
"griffe_loader": {
|
||||||
|
"name": "griffe_loader",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.loaders.griffe_loader",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module provides the GriffeLoader, which uses the 'griffe' library to\nintrospect Python source code and populate the doc-forge Project models.",
|
||||||
|
"members": {
|
||||||
|
"logging": {
|
||||||
|
"name": "logging",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.logging",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('logging', 'logging')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"ModulesCollection": {
|
||||||
|
"name": "ModulesCollection",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.ModulesCollection",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('ModulesCollection', 'griffe.ModulesCollection')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"LinesCollection": {
|
||||||
|
"name": "LinesCollection",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.LinesCollection",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('LinesCollection', 'griffe.LinesCollection')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Object": {
|
||||||
|
"name": "Object",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Object', 'griffe.Object')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"AliasResolutionError": {
|
||||||
|
"name": "AliasResolutionError",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.loaders.griffe_loader.AliasResolutionError",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('AliasResolutionError', 'griffe.AliasResolutionError')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('DocObject', 'docforge.models.DocObject')>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.object.DocObject.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.kind",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('kind', 'docforge.models.object.DocObject.kind')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.object.DocObject.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.signature",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('signature', 'docforge.models.object.DocObject.signature')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.object.DocObject.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.object.DocObject.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.add_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_member', 'docforge.models.object.DocObject.add_member')>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.get_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_member', 'docforge.models.object.DocObject.get_member')>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_members', 'docforge.models.object.DocObject.get_all_members')>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"logger": {
|
||||||
|
"name": "logger",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.loaders.griffe_loader.logger",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"discover_module_paths": {
|
||||||
|
"name": "discover_module_paths",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.discover_module_paths",
|
||||||
|
"signature": "<bound method Function.signature of Function('discover_module_paths', 23, 62)>",
|
||||||
|
"docstring": "Discover all Python modules under a package via filesystem traversal.\n\nRules:\n- Directory with __init__.py is treated as a package.\n- Any .py file is treated as a module.\n- All paths are converted to dotted module paths.\n\nArgs:\n module_name: The name of the package to discover.\n project_root: The root directory of the project. Defaults to current working directory.\n\nReturns:\n A sorted list of dotted module paths."
|
||||||
|
},
|
||||||
|
"GriffeLoader": {
|
||||||
|
"name": "GriffeLoader",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.loaders.griffe_loader.GriffeLoader",
|
||||||
|
"signature": "<bound method Class.signature of Class('GriffeLoader', 65, 188)>",
|
||||||
|
"docstring": "Loads Python modules and extracts documentation using the Griffe introspection engine.",
|
||||||
|
"members": {
|
||||||
|
"load_project": {
|
||||||
|
"name": "load_project",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.GriffeLoader.load_project",
|
||||||
|
"signature": "<bound method Function.signature of Function('load_project', 79, 115)>",
|
||||||
|
"docstring": "Load multiple modules and combine them into a single Project models.\n\nArgs:\n module_paths: A list of dotted paths to the modules to load.\n project_name: Optional name for the project. Defaults to the first module name.\n skip_import_errors: If True, modules that fail to import will be skipped.\n\nReturns:\n A Project instance containing the loaded modules."
|
||||||
|
},
|
||||||
|
"load_module": {
|
||||||
|
"name": "load_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.loaders.griffe_loader.GriffeLoader.load_module",
|
||||||
|
"signature": "<bound method Function.signature of Function('load_module', 117, 130)>",
|
||||||
|
"docstring": "Load a single module and convert its introspection data into the docforge models.\n\nArgs:\n path: The dotted path of the module to load.\n\nReturns:\n A Module instance."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
563
mcp_docs/modules/docforge.models.json
Normal file
563
mcp_docs/modules/docforge.models.json
Normal file
@@ -0,0 +1,563 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.models",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.models",
|
||||||
|
"docstring": "# Model Layer\n\nThe `docforge.models` package provides the core data structures used to represent\nPython source code in a documentation-focused hierarchy.\n\n## Key Components\n\n- **Project**: The root container for all documented modules.\n- **Module**: Represents a Python module or package, containing members.\n- **DocObject**: A recursive structure for classes, functions, and attributes.\n\nThese classes are designed to be renderer-agnostic, allowing the same internal\nrepresentation to be transformed into various output formats (currently MkDocs).",
|
||||||
|
"objects": {
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.project.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.module.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.DocObject",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('DocObject', 'docforge.models.object.DocObject')>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.DocObject.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.object.DocObject.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.DocObject.kind",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('kind', 'docforge.models.object.DocObject.kind')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.DocObject.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.object.DocObject.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.DocObject.signature",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('signature', 'docforge.models.object.DocObject.signature')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.DocObject.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.object.DocObject.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.DocObject.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.object.DocObject.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.DocObject.add_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_member', 'docforge.models.object.DocObject.add_member')>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.DocObject.get_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_member', 'docforge.models.object.DocObject.get_member')>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_members', 'docforge.models.object.DocObject.get_all_members')>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"module": {
|
||||||
|
"name": "module",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.models.module",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module defines the Module class, which represents a Python module or package\nin the doc-forge documentation models. It acts as a container for top-level\ndocumented objects.",
|
||||||
|
"members": {
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.module.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.module.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.module.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.module.DocObject",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('DocObject', 'docforge.models.object.DocObject')>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.object.DocObject.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.kind",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('kind', 'docforge.models.object.DocObject.kind')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.object.DocObject.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.signature",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('signature', 'docforge.models.object.DocObject.signature')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.object.DocObject.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.object.DocObject.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.DocObject.add_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_member', 'docforge.models.object.DocObject.add_member')>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.DocObject.get_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_member', 'docforge.models.object.DocObject.get_member')>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_members', 'docforge.models.object.DocObject.get_all_members')>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.module.Module",
|
||||||
|
"signature": "<bound method Class.signature of Class('Module', 12, 66)>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.Module.path",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.Module.docstring",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.Module.members",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.Module.add_object",
|
||||||
|
"signature": "<bound method Function.signature of Function('add_object', 38, 45)>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.Module.get_object",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_object', 47, 57)>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_all_objects', 59, 66)>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"object": {
|
||||||
|
"name": "object",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.models.object",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module defines the DocObject class, the fundamental recursive unit of the\ndoc-forge documentation models. A DocObject represents a single Python entity\n(class, function, method, or attribute) and its nested members.",
|
||||||
|
"members": {
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.object.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.object.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.object.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.object.DocObject",
|
||||||
|
"signature": "<bound method Class.signature of Class('DocObject', 10, 76)>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.kind",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.path",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.signature",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.docstring",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.members",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.object.DocObject.add_member",
|
||||||
|
"signature": "<bound method Function.signature of Function('add_member', 48, 55)>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.object.DocObject.get_member",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_member', 57, 67)>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.object.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_all_members', 69, 76)>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"name": "project",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.models.project",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module defines the Project class, the top-level container for a documented\nproject. It aggregates multiple Module instances into a single named entity.",
|
||||||
|
"members": {
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.project.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.project.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.project.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.module.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.project.Project",
|
||||||
|
"signature": "<bound method Class.signature of Class('Project', 11, 67)>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Project.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Project.modules",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.add_module",
|
||||||
|
"signature": "<bound method Function.signature of Function('add_module', 30, 37)>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.get_module",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_module', 39, 49)>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_all_modules', 51, 58)>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.get_module_list",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_module_list', 60, 67)>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
153
mcp_docs/modules/docforge.models.module.json
Normal file
153
mcp_docs/modules/docforge.models.module.json
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.models.module",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.models.module",
|
||||||
|
"docstring": "This module defines the Module class, which represents a Python module or package\nin the doc-forge documentation models. It acts as a container for top-level\ndocumented objects.",
|
||||||
|
"objects": {
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.module.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.module.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.module.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.module.DocObject",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('DocObject', 'docforge.models.object.DocObject')>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.object.DocObject.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.kind",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('kind', 'docforge.models.object.DocObject.kind')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.object.DocObject.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.signature",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('signature', 'docforge.models.object.DocObject.signature')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.object.DocObject.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.DocObject.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.object.DocObject.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.DocObject.add_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_member', 'docforge.models.object.DocObject.add_member')>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.DocObject.get_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_member', 'docforge.models.object.DocObject.get_member')>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_members', 'docforge.models.object.DocObject.get_all_members')>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.module.Module",
|
||||||
|
"signature": "<bound method Class.signature of Class('Module', 12, 66)>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.Module.path",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.Module.docstring",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.module.Module.members",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.Module.add_object",
|
||||||
|
"signature": "<bound method Function.signature of Function('add_object', 38, 45)>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.Module.get_object",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_object', 47, 57)>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.module.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_all_objects', 59, 66)>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
102
mcp_docs/modules/docforge.models.object.json
Normal file
102
mcp_docs/modules/docforge.models.object.json
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.models.object",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.models.object",
|
||||||
|
"docstring": "This module defines the DocObject class, the fundamental recursive unit of the\ndoc-forge documentation models. A DocObject represents a single Python entity\n(class, function, method, or attribute) and its nested members.",
|
||||||
|
"objects": {
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.object.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.object.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.object.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.object.DocObject",
|
||||||
|
"signature": "<bound method Class.signature of Class('DocObject', 10, 76)>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.kind",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.path",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.signature",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.docstring",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.object.DocObject.members",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.object.DocObject.add_member",
|
||||||
|
"signature": "<bound method Function.signature of Function('add_member', 48, 55)>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.object.DocObject.get_member",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_member', 57, 67)>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.object.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_all_members', 69, 76)>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
125
mcp_docs/modules/docforge.models.project.json
Normal file
125
mcp_docs/modules/docforge.models.project.json
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.models.project",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.models.project",
|
||||||
|
"docstring": "This module defines the Project class, the top-level container for a documented\nproject. It aggregates multiple Module instances into a single named entity.",
|
||||||
|
"objects": {
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.project.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.models.project.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.project.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.module.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.models.project.Project",
|
||||||
|
"signature": "<bound method Class.signature of Class('Project', 11, 67)>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Project.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.models.project.Project.modules",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.add_module",
|
||||||
|
"signature": "<bound method Function.signature of Function('add_module', 30, 37)>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.get_module",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_module', 39, 49)>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_all_modules', 51, 58)>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.models.project.Project.get_module_list",
|
||||||
|
"signature": "<bound method Function.signature of Function('get_module_list', 60, 67)>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
402
mcp_docs/modules/docforge.nav.json
Normal file
402
mcp_docs/modules/docforge.nav.json
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.nav",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.nav",
|
||||||
|
"docstring": "# Navigation Layer\n\nThe `docforge.nav` package manages the mapping between the logical documentation\nstructure and the physical files on disk.\n\n## Workflow\n\n1. **Spec Definition**: Users define navigation intent in `docforge.nav.yml`.\n2. **Resolution**: `resolve_nav` matches patterns in the spec to generated `.md` files.\n3. **Emission**: `MkDocsNavEmitter` produces the final YAML structure for `mkdocs.yml`.\n\nThis abstraction allows doc-forge to support complex grouping and ordering\nindependently of the source code's physical layout.",
|
||||||
|
"objects": {
|
||||||
|
"NavSpec": {
|
||||||
|
"name": "NavSpec",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.NavSpec",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('NavSpec', 'docforge.nav.spec.NavSpec')>",
|
||||||
|
"docstring": "Parsed representation of the docforge navigation specification file.\n\nAttributes:\n home: Path to the home document (e.g., 'index.md').\n groups: Mapping of group titles to lists of path patterns/globs.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.NavSpec.home",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('home', 'docforge.nav.spec.NavSpec.home')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.NavSpec.groups",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('groups', 'docforge.nav.spec.NavSpec.groups')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"load": {
|
||||||
|
"name": "load",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.NavSpec.load",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load', 'docforge.nav.spec.NavSpec.load')>",
|
||||||
|
"docstring": "Load a NavSpec from a YAML file.\n\nArgs:\n path: The filesystem path to the YAML file.\n\nReturns:\n A NavSpec instance.\n\nRaises:\n FileNotFoundError: If the path does not exist.\n ValueError: If the file content is not a valid NavSpec mapping."
|
||||||
|
},
|
||||||
|
"all_patterns": {
|
||||||
|
"name": "all_patterns",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.NavSpec.all_patterns",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('all_patterns', 'docforge.nav.spec.NavSpec.all_patterns')>",
|
||||||
|
"docstring": "Get all path patterns referenced in the specification.\n\nReturns:\n A list of all patterns (home plus all groups)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"load_nav_spec": {
|
||||||
|
"name": "load_nav_spec",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.load_nav_spec",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load_nav_spec', 'docforge.nav.spec.load_nav_spec')>",
|
||||||
|
"docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance."
|
||||||
|
},
|
||||||
|
"ResolvedNav": {
|
||||||
|
"name": "ResolvedNav",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.ResolvedNav",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('ResolvedNav', 'docforge.nav.resolver.ResolvedNav')>",
|
||||||
|
"docstring": "Represents a navigation structure where all patterns and paths have been\nresolved against the actual filesystem contents.\n\nAttributes:\n home: Resolved relative path to the home page.\n groups: Mapping of group titles to lists of absolute or relative Path objects.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.ResolvedNav.home",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('home', 'docforge.nav.resolver.ResolvedNav.home')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.ResolvedNav.groups",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('groups', 'docforge.nav.resolver.ResolvedNav.groups')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"all_files": {
|
||||||
|
"name": "all_files",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.ResolvedNav.all_files",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('all_files', 'docforge.nav.resolver.ResolvedNav.all_files')>",
|
||||||
|
"docstring": "Get an iterable of all resolved files in the navigation structure.\n\nReturns:\n An iterable of Path objects."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolve_nav": {
|
||||||
|
"name": "resolve_nav",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolve_nav",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('resolve_nav', 'docforge.nav.resolver.resolve_nav')>",
|
||||||
|
"docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist."
|
||||||
|
},
|
||||||
|
"MkDocsNavEmitter": {
|
||||||
|
"name": "MkDocsNavEmitter",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.MkDocsNavEmitter",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MkDocsNavEmitter', 'docforge.nav.mkdocs.MkDocsNavEmitter')>",
|
||||||
|
"docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.",
|
||||||
|
"members": {
|
||||||
|
"emit": {
|
||||||
|
"name": "emit",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.MkDocsNavEmitter.emit",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('emit', 'docforge.nav.mkdocs.MkDocsNavEmitter.emit')>",
|
||||||
|
"docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mkdocs": {
|
||||||
|
"name": "mkdocs",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.nav.mkdocs",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module provides the MkDocsNavEmitter, which converts a ResolvedNav instance\ninto the specific YAML-ready list structure expected by the MkDocs 'nav'\nconfiguration.",
|
||||||
|
"members": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Any": {
|
||||||
|
"name": "Any",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.Any",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"ResolvedNav": {
|
||||||
|
"name": "ResolvedNav",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('ResolvedNav', 'docforge.nav.resolver.ResolvedNav')>",
|
||||||
|
"docstring": "Represents a navigation structure where all patterns and paths have been\nresolved against the actual filesystem contents.\n\nAttributes:\n home: Resolved relative path to the home page.\n groups: Mapping of group titles to lists of absolute or relative Path objects.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav.home",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('home', 'docforge.nav.resolver.ResolvedNav.home')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav.groups",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('groups', 'docforge.nav.resolver.ResolvedNav.groups')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"all_files": {
|
||||||
|
"name": "all_files",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav.all_files",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('all_files', 'docforge.nav.resolver.ResolvedNav.all_files')>",
|
||||||
|
"docstring": "Get an iterable of all resolved files in the navigation structure.\n\nReturns:\n An iterable of Path objects."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MkDocsNavEmitter": {
|
||||||
|
"name": "MkDocsNavEmitter",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.mkdocs.MkDocsNavEmitter",
|
||||||
|
"signature": "<bound method Class.signature of Class('MkDocsNavEmitter', 13, 72)>",
|
||||||
|
"docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.",
|
||||||
|
"members": {
|
||||||
|
"emit": {
|
||||||
|
"name": "emit",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.mkdocs.MkDocsNavEmitter.emit",
|
||||||
|
"signature": "<bound method Function.signature of Function('emit', 19, 44)>",
|
||||||
|
"docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolver": {
|
||||||
|
"name": "resolver",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.nav.resolver",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module contains the logic for resolving a NavSpec against the physical\nfilesystem. It expands globs and validates that all referenced documents\nactually exist on disk.",
|
||||||
|
"members": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"glob": {
|
||||||
|
"name": "glob",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.glob",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('glob', 'glob')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"NavSpec": {
|
||||||
|
"name": "NavSpec",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('NavSpec', 'docforge.nav.spec.NavSpec')>",
|
||||||
|
"docstring": "Parsed representation of the docforge navigation specification file.\n\nAttributes:\n home: Path to the home document (e.g., 'index.md').\n groups: Mapping of group titles to lists of path patterns/globs.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.home",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('home', 'docforge.nav.spec.NavSpec.home')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.groups",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('groups', 'docforge.nav.spec.NavSpec.groups')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"load": {
|
||||||
|
"name": "load",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.load",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load', 'docforge.nav.spec.NavSpec.load')>",
|
||||||
|
"docstring": "Load a NavSpec from a YAML file.\n\nArgs:\n path: The filesystem path to the YAML file.\n\nReturns:\n A NavSpec instance.\n\nRaises:\n FileNotFoundError: If the path does not exist.\n ValueError: If the file content is not a valid NavSpec mapping."
|
||||||
|
},
|
||||||
|
"all_patterns": {
|
||||||
|
"name": "all_patterns",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.all_patterns",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('all_patterns', 'docforge.nav.spec.NavSpec.all_patterns')>",
|
||||||
|
"docstring": "Get all path patterns referenced in the specification.\n\nReturns:\n A list of all patterns (home plus all groups)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ResolvedNav": {
|
||||||
|
"name": "ResolvedNav",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav",
|
||||||
|
"signature": "<bound method Class.signature of Class('ResolvedNav', 15, 56)>",
|
||||||
|
"docstring": "Represents a navigation structure where all patterns and paths have been\nresolved against the actual filesystem contents.\n\nAttributes:\n home: Resolved relative path to the home page.\n groups: Mapping of group titles to lists of absolute or relative Path objects.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav.home",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav.groups",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"all_files": {
|
||||||
|
"name": "all_files",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav.all_files",
|
||||||
|
"signature": "<bound method Function.signature of Function('all_files', 43, 56)>",
|
||||||
|
"docstring": "Get an iterable of all resolved files in the navigation structure.\n\nReturns:\n An iterable of Path objects."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolve_nav": {
|
||||||
|
"name": "resolve_nav",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.resolve_nav",
|
||||||
|
"signature": "<bound method Function.signature of Function('resolve_nav', 59, 112)>",
|
||||||
|
"docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist."
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"name": "spec",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.nav.spec",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module defines the NavSpec class, which represents the user's intent for\ndocumentation navigation as defined in a YAML specification (usually\ndocforge.nav.yml).",
|
||||||
|
"members": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"yaml": {
|
||||||
|
"name": "yaml",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.yaml",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('yaml', 'yaml')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"NavSpec": {
|
||||||
|
"name": "NavSpec",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.spec.NavSpec",
|
||||||
|
"signature": "<bound method Class.signature of Class('NavSpec', 13, 91)>",
|
||||||
|
"docstring": "Parsed representation of the docforge navigation specification file.\n\nAttributes:\n home: Path to the home document (e.g., 'index.md').\n groups: Mapping of group titles to lists of path patterns/globs.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.home",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.groups",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"load": {
|
||||||
|
"name": "load",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.load",
|
||||||
|
"signature": "<bound method Function.signature of Function('load', 37, 77)>",
|
||||||
|
"docstring": "Load a NavSpec from a YAML file.\n\nArgs:\n path: The filesystem path to the YAML file.\n\nReturns:\n A NavSpec instance.\n\nRaises:\n FileNotFoundError: If the path does not exist.\n ValueError: If the file content is not a valid NavSpec mapping."
|
||||||
|
},
|
||||||
|
"all_patterns": {
|
||||||
|
"name": "all_patterns",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.all_patterns",
|
||||||
|
"signature": "<bound method Function.signature of Function('all_patterns', 79, 91)>",
|
||||||
|
"docstring": "Get all path patterns referenced in the specification.\n\nReturns:\n A list of all patterns (home plus all groups)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"load_nav_spec": {
|
||||||
|
"name": "load_nav_spec",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.spec.load_nav_spec",
|
||||||
|
"signature": "<bound method Function.signature of Function('load_nav_spec', 94, 114)>",
|
||||||
|
"docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
83
mcp_docs/modules/docforge.nav.mkdocs.json
Normal file
83
mcp_docs/modules/docforge.nav.mkdocs.json
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.nav.mkdocs",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.nav.mkdocs",
|
||||||
|
"docstring": "This module provides the MkDocsNavEmitter, which converts a ResolvedNav instance\ninto the specific YAML-ready list structure expected by the MkDocs 'nav'\nconfiguration.",
|
||||||
|
"objects": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Any": {
|
||||||
|
"name": "Any",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.mkdocs.Any",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"ResolvedNav": {
|
||||||
|
"name": "ResolvedNav",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('ResolvedNav', 'docforge.nav.resolver.ResolvedNav')>",
|
||||||
|
"docstring": "Represents a navigation structure where all patterns and paths have been\nresolved against the actual filesystem contents.\n\nAttributes:\n home: Resolved relative path to the home page.\n groups: Mapping of group titles to lists of absolute or relative Path objects.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav.home",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('home', 'docforge.nav.resolver.ResolvedNav.home')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav.groups",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('groups', 'docforge.nav.resolver.ResolvedNav.groups')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"all_files": {
|
||||||
|
"name": "all_files",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.mkdocs.ResolvedNav.all_files",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('all_files', 'docforge.nav.resolver.ResolvedNav.all_files')>",
|
||||||
|
"docstring": "Get an iterable of all resolved files in the navigation structure.\n\nReturns:\n An iterable of Path objects."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MkDocsNavEmitter": {
|
||||||
|
"name": "MkDocsNavEmitter",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.mkdocs.MkDocsNavEmitter",
|
||||||
|
"signature": "<bound method Class.signature of Class('MkDocsNavEmitter', 13, 72)>",
|
||||||
|
"docstring": "Emitter responsible for transforming a ResolvedNav into an MkDocs-compatible\nnavigation structure.",
|
||||||
|
"members": {
|
||||||
|
"emit": {
|
||||||
|
"name": "emit",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.mkdocs.MkDocsNavEmitter.emit",
|
||||||
|
"signature": "<bound method Function.signature of Function('emit', 19, 44)>",
|
||||||
|
"docstring": "Generate a list of navigation entries for mkdocs.yml.\n\nArgs:\n nav: The resolved navigation data.\n\nReturns:\n A list of dictionary mappings representing the MkDocs navigation."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
125
mcp_docs/modules/docforge.nav.resolver.json
Normal file
125
mcp_docs/modules/docforge.nav.resolver.json
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.nav.resolver",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.nav.resolver",
|
||||||
|
"docstring": "This module contains the logic for resolving a NavSpec against the physical\nfilesystem. It expands globs and validates that all referenced documents\nactually exist on disk.",
|
||||||
|
"objects": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Iterable": {
|
||||||
|
"name": "Iterable",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Iterable",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Iterable', 'typing.Iterable')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"glob": {
|
||||||
|
"name": "glob",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.glob",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('glob', 'glob')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"NavSpec": {
|
||||||
|
"name": "NavSpec",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('NavSpec', 'docforge.nav.spec.NavSpec')>",
|
||||||
|
"docstring": "Parsed representation of the docforge navigation specification file.\n\nAttributes:\n home: Path to the home document (e.g., 'index.md').\n groups: Mapping of group titles to lists of path patterns/globs.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.home",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('home', 'docforge.nav.spec.NavSpec.home')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.groups",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('groups', 'docforge.nav.spec.NavSpec.groups')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"load": {
|
||||||
|
"name": "load",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.load",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('load', 'docforge.nav.spec.NavSpec.load')>",
|
||||||
|
"docstring": "Load a NavSpec from a YAML file.\n\nArgs:\n path: The filesystem path to the YAML file.\n\nReturns:\n A NavSpec instance.\n\nRaises:\n FileNotFoundError: If the path does not exist.\n ValueError: If the file content is not a valid NavSpec mapping."
|
||||||
|
},
|
||||||
|
"all_patterns": {
|
||||||
|
"name": "all_patterns",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.NavSpec.all_patterns",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('all_patterns', 'docforge.nav.spec.NavSpec.all_patterns')>",
|
||||||
|
"docstring": "Get all path patterns referenced in the specification.\n\nReturns:\n A list of all patterns (home plus all groups)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ResolvedNav": {
|
||||||
|
"name": "ResolvedNav",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav",
|
||||||
|
"signature": "<bound method Class.signature of Class('ResolvedNav', 15, 56)>",
|
||||||
|
"docstring": "Represents a navigation structure where all patterns and paths have been\nresolved against the actual filesystem contents.\n\nAttributes:\n home: Resolved relative path to the home page.\n groups: Mapping of group titles to lists of absolute or relative Path objects.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav.home",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav.groups",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"all_files": {
|
||||||
|
"name": "all_files",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.ResolvedNav.all_files",
|
||||||
|
"signature": "<bound method Function.signature of Function('all_files', 43, 56)>",
|
||||||
|
"docstring": "Get an iterable of all resolved files in the navigation structure.\n\nReturns:\n An iterable of Path objects."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolve_nav": {
|
||||||
|
"name": "resolve_nav",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.resolver.resolve_nav",
|
||||||
|
"signature": "<bound method Function.signature of Function('resolve_nav', 59, 112)>",
|
||||||
|
"docstring": "Create a ResolvedNav by processing a NavSpec against the filesystem.\nThis expands globs and validates the existence of referenced files.\n\nArgs:\n spec: The navigation specification to resolve.\n docs_root: The root directory for documentation files.\n\nReturns:\n A ResolvedNav instance.\n\nRaises:\n FileNotFoundError: If a pattern doesn't match any files or the docs_root doesn't exist."
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.resolver.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
88
mcp_docs/modules/docforge.nav.spec.json
Normal file
88
mcp_docs/modules/docforge.nav.spec.json
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.nav.spec",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.nav.spec",
|
||||||
|
"docstring": "This module defines the NavSpec class, which represents the user's intent for\ndocumentation navigation as defined in a YAML specification (usually\ndocforge.nav.yml).",
|
||||||
|
"objects": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Optional": {
|
||||||
|
"name": "Optional",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.Optional",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"yaml": {
|
||||||
|
"name": "yaml",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.nav.spec.yaml",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('yaml', 'yaml')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"NavSpec": {
|
||||||
|
"name": "NavSpec",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.nav.spec.NavSpec",
|
||||||
|
"signature": "<bound method Class.signature of Class('NavSpec', 13, 91)>",
|
||||||
|
"docstring": "Parsed representation of the docforge navigation specification file.\n\nAttributes:\n home: Path to the home document (e.g., 'index.md').\n groups: Mapping of group titles to lists of path patterns/globs.",
|
||||||
|
"members": {
|
||||||
|
"home": {
|
||||||
|
"name": "home",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.home",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"groups": {
|
||||||
|
"name": "groups",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.groups",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"load": {
|
||||||
|
"name": "load",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.load",
|
||||||
|
"signature": "<bound method Function.signature of Function('load', 37, 77)>",
|
||||||
|
"docstring": "Load a NavSpec from a YAML file.\n\nArgs:\n path: The filesystem path to the YAML file.\n\nReturns:\n A NavSpec instance.\n\nRaises:\n FileNotFoundError: If the path does not exist.\n ValueError: If the file content is not a valid NavSpec mapping."
|
||||||
|
},
|
||||||
|
"all_patterns": {
|
||||||
|
"name": "all_patterns",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.spec.NavSpec.all_patterns",
|
||||||
|
"signature": "<bound method Function.signature of Function('all_patterns', 79, 91)>",
|
||||||
|
"docstring": "Get all path patterns referenced in the specification.\n\nReturns:\n A list of all patterns (home plus all groups)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"load_nav_spec": {
|
||||||
|
"name": "load_nav_spec",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.nav.spec.load_nav_spec",
|
||||||
|
"signature": "<bound method Function.signature of Function('load_nav_spec', 94, 114)>",
|
||||||
|
"docstring": "Utility function to load a NavSpec from a file.\n\nArgs:\n path: Path to the navigation specification file.\n\nReturns:\n A loaded NavSpec instance."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
120
mcp_docs/modules/docforge.renderers.base.json
Normal file
120
mcp_docs/modules/docforge.renderers.base.json
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.renderers.base",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.renderers.base",
|
||||||
|
"docstring": "This module defines the base interfaces and configuration containers for\ndoc-forge renderers. All renderer implementations should adhere to the\nDocRenderer protocol.",
|
||||||
|
"objects": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.base.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Protocol": {
|
||||||
|
"name": "Protocol",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.base.Protocol",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Protocol', 'typing.Protocol')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.base.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"RendererConfig": {
|
||||||
|
"name": "RendererConfig",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.base.RendererConfig",
|
||||||
|
"signature": "<bound method Class.signature of Class('RendererConfig', 13, 24)>",
|
||||||
|
"docstring": "Configuration container for documentation renderers.\n\nArgs:\n out_dir: The directory where documentation files should be written.\n project: The introspected project models to be rendered.",
|
||||||
|
"members": {
|
||||||
|
"out_dir": {
|
||||||
|
"name": "out_dir",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.RendererConfig.out_dir",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"name": "project",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.RendererConfig.project",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DocRenderer": {
|
||||||
|
"name": "DocRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.base.DocRenderer",
|
||||||
|
"signature": "<bound method Class.signature of Class('DocRenderer', 27, 46)>",
|
||||||
|
"docstring": "Protocol defining the interface for documentation renderers.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.DocRenderer.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.DocRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_sources', 34, 46)>",
|
||||||
|
"docstring": "Generate renderer-specific source files for the given project.\n\nArgs:\n project: The project models containing modules and objects.\n out_dir: Target directory for the generated files."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
557
mcp_docs/modules/docforge.renderers.json
Normal file
557
mcp_docs/modules/docforge.renderers.json
Normal file
@@ -0,0 +1,557 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.renderers",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.renderers",
|
||||||
|
"docstring": "# Renderers Layer\n\nThe `docforge.renderers` package handles the transformation of the internal\ndocumentation models into physical files formatted for specific documentation\nengines.\n\n## Current Implementations\n\n- **MkDocsRenderer**: Generates Markdown files utilizing the `mkdocstrings`\n syntax. It automatically handles package/module hierarchy and generates\n `index.md` files for packages.\n\n## Extending\n\nTo add a new renderer, implement the `DocRenderer` protocol defined in\n`docforge.renderers.base`.",
|
||||||
|
"objects": {
|
||||||
|
"MkDocsRenderer": {
|
||||||
|
"name": "MkDocsRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.MkDocsRenderer",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MkDocsRenderer', 'docforge.renderers.mkdocs_renderer.MkDocsRenderer')>",
|
||||||
|
"docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.MkDocsRenderer.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.renderers.mkdocs_renderer.MkDocsRenderer.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.MkDocsRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('generate_sources', 'docforge.renderers.mkdocs_renderer.MkDocsRenderer.generate_sources')>",
|
||||||
|
"docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MCPRenderer": {
|
||||||
|
"name": "MCPRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.MCPRenderer",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MCPRenderer', 'docforge.renderers.mcp_renderer.MCPRenderer')>",
|
||||||
|
"docstring": "Renderer that emits MCP-native JSON resources from docforge models.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.MCPRenderer.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.renderers.mcp_renderer.MCPRenderer.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.MCPRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('generate_sources', 'docforge.renderers.mcp_renderer.MCPRenderer.generate_sources')>",
|
||||||
|
"docstring": "Generate MCP-compatible JSON resources and navigation for the project."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"base": {
|
||||||
|
"name": "base",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.renderers.base",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module defines the base interfaces and configuration containers for\ndoc-forge renderers. All renderer implementations should adhere to the\nDocRenderer protocol.",
|
||||||
|
"members": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.base.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Protocol": {
|
||||||
|
"name": "Protocol",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.base.Protocol",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Protocol', 'typing.Protocol')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.base.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"RendererConfig": {
|
||||||
|
"name": "RendererConfig",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.base.RendererConfig",
|
||||||
|
"signature": "<bound method Class.signature of Class('RendererConfig', 13, 24)>",
|
||||||
|
"docstring": "Configuration container for documentation renderers.\n\nArgs:\n out_dir: The directory where documentation files should be written.\n project: The introspected project models to be rendered.",
|
||||||
|
"members": {
|
||||||
|
"out_dir": {
|
||||||
|
"name": "out_dir",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.RendererConfig.out_dir",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"name": "project",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.RendererConfig.project",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DocRenderer": {
|
||||||
|
"name": "DocRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.base.DocRenderer",
|
||||||
|
"signature": "<bound method Class.signature of Class('DocRenderer', 27, 46)>",
|
||||||
|
"docstring": "Protocol defining the interface for documentation renderers.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.base.DocRenderer.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.base.DocRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_sources', 34, 46)>",
|
||||||
|
"docstring": "Generate renderer-specific source files for the given project.\n\nArgs:\n project: The project models containing modules and objects.\n out_dir: Target directory for the generated files."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mcp_renderer": {
|
||||||
|
"name": "mcp_renderer",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.renderers.mcp_renderer",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null,
|
||||||
|
"members": {
|
||||||
|
"json": {
|
||||||
|
"name": "json",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.json",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('json', 'json')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('DocObject', 'docforge.models.DocObject')>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.object.DocObject.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.kind",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('kind', 'docforge.models.object.DocObject.kind')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.object.DocObject.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.signature",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('signature', 'docforge.models.object.DocObject.signature')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.object.DocObject.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.object.DocObject.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.add_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_member', 'docforge.models.object.DocObject.add_member')>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.get_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_member', 'docforge.models.object.DocObject.get_member')>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_members', 'docforge.models.object.DocObject.get_all_members')>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MCPRenderer": {
|
||||||
|
"name": "MCPRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.MCPRenderer",
|
||||||
|
"signature": "<bound method Class.signature of Class('MCPRenderer', 8, 102)>",
|
||||||
|
"docstring": "Renderer that emits MCP-native JSON resources from docforge models.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.MCPRenderer.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.MCPRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_sources', 15, 49)>",
|
||||||
|
"docstring": "Generate MCP-compatible JSON resources and navigation for the project."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mkdocs_renderer": {
|
||||||
|
"name": "mkdocs_renderer",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": "This module implements the MkDocsRenderer, which generates Markdown source files\ncompatible with the MkDocs 'material' theme and 'mkdocstrings' extension.",
|
||||||
|
"members": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MkDocsRenderer": {
|
||||||
|
"name": "MkDocsRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.MkDocsRenderer",
|
||||||
|
"signature": "<bound method Class.signature of Class('MkDocsRenderer', 11, 91)>",
|
||||||
|
"docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.MkDocsRenderer.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.MkDocsRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_sources', 19, 38)>",
|
||||||
|
"docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Set": {
|
||||||
|
"name": "Set",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Set",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Set', 'typing.Set')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
234
mcp_docs/modules/docforge.renderers.mcp_renderer.json
Normal file
234
mcp_docs/modules/docforge.renderers.mcp_renderer.json
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.renderers.mcp_renderer",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.renderers.mcp_renderer",
|
||||||
|
"docstring": null,
|
||||||
|
"objects": {
|
||||||
|
"json": {
|
||||||
|
"name": "json",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.json",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('json', 'json')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Dict": {
|
||||||
|
"name": "Dict",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Dict",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"name": "List",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.List",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DocObject": {
|
||||||
|
"name": "DocObject",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('DocObject', 'docforge.models.DocObject')>",
|
||||||
|
"docstring": "Represents a documented Python object (class, function, method, etc.).\n\nAttributes:\n name: Local name of the object.\n kind: Type of object (e.g., 'class', 'function', 'attribute').\n path: Full dotted import path to the object.\n signature: Callable signature, if applicable.\n docstring: Raw docstring content extracted from the source.\n members: Dictionary mapping member names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.object.DocObject.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"kind": {
|
||||||
|
"name": "kind",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.kind",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('kind', 'docforge.models.object.DocObject.kind')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.object.DocObject.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"signature": {
|
||||||
|
"name": "signature",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.signature",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('signature', 'docforge.models.object.DocObject.signature')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.object.DocObject.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.object.DocObject.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_member": {
|
||||||
|
"name": "add_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.add_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_member', 'docforge.models.object.DocObject.add_member')>",
|
||||||
|
"docstring": "Add a child member to this object (e.g., a method to a class).\n\nArgs:\n obj: The child DocObject to add."
|
||||||
|
},
|
||||||
|
"get_member": {
|
||||||
|
"name": "get_member",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.get_member",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_member', 'docforge.models.object.DocObject.get_member')>",
|
||||||
|
"docstring": "Retrieve a child member by name.\n\nArgs:\n name: The name of the member.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_members": {
|
||||||
|
"name": "get_all_members",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.DocObject.get_all_members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_members', 'docforge.models.object.DocObject.get_all_members')>",
|
||||||
|
"docstring": "Get all members of this object.\n\nReturns:\n An iterable of child DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MCPRenderer": {
|
||||||
|
"name": "MCPRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.MCPRenderer",
|
||||||
|
"signature": "<bound method Class.signature of Class('MCPRenderer', 8, 102)>",
|
||||||
|
"docstring": "Renderer that emits MCP-native JSON resources from docforge models.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.MCPRenderer.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mcp_renderer.MCPRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_sources', 15, 49)>",
|
||||||
|
"docstring": "Generate MCP-compatible JSON resources and navigation for the project."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
148
mcp_docs/modules/docforge.renderers.mkdocs_renderer.json
Normal file
148
mcp_docs/modules/docforge.renderers.mkdocs_renderer.json
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.renderers.mkdocs_renderer",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer",
|
||||||
|
"docstring": "This module implements the MkDocsRenderer, which generates Markdown source files\ncompatible with the MkDocs 'material' theme and 'mkdocstrings' extension.",
|
||||||
|
"objects": {
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Project": {
|
||||||
|
"name": "Project",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Project', 'docforge.models.Project')>",
|
||||||
|
"docstring": "Represents a documentation project, serving as a container for modules.\n\nAttributes:\n name: Name of the project.\n modules: Dictionary mapping module paths to Module instances.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.name",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('name', 'docforge.models.project.Project.name')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"name": "modules",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('modules', 'docforge.models.project.Project.modules')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_module": {
|
||||||
|
"name": "add_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.add_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_module', 'docforge.models.project.Project.add_module')>",
|
||||||
|
"docstring": "Add a module to the project.\n\nArgs:\n module: The module to add."
|
||||||
|
},
|
||||||
|
"get_module": {
|
||||||
|
"name": "get_module",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.get_module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module', 'docforge.models.project.Project.get_module')>",
|
||||||
|
"docstring": "Retrieve a module by its dotted path.\n\nArgs:\n path: The dotted path of the module (e.g., 'pkg.mod').\n\nReturns:\n The requested Module."
|
||||||
|
},
|
||||||
|
"get_all_modules": {
|
||||||
|
"name": "get_all_modules",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.get_all_modules",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_modules', 'docforge.models.project.Project.get_all_modules')>",
|
||||||
|
"docstring": "Get all modules in the project.\n\nReturns:\n An iterable of Module objects."
|
||||||
|
},
|
||||||
|
"get_module_list": {
|
||||||
|
"name": "get_module_list",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Project.get_module_list",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_module_list', 'docforge.models.project.Project.get_module_list')>",
|
||||||
|
"docstring": "Get the list of all module dotted paths.\n\nReturns:\n A list of module paths."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MkDocsRenderer": {
|
||||||
|
"name": "MkDocsRenderer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.MkDocsRenderer",
|
||||||
|
"signature": "<bound method Class.signature of Class('MkDocsRenderer', 11, 91)>",
|
||||||
|
"docstring": "Renderer that generates Markdown source files formatted for the MkDocs\n'mkdocstrings' plugin.",
|
||||||
|
"members": {
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.MkDocsRenderer.name",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"generate_sources": {
|
||||||
|
"name": "generate_sources",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.MkDocsRenderer.generate_sources",
|
||||||
|
"signature": "<bound method Function.signature of Function('generate_sources', 19, 38)>",
|
||||||
|
"docstring": "Produce a set of Markdown files in the output directory based on the\nprovided Project models.\n\nArgs:\n project: The project models to render.\n out_dir: Target directory for documentation files."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Set": {
|
||||||
|
"name": "Set",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Set",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Set', 'typing.Set')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Module": {
|
||||||
|
"name": "Module",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Module', 'docforge.models.Module')>",
|
||||||
|
"docstring": "Represents a documented Python module or package.\n\nAttributes:\n path: Dotted import path of the module.\n docstring: Module-level docstring content.\n members: Dictionary mapping object names to their DocObject representations.",
|
||||||
|
"members": {
|
||||||
|
"path": {
|
||||||
|
"name": "path",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('path', 'docforge.models.module.Module.path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"docstring": {
|
||||||
|
"name": "docstring",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.docstring",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('docstring', 'docforge.models.module.Module.docstring')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"name": "members",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.members",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('members', 'docforge.models.module.Module.members')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"add_object": {
|
||||||
|
"name": "add_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.add_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('add_object', 'docforge.models.module.Module.add_object')>",
|
||||||
|
"docstring": "Add a documented object to the module.\n\nArgs:\n obj: The object to add."
|
||||||
|
},
|
||||||
|
"get_object": {
|
||||||
|
"name": "get_object",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.get_object",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_object', 'docforge.models.module.Module.get_object')>",
|
||||||
|
"docstring": "Retrieve a member object by name.\n\nArgs:\n name: The name of the object.\n\nReturns:\n The requested DocObject."
|
||||||
|
},
|
||||||
|
"get_all_objects": {
|
||||||
|
"name": "get_all_objects",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.renderers.mkdocs_renderer.Module.get_all_objects",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('get_all_objects', 'docforge.models.module.Module.get_all_objects')>",
|
||||||
|
"docstring": "Get all top-level objects in the module.\n\nReturns:\n An iterable of DocObject instances."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
120
mcp_docs/modules/docforge.servers.json
Normal file
120
mcp_docs/modules/docforge.servers.json
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.servers",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.servers",
|
||||||
|
"docstring": null,
|
||||||
|
"objects": {
|
||||||
|
"MCPServer": {
|
||||||
|
"name": "MCPServer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.servers.MCPServer",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('MCPServer', 'docforge.servers.mcp_server.MCPServer')>",
|
||||||
|
"docstring": "MCP server for serving a pre-built MCP documentation bundle.",
|
||||||
|
"members": {
|
||||||
|
"mcp_root": {
|
||||||
|
"name": "mcp_root",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.servers.MCPServer.mcp_root",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('mcp_root', 'docforge.servers.mcp_server.MCPServer.mcp_root')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"app": {
|
||||||
|
"name": "app",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.servers.MCPServer.app",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('app', 'docforge.servers.mcp_server.MCPServer.app')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"run": {
|
||||||
|
"name": "run",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.servers.MCPServer.run",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('run', 'docforge.servers.mcp_server.MCPServer.run')>",
|
||||||
|
"docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mcp_server": {
|
||||||
|
"name": "mcp_server",
|
||||||
|
"kind": "module",
|
||||||
|
"path": "docforge.servers.mcp_server",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null,
|
||||||
|
"members": {
|
||||||
|
"annotations": {
|
||||||
|
"name": "annotations",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.annotations",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"json": {
|
||||||
|
"name": "json",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.json",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('json', 'json')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Any": {
|
||||||
|
"name": "Any",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.Any",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Literal": {
|
||||||
|
"name": "Literal",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.Literal",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Literal', 'typing.Literal')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"FastMCP": {
|
||||||
|
"name": "FastMCP",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.FastMCP",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('FastMCP', 'mcp.server.fastmcp.FastMCP')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"MCPServer": {
|
||||||
|
"name": "MCPServer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer",
|
||||||
|
"signature": "<bound method Class.signature of Class('MCPServer', 10, 73)>",
|
||||||
|
"docstring": "MCP server for serving a pre-built MCP documentation bundle.",
|
||||||
|
"members": {
|
||||||
|
"mcp_root": {
|
||||||
|
"name": "mcp_root",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer.mcp_root",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"app": {
|
||||||
|
"name": "app",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer.app",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"run": {
|
||||||
|
"name": "run",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer.run",
|
||||||
|
"signature": "<bound method Function.signature of Function('run', 66, 73)>",
|
||||||
|
"docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
81
mcp_docs/modules/docforge.servers.mcp_server.json
Normal file
81
mcp_docs/modules/docforge.servers.mcp_server.json
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"module": "docforge.servers.mcp_server",
|
||||||
|
"content": {
|
||||||
|
"path": "docforge.servers.mcp_server",
|
||||||
|
"docstring": null,
|
||||||
|
"objects": {
|
||||||
|
"annotations": {
|
||||||
|
"name": "annotations",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.annotations",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"json": {
|
||||||
|
"name": "json",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.json",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('json', 'json')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Path": {
|
||||||
|
"name": "Path",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.Path",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Any": {
|
||||||
|
"name": "Any",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.Any",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"Literal": {
|
||||||
|
"name": "Literal",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.Literal",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('Literal', 'typing.Literal')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"FastMCP": {
|
||||||
|
"name": "FastMCP",
|
||||||
|
"kind": "alias",
|
||||||
|
"path": "docforge.servers.mcp_server.FastMCP",
|
||||||
|
"signature": "<bound method Alias.signature of Alias('FastMCP', 'mcp.server.fastmcp.FastMCP')>",
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"MCPServer": {
|
||||||
|
"name": "MCPServer",
|
||||||
|
"kind": "class",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer",
|
||||||
|
"signature": "<bound method Class.signature of Class('MCPServer', 10, 73)>",
|
||||||
|
"docstring": "MCP server for serving a pre-built MCP documentation bundle.",
|
||||||
|
"members": {
|
||||||
|
"mcp_root": {
|
||||||
|
"name": "mcp_root",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer.mcp_root",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"app": {
|
||||||
|
"name": "app",
|
||||||
|
"kind": "attribute",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer.app",
|
||||||
|
"signature": null,
|
||||||
|
"docstring": null
|
||||||
|
},
|
||||||
|
"run": {
|
||||||
|
"name": "run",
|
||||||
|
"kind": "function",
|
||||||
|
"path": "docforge.servers.mcp_server.MCPServer.run",
|
||||||
|
"signature": "<bound method Function.signature of Function('run', 66, 73)>",
|
||||||
|
"docstring": "Start the MCP server.\n\nArgs:\n transport: MCP transport (default: streamable-http)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
82
mcp_docs/nav.json
Normal file
82
mcp_docs/nav.json
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"module": "docforge",
|
||||||
|
"resource": "doc://modules/docforge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.cli",
|
||||||
|
"resource": "doc://modules/docforge.cli"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.cli.main",
|
||||||
|
"resource": "doc://modules/docforge.cli.main"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.cli.mkdocs",
|
||||||
|
"resource": "doc://modules/docforge.cli.mkdocs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.loaders",
|
||||||
|
"resource": "doc://modules/docforge.loaders"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.loaders.griffe_loader",
|
||||||
|
"resource": "doc://modules/docforge.loaders.griffe_loader"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.models",
|
||||||
|
"resource": "doc://modules/docforge.models"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.models.module",
|
||||||
|
"resource": "doc://modules/docforge.models.module"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.models.object",
|
||||||
|
"resource": "doc://modules/docforge.models.object"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.models.project",
|
||||||
|
"resource": "doc://modules/docforge.models.project"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.nav",
|
||||||
|
"resource": "doc://modules/docforge.nav"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.nav.mkdocs",
|
||||||
|
"resource": "doc://modules/docforge.nav.mkdocs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.nav.resolver",
|
||||||
|
"resource": "doc://modules/docforge.nav.resolver"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.nav.spec",
|
||||||
|
"resource": "doc://modules/docforge.nav.spec"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.renderers",
|
||||||
|
"resource": "doc://modules/docforge.renderers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.renderers.base",
|
||||||
|
"resource": "doc://modules/docforge.renderers.base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.renderers.mcp_renderer",
|
||||||
|
"resource": "doc://modules/docforge.renderers.mcp_renderer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.renderers.mkdocs_renderer",
|
||||||
|
"resource": "doc://modules/docforge.renderers.mkdocs_renderer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.servers",
|
||||||
|
"resource": "doc://modules/docforge.servers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "docforge.servers.mcp_server",
|
||||||
|
"resource": "doc://modules/docforge.servers.mcp_server"
|
||||||
|
}
|
||||||
|
]
|
||||||
60
mkdocs.yml
Normal file
60
mkdocs.yml
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
site_name: DocForge
|
||||||
|
|
||||||
|
theme:
|
||||||
|
name: material
|
||||||
|
palette:
|
||||||
|
- scheme: slate
|
||||||
|
primary: deep purple
|
||||||
|
accent: cyan
|
||||||
|
font:
|
||||||
|
text: Inter
|
||||||
|
code: JetBrains Mono
|
||||||
|
features:
|
||||||
|
- navigation.tabs
|
||||||
|
- navigation.expand
|
||||||
|
- navigation.top
|
||||||
|
- navigation.instant
|
||||||
|
- content.code.copy
|
||||||
|
- content.code.annotate
|
||||||
|
plugins:
|
||||||
|
- search
|
||||||
|
- mkdocstrings:
|
||||||
|
handlers:
|
||||||
|
python:
|
||||||
|
paths:
|
||||||
|
- .
|
||||||
|
options:
|
||||||
|
docstring_style: google
|
||||||
|
show_source: false
|
||||||
|
show_signature_annotations: true
|
||||||
|
separate_signature: true
|
||||||
|
merge_init_into_class: true
|
||||||
|
inherited_members: true
|
||||||
|
annotations_path: brief
|
||||||
|
show_root_heading: true
|
||||||
|
group_by_category: true
|
||||||
|
|
||||||
|
nav:
|
||||||
|
- Home: docforge/index.md
|
||||||
|
- Loaders:
|
||||||
|
- docforge/loaders/index.md
|
||||||
|
- docforge/loaders/griffe_loader.md
|
||||||
|
- Models:
|
||||||
|
- docforge/models/index.md
|
||||||
|
- docforge/models/module.md
|
||||||
|
- docforge/models/object.md
|
||||||
|
- docforge/models/project.md
|
||||||
|
- Navigation:
|
||||||
|
- docforge/nav/index.md
|
||||||
|
- docforge/nav/spec.md
|
||||||
|
- docforge/nav/resolver.md
|
||||||
|
- docforge/nav/mkdocs.md
|
||||||
|
- Renderers:
|
||||||
|
- docforge/renderers/index.md
|
||||||
|
- docforge/renderers/base.md
|
||||||
|
- docforge/renderers/mkdocs_renderer.md
|
||||||
|
- docforge/renderers/mcp_renderer.md
|
||||||
|
- CLI:
|
||||||
|
- docforge/cli/index.md
|
||||||
|
- docforge/cli/main.md
|
||||||
|
- docforge/cli/mkdocs.md
|
||||||
@@ -1,38 +1,56 @@
|
|||||||
[build-system]
|
[build-system]
|
||||||
requires = ["hatchling"]
|
requires = ["setuptools>=68", "wheel"]
|
||||||
build-backend = "hatchling.build"
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "doc-forge"
|
name = "doc-forge"
|
||||||
version = "0.1.0"
|
version = "0.0.2"
|
||||||
description = "A renderer-agnostic Python documentation compiler"
|
description = "A renderer-agnostic Python documentation compiler"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.10"
|
||||||
license = { text = "MIT" }
|
license = { text = "MIT" }
|
||||||
|
|
||||||
authors = [
|
authors = [
|
||||||
{name = "doc-forge team"},
|
{ name = "Aetos Skia", email = "dev@aetoskia.com" }
|
||||||
|
]
|
||||||
|
maintainers = [
|
||||||
|
{ name = "Aetos Skia", email = "dev@aetoskia.com" }
|
||||||
]
|
]
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Development Status :: 3 - Alpha",
|
"Development Status :: 3 - Alpha",
|
||||||
"Intended Audience :: Developers",
|
"Intended Audience :: Developers",
|
||||||
"License :: OSI Approved :: MIT License",
|
"License :: OSI Approved :: MIT License",
|
||||||
"Programming Language :: Python :: 3",
|
"Programming Language :: Python :: 3",
|
||||||
"Programming Language :: Python :: 3.8",
|
|
||||||
"Programming Language :: Python :: 3.9",
|
|
||||||
"Programming Language :: Python :: 3.10",
|
"Programming Language :: Python :: 3.10",
|
||||||
"Programming Language :: Python :: 3.11",
|
"Programming Language :: Python :: 3.11",
|
||||||
"Programming Language :: Python :: 3.12",
|
"Programming Language :: Python :: 3.12",
|
||||||
|
"Framework :: FastAPI",
|
||||||
|
"Topic :: Software Development :: Libraries",
|
||||||
|
"Topic :: Internet :: WWW/HTTP :: HTTP Servers",
|
||||||
]
|
]
|
||||||
requires-python = ">=3.8"
|
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"griffe>=0.45.0",
|
"griffe>=0.45.0",
|
||||||
"click>=8.0.0",
|
"click>=8.0.0",
|
||||||
"pydantic>=2.0.0",
|
"pydantic>=2.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[project.scripts]
|
||||||
|
doc-forge = "docforge.cli.main:main"
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
mkdocs = [
|
mkdocs = [
|
||||||
"mkdocs>=1.5.0",
|
"mkdocs==1.6.1",
|
||||||
"mkdocstrings[python]>=0.20.0",
|
"mkdocs-material==9.6.23",
|
||||||
|
|
||||||
|
"mkdocstrings==0.25.2",
|
||||||
|
"mkdocstrings-python==1.10.8",
|
||||||
|
"mkdocs-autorefs==0.5.0",
|
||||||
|
|
||||||
|
"pymdown-extensions==10.16.1",
|
||||||
|
"neoteroi-mkdocs==1.1.3",
|
||||||
]
|
]
|
||||||
sphinx = [
|
sphinx = [
|
||||||
"sphinx>=5.0.0",
|
"sphinx>=5.0.0",
|
||||||
@@ -49,38 +67,28 @@ dev = [
|
|||||||
"mypy>=1.0.0",
|
"mypy>=1.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.scripts]
|
|
||||||
doc-forge = "docforge.cli.main:main"
|
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
Homepage = "https://github.com/doc-forge/doc-forge"
|
Homepage = "https://git.aetoskia.com/aetos/doc-forge"
|
||||||
Repository = "https://github.com/doc-forge/doc-forge"
|
Documentation = "https://git.aetoskia.com/aetos/doc-forge#readme"
|
||||||
Documentation = "https://doc-forge.readthedocs.io"
|
Repository = "https://git.aetoskia.com/aetos/doc-forge.git"
|
||||||
|
Issues = "https://git.aetoskia.com/aetos/doc-forge/issues"
|
||||||
|
Versions = "https://git.aetoskia.com/aetos/doc-forge/tags"
|
||||||
|
|
||||||
[tool.hatch.build.targets.wheel]
|
|
||||||
packages = ["docforge"]
|
|
||||||
|
|
||||||
[tool.black]
|
[tool.setuptools]
|
||||||
line-length = 88
|
packages = { find = { include = ["docforge*"] } }
|
||||||
target-version = ['py38']
|
|
||||||
|
[tool.setuptools.package-data]
|
||||||
|
docforge = ["templates/*.yml"]
|
||||||
|
|
||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
line-length = 88
|
line-length = 100
|
||||||
target-version = "py38"
|
target-version = "py310"
|
||||||
select = ["E", "F", "W", "I", "N", "UP", "B", "A", "C4", "DTZ", "T10", "EM", "EXE", "ISC", "ICN", "G", "PIE", "T20", "PYI", "PT", "Q", "RSE", "RET", "SIM", "TID", "TCH", "ARG", "PTH", "ERA", "PGH", "PL", "TRY", "NPY", "RUF"]
|
|
||||||
ignore = ["E501"]
|
|
||||||
|
|
||||||
[tool.mypy]
|
[tool.mypy]
|
||||||
python_version = "3.8"
|
python_version = "3.10"
|
||||||
warn_return_any = true
|
strict = true
|
||||||
warn_unused_configs = true
|
ignore_missing_imports = true
|
||||||
disallow_untyped_defs = true
|
|
||||||
disallow_incomplete_defs = true
|
|
||||||
check_untyped_defs = true
|
|
||||||
disallow_untyped_decorators = true
|
|
||||||
no_implicit_optional = true
|
|
||||||
warn_redundant_casts = true
|
|
||||||
warn_unused_ignores = true
|
|
||||||
warn_no_return = true
|
|
||||||
warn_unreachable = true
|
|
||||||
strict_equality = true
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from pathlib import Path
|
import json
|
||||||
from typing import Callable
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from click.testing import CliRunner
|
from click.testing import CliRunner
|
||||||
|
|
||||||
|
|
||||||
@@ -65,3 +65,47 @@ def mock_mkdocs_serve(monkeypatch):
|
|||||||
fake_serve,
|
fake_serve,
|
||||||
)
|
)
|
||||||
return lambda: called["value"]
|
return lambda: called["value"]
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def fake_mcp_docs(tmp_path: Path) -> Path:
|
||||||
|
"""
|
||||||
|
Create a minimal valid MCP bundle in mcp_docs/.
|
||||||
|
"""
|
||||||
|
mcp_root = tmp_path / "mcp_docs"
|
||||||
|
modules_dir = mcp_root / "modules"
|
||||||
|
modules_dir.mkdir(parents=True)
|
||||||
|
|
||||||
|
(mcp_root / "index.json").write_text(
|
||||||
|
json.dumps({"project": "test", "type": "docforge-model"}),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
(mcp_root / "nav.json").write_text(
|
||||||
|
json.dumps([]),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
(modules_dir / "test.mod.json").write_text(
|
||||||
|
json.dumps({"module": "test.mod", "content": {}}),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
return mcp_root
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_mcp_server_run(monkeypatch):
|
||||||
|
"""
|
||||||
|
Mock MCPServer.run so no real server is started.
|
||||||
|
"""
|
||||||
|
called = {"value": False}
|
||||||
|
|
||||||
|
def fake_run(self, transport="streamable-http"):
|
||||||
|
called["value"] = True
|
||||||
|
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"docforge.servers.MCPServer.run",
|
||||||
|
fake_run,
|
||||||
|
)
|
||||||
|
|
||||||
|
return lambda: called["value"]
|
||||||
|
|||||||
@@ -3,21 +3,24 @@ from pathlib import Path
|
|||||||
from docforge.cli.main import cli
|
from docforge.cli.main import cli
|
||||||
|
|
||||||
|
|
||||||
def test_generate_command(cli_runner, temp_package, tmp_path: Path):
|
def test_generate_command(cli_runner):
|
||||||
(temp_package / "mod.py").write_text(
|
with cli_runner.isolated_filesystem():
|
||||||
'''
|
cwd = Path.cwd()
|
||||||
def f(): ...
|
|
||||||
'''
|
|
||||||
)
|
|
||||||
|
|
||||||
docs_dir = tmp_path / "docs"
|
# Create package structure
|
||||||
|
pkg = cwd / "testpkg"
|
||||||
|
pkg.mkdir()
|
||||||
|
(pkg / "__init__.py").write_text("")
|
||||||
|
(pkg / "mod.py").write_text("def f(): ...\n")
|
||||||
|
|
||||||
|
docs_dir = cwd / "docs"
|
||||||
|
|
||||||
result = cli_runner.invoke(
|
result = cli_runner.invoke(
|
||||||
cli,
|
cli,
|
||||||
[
|
[
|
||||||
"generate",
|
"generate",
|
||||||
"--modules",
|
"--module",
|
||||||
"testpkg.mod",
|
"testpkg",
|
||||||
"--docs-dir",
|
"--docs-dir",
|
||||||
str(docs_dir),
|
str(docs_dir),
|
||||||
],
|
],
|
||||||
|
|||||||
18
tests/cli/test_mcp_serve.py
Normal file
18
tests/cli/test_mcp_serve.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
from docforge.cli.main import cli
|
||||||
|
|
||||||
|
|
||||||
|
def test_serve_mcp(
|
||||||
|
cli_runner,
|
||||||
|
fake_mcp_docs,
|
||||||
|
mock_mcp_server_run,
|
||||||
|
monkeypatch,
|
||||||
|
):
|
||||||
|
monkeypatch.chdir(fake_mcp_docs.parent)
|
||||||
|
|
||||||
|
result = cli_runner.invoke(
|
||||||
|
cli,
|
||||||
|
["serve-mcp"],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert mock_mcp_server_run()
|
||||||
123
tests/cli/test_mkdocs.py
Normal file
123
tests/cli/test_mkdocs.py
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
from click.testing import CliRunner
|
||||||
|
|
||||||
|
from docforge.cli.main import cli
|
||||||
|
|
||||||
|
|
||||||
|
def _write_nav_spec(path: Path) -> None:
|
||||||
|
path.write_text(
|
||||||
|
"""
|
||||||
|
home: openapi_first/index.md
|
||||||
|
groups:
|
||||||
|
Core:
|
||||||
|
- openapi_first/app.md
|
||||||
|
- openapi_first/client.md
|
||||||
|
""".strip(),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _write_docs(docs: Path) -> None:
|
||||||
|
files = [
|
||||||
|
"openapi_first/index.md",
|
||||||
|
"openapi_first/app.md",
|
||||||
|
"openapi_first/client.md",
|
||||||
|
]
|
||||||
|
for rel in files:
|
||||||
|
p = docs / rel
|
||||||
|
p.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
p.write_text(f"# {rel}", encoding="utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def test_mkdocs_uses_builtin_template(tmp_path: Path) -> None:
|
||||||
|
docs = tmp_path / "docs"
|
||||||
|
docs.mkdir()
|
||||||
|
|
||||||
|
nav_file = tmp_path / "docforge.nav.yml"
|
||||||
|
out_file = tmp_path / "mkdocs.yml"
|
||||||
|
|
||||||
|
_write_docs(docs)
|
||||||
|
_write_nav_spec(nav_file)
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
result = runner.invoke(
|
||||||
|
cli,
|
||||||
|
[
|
||||||
|
"mkdocs",
|
||||||
|
"--site-name",
|
||||||
|
"DocForge",
|
||||||
|
"--docs-dir",
|
||||||
|
str(docs),
|
||||||
|
"--nav",
|
||||||
|
str(nav_file),
|
||||||
|
"--out",
|
||||||
|
str(out_file),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert out_file.exists()
|
||||||
|
|
||||||
|
|
||||||
|
def test_mkdocs_overrides_template(tmp_path: Path) -> None:
|
||||||
|
docs = tmp_path / "docs"
|
||||||
|
docs.mkdir()
|
||||||
|
|
||||||
|
nav_file = tmp_path / "docforge.nav.yml"
|
||||||
|
template = tmp_path / "custom.yml"
|
||||||
|
out_file = tmp_path / "mkdocs.yml"
|
||||||
|
|
||||||
|
_write_docs(docs)
|
||||||
|
_write_nav_spec(nav_file)
|
||||||
|
|
||||||
|
template.write_text(
|
||||||
|
"""
|
||||||
|
site_name: Custom Site
|
||||||
|
theme:
|
||||||
|
name: readthedocs
|
||||||
|
""".strip(),
|
||||||
|
encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
result = runner.invoke(
|
||||||
|
cli,
|
||||||
|
[
|
||||||
|
"mkdocs",
|
||||||
|
"--site-name",
|
||||||
|
"Override Site",
|
||||||
|
"--docs-dir",
|
||||||
|
str(docs),
|
||||||
|
"--nav",
|
||||||
|
str(nav_file),
|
||||||
|
"--template",
|
||||||
|
str(template),
|
||||||
|
"--out",
|
||||||
|
str(out_file),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert out_file.exists()
|
||||||
|
|
||||||
|
|
||||||
|
def test_mkdocs_missing_nav_fails(tmp_path: Path) -> None:
|
||||||
|
docs = tmp_path / "docs"
|
||||||
|
docs.mkdir()
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
result = runner.invoke(
|
||||||
|
cli,
|
||||||
|
[
|
||||||
|
"mkdocs",
|
||||||
|
"--site-name",
|
||||||
|
"DocForge",
|
||||||
|
"--docs-dir",
|
||||||
|
str(docs),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result.exit_code != 0
|
||||||
|
assert "Nav spec not found" in result.output
|
||||||
@@ -1,12 +1,21 @@
|
|||||||
|
import pytest
|
||||||
from docforge import GriffeLoader
|
from docforge import GriffeLoader
|
||||||
|
|
||||||
|
|
||||||
def test_import_failure_does_not_crash():
|
def test_load_project_raises_on_missing_module_by_default():
|
||||||
loader = GriffeLoader()
|
loader = GriffeLoader()
|
||||||
|
|
||||||
project = loader.load_project(
|
with pytest.raises(ImportError):
|
||||||
|
loader.load_project(
|
||||||
["nonexistent.module", "sys"]
|
["nonexistent.module", "sys"]
|
||||||
)
|
)
|
||||||
|
|
||||||
# sys should still load
|
def test_load_project_skips_missing_modules_when_enabled():
|
||||||
|
loader = GriffeLoader()
|
||||||
|
|
||||||
|
project = loader.load_project(
|
||||||
|
["nonexistent.module", "sys"],
|
||||||
|
skip_import_errors=True,
|
||||||
|
)
|
||||||
|
|
||||||
assert "sys" in project.modules
|
assert "sys" in project.modules
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user