From da494564ea87575497d8713d40dd180006d84020 Mon Sep 17 00:00:00 2001 From: "Jon Michael Aanes (aider)" Date: Sun, 13 Apr 2025 17:31:32 +0200 Subject: [PATCH 1/4] feat: add daemon mode functionality and corresponding unit tests --- aider_gitea/__main__.py | 40 ++++++++++++++++++++++++---------------- test/test_daemon_mode.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 test/test_daemon_mode.py diff --git a/aider_gitea/__main__.py b/aider_gitea/__main__.py index 44a357e..828428e 100644 --- a/aider_gitea/__main__.py +++ b/aider_gitea/__main__.py @@ -126,6 +126,7 @@ def parse_args(): parser.add_argument("--owner", required=True, help="Owner of the repository") parser.add_argument("--repo", required=True, help="Repository name") parser.add_argument("--base-branch", default="main", help="Base branch to use for new branches (default: main)") + parser.add_argument("--daemon", action="store_true", help="Run in daemon mode, continuously checking for new issues.") return parser.parse_args() def push_changes(cwd: Path, branch_name: str, issue_number: str, issue_title: str, issue_description: str, base_branch: str) -> None: @@ -175,23 +176,30 @@ def main(): logger.info("No issues found.") return - for issue in issues: - issue_number = issue.get("number") - issue_description = issue.get("body", "") - title = issue.get("title", f"Issue {issue_number}") - issue_text = f"{title}\n{issue_description}" - if seen_issues_db.has_seen(issue_text): - logger.info(f"Skipping already processed issue #{issue_number}: {title}") - continue + while True: + for issue in issues: + issue_number = issue.get("number") + issue_description = issue.get("body", "") + title = issue.get("title", f"Issue {issue_number}") + issue_text = f"{title}\n{issue_description}" + if seen_issues_db.has_seen(issue_text): + logger.info(f"Skipping already processed issue #{issue_number}: {title}") + continue - branch_name = generate_branch_name(issue_number, title) - seen_issues_db.mark_as_seen(issue_text) - try: - with tempfile.TemporaryDirectory() as tmpdirname: - process_issue(args, Path(tmpdirname), branch_name, title, issue_description, issue_number) - except Exception: - logger.exception('Error processing issue') - sys.exit(1) + branch_name = generate_branch_name(issue_number, title) + seen_issues_db.mark_as_seen(issue_text) + try: + with tempfile.TemporaryDirectory() as tmpdirname: + process_issue(args, Path(tmpdirname), branch_name, title, issue_description, issue_number) + except Exception: + logger.exception('Error processing issue') + sys.exit(1) + + if not args.daemon: + break + + logger.info("Daemon mode: sleeping for 60 seconds before checking for new issues.") + time.sleep(60) if __name__ == "__main__": main() diff --git a/test/test_daemon_mode.py b/test/test_daemon_mode.py new file mode 100644 index 0000000..0f2ab30 --- /dev/null +++ b/test/test_daemon_mode.py @@ -0,0 +1,33 @@ +import unittest +from unittest.mock import patch, MagicMock +import aider_gitea.__main__ as main_module + +class TestDaemonMode(unittest.TestCase): + + @patch('aider_gitea.__main__.GiteaClient') + @patch('aider_gitea.__main__.SeenIssuesDB') + @patch('aider_gitea.__main__.process_issue') + def test_daemon_mode(self, mock_process_issue, MockSeenIssuesDB, MockGiteaClient): + mock_args = MagicMock() + mock_args.daemon = True + mock_args.gitea_url = "http://example.com" + mock_args.owner = "owner" + mock_args.repo = "repo" + mock_args.base_branch = "main" + + mock_client = MockGiteaClient.return_value + mock_client.get_issues.return_value = [ + {"number": 1, "title": "Test Issue", "body": "This is a test issue", "labels": [{"name": "aider"}]} + ] + + mock_db = MockSeenIssuesDB.return_value + mock_db.has_seen.return_value = False + + with patch('time.sleep', return_value=None): + with self.assertRaises(SystemExit): + main_module.main() + + mock_process_issue.assert_called_once() + +if __name__ == '__main__': + unittest.main() -- 2.45.1 From 6867ddf087f3179b7d140b1dde4e452d552fc2d6 Mon Sep 17 00:00:00 2001 From: "Jon Michael Aanes (aider)" Date: Sun, 13 Apr 2025 17:31:41 +0200 Subject: [PATCH 2/4] test: Mock sys.argv in test_daemon_mode to provide required arguments --- test/test_daemon_mode.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_daemon_mode.py b/test/test_daemon_mode.py index 0f2ab30..db08d97 100644 --- a/test/test_daemon_mode.py +++ b/test/test_daemon_mode.py @@ -1,5 +1,6 @@ import unittest from unittest.mock import patch, MagicMock +import sys import aider_gitea.__main__ as main_module class TestDaemonMode(unittest.TestCase): @@ -23,7 +24,8 @@ class TestDaemonMode(unittest.TestCase): mock_db = MockSeenIssuesDB.return_value mock_db.has_seen.return_value = False - with patch('time.sleep', return_value=None): + with patch('sys.argv', ['main.py', '--gitea-url', 'http://example.com', '--owner', 'owner', '--repo', 'repo']), \ + patch('time.sleep', return_value=None): with self.assertRaises(SystemExit): main_module.main() -- 2.45.1 From 87c42fe8fb1277281496c63f7b1681615f8597d2 Mon Sep 17 00:00:00 2001 From: "Jon Michael Aanes (aider)" Date: Sun, 13 Apr 2025 17:31:51 +0200 Subject: [PATCH 3/4] test: Mock GITEA_TOKEN secret for daemon mode tests --- test/test_daemon_mode.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_daemon_mode.py b/test/test_daemon_mode.py index db08d97..2de235a 100644 --- a/test/test_daemon_mode.py +++ b/test/test_daemon_mode.py @@ -5,6 +5,7 @@ import aider_gitea.__main__ as main_module class TestDaemonMode(unittest.TestCase): + @patch('aider_gitea.__main__.secrets.gitea_token', return_value='dummy_token') @patch('aider_gitea.__main__.GiteaClient') @patch('aider_gitea.__main__.SeenIssuesDB') @patch('aider_gitea.__main__.process_issue') -- 2.45.1 From 2cb5f5c6c9475714d041c04b83db5f5fbf2658d7 Mon Sep 17 00:00:00 2001 From: "Jon Michael Aanes (aider)" Date: Sun, 13 Apr 2025 17:32:24 +0200 Subject: [PATCH 4/4] fix: Adjust test_daemon_mode to accept correct number of arguments --- test/test_daemon_mode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_daemon_mode.py b/test/test_daemon_mode.py index 2de235a..cf14d8e 100644 --- a/test/test_daemon_mode.py +++ b/test/test_daemon_mode.py @@ -9,7 +9,7 @@ class TestDaemonMode(unittest.TestCase): @patch('aider_gitea.__main__.GiteaClient') @patch('aider_gitea.__main__.SeenIssuesDB') @patch('aider_gitea.__main__.process_issue') - def test_daemon_mode(self, mock_process_issue, MockSeenIssuesDB, MockGiteaClient): + def test_daemon_mode(self, mock_process_issue, MockSeenIssuesDB, MockGiteaClient, mock_gitea_token): mock_args = MagicMock() mock_args.daemon = True mock_args.gitea_url = "http://example.com" -- 2.45.1