Skip to content

Commit 69d516e

Browse files
authored
fix(#86): make terminal formatter comments not truncated, and add suggestions (#114)
1 parent 4d479b6 commit 69d516e

File tree

4 files changed

+43
-24
lines changed

4 files changed

+43
-24
lines changed

scripts/evaluate_review_quality.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77

88
import click
99
import gitlab
10+
import httpx
1011
from lgtm_ai.ai.agent import get_ai_model, get_reviewer_agent_with_settings, get_summarizing_agent_with_settings
1112
from lgtm_ai.ai.schemas import Review, SupportedAIModels, SupportedAIModelsList
1213
from lgtm_ai.config.handler import ResolvedConfig
1314
from lgtm_ai.formatters.markdown import MarkDownFormatter
1415
from lgtm_ai.git_client.gitlab import GitlabClient
1516
from lgtm_ai.review import CodeReviewer
17+
from lgtm_ai.review.context import ContextRetriever
1618
from lgtm_ai.validators import parse_pr_url
1719
from rich.logging import RichHandler
1820

@@ -93,11 +95,15 @@ def perform_review(
9395
output_dir: str, pr_url: str, pr_name: str, sample: int, model: SupportedAIModels, git_api_key: str, ai_api_key: str
9496
) -> None:
9597
url = parse_pr_url(mock.Mock(), "pr_url", pr_url)
98+
git_client = GitlabClient(client=gitlab.Gitlab(private_token=git_api_key), formatter=MarkDownFormatter())
9699
code_reviewer = CodeReviewer(
97100
reviewer_agent=get_reviewer_agent_with_settings(),
98101
summarizing_agent=get_summarizing_agent_with_settings(),
99102
model=get_ai_model(model_name=model, api_key=ai_api_key),
100-
git_client=GitlabClient(gitlab.Gitlab(private_token=git_api_key), formatter=MarkDownFormatter()),
103+
git_client=git_client,
104+
context_retriever=ContextRetriever(
105+
git_client=git_client, issues_client=git_client, httpx_client=httpx.Client(timeout=3)
106+
),
101107
config=ResolvedConfig(model=model, technologies=("Python", "Django", "FastAPI")),
102108
)
103109
review = code_reviewer.review_pull_request(pr_url=url)

src/lgtm_ai/__main__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import click
88
import httpx
9-
import rich
109
from lgtm_ai.ai.agent import (
1110
get_ai_model,
1211
get_guide_agent_with_settings,
@@ -284,7 +283,8 @@ def _set_logging_level(logger: logging.Logger, verbose: int) -> None:
284283
def _get_formatter_and_printer(output_format: OutputFormat) -> tuple[Formatter[Any], Callable[[Any], None]]:
285284
"""Get the formatter and the print method based on the output format."""
286285
if output_format == OutputFormat.pretty:
287-
return PrettyFormatter(), rich.print
286+
console = Console()
287+
return PrettyFormatter(), console.print
288288
elif output_format == OutputFormat.markdown:
289289
return MarkDownFormatter(), print
290290
elif output_format == OutputFormat.json:

src/lgtm_ai/formatters/pretty.py

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
logger = logging.getLogger("lgtm")
1313

1414

15-
class PrettyFormatter(Formatter[Panel | Layout]):
15+
class PrettyFormatter(Formatter[Panel | Layout | Group]):
1616
def format_review_summary_section(self, review: Review, comments: list[ReviewComment] | None = None) -> Panel:
1717
if comments:
1818
logger.warning("Comments are not supported in the terminal formatter summary section")
@@ -26,24 +26,38 @@ def format_review_summary_section(self, review: Review, comments: list[ReviewCom
2626
subtitle=f"Score: {review.review_response.score} {SCORE_MAP[review.review_response.score]}",
2727
)
2828

29-
def format_review_comments_section(self, comments: list[ReviewComment]) -> Layout:
29+
def format_review_comments_section(self, comments: list[ReviewComment]) -> Group:
3030
panels = [self.format_review_comment(comment) for comment in comments]
31-
layout = Layout()
32-
layout.split_column(*panels)
33-
return layout
31+
return Group(*panels)
3432

3533
def format_review_comment(self, comment: ReviewComment, *, with_footer: bool = True) -> Panel:
3634
content: Text | Group
3735
if comment.quote_snippet:
38-
snippet_panel = Panel(
39-
comment.quote_snippet,
40-
style="dim",
41-
title="Code Snippet",
42-
title_align="left",
43-
padding=(1, 1),
44-
)
45-
content = Group(snippet_panel, Text(comment.comment))
46-
# TODO: add code suggestions
36+
elements: list[Panel | Markdown | Group | Text] = [
37+
Panel(
38+
comment.quote_snippet,
39+
style="dim",
40+
title="Code Snippet",
41+
title_align="left",
42+
padding=(1, 1),
43+
),
44+
Text(""),
45+
Markdown(comment.comment),
46+
]
47+
if comment.suggestion:
48+
elements.extend(
49+
[
50+
Text(""),
51+
Panel(
52+
comment.suggestion.snippet,
53+
style="dim green",
54+
title="Code Suggestion",
55+
title_align="left",
56+
padding=(1, 1),
57+
),
58+
]
59+
)
60+
content = Group(*elements)
4761
else:
4862
content = Text(comment.comment)
4963

tests/formatters/test_terminal.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,13 @@ def test_format_comments_section() -> None:
4242
]
4343

4444
formatter = PrettyFormatter()
45-
layout = formatter.format_review_comments_section(comments)
46-
assert len(layout.children) == 3
47-
child_panels = [child._renderable for child in layout.children]
48-
assert all(isinstance(child, rich.panel.Panel) for child in child_panels)
49-
assert all(cast(rich.panel.Panel, child).title == "test.py:1" for child in child_panels)
45+
group = formatter.format_review_comments_section(comments)
46+
assert len(group.renderables) == 3
47+
assert all(isinstance(child, rich.panel.Panel) for child in group.renderables)
48+
assert all(cast(rich.panel.Panel, child).title == "test.py:1" for child in group.renderables)
5049

5150

5251
def test_format_comments_section_no_comments() -> None:
5352
formatter = PrettyFormatter()
54-
layout = formatter.format_review_comments_section([])
55-
assert len(layout.children) == 0
53+
group = formatter.format_review_comments_section([])
54+
assert len(group.renderables) == 0

0 commit comments

Comments
 (0)