From 13809e87f2311615563af59a44f7125032de5e67 Mon Sep 17 00:00:00 2001 From: Mariatta Wijaya Date: Wed, 10 Jul 2019 22:34:22 -0700 Subject: [PATCH 1/4] Remove automerge label if not added by core dev This also adds the "Automerge-triggered-by: @{coredev}" message at the end of the PR body. Closes https://github.com/python/core-workflow/issues/340 --- miss_islington/status_change.py | 15 ++ miss_islington/util.py | 4 + tests/test_status_change.py | 282 ++++++++++++++++++++++++++++++-- 3 files changed, 283 insertions(+), 18 deletions(-) diff --git a/miss_islington/status_change.py b/miss_islington/status_change.py index 5edd3884..63655b8a 100644 --- a/miss_islington/status_change.py +++ b/miss_islington/status_change.py @@ -41,6 +41,15 @@ async def check_status(event, gh, *args, **kwargs): async def pr_reviewed(event, gh, *args, **kwargs): pr_labels = event.data["pull_request"]["labels"] + sender = event.data["sender"]["login"] + label = event.data["label"]["name"] + + if label == util.AUTOMERGE_LABEL: + if await util.is_core_dev(gh, sender): + await add_automerged_by(gh, event.data["pull_request"], sender) + else: + await util.remove_automerge(gh, event.data["pull_request"]) + return if util.pr_is_automerge(pr_labels) and util.pr_is_awaiting_merge(pr_labels): sha = event.data["pull_request"]["head"]["sha"] @@ -132,3 +141,9 @@ async def merge_pr(gh, pr, sha, is_automerge=False): gh, pr_number, f"Sorry, I can't merge this PR. Reason: `{err}`." ) break + + +async def add_automerged_by(gh, pr_data, username): + + new_pr_body = f"{pr_data['body']}\n\nAutomerge-Triggered-By: @{username}" + await gh.patch(pr_data["url"], data={"body": new_pr_body}) \ No newline at end of file diff --git a/miss_islington/util.py b/miss_islington/util.py index 3c062546..9e0e2a59 100644 --- a/miss_islington/util.py +++ b/miss_islington/util.py @@ -145,3 +145,7 @@ async def get_pr_for_commit(gh, sha): pr_for_commit = prs_for_commit["items"][0] return pr_for_commit return None + +async def remove_automerge(gh, pr_data): + """Remove the automerge label""" + await gh.delete(f"{pr_data['issue_url']}/labels/{AUTOMERGE_LABEL}", accept="application/vnd.github.symmetra-preview+json") diff --git a/tests/test_status_change.py b/tests/test_status_change.py index 8989c38e..cbb4a21e 100644 --- a/tests/test_status_change.py +++ b/tests/test_status_change.py @@ -8,18 +8,25 @@ class FakeGH: - def __init__(self, *, getitem=None, getiter=None, put=None, post=None): + def __init__(self, *, getitem=None, getiter=None, put=None, post=None, patch=None, delete=None): self._getitem_return = getitem self._getiter_return = getiter self.getitem_url = None self.getiter_url = None self._put_return = put + self._delete_return = put self._post_return = post + self._patch_return = patch + self.patch_url = self.patch_data = None + async def getitem(self, url): self.getitem_url = url to_return = self._getitem_return[self.getitem_url] - return to_return + if isinstance(to_return, Exception): + raise to_return + else: + return to_return async def getiter(self, url): self.getiter_url = url @@ -27,6 +34,15 @@ async def getiter(self, url): for item in to_iterate: yield item + async def patch(self, url, *, data): + self.patch_url = url + self.patch_data = data + return self._patch_return + + async def delete(self, url, *, data=b"", accept=None): + self.delete_url = url + return self._delete_return + async def put(self, url, *, data): self.put_url = url self.put_data = data @@ -216,6 +232,12 @@ async def test_awaiting_merge_label_added_and_ci_passed_pr_is_merged(): "title": "[3.6] bpo-32720: Fixed the replacement field grammar documentation. (GH-5544)", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.\n(cherry picked from commit 7a561afd2c79f63a6008843b83733911d07f0119)\n\nCo-authored-by: Mariatta ", }, + "sender": { + "login": "Mariatta", + }, + "label": { + "name": "awaiting merge" + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -274,6 +296,12 @@ async def test_awaiting_merge_webhook_ci_failure_pr_is_not_merged(): "labels": [{"name": "awaiting merge"}], "head": {"sha": sha}, }, + "sender": { + "login": "Mariatta", + }, + "label": { + "name": "awaiting merge" + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -321,9 +349,15 @@ async def test_awaiting_core_review_label_added_is_not_merged(): "action": "labeled", "pull_request": { "user": {"login": "miss-islington"}, - "labels": [{"name": "awaiting merge"}], + "labels": [{"name": "awaiting core review"}], "head": {"sha": sha}, }, + "sender": { + "login": "bedevere-bot", + }, + "label": { + "name": "awaiting core review" + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -352,7 +386,7 @@ async def test_awaiting_core_review_label_added_is_not_merged(): "number": 5547, "title": "[3.6] bpo-32720: Fixed the replacement field grammar documentation. (GH-5544)", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.\n(cherry picked from commit 7a561afd2c79f63a6008843b83733911d07f0119)\n\nCo-authored-by: Mariatta ", - "labels": [{"name": "awaiting merge"}], + "labels": [{"name": "awaiting core review"}], } ], }, @@ -372,8 +406,15 @@ async def test_awaiting_merge_label_ignore_non_miss_islingtons_pr(): "user": {"login": "Mariatta"}, "labels": [{"name": "awaiting merge"}], "head": {"sha": sha}, + "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" }, - } + "sender": { + "login": "Mariatta", + }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -393,10 +434,16 @@ async def test_awaiting_merge_label_ignore_non_miss_islingtons_pr(): "context": "continuous-integration/travis-ci/pr", }, ], - } + }, + "/teams/42/memberships/Mariatta": True + + } + + getiter = { + "/orgs/python/teams": [{"name": "python core", "id": 42}], } - gh = FakeGH(getitem=getitem) # , getiter=getiter) + gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) assert not hasattr(gh, "post_data") # does not leave a comment assert not hasattr(gh, "put_data") # is not merged @@ -699,8 +746,15 @@ async def test_awaiting_merge_label_added_not_miss_islingtons_pr(): "user": {"login": "Mariatta"}, "labels": [{"name": "awaiting merge"}], "head": {"sha": sha}, + "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" }, - } + "sender": { + "login": "Mariatta", + }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -726,6 +780,8 @@ async def test_awaiting_merge_label_added_not_miss_islingtons_pr(): "merged_by": {"login": "Mariatta"}, }, "/repos/python/cpython/pulls/5547": {"labels": [{"name": "awaiting merge"}]}, + "/teams/42/memberships/Mariatta": True + } getiter = { @@ -755,6 +811,8 @@ async def test_awaiting_merge_label_added_not_miss_islingtons_pr(): }, } ], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) @@ -770,8 +828,15 @@ async def test_awaiting_core_review_label_added_miss_islingtons_pr(): "user": {"login": "miss-islington"}, "labels": [{"name": "awaiting core review"}], "head": {"sha": sha}, + "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" }, - } + "sender": { + "login": "Mariatta", + }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -799,6 +864,8 @@ async def test_awaiting_core_review_label_added_miss_islingtons_pr(): "/repos/python/cpython/pulls/5547": { "labels": [{"name": "awaiting core review"}] }, + "/teams/42/memberships/Mariatta": True + } getiter = { @@ -828,6 +895,8 @@ async def test_awaiting_core_review_label_added_miss_islingtons_pr(): }, } ], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) @@ -1005,7 +1074,14 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" + }, + "sender": { + "login": "Mariatta", }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1026,10 +1102,14 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington "context": "continuous-integration/travis-ci/pr", }, ], - } + }, + "/teams/42/memberships/Mariatta": True + } - getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}]} + getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) @@ -1055,7 +1135,15 @@ async def test_automerge_but_not_awaiting_merge(): "user": {"login": "Mariatta"}, "labels": [{"name": "awaiting review"}, {"name": AUTOMERGE_LABEL}], "head": {"sha": sha}, + "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" + }, + "sender": { + "login": "Mariatta", }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1093,9 +1181,13 @@ async def test_automerge_but_not_awaiting_merge(): } ], }, + "/teams/42/memberships/Mariatta": True + } - getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}]} + getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) @@ -1137,7 +1229,14 @@ async def test_automerge_multi_commits_in_pr(): "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" }, + "sender": { + "login": "Mariatta", + }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1158,14 +1257,18 @@ async def test_automerge_multi_commits_in_pr(): "context": "continuous-integration/travis-ci/pr", }, ], - } + }, + "/teams/42/memberships/Mariatta": True + } getiter = { "/repos/python/cpython/pulls/5547/commits": [ {"sha": "5f007046b5d4766f971272a0cc99f8461215c1ec"}, {"sha": sha}, - ] + ], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) @@ -1199,7 +1302,14 @@ async def test_automerge_commit_not_found(): "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" }, + "sender": { + "login": "Mariatta", + }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1220,10 +1330,14 @@ async def test_automerge_commit_not_found(): "context": "continuous-integration/travis-ci/pr", }, ], - } + }, + "/teams/42/memberships/Mariatta": True + } - getiter = {"/repos/python/cpython/pulls/5547/commits": []} + getiter = {"/repos/python/cpython/pulls/5547/commits": [], + "/orgs/python/teams": [{"name": "python core", "id": 42}], +} gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) @@ -1246,7 +1360,14 @@ async def test_automerge_failed(): "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547" }, + "sender": { + "login": "Mariatta", + }, + "label": { + "name": AUTOMERGE_LABEL + } } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1267,14 +1388,16 @@ async def test_automerge_failed(): "context": "continuous-integration/travis-ci/pr", }, ], - } + }, + "/teams/42/memberships/Mariatta": True } getiter = { "/repos/python/cpython/pulls/5547/commits": [ {"sha": "5f007046b5d4766f971272a0cc99f8461215c1ec"}, {"sha": sha}, - ] + ], + "/orgs/python/teams": [{"name": "python core", "id": 42}], } gh = FakeGH( @@ -1300,3 +1423,126 @@ async def test_automerge_failed(): ) assert "Sorry, I can't merge this PR" in gh.post_data["body"] + + +async def test_automerge_label_added_by_non_core_dev(): + sha = "f2393593c99dd2d3ab8bfab6fcc5ddee540518a9" + data = { + "action": "labeled", + "pull_request": { + "user": {"login": "miss-islington"}, + "labels": [ + {"name": "awaiting merge"}, + {"name": AUTOMERGE_LABEL}, + {"name": "CLA signed"}, + ], + "head": {"sha": sha}, + "number": 5547, + "title": "bpo-32720: Fixed the replacement field grammar documentation.", + "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", + "issue_url": "https://api.github.com/repos/python/cpython/issues/5547" + }, + "sender": { + "login": "miss-islington", + }, + "label": { + "name": AUTOMERGE_LABEL + } + } + + event = sansio.Event(data, event="pull_request", delivery_id="1") + + getitem = { + f"/repos/python/cpython/commits/{sha}/status": { + "state": "success", + "statuses": [ + { + "state": "success", + "description": "Issue report skipped", + "context": "bedevere/issue-number", + }, + { + "state": "success", + "description": "The Travis CI build passed", + "target_url": "https://travis-ci.org/python/cpython/builds/340259685?utm_source=github_status&utm_medium=notification", + "context": "continuous-integration/travis-ci/pr", + }, + ], + }, + "/teams/42/memberships/miss-islington": gidgethub.BadRequest( + status_code=http.HTTPStatus(404)) + + } + + getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } + + gh = FakeGH(getitem=getitem, getiter=getiter) + await status_change.router.dispatch(event, gh) + assert gh.delete_url == f'{data["pull_request"]["issue_url"]}/labels/{AUTOMERGE_LABEL}' + assert not hasattr(gh, "post_data") # does not leave a comment + + assert not hasattr(gh, "post_data") # does not leave a comment + assert not hasattr(gh, "put_data") # does not merge + + + +async def test_automerge_label_triggered_by_added_to_pr(): + sha = "f2393593c99dd2d3ab8bfab6fcc5ddee540518a9" + data = { + "action": "labeled", + "pull_request": { + "user": {"login": "miss-islington"}, + "labels": [ + {"name": "awaiting merge"}, + {"name": AUTOMERGE_LABEL}, + {"name": "CLA signed"}, + ], + "head": {"sha": sha}, + "number": 5547, + "title": "bpo-32720: Fixed the replacement field grammar documentation.", + "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", + "issue_url": "https://api.github.com/repos/python/cpython/issues/5547" + }, + "sender": { + "login": "Mariatta", + }, + "label": { + "name": AUTOMERGE_LABEL + } + } + + event = sansio.Event(data, event="pull_request", delivery_id="1") + + getitem = { + f"/repos/python/cpython/commits/{sha}/status": { + "state": "success", + "statuses": [ + { + "state": "success", + "description": "Issue report skipped", + "context": "bedevere/issue-number", + }, + { + "state": "success", + "description": "The Travis CI build passed", + "target_url": "https://travis-ci.org/python/cpython/builds/340259685?utm_source=github_status&utm_medium=notification", + "context": "continuous-integration/travis-ci/pr", + }, + ], + }, + "/teams/42/memberships/Mariatta": True + + } + + getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } + + gh = FakeGH(getitem=getitem, getiter=getiter) + await status_change.router.dispatch(event, gh) + assert gh.patch_url == f'{data["pull_request"]["url"]}' + assert gh.patch_data == {"body": f"{data['pull_request']['body']}\n\nAutomerge-Triggered-By: @Mariatta"} From 4488b746e599dc63ed346dee0fd47733bc026aa1 Mon Sep 17 00:00:00 2001 From: Mariatta Wijaya Date: Thu, 11 Jul 2019 05:34:58 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=90=8D=F0=9F=8C=9A=F0=9F=A4=96=20Form?= =?UTF-8?q?atted=20using=20`black`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miss_islington/status_change.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miss_islington/status_change.py b/miss_islington/status_change.py index 63655b8a..af260445 100644 --- a/miss_islington/status_change.py +++ b/miss_islington/status_change.py @@ -146,4 +146,4 @@ async def merge_pr(gh, pr, sha, is_automerge=False): async def add_automerged_by(gh, pr_data, username): new_pr_body = f"{pr_data['body']}\n\nAutomerge-Triggered-By: @{username}" - await gh.patch(pr_data["url"], data={"body": new_pr_body}) \ No newline at end of file + await gh.patch(pr_data["url"], data={"body": new_pr_body}) From 5dd19418ec31835e24434748020d1275c1c7036a Mon Sep 17 00:00:00 2001 From: Mariatta Wijaya Date: Thu, 11 Jul 2019 05:35:01 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=90=8D=F0=9F=8C=9A=F0=9F=A4=96=20Form?= =?UTF-8?q?atted=20using=20`black`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miss_islington/util.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/miss_islington/util.py b/miss_islington/util.py index 9e0e2a59..3c8fee29 100644 --- a/miss_islington/util.py +++ b/miss_islington/util.py @@ -146,6 +146,10 @@ async def get_pr_for_commit(gh, sha): return pr_for_commit return None + async def remove_automerge(gh, pr_data): """Remove the automerge label""" - await gh.delete(f"{pr_data['issue_url']}/labels/{AUTOMERGE_LABEL}", accept="application/vnd.github.symmetra-preview+json") + await gh.delete( + f"{pr_data['issue_url']}/labels/{AUTOMERGE_LABEL}", + accept="application/vnd.github.symmetra-preview+json", + ) From f9dc57d33f1e8d4d0f362ed661ba26b223a9096f Mon Sep 17 00:00:00 2001 From: Mariatta Wijaya Date: Thu, 11 Jul 2019 05:35:13 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=90=8D=F0=9F=8C=9A=F0=9F=A4=96=20Form?= =?UTF-8?q?atted=20using=20`black`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_status_change.py | 222 ++++++++++++++---------------------- 1 file changed, 88 insertions(+), 134 deletions(-) diff --git a/tests/test_status_change.py b/tests/test_status_change.py index cbb4a21e..0a632f06 100644 --- a/tests/test_status_change.py +++ b/tests/test_status_change.py @@ -8,7 +8,16 @@ class FakeGH: - def __init__(self, *, getitem=None, getiter=None, put=None, post=None, patch=None, delete=None): + def __init__( + self, + *, + getitem=None, + getiter=None, + put=None, + post=None, + patch=None, + delete=None, + ): self._getitem_return = getitem self._getiter_return = getiter self.getitem_url = None @@ -19,7 +28,6 @@ def __init__(self, *, getitem=None, getiter=None, put=None, post=None, patch=Non self._patch_return = patch self.patch_url = self.patch_data = None - async def getitem(self, url): self.getitem_url = url to_return = self._getitem_return[self.getitem_url] @@ -232,12 +240,8 @@ async def test_awaiting_merge_label_added_and_ci_passed_pr_is_merged(): "title": "[3.6] bpo-32720: Fixed the replacement field grammar documentation. (GH-5544)", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.\n(cherry picked from commit 7a561afd2c79f63a6008843b83733911d07f0119)\n\nCo-authored-by: Mariatta ", }, - "sender": { - "login": "Mariatta", - }, - "label": { - "name": "awaiting merge" - } + "sender": {"login": "Mariatta"}, + "label": {"name": "awaiting merge"}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -296,12 +300,8 @@ async def test_awaiting_merge_webhook_ci_failure_pr_is_not_merged(): "labels": [{"name": "awaiting merge"}], "head": {"sha": sha}, }, - "sender": { - "login": "Mariatta", - }, - "label": { - "name": "awaiting merge" - } + "sender": {"login": "Mariatta"}, + "label": {"name": "awaiting merge"}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -352,12 +352,8 @@ async def test_awaiting_core_review_label_added_is_not_merged(): "labels": [{"name": "awaiting core review"}], "head": {"sha": sha}, }, - "sender": { - "login": "bedevere-bot", - }, - "label": { - "name": "awaiting core review" - } + "sender": {"login": "bedevere-bot"}, + "label": {"name": "awaiting core review"}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -407,14 +403,11 @@ async def test_awaiting_merge_label_ignore_non_miss_islingtons_pr(): "labels": [{"name": "awaiting merge"}], "head": {"sha": sha}, "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, + } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -435,13 +428,10 @@ async def test_awaiting_merge_label_ignore_non_miss_islingtons_pr(): }, ], }, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } - getiter = { - "/orgs/python/teams": [{"name": "python core", "id": 42}], - } + getiter = {"/orgs/python/teams": [{"name": "python core", "id": 42}]} gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) @@ -747,14 +737,11 @@ async def test_awaiting_merge_label_added_not_miss_islingtons_pr(): "labels": [{"name": "awaiting merge"}], "head": {"sha": sha}, "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, + } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -780,8 +767,7 @@ async def test_awaiting_merge_label_added_not_miss_islingtons_pr(): "merged_by": {"login": "Mariatta"}, }, "/repos/python/cpython/pulls/5547": {"labels": [{"name": "awaiting merge"}]}, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } getiter = { @@ -812,7 +798,6 @@ async def test_awaiting_merge_label_added_not_miss_islingtons_pr(): } ], "/orgs/python/teams": [{"name": "python core", "id": 42}], - } gh = FakeGH(getitem=getitem, getiter=getiter) @@ -829,14 +814,11 @@ async def test_awaiting_core_review_label_added_miss_islingtons_pr(): "labels": [{"name": "awaiting core review"}], "head": {"sha": sha}, "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, + } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -864,8 +846,7 @@ async def test_awaiting_core_review_label_added_miss_islingtons_pr(): "/repos/python/cpython/pulls/5547": { "labels": [{"name": "awaiting core review"}] }, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } getiter = { @@ -896,7 +877,6 @@ async def test_awaiting_core_review_label_added_miss_islingtons_pr(): } ], "/orgs/python/teams": [{"name": "python core", "id": 42}], - } gh = FakeGH(getitem=getitem, getiter=getiter) @@ -1074,14 +1054,10 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1103,13 +1079,13 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington }, ], }, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } - getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], - "/orgs/python/teams": [{"name": "python core", "id": 42}], - } + getiter = { + "/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) @@ -1136,14 +1112,10 @@ async def test_automerge_but_not_awaiting_merge(): "labels": [{"name": "awaiting review"}, {"name": AUTOMERGE_LABEL}], "head": {"sha": sha}, "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1181,13 +1153,13 @@ async def test_automerge_but_not_awaiting_merge(): } ], }, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } - getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], - "/orgs/python/teams": [{"name": "python core", "id": 42}], - } + getiter = { + "/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) @@ -1229,14 +1201,10 @@ async def test_automerge_multi_commits_in_pr(): "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1258,8 +1226,7 @@ async def test_automerge_multi_commits_in_pr(): }, ], }, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } getiter = { @@ -1268,7 +1235,6 @@ async def test_automerge_multi_commits_in_pr(): {"sha": sha}, ], "/orgs/python/teams": [{"name": "python core", "id": 42}], - } gh = FakeGH(getitem=getitem, getiter=getiter) @@ -1302,14 +1268,10 @@ async def test_automerge_commit_not_found(): "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1331,13 +1293,13 @@ async def test_automerge_commit_not_found(): }, ], }, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } - getiter = {"/repos/python/cpython/pulls/5547/commits": [], - "/orgs/python/teams": [{"name": "python core", "id": 42}], -} + getiter = { + "/repos/python/cpython/pulls/5547/commits": [], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) @@ -1360,14 +1322,10 @@ async def test_automerge_failed(): "number": 5547, "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", - "url": "https://api.github.com/repos/python/cpython/pulls/5547" - }, - "sender": { - "login": "Mariatta", + "url": "https://api.github.com/repos/python/cpython/pulls/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1389,7 +1347,7 @@ async def test_automerge_failed(): }, ], }, - "/teams/42/memberships/Mariatta": True + "/teams/42/memberships/Mariatta": True, } getiter = { @@ -1441,14 +1399,10 @@ async def test_automerge_label_added_by_non_core_dev(): "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", "url": "https://api.github.com/repos/python/cpython/pulls/5547", - "issue_url": "https://api.github.com/repos/python/cpython/issues/5547" - }, - "sender": { - "login": "miss-islington", + "issue_url": "https://api.github.com/repos/python/cpython/issues/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } + "sender": {"login": "miss-islington"}, + "label": {"name": AUTOMERGE_LABEL}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1470,25 +1424,27 @@ async def test_automerge_label_added_by_non_core_dev(): }, ], }, - "/teams/42/memberships/miss-islington": gidgethub.BadRequest( - status_code=http.HTTPStatus(404)) - + "/teams/42/memberships/miss-islington": gidgethub.BadRequest( + status_code=http.HTTPStatus(404) + ), } - getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], - "/orgs/python/teams": [{"name": "python core", "id": 42}], - } + getiter = { + "/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) - assert gh.delete_url == f'{data["pull_request"]["issue_url"]}/labels/{AUTOMERGE_LABEL}' + assert ( + gh.delete_url == f'{data["pull_request"]["issue_url"]}/labels/{AUTOMERGE_LABEL}' + ) assert not hasattr(gh, "post_data") # does not leave a comment assert not hasattr(gh, "post_data") # does not leave a comment assert not hasattr(gh, "put_data") # does not merge - async def test_automerge_label_triggered_by_added_to_pr(): sha = "f2393593c99dd2d3ab8bfab6fcc5ddee540518a9" data = { @@ -1505,14 +1461,10 @@ async def test_automerge_label_triggered_by_added_to_pr(): "title": "bpo-32720: Fixed the replacement field grammar documentation.", "body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.", "url": "https://api.github.com/repos/python/cpython/pulls/5547", - "issue_url": "https://api.github.com/repos/python/cpython/issues/5547" - }, - "sender": { - "login": "Mariatta", + "issue_url": "https://api.github.com/repos/python/cpython/issues/5547", }, - "label": { - "name": AUTOMERGE_LABEL - } + "sender": {"login": "Mariatta"}, + "label": {"name": AUTOMERGE_LABEL}, } event = sansio.Event(data, event="pull_request", delivery_id="1") @@ -1534,15 +1486,17 @@ async def test_automerge_label_triggered_by_added_to_pr(): }, ], }, - "/teams/42/memberships/Mariatta": True - + "/teams/42/memberships/Mariatta": True, } - getiter = {"/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], - "/orgs/python/teams": [{"name": "python core", "id": 42}], - } + getiter = { + "/repos/python/cpython/pulls/5547/commits": [{"sha": sha}], + "/orgs/python/teams": [{"name": "python core", "id": 42}], + } gh = FakeGH(getitem=getitem, getiter=getiter) await status_change.router.dispatch(event, gh) assert gh.patch_url == f'{data["pull_request"]["url"]}' - assert gh.patch_data == {"body": f"{data['pull_request']['body']}\n\nAutomerge-Triggered-By: @Mariatta"} + assert gh.patch_data == { + "body": f"{data['pull_request']['body']}\n\nAutomerge-Triggered-By: @Mariatta" + }