From ea71fc5cf1a2c31065e06e8428d502b7c404fde8 Mon Sep 17 00:00:00 2001 From: Martin Ye Date: Wed, 5 Jun 2024 18:11:09 +0000 Subject: [PATCH] added test --- .github/workflows/review.yml | 60 ++++ tests/e2e/test_pr_review.py | 83 ++++++ tests/jsons/e2e_pr_review.json | 523 +++++++++++++++++++++++++++++++++ 3 files changed, 666 insertions(+) create mode 100644 .github/workflows/review.yml create mode 100644 tests/e2e/test_pr_review.py create mode 100644 tests/jsons/e2e_pr_review.json diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml new file mode 100644 index 0000000000..758cefade5 --- /dev/null +++ b/.github/workflows/review.yml @@ -0,0 +1,60 @@ +name: Python CI All + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: + pull_request: + branches: + - main + - dev + paths: + - 'sweepai/**' + - 'tests/**' + push: + branches: + - main + - dev + paths: + - 'sweepai/**' + - 'tests/**' + +jobs: + code-quality: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10"] + # python-version: ["3.10", "3.11"] + os: [ubuntu-latest] + # outputs: + # cache-key: ${{ steps.cache-dependencies.outputs.cache-key }} + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.67.0 + override: true + # - uses: Swatinem/rust-cache@v1 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + # - run: echo "VIRTUAL_ENV=${Python_ROOT_DIR}" >> $GITHUB_ENV + # if: steps.restore-dependencies.outputs.cache-hit != 'true' + - run: | + pip install uv + uv venv + source .venv/bin/activate + echo ".venv/bin" >> $GITHUB_PATH + # if: steps.restore-dependencies.outputs.cache-hit != 'true' + - run: uv pip install -r requirements.txt + # if: steps.restore-dependencies.outputs.cache-hit != 'true' + - run: uv pip install ruff pylint pytest pytest-xdist black + # if: steps.restore-dependencies.outputs.cache-hit != 'true' + - name: Run Review Test + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + run: pytest tests/e2e/test_pr_review.py diff --git a/tests/e2e/test_pr_review.py b/tests/e2e/test_pr_review.py new file mode 100644 index 0000000000..f466b2a160 --- /dev/null +++ b/tests/e2e/test_pr_review.py @@ -0,0 +1,83 @@ +import datetime +import json +import os +import sys +import time +import traceback + +from fastapi.testclient import TestClient +from github import Github + +from sweepai.api import app, global_threads + +GITHUB_PAT = os.environ["GITHUB_PAT"] +print( + f"Using GITHUB_PAT: " + + GITHUB_PAT[:3] + + "*" * (len(GITHUB_PAT) - 4) + + GITHUB_PAT[-1:] +) +g = Github(GITHUB_PAT) +repo_name = "sweepai/e2e" # for e2e test this is hardcoded +repo = g.get_repo(repo_name) + +local_tz = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo +# PR NUMBER is hardcoded for e2e test +pr_number = 1349 + + +def test_e2e_pr_review(): + client = TestClient(app) + try: + issue_json = json.load(open("tests/jsons/e2e_pr_review.json", "r")) + start_time = time.time() + response = client.post( + "/", + json=issue_json, + headers={"X-GitHub-Event": "pull_request"}, + ) + print(f"Completed in {time.time() - start_time}s") + assert response + assert response.text + response_text = json.loads(response.text) + assert response.status_code == 200 + assert "success" in response_text + pr = repo.get_pull(pr_number) + # poll github 20 times, waiting 1 minute between each poll, check if the pr has been updated or not + for i in range(20): + pr = repo.get_pull(pr_number) + # iterate through the comments of the pr and check if a new comment got created the title Sweep: PR Review + comments = pr.get_issue_comments() + for comment in comments: + # success if a new pr was made within i+1 minutes ago + if ( + "Sweep: PR Review" in comment.body + ): + i = 1 + for thread in global_threads: + thread.join() + print(f"joining thread {i} of {len(global_threads)}") + i += 1 + print(f"PR successfully updated: {pr.title}") + print(f"PR object is: {pr}") + # delete comment for next time around + comment.delete() + return + + time.sleep(60) + raise AssertionError("PR was not updated!") + except AssertionError as e: + for thread in global_threads: + thread.join() + print(f"Assertions failed with error: {e}") + sys.exit(1) + except Exception as e: + for thread in global_threads: + thread.join() + stack_trace = traceback.format_exc() + print(f"Failed with error: {e}\nTraceback: {stack_trace}") + sys.exit(1) + + +if __name__ == "__main__": + test_e2e_pr_review() diff --git a/tests/jsons/e2e_pr_review.json b/tests/jsons/e2e_pr_review.json new file mode 100644 index 0000000000..b046bb28ab --- /dev/null +++ b/tests/jsons/e2e_pr_review.json @@ -0,0 +1,523 @@ +{ + "action": "opened", + "number": 1349, + "pull_request": { + "url": "https://api.github.com/repos/sweepai/e2e/pulls/1349", + "id": 1905662934, + "node_id": "PR_kwDOLP3pgc5xlhvW", + "html_url": "https://github.com/sweepai/e2e/pull/1349", + "diff_url": "https://github.com/sweepai/e2e/pull/1349.diff", + "patch_url": "https://github.com/sweepai/e2e/pull/1349.patch", + "issue_url": "https://api.github.com/repos/sweepai/e2e/issues/1349", + "number": 1349, + "state": "open", + "locked": false, + "title": "reduce font size", + "user": { + "login": "MartinYe1234", + "id": 52641447, + "node_id": "MDQ6VXNlcjUyNjQxNDQ3", + "avatar_url": "https://avatars.githubusercontent.com/u/52641447?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/MartinYe1234", + "html_url": "https://github.com/MartinYe1234", + "followers_url": "https://api.github.com/users/MartinYe1234/followers", + "following_url": "https://api.github.com/users/MartinYe1234/following{/other_user}", + "gists_url": "https://api.github.com/users/MartinYe1234/gists{/gist_id}", + "starred_url": "https://api.github.com/users/MartinYe1234/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/MartinYe1234/subscriptions", + "organizations_url": "https://api.github.com/users/MartinYe1234/orgs", + "repos_url": "https://api.github.com/users/MartinYe1234/repos", + "events_url": "https://api.github.com/users/MartinYe1234/events{/privacy}", + "received_events_url": "https://api.github.com/users/MartinYe1234/received_events", + "type": "User", + "site_admin": false + }, + "body": "reduce fontsize", + "created_at": "2024-06-05T17:48:47Z", + "updated_at": "2024-06-05T17:48:47Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": null, + "assignee": null, + "assignees": [ + + ], + "requested_reviewers": [ + + ], + "requested_teams": [ + + ], + "labels": [ + + ], + "milestone": null, + "draft": false, + "commits_url": "https://api.github.com/repos/sweepai/e2e/pulls/1349/commits", + "review_comments_url": "https://api.github.com/repos/sweepai/e2e/pulls/1349/comments", + "review_comment_url": "https://api.github.com/repos/sweepai/e2e/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/sweepai/e2e/issues/1349/comments", + "statuses_url": "https://api.github.com/repos/sweepai/e2e/statuses/e7ff165a5eee87cdd4da0d6b4b4d222670bbbca3", + "head": { + "label": "sweepai:test/e2e-test-do-not-merge", + "ref": "test/e2e-test-do-not-merge", + "sha": "e7ff165a5eee87cdd4da0d6b4b4d222670bbbca3", + "user": { + "login": "sweepai", + "id": 127925974, + "node_id": "O_kgDOB5_-1g", + "avatar_url": "https://avatars.githubusercontent.com/u/127925974?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sweepai", + "html_url": "https://github.com/sweepai", + "followers_url": "https://api.github.com/users/sweepai/followers", + "following_url": "https://api.github.com/users/sweepai/following{/other_user}", + "gists_url": "https://api.github.com/users/sweepai/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sweepai/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sweepai/subscriptions", + "organizations_url": "https://api.github.com/users/sweepai/orgs", + "repos_url": "https://api.github.com/users/sweepai/repos", + "events_url": "https://api.github.com/users/sweepai/events{/privacy}", + "received_events_url": "https://api.github.com/users/sweepai/received_events", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 754837889, + "node_id": "R_kgDOLP3pgQ", + "name": "e2e", + "full_name": "sweepai/e2e", + "private": true, + "owner": { + "login": "sweepai", + "id": 127925974, + "node_id": "O_kgDOB5_-1g", + "avatar_url": "https://avatars.githubusercontent.com/u/127925974?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sweepai", + "html_url": "https://github.com/sweepai", + "followers_url": "https://api.github.com/users/sweepai/followers", + "following_url": "https://api.github.com/users/sweepai/following{/other_user}", + "gists_url": "https://api.github.com/users/sweepai/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sweepai/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sweepai/subscriptions", + "organizations_url": "https://api.github.com/users/sweepai/orgs", + "repos_url": "https://api.github.com/users/sweepai/repos", + "events_url": "https://api.github.com/users/sweepai/events{/privacy}", + "received_events_url": "https://api.github.com/users/sweepai/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/sweepai/e2e", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/sweepai/e2e", + "forks_url": "https://api.github.com/repos/sweepai/e2e/forks", + "keys_url": "https://api.github.com/repos/sweepai/e2e/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/sweepai/e2e/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/sweepai/e2e/teams", + "hooks_url": "https://api.github.com/repos/sweepai/e2e/hooks", + "issue_events_url": "https://api.github.com/repos/sweepai/e2e/issues/events{/number}", + "events_url": "https://api.github.com/repos/sweepai/e2e/events", + "assignees_url": "https://api.github.com/repos/sweepai/e2e/assignees{/user}", + "branches_url": "https://api.github.com/repos/sweepai/e2e/branches{/branch}", + "tags_url": "https://api.github.com/repos/sweepai/e2e/tags", + "blobs_url": "https://api.github.com/repos/sweepai/e2e/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/sweepai/e2e/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/sweepai/e2e/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/sweepai/e2e/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/sweepai/e2e/statuses/{sha}", + "languages_url": "https://api.github.com/repos/sweepai/e2e/languages", + "stargazers_url": "https://api.github.com/repos/sweepai/e2e/stargazers", + "contributors_url": "https://api.github.com/repos/sweepai/e2e/contributors", + "subscribers_url": "https://api.github.com/repos/sweepai/e2e/subscribers", + "subscription_url": "https://api.github.com/repos/sweepai/e2e/subscription", + "commits_url": "https://api.github.com/repos/sweepai/e2e/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/sweepai/e2e/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/sweepai/e2e/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/sweepai/e2e/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/sweepai/e2e/contents/{+path}", + "compare_url": "https://api.github.com/repos/sweepai/e2e/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/sweepai/e2e/merges", + "archive_url": "https://api.github.com/repos/sweepai/e2e/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/sweepai/e2e/downloads", + "issues_url": "https://api.github.com/repos/sweepai/e2e/issues{/number}", + "pulls_url": "https://api.github.com/repos/sweepai/e2e/pulls{/number}", + "milestones_url": "https://api.github.com/repos/sweepai/e2e/milestones{/number}", + "notifications_url": "https://api.github.com/repos/sweepai/e2e/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/sweepai/e2e/labels{/name}", + "releases_url": "https://api.github.com/repos/sweepai/e2e/releases{/id}", + "deployments_url": "https://api.github.com/repos/sweepai/e2e/deployments", + "created_at": "2024-02-08T21:23:12Z", + "updated_at": "2024-02-08T21:24:37Z", + "pushed_at": "2024-06-05T17:48:48Z", + "git_url": "git://github.com/sweepai/e2e.git", + "ssh_url": "git@github.com:sweepai/e2e.git", + "clone_url": "https://github.com/sweepai/e2e.git", + "svn_url": "https://github.com/sweepai/e2e", + "homepage": null, + "size": 31922, + "stargazers_count": 0, + "watchers_count": 0, + "language": "TypeScript", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 3, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 821, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "private", + "forks": 3, + "open_issues": 821, + "watchers": 0, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_auto_merge": false, + "delete_branch_on_merge": false, + "allow_update_branch": false, + "use_squash_pr_title_as_default": false, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "base": { + "label": "sweepai:main", + "ref": "main", + "sha": "ff66dbb05624f7ed05bf65efe54f21b6cdd56d53", + "user": { + "login": "sweepai", + "id": 127925974, + "node_id": "O_kgDOB5_-1g", + "avatar_url": "https://avatars.githubusercontent.com/u/127925974?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sweepai", + "html_url": "https://github.com/sweepai", + "followers_url": "https://api.github.com/users/sweepai/followers", + "following_url": "https://api.github.com/users/sweepai/following{/other_user}", + "gists_url": "https://api.github.com/users/sweepai/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sweepai/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sweepai/subscriptions", + "organizations_url": "https://api.github.com/users/sweepai/orgs", + "repos_url": "https://api.github.com/users/sweepai/repos", + "events_url": "https://api.github.com/users/sweepai/events{/privacy}", + "received_events_url": "https://api.github.com/users/sweepai/received_events", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 754837889, + "node_id": "R_kgDOLP3pgQ", + "name": "e2e", + "full_name": "sweepai/e2e", + "private": true, + "owner": { + "login": "sweepai", + "id": 127925974, + "node_id": "O_kgDOB5_-1g", + "avatar_url": "https://avatars.githubusercontent.com/u/127925974?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sweepai", + "html_url": "https://github.com/sweepai", + "followers_url": "https://api.github.com/users/sweepai/followers", + "following_url": "https://api.github.com/users/sweepai/following{/other_user}", + "gists_url": "https://api.github.com/users/sweepai/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sweepai/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sweepai/subscriptions", + "organizations_url": "https://api.github.com/users/sweepai/orgs", + "repos_url": "https://api.github.com/users/sweepai/repos", + "events_url": "https://api.github.com/users/sweepai/events{/privacy}", + "received_events_url": "https://api.github.com/users/sweepai/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/sweepai/e2e", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/sweepai/e2e", + "forks_url": "https://api.github.com/repos/sweepai/e2e/forks", + "keys_url": "https://api.github.com/repos/sweepai/e2e/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/sweepai/e2e/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/sweepai/e2e/teams", + "hooks_url": "https://api.github.com/repos/sweepai/e2e/hooks", + "issue_events_url": "https://api.github.com/repos/sweepai/e2e/issues/events{/number}", + "events_url": "https://api.github.com/repos/sweepai/e2e/events", + "assignees_url": "https://api.github.com/repos/sweepai/e2e/assignees{/user}", + "branches_url": "https://api.github.com/repos/sweepai/e2e/branches{/branch}", + "tags_url": "https://api.github.com/repos/sweepai/e2e/tags", + "blobs_url": "https://api.github.com/repos/sweepai/e2e/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/sweepai/e2e/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/sweepai/e2e/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/sweepai/e2e/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/sweepai/e2e/statuses/{sha}", + "languages_url": "https://api.github.com/repos/sweepai/e2e/languages", + "stargazers_url": "https://api.github.com/repos/sweepai/e2e/stargazers", + "contributors_url": "https://api.github.com/repos/sweepai/e2e/contributors", + "subscribers_url": "https://api.github.com/repos/sweepai/e2e/subscribers", + "subscription_url": "https://api.github.com/repos/sweepai/e2e/subscription", + "commits_url": "https://api.github.com/repos/sweepai/e2e/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/sweepai/e2e/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/sweepai/e2e/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/sweepai/e2e/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/sweepai/e2e/contents/{+path}", + "compare_url": "https://api.github.com/repos/sweepai/e2e/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/sweepai/e2e/merges", + "archive_url": "https://api.github.com/repos/sweepai/e2e/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/sweepai/e2e/downloads", + "issues_url": "https://api.github.com/repos/sweepai/e2e/issues{/number}", + "pulls_url": "https://api.github.com/repos/sweepai/e2e/pulls{/number}", + "milestones_url": "https://api.github.com/repos/sweepai/e2e/milestones{/number}", + "notifications_url": "https://api.github.com/repos/sweepai/e2e/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/sweepai/e2e/labels{/name}", + "releases_url": "https://api.github.com/repos/sweepai/e2e/releases{/id}", + "deployments_url": "https://api.github.com/repos/sweepai/e2e/deployments", + "created_at": "2024-02-08T21:23:12Z", + "updated_at": "2024-02-08T21:24:37Z", + "pushed_at": "2024-06-05T17:48:48Z", + "git_url": "git://github.com/sweepai/e2e.git", + "ssh_url": "git@github.com:sweepai/e2e.git", + "clone_url": "https://github.com/sweepai/e2e.git", + "svn_url": "https://github.com/sweepai/e2e", + "homepage": null, + "size": 31922, + "stargazers_count": 0, + "watchers_count": 0, + "language": "TypeScript", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 3, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 821, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "private", + "forks": 3, + "open_issues": 821, + "watchers": 0, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_auto_merge": false, + "delete_branch_on_merge": false, + "allow_update_branch": false, + "use_squash_pr_title_as_default": false, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/sweepai/e2e/pulls/1349" + }, + "html": { + "href": "https://github.com/sweepai/e2e/pull/1349" + }, + "issue": { + "href": "https://api.github.com/repos/sweepai/e2e/issues/1349" + }, + "comments": { + "href": "https://api.github.com/repos/sweepai/e2e/issues/1349/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/sweepai/e2e/pulls/1349/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/sweepai/e2e/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/sweepai/e2e/pulls/1349/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/sweepai/e2e/statuses/e7ff165a5eee87cdd4da0d6b4b4d222670bbbca3" + } + }, + "author_association": "COLLABORATOR", + "auto_merge": null, + "active_lock_reason": null, + "merged": false, + "mergeable": null, + "rebaseable": null, + "mergeable_state": "unknown", + "merged_by": null, + "comments": 0, + "review_comments": 0, + "maintainer_can_modify": false, + "commits": 2, + "additions": 3, + "deletions": 2, + "changed_files": 2 + }, + "repository": { + "id": 754837889, + "node_id": "R_kgDOLP3pgQ", + "name": "e2e", + "full_name": "sweepai/e2e", + "private": true, + "owner": { + "login": "sweepai", + "id": 127925974, + "node_id": "O_kgDOB5_-1g", + "avatar_url": "https://avatars.githubusercontent.com/u/127925974?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sweepai", + "html_url": "https://github.com/sweepai", + "followers_url": "https://api.github.com/users/sweepai/followers", + "following_url": "https://api.github.com/users/sweepai/following{/other_user}", + "gists_url": "https://api.github.com/users/sweepai/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sweepai/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sweepai/subscriptions", + "organizations_url": "https://api.github.com/users/sweepai/orgs", + "repos_url": "https://api.github.com/users/sweepai/repos", + "events_url": "https://api.github.com/users/sweepai/events{/privacy}", + "received_events_url": "https://api.github.com/users/sweepai/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/sweepai/e2e", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/sweepai/e2e", + "forks_url": "https://api.github.com/repos/sweepai/e2e/forks", + "keys_url": "https://api.github.com/repos/sweepai/e2e/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/sweepai/e2e/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/sweepai/e2e/teams", + "hooks_url": "https://api.github.com/repos/sweepai/e2e/hooks", + "issue_events_url": "https://api.github.com/repos/sweepai/e2e/issues/events{/number}", + "events_url": "https://api.github.com/repos/sweepai/e2e/events", + "assignees_url": "https://api.github.com/repos/sweepai/e2e/assignees{/user}", + "branches_url": "https://api.github.com/repos/sweepai/e2e/branches{/branch}", + "tags_url": "https://api.github.com/repos/sweepai/e2e/tags", + "blobs_url": "https://api.github.com/repos/sweepai/e2e/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/sweepai/e2e/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/sweepai/e2e/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/sweepai/e2e/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/sweepai/e2e/statuses/{sha}", + "languages_url": "https://api.github.com/repos/sweepai/e2e/languages", + "stargazers_url": "https://api.github.com/repos/sweepai/e2e/stargazers", + "contributors_url": "https://api.github.com/repos/sweepai/e2e/contributors", + "subscribers_url": "https://api.github.com/repos/sweepai/e2e/subscribers", + "subscription_url": "https://api.github.com/repos/sweepai/e2e/subscription", + "commits_url": "https://api.github.com/repos/sweepai/e2e/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/sweepai/e2e/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/sweepai/e2e/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/sweepai/e2e/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/sweepai/e2e/contents/{+path}", + "compare_url": "https://api.github.com/repos/sweepai/e2e/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/sweepai/e2e/merges", + "archive_url": "https://api.github.com/repos/sweepai/e2e/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/sweepai/e2e/downloads", + "issues_url": "https://api.github.com/repos/sweepai/e2e/issues{/number}", + "pulls_url": "https://api.github.com/repos/sweepai/e2e/pulls{/number}", + "milestones_url": "https://api.github.com/repos/sweepai/e2e/milestones{/number}", + "notifications_url": "https://api.github.com/repos/sweepai/e2e/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/sweepai/e2e/labels{/name}", + "releases_url": "https://api.github.com/repos/sweepai/e2e/releases{/id}", + "deployments_url": "https://api.github.com/repos/sweepai/e2e/deployments", + "created_at": "2024-02-08T21:23:12Z", + "updated_at": "2024-02-08T21:24:37Z", + "pushed_at": "2024-06-05T17:48:48Z", + "git_url": "git://github.com/sweepai/e2e.git", + "ssh_url": "git@github.com:sweepai/e2e.git", + "clone_url": "https://github.com/sweepai/e2e.git", + "svn_url": "https://github.com/sweepai/e2e", + "homepage": null, + "size": 31922, + "stargazers_count": 0, + "watchers_count": 0, + "language": "TypeScript", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 3, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 821, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "private", + "forks": 3, + "open_issues": 821, + "watchers": 0, + "default_branch": "main", + "custom_properties": { + + } + }, + "organization": { + "login": "sweepai", + "id": 127925974, + "node_id": "O_kgDOB5_-1g", + "url": "https://api.github.com/orgs/sweepai", + "repos_url": "https://api.github.com/orgs/sweepai/repos", + "events_url": "https://api.github.com/orgs/sweepai/events", + "hooks_url": "https://api.github.com/orgs/sweepai/hooks", + "issues_url": "https://api.github.com/orgs/sweepai/issues", + "members_url": "https://api.github.com/orgs/sweepai/members{/member}", + "public_members_url": "https://api.github.com/orgs/sweepai/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/127925974?v=4", + "description": "AI junior developer that turns bugs & feature requests into code changes. Check out our docs! https://docs.sweep.dev" + }, + "sender": { + "login": "MartinYe1234", + "id": 52641447, + "node_id": "MDQ6VXNlcjUyNjQxNDQ3", + "avatar_url": "https://avatars.githubusercontent.com/u/52641447?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/MartinYe1234", + "html_url": "https://github.com/MartinYe1234", + "followers_url": "https://api.github.com/users/MartinYe1234/followers", + "following_url": "https://api.github.com/users/MartinYe1234/following{/other_user}", + "gists_url": "https://api.github.com/users/MartinYe1234/gists{/gist_id}", + "starred_url": "https://api.github.com/users/MartinYe1234/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/MartinYe1234/subscriptions", + "organizations_url": "https://api.github.com/users/MartinYe1234/orgs", + "repos_url": "https://api.github.com/users/MartinYe1234/repos", + "events_url": "https://api.github.com/users/MartinYe1234/events{/privacy}", + "received_events_url": "https://api.github.com/users/MartinYe1234/received_events", + "type": "User", + "site_admin": false + }, + "installation": { + "id": 36855882, + "node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMzY4NTU4ODI=" + } +} \ No newline at end of file