diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index b967a0be..aeecd35b 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -164,7 +164,7 @@ def convert_to_markdown_v2(output_data: dict, if gfm_supported: markdown_text += "\n" - todos_summary = output_data['review'].pop('todos_summary', '') + todo_summary = output_data['review'].pop('todo_summary', '') for key, value in output_data['review'].items(): if value is None or value == '' or value == {} or value == []: if key.lower() not in ['can_be_split', 'key_issues_to_review']: @@ -260,12 +260,9 @@ def convert_to_markdown_v2(output_data: dict, else: return file_ref - if gfm_supported: - markdown_text += f"\n" - else: - if is_value_no(value): - markdown_text += f"### {emoji} No TODO sections\n\n" else: - markdown_text += f"### {emoji} TODO sections ({len(value)} items)\n
{todos_summary}\n\n" if isinstance(value, list): for todo_item in value: markdown_text += f"- {format_todo_item(todo_item)}\n" else: markdown_text += f"- {format_todo_item(value)}\n" + return markdown_text + + markdown_todo_items = format_todo_items(value) + EXPAND_LINE_THRESHOLD = 10 + details_open_attr = " open" if markdown_todo_items.count("\n") + 1 <= EXPAND_LINE_THRESHOLD else "" + + todo_entry_label = f"{len(value)} " + "entries" if len(value) > 1 else "entry" + if gfm_supported: + markdown_text += "
\n" + else: + if is_value_no(value): + markdown_text += f"### {emoji} No TODO sections\n\n" + else: + markdown_text += f"### {emoji} TODO sections ({todo_entry_label})\n{todo_summary}\n\n" + markdown_text += markdown_todo_items markdown_text += "\n\n\n" elif 'can be split' in key_nice.lower(): if gfm_supported: diff --git a/pr_agent/settings/pr_reviewer_prompts.toml b/pr_agent/settings/pr_reviewer_prompts.toml index 6d94acd6..c96cac6e 100644 --- a/pr_agent/settings/pr_reviewer_prompts.toml +++ b/pr_agent/settings/pr_reviewer_prompts.toml @@ -75,7 +75,7 @@ class KeyIssuesComponentLink(BaseModel): class TodoSection(BaseModel): relevant_file: str = Field(description="The file containing the TODO comment") line_range: Tuple[int, int] = Field(description="Start and end line numbers of the TODO comment (inclusive). Must be a tuple of two integers, e.g., (7, 7) for a single line or (7, 10) for a range. Do not use list format [7, 7].") - content: str = Field(description="The content of the TODO comment. Only include actual TODO comments within code comments (e.g., lines starting with '#', '//', '/*', '
" - if is_value_no(value): - markdown_text += f"{emoji} No TODO sections" - else: - markdown_text += f"{emoji} TODO sections ({len(value)} items)\n
{todos_summary}\n\n" + def format_todo_items(value: list[TodoItem] | TodoItem) -> str: + markdown_text = "" + if gfm_supported: if isinstance(value, list): markdown_text += "
    \n" for todo_item in value: @@ -273,18 +270,35 @@ def convert_to_markdown_v2(output_data: dict, markdown_text += "
\n" else: markdown_text += f"

{format_todo_item(value)}

\n" - markdown_text += "\n
\n" - markdown_text += f"
" + if is_value_no(value): + markdown_text += f"{emoji} No TODO sections" + else: + markdown_text += f"{emoji} TODO sections ({todo_entry_label})\n" + markdown_text += f"{todo_summary}\n\n" + markdown_text += markdown_todo_items + markdown_text += "\n\n" + markdown_text += "