Compare commits

...

3 Commits

Author SHA1 Message Date
1371343ff4 Ruff after aider
All checks were successful
Run Python tests (through Pytest) / Test (push) Successful in 25s
Verify Python project can be installed, loaded and have version checked / Test (push) Successful in 22s
2025-04-15 23:41:22 +02:00
44104215a2 feat: Add support for assigning reviewers and assignees to pull requests 2025-04-15 23:41:18 +02:00
0db5ea7214 Initial ruff pass 2025-04-15 23:39:46 +02:00
4 changed files with 85 additions and 5 deletions

View File

@ -283,8 +283,10 @@ def run_cmd(cmd: list[str], cwd: Path | None = None, check=True) -> bool:
result = subprocess.run(cmd, check=check, cwd=cwd)
return result.returncode == 0
SKIP_AIDER = False
def solve_issue_in_repository(
args,
tmpdirname: Path,
@ -294,7 +296,7 @@ def solve_issue_in_repository(
issue_number: str,
gitea_client=None,
) -> bool:
logger.info("### %s #####", issue_title)
logger.info('### %s #####', issue_title)
repo_url = f'{args.gitea_url}:{args.owner}/{args.repo}.git'.replace(
'https://',
@ -331,7 +333,7 @@ def solve_issue_in_repository(
check=False,
)
else:
logger.warning("Skipping aider command (for testing)")
logger.warning('Skipping aider command (for testing)')
succeeded = True
if not succeeded:
logger.error('Aider invocation failed for issue #%s', issue_number)
@ -409,6 +411,8 @@ def handle_issues(args, client, seen_issues_db):
issue_description,
issue_number,
client,
reviewers=args.reviewers,
assignees=args.assignees,
)
if solved:

View File

@ -22,6 +22,8 @@ class AiderArgs:
owner: str
repo: str
base_branch: str
reviewers: list[str] = None
assignees: list[str] = None
def parse_args():
@ -54,6 +56,16 @@ def parse_args():
default=300,
help='Interval in seconds between checks in daemon mode (default: 300)',
)
parser.add_argument(
'--reviewers',
type=str,
help='Comma-separated list of usernames to assign as reviewers for pull requests',
)
parser.add_argument(
'--assignees',
type=str,
help='Comma-separated list of usernames to assign as assignees for pull requests',
)
return parser.parse_args()
@ -72,11 +84,17 @@ def main():
while True:
logger.info('Checking for new issues...')
for repo in repositories:
# Parse reviewers and assignees from comma-separated strings to lists
reviewers = args.reviewers.split(',') if args.reviewers else None
assignees = args.assignees.split(',') if args.assignees else None
aider_args = AiderArgs(
gitea_url=args.gitea_url,
owner=args.owner,
repo=repo,
base_branch=args.base_branch,
reviewers=reviewers,
assignees=assignees,
)
handle_issues(aider_args, client, seen_issues_db)
del repo

49
test/test_main_args.py Normal file
View File

@ -0,0 +1,49 @@
from unittest.mock import patch
from aider_gitea.__main__ import parse_args
def test_parse_args_with_reviewers_and_assignees():
"""Test that reviewers and assignees arguments are correctly parsed."""
test_args = [
'--gitea-url',
'https://gitea.example.com',
'--owner',
'test-owner',
'--repo',
'test-repo',
'--reviewers',
'user1,user2',
'--assignees',
'user3,user4',
]
with patch('sys.argv', ['aider_gitea'] + test_args):
args = parse_args()
assert args.gitea_url == 'https://gitea.example.com'
assert args.owner == 'test-owner'
assert args.repo == 'test-repo'
assert args.reviewers == 'user1,user2'
assert args.assignees == 'user3,user4'
def test_parse_args_without_reviewers_and_assignees():
"""Test that the parser works without reviewers and assignees."""
test_args = [
'--gitea-url',
'https://gitea.example.com',
'--owner',
'test-owner',
'--repo',
'test-repo',
]
with patch('sys.argv', ['aider_gitea'] + test_args):
args = parse_args()
assert args.gitea_url == 'https://gitea.example.com'
assert args.owner == 'test-owner'
assert args.repo == 'test-repo'
assert args.reviewers is None
assert args.assignees is None

View File

@ -24,7 +24,11 @@ class TestSolveIssueInRepository:
@patch('aider_gitea.push_changes')
@patch('subprocess.run')
def test_solve_issue_with_aider_changes(
self, mock_subprocess_run, mock_push_changes, mock_run_cmd, mock_llm_api_key,
self,
mock_subprocess_run,
mock_push_changes,
mock_run_cmd,
mock_llm_api_key,
):
# Setup mocks
mock_run_cmd.return_value = True
@ -34,7 +38,8 @@ class TestSolveIssueInRepository:
mock_subprocess_run.side_effect = [
MagicMock(stdout='abc123\n', returncode=0), # First git rev-parse
MagicMock(
stdout='file1.py\nfile2.py\n', returncode=0,
stdout='file1.py\nfile2.py\n',
returncode=0,
), # git diff with changes
]
@ -59,7 +64,11 @@ class TestSolveIssueInRepository:
@patch('aider_gitea.push_changes')
@patch('subprocess.run')
def test_solve_issue_without_aider_changes(
self, mock_subprocess_run, mock_push_changes, mock_run_cmd, mock_llm_api_key,
self,
mock_subprocess_run,
mock_push_changes,
mock_run_cmd,
mock_llm_api_key,
):
# Setup mocks
mock_run_cmd.return_value = True