From a1d1f016065b7043e3ca755e13ee8736281324ed Mon Sep 17 00:00:00 2001 From: Jon Michael Aanes Date: Mon, 9 Jun 2025 18:04:24 +0200 Subject: [PATCH] Ruff after Claude Code --- aider_gitea/__init__.py | 8 ++- aider_gitea/__main__.py | 6 ++ aider_gitea/gitea_client.py | 103 ++++++++++++++++++++++++++- test/test_claude_code_integration.py | 14 ++-- 4 files changed, 122 insertions(+), 9 deletions(-) diff --git a/aider_gitea/__init__.py b/aider_gitea/__init__.py index 9fe3f23..663daca 100644 --- a/aider_gitea/__init__.py +++ b/aider_gitea/__init__.py @@ -156,6 +156,7 @@ class RepositoryConfig: owner: str repo: str base_branch: str + assignee: str | None = None def repo_url(self) -> str: return f'{self.gitea_url}:{self.owner}/{self.repo}.git'.replace( @@ -497,7 +498,10 @@ def push_changes( cmd = ['git', 'push', 'origin', branch_name, '--force'] run_cmd(cmd, cwd) - # Then create the PR with the aider label + # Then create the PR with the aider label and optional assignee/reviewer + assignees = [repository_config.assignee] if repository_config.assignee else None + reviewers = [repository_config.assignee] if repository_config.assignee else None + pr_response = gitea_client.create_pull_request( owner=repository_config.owner, repo=repository_config.repo, @@ -506,6 +510,8 @@ def push_changes( head=branch_name, base=repository_config.base_branch, labels=['aider'], + assignees=assignees, + reviewers=reviewers, ) # Extract PR number and URL if available diff --git a/aider_gitea/__main__.py b/aider_gitea/__main__.py index e9ab35e..33afafb 100644 --- a/aider_gitea/__main__.py +++ b/aider_gitea/__main__.py @@ -55,6 +55,11 @@ def parse_args(): help='Model to use for evaluating code (overrides default)', default=None, ) + parser.add_argument( + '--assignee', + help='Username to automatically assign as assignee and reviewer for created pull requests', + default=None, + ) return parser.parse_args() @@ -84,6 +89,7 @@ def main(): owner=args.owner, repo=repo, base_branch=args.base_branch, + assignee=args.assignee, ) solve_issues_in_repository(repository_config, client, seen_issues_db) del repo diff --git a/aider_gitea/gitea_client.py b/aider_gitea/gitea_client.py index bf90768..4ae6596 100644 --- a/aider_gitea/gitea_client.py +++ b/aider_gitea/gitea_client.py @@ -139,8 +139,10 @@ class GiteaClient: head: str, base: str, labels: list[str] = None, + assignees: list[str] = None, + reviewers: list[str] = None, ) -> dict: - """Create a pull request and optionally apply labels. + """Create a pull request and optionally apply labels, assignees, and reviewers. Args: owner (str): Owner of the repository. @@ -150,6 +152,8 @@ class GiteaClient: head (str): The name of the branch where changes are implemented. base (str): The name of the branch you want the changes pulled into. labels (list[str], optional): List of label names to apply to the pull request. + assignees (list[str], optional): List of usernames to assign to the pull request. + reviewers (list[str], optional): List of usernames to request reviews from. Returns: dict: The created pull request data. @@ -165,6 +169,12 @@ class GiteaClient: 'base': base, } + # Add assignees and reviewers if provided + if assignees: + json_data['assignees'] = assignees + if reviewers: + json_data['reviewers'] = reviewers + response = self.session.post(url, json=json_data) # If a pull request for this head/base already exists, return it instead of crashing if response.status_code == 409: @@ -179,11 +189,100 @@ class GiteaClient: pr.get('head', {}).get('ref') == head and pr.get('base', {}).get('ref') == base ): + # Try to set assignees and reviewers on existing PR + pr_number = pr.get('number') + if assignees and pr_number: + self.set_pull_request_assignees( + owner, + repo, + pr_number, + assignees, + ) + if reviewers and pr_number: + self.set_pull_request_reviewers( + owner, + repo, + pr_number, + reviewers, + ) return pr # fallback to raise if we can’t find it response.raise_for_status() response.raise_for_status() - return response.json() + + pr_data = response.json() + + # If initial creation didn't set assignees/reviewers, try setting them separately + pr_number = pr_data.get('number') + if pr_number: + if assignees: + self.set_pull_request_assignees(owner, repo, pr_number, assignees) + if reviewers: + self.set_pull_request_reviewers(owner, repo, pr_number, reviewers) + + return pr_data + + def set_pull_request_assignees( + self, + owner: str, + repo: str, + pr_number: int, + assignees: list[str], + ) -> bool: + """Set assignees for a pull request. + + Args: + owner (str): Owner of the repository. + repo (str): Name of the repository. + pr_number (int): Pull request number. + assignees (list[str]): List of usernames to assign. + + Returns: + bool: True if successful, False otherwise. + """ + url = f'{self.gitea_url}/repos/{owner}/{repo}/pulls/{pr_number}/assignees' + json_data = {'assignees': assignees} + try: + response = self.session.put(url, json=json_data) + response.raise_for_status() + logger.info('Assigned users %s to PR #%s', assignees, pr_number) + return True + except Exception: + logger.warning('Failed to assign users %s to PR #%s', assignees, pr_number) + return False + + def set_pull_request_reviewers( + self, + owner: str, + repo: str, + pr_number: int, + reviewers: list[str], + ) -> bool: + """Set reviewers for a pull request. + + Args: + owner (str): Owner of the repository. + repo (str): Name of the repository. + pr_number (int): Pull request number. + reviewers (list[str]): List of usernames to request reviews from. + + Returns: + bool: True if successful, False otherwise. + """ + url = f'{self.gitea_url}/repos/{owner}/{repo}/pulls/{pr_number}/reviewers' + json_data = {'reviewers': reviewers} + try: + response = self.session.post(url, json=json_data) + response.raise_for_status() + logger.info('Requested reviews from %s for PR #%s', reviewers, pr_number) + return True + except Exception: + logger.warning( + 'Failed to request reviews from %s for PR #%s', + reviewers, + pr_number, + ) + return False def get_failed_pipelines(self, owner: str, repo: str, pr_number: str) -> list[int]: """Fetch pipeline runs for a PR and return IDs of failed runs.""" diff --git a/test/test_claude_code_integration.py b/test/test_claude_code_integration.py index 9229225..ad83669 100644 --- a/test/test_claude_code_integration.py +++ b/test/test_claude_code_integration.py @@ -69,9 +69,10 @@ class TestClaudeCodeIntegration: 'claude', '-p', '--output-format', - 'json', - '--max-turns', - '10', + 'stream-json', + '--debug', + '--verbose', + '--dangerously-skip-permissions', issue, ] assert cmd == expected @@ -84,9 +85,10 @@ class TestClaudeCodeIntegration: 'claude', '-p', '--output-format', - 'json', - '--max-turns', - '10', + 'stream-json', + '--debug', + '--verbose', + '--dangerously-skip-permissions', '--model', 'claude-3-sonnet', issue,