Conversation
Reviewer's GuideThis PR introduces a file-level comment summary to Class diagram for summarize_files helper and related typesclassDiagram
class ReviewThread {
+String id
+bool is_resolved
+CommentConnection comments
}
class CommentConnection {
+Vec~ReviewComment~ nodes
+PageInfo page_info
}
class ReviewComment {
+String body
+String diff_hunk
+Option~usize~ original_position
+Option~usize~ position
+String path
+String url
+Option~Author~ author
}
class PageInfo {
+bool has_next_page
+Option~String~ end_cursor
}
ReviewThread --> CommentConnection : comments
CommentConnection --> ReviewComment : nodes
CommentConnection --> PageInfo : page_info
ReviewComment --> Author : author
class summarize_files {
+summarize_files(threads: &[ReviewThread]) Vec<(String, usize)>
}
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Warning Rate limit exceeded@leynos has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 5 minutes and 48 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (3)
Summary by CodeRabbit
WalkthroughUpdate the README.md for improved formatting, clarity, and expanded documentation of the Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant CLI
participant GitHubAPI
User->>CLI: Run `pr` subcommand
CLI->>GitHubAPI: Fetch unresolved review threads
GitHubAPI-->>CLI: Return review threads
CLI->>CLI: Call summarize_files(threads)
CLI->>User: Print summary of files and comment counts
CLI->>User: Print unresolved comments
Poem
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Hey @leynos - I've reviewed your changes - here's some feedback:
- Consider sorting the summary output by descending comment count (rather than path name) so the files with the most comments appear first.
- You might extract the summary-printing block into its own helper function to keep run_pr focused and make the output logic easier to customize or test.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- Consider sorting the summary output by descending comment count (rather than path name) so the files with the most comments appear first.
- You might extract the summary-printing block into its own helper function to keep run_pr focused and make the output logic easier to customize or test.
## Individual Comments
### Comment 1
<location> `src/main.rs:1009` </location>
<code_context>
}
+
+ #[test]
+ fn summarize_files_counts_comments() {
+ fn comment(path: &str) -> ReviewComment {
+ ReviewComment {
</code_context>
<issue_to_address>
Consider implementing Default for your GitHub types to simplify test setup and reduce repetitive code.
```markdown
You can cut most of the boilerplate in the test by giving your GitHub types a `Default` (or test‐only default) and then only overriding the fields you care about. For example:
```rust
// in src/github_types.rs (or wherever these live)
#[derive(Clone, Debug)]
pub struct ReviewComment {
pub body: String,
pub diff_hunk: String,
pub original_position: Option<i64>,
pub position: Option<i64>,
pub path: String,
pub url: String,
pub author: Option<User>,
}
#[derive(Clone, Debug)]
pub struct PageInfo {
pub has_next_page: bool,
pub end_cursor: Option<String>,
}
#[derive(Clone, Debug)]
pub struct CommentConnection {
pub nodes: Vec<ReviewComment>,
pub page_info: PageInfo,
}
// impl Default for all three
impl Default for ReviewComment {
fn default() -> Self {
ReviewComment {
body: String::new(),
diff_hunk: String::new(),
original_position: None,
position: None,
path: String::new(),
url: String::new(),
author: None,
}
}
}
impl Default for PageInfo {
fn default() -> Self {
PageInfo {
has_next_page: false,
end_cursor: None,
}
}
}
impl Default for CommentConnection {
fn default() -> Self {
CommentConnection {
nodes: Vec::new(),
page_info: PageInfo::default(),
}
}
}
// (Optionally) if ReviewThread is in your control, derive Default there too
impl Default for ReviewThread {
fn default() -> Self {
ReviewThread {
id: String::new(),
is_resolved: false,
comments: CommentConnection::default(),
}
}
}
```
Then your test can shrink to:
```rust
#[cfg(test)]
mod tests {
use super::*;
fn comment(path: &str) -> ReviewComment {
ReviewComment { path: path.into(), ..Default::default() }
}
#[test]
fn summarize_files_counts_comments() {
let t1 = ReviewThread {
comments: CommentConnection {
nodes: vec![ comment("a.rs"), comment("b.rs") ],
..Default::default()
},
..Default::default()
};
let t2 = ReviewThread {
comments: CommentConnection {
nodes: vec![ comment("a.rs") ],
..Default::default()
},
..Default::default()
};
let summary = summarize_files(&[t1, t2]);
assert_eq!(summary, vec![("a.rs".into(), 2), ("b.rs".into(), 1)]);
}
}
```
That removes the repetitive field‐by‐field setup but keeps your coverage and logic intact.
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
There was a problem hiding this comment.
Actionable comments posted: 5
🔭 Outside diff range comments (1)
src/main.rs (1)
1-1: Add required module-level documentation.The coding guidelines mandate that every module must begin with a
//!doc comment explaining the module's purpose and utility. Add this at the top of the file.+//! Command-line tool for viewing GitHub pull request comments and issues. +//! +//! This module provides the main application logic for fetching and displaying +//! unresolved review comments from GitHub pull requests using the GraphQL API. + #![allow(non_snake_case)]
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
README.md(3 hunks)src/main.rs(3 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.md
Instructions used from:
Sources:
⚙️ CodeRabbit Configuration File
**/*.rs
Instructions used from:
Sources:
⚙️ CodeRabbit Configuration File
🪛 LanguageTool
README.md
[uncategorized] ~3-~3: Possible missing comma found.
Context: ...ause vc was already taken back in the 1970s and no one argues with a greybeard. Thi...
(AI_HYDRA_LEO_MISSING_COMMA)
[typographical] ~24-~24: To join two clauses or introduce examples, consider using an em dash.
Context: ...he CLI provides two subcommands: * pr - show unresolved pull request comments. A...
(DASH_RULE)
[typographical] ~26-~26: To join two clauses or introduce examples, consider using an em dash.
Context: ...ent counts is printed first. * issue - read a GitHub issue (to do) If you ...
(DASH_RULE)
[uncategorized] ~37-~37: Possible missing comma found.
Context: ...HUB_TOKEN` to authenticate. If it's not set you'll get a warning and anonymous requ...
(AI_HYDRA_LEO_MISSING_COMMA)
[locale-violation] ~65-~65: License must be spelled with a “c” when used as a noun in British English. Use “licence”.
Context: ... This project is licensed under the ISC License. See LICENSE for details.
(LICENCE_LICENSE_NOUN_SINGULAR)
[locale-violation] ~66-~66: LICENSE must be spelled with a “c” when used as a noun in British English. Use “licence”.
Context: ...is licensed under the ISC License. See LICENSE for details.
(LICENCE_LICENSE_NOUN_SINGULAR)
🔇 Additional comments (3)
src/main.rs (2)
575-584: Function implementation follows best practices.The
summarize_filesfunction correctly uses aBTreeMapfor deterministic ordering and implements a clear aggregation pattern. The logic is straightforward and maintains low cyclomatic complexity.
615-622: Summary output enhances user experience.The integration of the summary display improves the tool's usability by providing an overview before detailed comments. The conditional display logic prevents empty output when no files have comments.
README.md (1)
45-46: Example formatting follows best practices.The bash syntax highlighting specification for the code block improves readability and follows proper markdown conventions.
Summary
Testing
cargo fmt --allcargo clippy -- -D warningsRUSTFLAGS="-D warnings" cargo testmarkdownlint README.md docs/GITHUB_TOKEN.mdnixie README.md docs/GITHUB_TOKEN.mdhttps://chatgpt.com/codex/tasks/task_e_687cbce2aff88322aad72786f7eb1047
Summary by Sourcery
Add file comment summary to the
vk proutput, update documentation to reflect this addition, and include tests for the summary helper.New Features:
vk prEnhancements:
Tests: