Source code for ralph.prompts.reviewer

"""Utility functions for rendering reviewer prompts."""

from __future__ import annotations

from ralph.prompts.template_context import TemplateContext
from ralph.prompts.template_engine import TemplateRenderingError, render_template
from ralph.prompts.template_registry import (
    TemplateNotFoundError,
    TemplateRegistry,
    packaged_template_root,
)

__all__ = [
    "CHANGES_PLACEHOLDER",
    "PLAN_PLACEHOLDER",
    "prompt_review",
    "render_review_prompt",
]

PLAN_PLACEHOLDER = "(no plan available)"
"""Fallback text when reviewer plan content is empty."""

CHANGES_PLACEHOLDER = "(no diff available)"
"""Fallback text when reviewer change description is empty."""


def _normalize_content(value: str, placeholder: str) -> str:
    stripped = value.strip()
    return stripped if stripped else placeholder


[docs] def render_review_prompt( plan: str, changes: str, *, template_registry: TemplateRegistry | None = None, template_name: str = "review", ) -> str: """Render the reviewer prompt using the requested template. If a template registry is provided, the named template is used. Missing placeholders or templates fall back to the built-in default template. """ plan_value = _normalize_content(plan, PLAN_PLACEHOLDER) changes_value = _normalize_content(changes, CHANGES_PLACEHOLDER) template = _load_packaged_review_template() partials = TemplateContext.default().partials if template_registry is not None: try: template = template_registry.get_template(template_name) except TemplateNotFoundError: template = _load_packaged_review_template() try: return render_template( template, { "PLAN": plan_value, "PLAN_PATH": "", "CHANGES": changes_value, "CHANGES_PATH": "", "FIX_RESULT": "(no fix result available)", "FIX_RESULT_PATH": "", "LAST_RETRY_ERROR": "", }, partials, ) except TemplateRenderingError as err: raise ValueError("Unable to render review prompt; invalid Jinja template") from err
prompt_review = render_review_prompt """Backward-compatible alias matching the original reviewer prompt name.""" def _load_packaged_review_template() -> str: return (packaged_template_root() / "review.jinja").read_text(encoding="utf-8")