From metatracker at psf.upfronthosting.co.za Fri Jul 1 11:04:18 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Fri, 01 Jul 2016 15:04:18 +0000 Subject: [Tracker-discuss] [issue595] Set stage to 'resolved' when an issue is closed In-Reply-To: <1465455890.27.0.55118446796.issue595@psf.upfronthosting.co.za> Message-ID: <1467385458.94.0.580265681164.issue595@psf.upfronthosting.co.za> R David Murray added the comment: Looks OK to me (without testing it). You probably meant to write 'status_changed' twice in the assignment for status_close, though. ---------- status: unread -> chatting _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 5 20:26:49 2016 From: metatracker at psf.upfronthosting.co.za (John Rouillard) Date: Wed, 06 Jul 2016 00:26:49 +0000 Subject: [Tracker-discuss] [issue467] People searches return all issues In-Reply-To: <1339620677.42.0.0885958608916.issue467@psf.upfronthosting.co.za> Message-ID: <1467764809.13.0.358175628323.issue467@psf.upfronthosting.co.za> John Rouillard added the comment: See: http://issues.roundup-tracker.org/issue2550855 for fix. The anonymous user needs to have search permission for users added. I am not sure what version of roundup is running here, search perms were added at 1.4.19 so ... ---------- nosy: +rouilj _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 5 21:41:45 2016 From: metatracker at psf.upfronthosting.co.za (John Rouillard) Date: Wed, 06 Jul 2016 01:41:45 +0000 Subject: [Tracker-discuss] [issue448] Cannot log into search results page In-Reply-To: <1333644181.93.0.427714955722.issue448@psf.upfronthosting.co.za> Message-ID: <1467769305.74.0.728748907075.issue448@psf.upfronthosting.co.za> John Rouillard added the comment: I just wanted to mention that there is an upstream fix for this that you may want to include. See: http://issues.roundup-tracker.org/issue2550785 Code: https://sourceforge.net/p/roundup/code/ci/894aa07be6cbdc4f55634f4d2c11d62232cf0806/ ---------- nosy: +rouilj _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 5 22:03:42 2016 From: metatracker at psf.upfronthosting.co.za (John Rouillard) Date: Wed, 06 Jul 2016 02:03:42 +0000 Subject: [Tracker-discuss] [issue555] Registration does not report name conflicts In-Reply-To: <1413199530.16.0.0951056574514.issue555@psf.upfronthosting.co.za> Message-ID: <1467770622.53.0.56271780524.issue555@psf.upfronthosting.co.za> John Rouillard added the comment: Pulled upstream as: http://issues.roundup-tracker.org/issue2550920 ---------- nosy: +rouilj _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 5 22:15:36 2016 From: metatracker at psf.upfronthosting.co.za (John Rouillard) Date: Wed, 06 Jul 2016 02:15:36 +0000 Subject: [Tracker-discuss] [issue581] Add rest endpoint to roundup In-Reply-To: <1456613089.91.0.963732827198.issue581@psf.upfronthosting.co.za> Message-ID: <1467771335.99.0.931651715341.issue581@psf.upfronthosting.co.za> John Rouillard added the comment: maciej, do you have any updates to this? ---------- nosy: +rouilj _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 5 22:32:45 2016 From: metatracker at psf.upfronthosting.co.za (John Rouillard) Date: Wed, 06 Jul 2016 02:32:45 +0000 Subject: [Tracker-discuss] [issue598] Hide retired queries in "Your Queries" sidebar In-Reply-To: <1465630876.44.0.0882967151952.issue598@psf.upfronthosting.co.za> Message-ID: <1467772365.22.0.920528934942.issue598@psf.upfronthosting.co.za> John Rouillard added the comment: A version of this was checked in upstream. http://issues.roundup-tracker.org/issue2550831 screenshots are attached to the upstream issue. If the query is on the user's active list (i.e. in the sidebar) one of two things is shown: If you are the query owner, you can undelete it and then remove it from your list then re-retire it to remove it entirely. My thought is it takes two steps to truly delete a query for the owner: remove from your active list and then delete. I have accidentally clicked on delete and had to resort to unretire in roundup-admin to recover my query. If you are not the query owner you can remove the query from your active list. I haven't looked at the attached patch to see how it differs from the original patch that I modified and adopted upstream. ---------- nosy: +rouilj _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 11 16:37:06 2016 From: metatracker at psf.upfronthosting.co.za (=?utf-8?b?0JrQvtGA0LXQvdCx0LXRgNCzINCc0LDRgNC6?=) Date: Mon, 11 Jul 2016 20:37:06 +0000 Subject: [Tracker-discuss] [issue562] Gmail (google) marks registration email as spam In-Reply-To: <1422157456.62.0.726959967661.issue562@psf.upfronthosting.co.za> Message-ID: <1468269426.74.0.115067444419.issue562@psf.upfronthosting.co.za> ????????? ???? added the comment: Still no progress? you just required to add SPF-recrod to DNS ---------- nosy: +socketpair _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 12 04:15:41 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Tue, 12 Jul 2016 08:15:41 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page Message-ID: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> New submission from Maciej Szulik: Anish here are my review comments: 1. detectors/github_pullrequest_url.py Add an empty line before imports. > if parsed_url.scheme not in ('http', 'https'): You're expecting http or https, but what if I paste github.com/python/cpython/pull/41 which is perfectly valid but will fail your validator? You can actually add http on your own if it's missing, for purity ;) > newvalues['url'] = (parsed_url.scheme + "://" + parsed_url.netloc + parsed_url.path) Why do you need to reconstruct the url in this case? Why not just assigning the one you verified is ok? iow. newvalues['url'] = url > github_url_id = db.github_pullrequest_url.lookup(pullrequest_number) No need to assign to a value if you're not using it. 2. html/issue.item.html > GitHub Pull Request URL: The name is lengthy, make it shorter 'GitHub PR' should be enough, imho. Don't forget to change error messages so they reflect that change as well. > Pull Request Change to Link. > Put entire link, it won't be long, and the short version looks awful. > edit It would be nice to also have Remove button similarly to how we have with files, hgrepos, etc. See the files section on this page, as an example. Additionally there's an empty line right after this cell, please remove ;) 3. schema.py > github_pullrequest_url = Class(db, "github_pullrequest_url", Make shorter, 'github_prs' is enough. > pullrequest_number=String(), 'id', 'no', 'pr_no' one of them will be sufficient, as well. Have we discussed the possibility of having the links being crossed when the PR is merged or at least having a separate column with the state, I think we did. Can you link the issue if one exists? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 12 04:47:30 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Tue, 12 Jul 2016 08:47:30 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468313250.52.0.993884685205.issue586@psf.upfronthosting.co.za> Berker Peksag added the comment: + url = newvalues.get('url', '') You should also return early if there is no 'url' key in newvalues. i18n:translate="" can be removed. I don't think we are going to support a non-English language. I would also prefer a 'remove' link instead of 'edit'. This is just a nitpick, but it would be nice to not use name 'github' in schema.py. We may switch to another pull request/merge request based software in the future. + + + + + The empty can be removed. ---------- nosy: +berker.peksag _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 12 04:54:23 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Tue, 12 Jul 2016 08:54:23 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468313663.5.0.147037723185.issue586@psf.upfronthosting.co.za> Berker Peksag added the comment: Also, I'm not fan of such a manual work. I would prefer to have a JSON endpoint which queries open pull requests on python/cpython and match if the title of a pull request contains the issue number. You can see https://code.djangoproject.com/ticket/25227 for an example implementation of the idea (notice the "Pull Requests" field). _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 12 08:54:07 2016 From: metatracker at psf.upfronthosting.co.za (Tim Tisdall) Date: Tue, 12 Jul 2016 12:54:07 +0000 Subject: [Tracker-discuss] [issue562] Gmail (google) marks registration email as spam In-Reply-To: <1468269426.74.0.115067444419.issue562@psf.upfronthosting.co.za> Message-ID: Tim Tisdall added the comment: Your comment got emailed to me with no DMARC fail, so that's good. But adding a policy would be good. On 11 July 2016 at 16:37, ????????? ???? wrote: > > ????????? ???? added the comment: > > Still no progress? you just required to add SPF-recrod to DNS > > ---------- > nosy: +socketpair > > _______________________________________________________ > PSF Meta Tracker > > _______________________________________________________ _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 12:45:07 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 13 Jul 2016 16:45:07 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468428307.4.0.752438793053.issue586@psf.upfronthosting.co.za> Anish Shah added the comment: > Why do you need to reconstruct the url in this case? Why not just assigning the one you verified is ok? I'm reconstructing because URL might contain fragment identifier/query string. What do you think? > Make shorter, 'github_prs' is enough. > 'id', 'no', 'pr_no' one of them will be sufficient, as well. I will change this. But, I will need to change this in all the patches that I have submitted. > Have we discussed the possibility of having the links being crossed when the PR is merged or at least having a separate column with the state, I think we did. I have added a 'state' field in issue590 _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 12:47:48 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 13 Jul 2016 16:47:48 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468428468.4.0.787248414281.issue586@psf.upfronthosting.co.za> Anish Shah added the comment: @berker.peksag Thank you for the review. I will make those changes. > Also, I'm not fan of such a manual work. I would prefer to have a JSON endpoint > which queries open pull requests on python/cpython and match if the title of a > pull request contains the issue number. This is the first patch as a part of my GSoC project. You can check issue589 where I'm using GitHub webhooks to link issues automatically. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 13:32:15 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 13 Jul 2016 17:32:15 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468431135.25.0.82089210348.issue586@psf.upfronthosting.co.za> Berker Peksag added the comment: Issue 589 is a different feature and it should be discussed there (by the way it would be really nice if you could give more information about the feature and the patch -- I had to read the whole patch to understand what it does). The problem with this implementation is that I will need to go to bugs.python.org/issueXXXX and paste a URL everytime I open a pull request on GitHub. Instead of this manual step, Roundup should automatically look for "Issue #NNNN" in all pull request titles and list all matched items by using JavaScript on bugs.python.org/issueXXXX. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 13:40:04 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 13 Jul 2016 17:40:04 +0000 Subject: [Tracker-discuss] [issue600] Convert patches to GitHub Pull Request In-Reply-To: <1466359411.87.0.930389612417.issue600@psf.upfronthosting.co.za> Message-ID: <1468431604.77.0.356692903428.issue600@psf.upfronthosting.co.za> Berker Peksag added the comment: How do you get the correct author information of the patch? I don't think there is an easy way [1] to extract the author information to use it in the pull requests. [1] You could probably check the GitHub username field of the author but you could have to guess it anyway and I don't think we should guess it. People should convert their patches to pull requests manually. ---------- nosy: +berker.peksag _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 13:46:21 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Wed, 13 Jul 2016 17:46:21 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468431981.11.0.362654975381.issue586@psf.upfronthosting.co.za> R David Murray added the comment: Berker: I presume the point here is that this creates the field, and issue 589 fills it in automatically by having github call roundup when a PR is created. I haven't looked at either patch closely enough to know if I'm right, but that's what I'd expect the implementation to look like. ---------- nosy: +r.david.murray _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 13:50:27 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 13 Jul 2016 17:50:27 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o Message-ID: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> New submission from Berker Peksag: Thanks for the patches! :) GitHub already spams every single comment made on a pull request and this will make it worse. I'm -1 on this. It's fine if other core developers want to backup review comments, but it shouldn't be shown on bugs.python.org by default. (Also, please attach standalone patches. I think I need some another patch to be able to import and test these patches.) ---------- nosy: +berker.peksag _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 13:55:37 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 13 Jul 2016 17:55:37 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o Message-ID: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> New submission from Berker Peksag: Do we need a separate issue for this? I think this can be done in issue 586. ---------- nosy: +berker.peksag _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 15:40:13 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Wed, 13 Jul 2016 19:40:13 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1468438813.34.0.117660477168.issue592@psf.upfronthosting.co.za> R David Murray added the comment: If github batched the review comments, what we would want (what we've wanted for a long time from reitveld) is a note posted to b.p.o that there *are* review comments. But since github does *not* batch review comments, posting every comment (especially without the relevant context) may indeed be noisy. On the other hand, I'd not like to see the bulk of the *discussion* of the issue (as opposed to the code) be hidden away on github, which it undoubtably would be. So on balance I'm in favor of reflecting the comments to bugs, but not adamantly so. ---------- nosy: +r.david.murray _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 13 15:41:35 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Wed, 13 Jul 2016 19:41:35 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1468438895.09.0.572538863063.issue592@psf.upfronthosting.co.za> R David Murray added the comment: But, really, this level of discussion should take place on the workflow mailing list, not in the context of the patch. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 18 15:11:48 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 18 Jul 2016 19:11:48 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468869108.81.0.988311210971.issue586@psf.upfronthosting.co.za> Maciej Szulik added the comment: @anish.shah > I'm reconstructing because URL might contain fragment identifier/query string. What do you think? Doesn't matter, the parsed_url is just an object representation of that url. > I will change this. But, I will need to change this in all the patches that I have submitted. Sorry, but yes please. And apply Berker's suggestion of not having github word in it, as well. > I have added a 'state' field in issue590 Cool. @Berker > Issue 589 is a different feature and it should be discussed there (by the way it would be really nice if you could give more information about the feature and the patch -- I had to read the whole patch to understand what it does). > The problem with this implementation is that I will need to go to bugs.python.org/issueXXXX and paste a URL everytime I open a pull request on GitHub. Instead of this manual step, Roundup should automatically look for "Issue #NNNN" in all pull request titles and list all matched items by using JavaScript on bugs.python.org/issueXXXX. It's exactly like David is saying. With issue 589 b.p.o is notified through github webhook of new events, such as PRs in which we parse the title and comment in search for bpoNNN and link the PR automatically. The idea of having a client side javascript assuming you have a gh opened in one tab and bpo in other doesn't seem right. I'm currently reviewing Anish all submissions from his GSoC and he'll soon create an extensive article describing all the things he has done. Anyway thanks for your time and review! _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 18 15:34:02 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 18 Jul 2016 19:34:02 +0000 Subject: [Tracker-discuss] [issue587] Link GitHub pull requests in comments Message-ID: <1468870442.58.0.0827952665631.issue587@psf.upfronthosting.co.za> New submission from Maciej Szulik: @anish.shah > pullrequest_number = match.group('id') Use shorter naming, like mentioned in #586, iow pr_id/pr_no. > github_pullrequest_url_id = cl.lookup(pullrequest_number) There are two problems with this approach: 1. You lookup from the list of all patches, not necessarily connected with that particular issue. Iow. I have issue1 with PR1 and issue2 w/o PR number and when I enter PR1 in issue2 I'm getting a link to PR1 from issue1, which should not happen. Either you want to restrict that to this particular issue, you'd need to check issues's prs specifically to fix it. Or... 2. Don't do lookups at all, but always assume the format we've settled on to be something you should turn into a link. Additionally, you could think of adding such link to the list of links. Personally, I'm more towards the latter. Thanks! _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 18 16:20:48 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 18 Jul 2016 20:20:48 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1468873248.17.0.081706483517.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: @anish.shah roundup/github_pullrequest_url.py > def __init__(self, client): > .... > self._validate_webhook_secret() > self._verify_request() > self._extract() Don't put the entire action in the constructor of the object. Its responsibility is to create an object and then you call actions on it. Here dispatch is the method you should create that should do what you want here. > result = compare_digest(signature, header_signature) > if not result: Replace with: if not compare_digest(signature, header_signature): reads better. > def _get_event(self): > event = self.request.headers.get('X-GitHub-Event', None) > return event Replace with: def _get_event(self): return self.request.headers.get('X-GitHub-Event', None) > if event == 'pull_request': > PullRequest(self.db, self.data) > elif event == 'issue_comment': > IssueComment(self.db, self.data) Same here. Create objects and act upon them, don't run actions inside the initialization. I'll get back to this patch once again tomorrow. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 18 23:00:51 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Tue, 19 Jul 2016 03:00:51 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468897251.3.0.709162026897.issue586@psf.upfronthosting.co.za> Berker Peksag added the comment: I'm not sure I explained myself clearly so here is a quick and dirty patch, including a screenshot: https://dl.dropboxusercontent.com/u/166024/gh-pr.png Since I don't have meaningful data I chose Django as an example. _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/html/issue.item.html b/html/issue.item.html --- a/html/issue.item.html +++ b/html/issue.item.html @@ -10,16 +10,35 @@ /> + New Issue New Issue Editing Remote hg repo: + + + Pull requests: + + + + + + + + + + +
  From metatracker at psf.upfronthosting.co.za Tue Jul 19 03:11:01 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Tue, 19 Jul 2016 07:11:01 +0000 Subject: [Tracker-discuss] [issue581] Add rest endpoint to roundup In-Reply-To: <1456613089.91.0.963732827198.issue581@psf.upfronthosting.co.za> Message-ID: <1468912261.52.0.207474761319.issue581@psf.upfronthosting.co.za> Maciej Szulik added the comment: @rouilj it's currently stuck, hopefully after summer I'll be able to get back to the topic. Sorry :( _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 14:11:48 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Tue, 19 Jul 2016 18:11:48 +0000 Subject: [Tracker-discuss] [issue587] Link GitHub pull requests in comments In-Reply-To: <1468870442.58.0.0827952665631.issue587@psf.upfronthosting.co.za> Message-ID: <1468951908.45.0.235720900721.issue587@psf.upfronthosting.co.za> Anish Shah added the comment: Description about this issue: If any of the comments on b.p.o contain strings like "PR NNN", then it should automatically add an href link to the GitHub PR. For example, input - PR 23 looks great output - PR 23 looks great _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 14:19:30 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Tue, 19 Jul 2016 18:19:30 +0000 Subject: [Tracker-discuss] [issue587] Link GitHub pull requests in comments In-Reply-To: <1468870442.58.0.0827952665631.issue587@psf.upfronthosting.co.za> Message-ID: <1468952370.08.0.368005086297.issue587@psf.upfronthosting.co.za> Anish Shah added the comment: > 1. You lookup from the list of all patches, not necessarily connected with that particular issue. Suppose there was an issue1 which was resolved by PR1. Now, this PR1 introduced a new bug - issue2. In this case, we might want to discuss about PR1 in issue2. What do you think? > 2. Don't do lookups at all, but always assume the format we've settled on to be something you should turn into a link. Additionally, you could think of adding such link to the list of links. I think, this might not be a good idea. For example, a comment has a string like "PR 23" and we extract the number "23". Now, we need to create the GitHub URL by ourself like - url = "https://github.com/python/cpython/pull" + pr_no This will fail if in future Github decides to change the URL for pull request. Let me know what do you think? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 14:43:03 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Tue, 19 Jul 2016 18:43:03 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1468953783.21.0.149183017157.issue589@psf.upfronthosting.co.za> Anish Shah added the comment: Description about this issue:- GitHub provides webhooks to subscribe to events on GitHub.com. These events include - creating a new PR, adding a comment on PR, etc. If one of this event is triggered, it sends an HTTP POST request with JSON data of that particular event to the configured URL in webhooks settings. For eg, whenever a new PR is created on GitHub, it will send an HTTP POST request on http://bugs.python.org/add_pull_request. The payload contains information like id, title, body, commits of PR. If the title or the body of PR contains string like "Fixes bpoNNN", then we link the PR id to issueNNN on bpo _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 14:55:27 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Tue, 19 Jul 2016 18:55:27 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468954527.07.0.275657853897.issue586@psf.upfronthosting.co.za> Anish Shah added the comment: @berker.peksag I looked at your patch and screenshot. What you are doing is calling GitHub API using JS each time an issue page is loaded and showing PRs which have a string like "Issue #NN" in its title. I have just added a description in issue 589 (sorry for not adding before). GitHub webhooks will provide JSON data which will contain information about PR title (just like GitHub APIs). If the title contains a string like "Fixes bpoNNN", we had that PR to PostGres DB. I hope this makes _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 15:12:16 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Tue, 19 Jul 2016 19:12:16 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468955536.14.0.920345893454.issue586@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch according to reviews suggested by @maciej.szulik and @berker.peksag Description:- This patch adds a new table "pull_request" which is used to save GitHub PR URLs. URL can be added manually using "GitHub PR" field on issue's page. --- GitHub PR URL will also be added automatically in two ways - for that, you can have a look at issue589 and issue600 _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/detectors/pull_request.py b/detectors/pull_request.py new file mode 100644 index 0000000..6a206e5 --- /dev/null +++ b/detectors/pull_request.py @@ -0,0 +1,35 @@ +# Auditor for GitHub URLs +# Check if it is a valid GitHub Pull Request URL and extract PR number + +import re +import urlparse + + +def validate_github_url(db, cl, nodeid, newvalues): + url = newvalues.get('url', '') + if url == '': + return + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme == '': + url = 'https://' + url + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme not in ('http', 'https'): + raise ValueError("Invalid URL scheme in GitHub PR") + if 'github.com' not in parsed_url.netloc or 'pull' not in parsed_url.path: + raise ValueError("Invalid GitHub PR") + newvalues['url'] = parsed_url.geturl() + regex = re.match(".*/pull/(\d+)", newvalues['url']) + if regex and len(regex.groups()) == 1: + pr_no = regex.groups()[0] + try: + db.pull_request.lookup(pr_no) + raise ValueError("GitHub PR already added to an issue") + except KeyError: + newvalues['pr_no'] = pr_no + else: + raise ValueError("Invalid GitHub PR") + + +def init(db): + db.pull_request.audit('create', validate_github_url) + db.pull_request.audit('set', validate_github_url) diff --git a/html/issue.item.html b/html/issue.item.html index ddc4ec3..17eecd1 100644 --- a/html/issue.item.html +++ b/html/issue.item.html @@ -220,6 +220,14 @@
GitHub PR: + + +
@@ -273,6 +281,43 @@
+ + + + + + + + + + + + + + + + +
GitHub Pull Requests
LinkAuthorDateEditRemove
+ + GitHub PR link + + + creator's name + + creation date + + edit + +
+ + + +
+
+

diff --git a/schema.py b/schema.py index d91bf7b..c125a5f 100644 --- a/schema.py +++ b/schema.py @@ -173,6 +173,12 @@ hgrepo = Class(db, "hgrepo", patchbranch=String(), ) +pull_request = Class(db, "pull_request", + url=String(), + pr_no=String(),) + +pull_request.setkey("pr_no") + # IssueClass automatically gets these properties in addition to the Class ones: # title = String() # messages = Multilink("msg") @@ -194,7 +200,8 @@ issue = IssueClass(db, "issue", stage=Link('stage'), nosy_count=Number(), message_count=Number(), - hgrepos=Multilink('hgrepo')) + hgrepos=Multilink('hgrepo'), + pull_requests=Multilink('pull_request')) # # TRACKER SECURITY SETTINGS @@ -222,7 +229,7 @@ for r in 'User', 'Developer', 'Coordinator': for cl in ('issue_type', 'severity', 'component', 'version', 'priority', 'stage', 'status', 'resolution', - 'issue', 'keyword', 'hgrepo'): + 'issue', 'keyword', 'hgrepo', 'pull_request'): db.security.addPermissionToRole('User', 'View', cl) db.security.addPermissionToRole('Anonymous', 'View', cl) @@ -233,6 +240,13 @@ p = db.security.addPermission(name='Edit', klass='hgrepo', check=may_edit_hgrepo properties=['url', 'patchbranch']) db.security.addPermissionToRole('User', p) +def may_edit_github_url(db, userid, itemid): + return userid == db.pull_request.get(itemid, "creator") +db.security.addPermissionToRole('User', 'Create', 'pull_request') +p = db.security.addPermission(name='Edit', klass='pull_request', + check=may_edit_github_url, properties=['url']) +db.security.addPermissionToRole('User', p) + class may_view_spam: def __init__(self, klassname): self.klassname = klassname @@ -292,7 +306,7 @@ p = db.security.addPermission(name='Create', klass='issue', properties=('title', 'type', 'components', 'versions', 'severity', - 'messages', 'files', 'nosy', 'hgrepos'), + 'messages', 'files', 'nosy', 'hgrepos', 'pull_requests'), description='User can report and discuss issues') db.security.addPermissionToRole('User', p) @@ -300,7 +314,7 @@ p = db.security.addPermission(name='Edit', klass='issue', properties=('title', 'type', 'components', 'versions', 'severity', - 'messages', 'files', 'nosy', 'hgrepos'), + 'messages', 'files', 'nosy', 'hgrepos', 'pull_requests'), description='User can report and discuss issues') db.security.addPermissionToRole('User', p) @@ -335,7 +349,7 @@ for cl in ('issue', 'file', 'msg', 'keyword'): ########################## for cl in ('issue_type', 'severity', 'component', 'version', 'priority', 'stage', 'status', 'resolution', 'issue', - 'file', 'msg', 'hgrepo'): + 'file', 'msg', 'hgrepo', 'pull_request'): db.security.addPermissionToRole('Coordinator', 'View', cl) db.security.addPermissionToRole('Coordinator', 'Edit', cl) db.security.addPermissionToRole('Coordinator', 'Create', cl) From metatracker at psf.upfronthosting.co.za Tue Jul 19 16:00:00 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Tue, 19 Jul 2016 20:00:00 +0000 Subject: [Tracker-discuss] [issue587] Link GitHub pull requests in comments (depends on issue 586) In-Reply-To: <1468870442.58.0.0827952665631.issue587@psf.upfronthosting.co.za> Message-ID: <1468958400.84.0.899888116485.issue587@psf.upfronthosting.co.za> R David Murray added the comment: Don't do lookups, do mechanical translation. The translation happens at page rendering time, so if github changes it URLs (or we move to a different provider), we just change the linkifier code to match. ---------- nosy: +r.david.murray _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 16:03:39 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Tue, 19 Jul 2016 20:03:39 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1468958619.77.0.485694246015.issue589@psf.upfronthosting.co.za> R David Murray added the comment: And if the PR doesn't reference an issue number, it should create a new issue. I think we should also look for issue numbers in the body of the PR as well. The user might put it in the description rather than the title, if they provide a description. ---------- nosy: +r.david.murray _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 16:09:45 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Tue, 19 Jul 2016 20:09:45 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1468958985.89.0.784559564866.issue586@psf.upfronthosting.co.za> Berker Peksag added the comment: I don't have an objection to a general purpose webhook (I wrote such webhooks for GitHub before.) Using a webhook for a simple task like this will only make the implementation more complicated. I don't see a reason to store pull request URLs in database. We've also discussed backup pull request data (including review comments) so storing URLs in database won't be needed in long term anyway. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 19 16:19:56 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Tue, 19 Jul 2016 20:19:56 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1468959596.34.0.86342361078.issue589@psf.upfronthosting.co.za> Berker Peksag added the comment: > And if the PR doesn't reference an issue number, it should create a new issue. Wouldn't that create too much noise for trivial pull requests like typo fixes, documentation tweaks and code style changes? Also how do we handle if the user doesn't have an account on bugs.python.org? ---------- nosy: +berker.peksag _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 20 10:06:39 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Wed, 20 Jul 2016 14:06:39 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469023599.96.0.107099442808.issue589@psf.upfronthosting.co.za> R David Murray added the comment: Hmm. Good question. We could use a specific user to create such issues. As for noise...we do typo issues now, so if we have an increased volume of them I think that just means we're fixing more typos. I don't really see the problem with that, since committing the PR will (if everything is working right) close the issue. Others may disagree, though. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 20 10:10:23 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Wed, 20 Jul 2016 14:10:23 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1469023823.11.0.844075802014.issue586@psf.upfronthosting.co.za> R David Murray added the comment: I anticipate that even if we improve our patch commit rate we'll still have 1000+ open PRs. I don't think pounding on github's infrastructure for every page render on our bug tracker is very friendly, not to mention probably not very performant on our end. Unless I'm misunderstanding something. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 20 10:46:08 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 20 Jul 2016 14:46:08 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1469025968.56.0.772075872643.issue586@psf.upfronthosting.co.za> Berker Peksag added the comment: The API call in my patch was just an example. GitHub does provide a search API. However, the problem with my approach is that it ignores rate limiting of GitHub API: https://api.github.com/rate_limit So Anish's patch might be more reliable than mine. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 20 13:09:34 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 20 Jul 2016 17:09:34 +0000 Subject: [Tracker-discuss] [issue587] Link GitHub pull requests in comments (depends on issue 586) In-Reply-To: <1468870442.58.0.0827952665631.issue587@psf.upfronthosting.co.za> Message-ID: <1469034574.94.0.487547016714.issue587@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch. :) _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/extensions/local_replace.py b/extensions/local_replace.py index 1dd0e89..b05e3d4 100644 --- a/extensions/local_replace.py +++ b/extensions/local_replace.py @@ -111,6 +111,10 @@ substitutions = [ # if the issue number is too big the db will explode -- limit it to 7 digits issue_re = re.compile(r'(?P(\#|\b(?1?\d{1,6}))\b', re.I) +# PR number, pull request number, pullrequest number +pullrequest_re = re.compile(r'(?P(\b(?1?\d{1,6}))\b', + re.I) + class PyDevStringHTMLProperty(StringHTMLProperty): def _hyper_repl(self, match): @@ -142,6 +146,7 @@ class PyDevStringHTMLProperty(StringHTMLProperty): message = cre.sub(replacement, message) # finally add links for issues message = issue_re.sub(self._linkify_issue, message) + message = pullrequest_re.sub(self._linkify_pull_request, message) return message def _linkify_issue(self, match): @@ -165,6 +170,15 @@ class PyDevStringHTMLProperty(StringHTMLProperty): return template % dict(issue_id=issue_id, title=title, status=status, text=text) + def _linkify_pull_request(self, match): + """Turn a pullrequest (e.g. 'PR 123') to an HTML link""" + template = ('%(text)s') + pr_no = match.group('pr_no') + text = match.group('text') + base_url = 'https://github.com/python/cpython/pull/{}' + pr_url = base_url.format(pr_no) + return template % dict(link=pr_url, text=text) + noise_changes = re.compile('(nosy_count|message_count)\: \d+\.0( -> \d+\.0)?') diff --git a/extensions/test/local_replace_data.txt b/extensions/test/local_replace_data.txt index bdf1eb9..dbedc6c 100644 --- a/extensions/test/local_replace_data.txt +++ b/extensions/test/local_replace_data.txt @@ -234,3 +234,9 @@ see devguide/committing.html#using-several-working-copies see devguide/committing.html#using-several-working-copies see devguide/committing#using-several-working-copies see devguide/committing#using-several-working-copies +check my pullrequest 1000 on github +check my pullrequest 1000 on github +check my PR 1000 on github +check my PR 1000 on github +check my pull request 1000 on github +check my pull request 1000 on github From metatracker at psf.upfronthosting.co.za Wed Jul 20 13:49:10 2016 From: metatracker at psf.upfronthosting.co.za (Brett C.) Date: Wed, 20 Jul 2016 17:49:10 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469036950.8.0.117176080912.issue589@psf.upfronthosting.co.za> Brett C. added the comment: Another issue is that what happens if there is an issue, but the person simply forgot to include it? Now we have an extra issue that will need to have its superceder set and the issue closed. Eventually we could have a bot that automatically added a comment that either contained a link to the bpo issue or mentioned that no issue was specified (and how to fix it if there is one). But this isn't critical so I wouldn't prioritize its work. ---------- nosy: +brett.cannon _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 20 16:15:17 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Wed, 20 Jul 2016 20:15:17 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1469045717.33.0.121662019384.issue586@psf.upfronthosting.co.za> Maciej Szulik added the comment: Anish before accepting (if there are no other objections) there's still one issue. If I add a PR, remove it and re-add it I'm hitting the detector's "GitHub PR already added to an issue". Can you fix it, please? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Thu Jul 21 02:02:18 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Thu, 21 Jul 2016 06:02:18 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1469080938.38.0.88874208128.issue586@psf.upfronthosting.co.za> Maciej Szulik added the comment: Anish, actually there is one serious problem that grows from previous comment. Generally your current solution blocks adding single PR to multiple issues, because of the key. Generally, I'd advise you to drop the key entirely and do it similarly to how hgrepos are handled. In none of the next patches you're doing lookups, not anymore at least ;) If anything, you're going through PRs attached to specific issue and that is totally fine. That will also simplify the detector a bit at least, since you won't be searching for duplicates. I can't come up with something to fix the duplicates problem atm. I'll try to reach out to David and Berker later today and ask for their ideas. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Thu Jul 21 12:12:51 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Thu, 21 Jul 2016 16:12:51 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1469117571.84.0.202488741962.issue586@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch. I have removed pr_no field entirely. _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- commit 299d794e5e7c58bb98358610d6a751079a89f8b4 Author: Anish Shah Date: Tue Jul 19 23:24:18 2016 +0530 Add GitHub Pull Request URL field on issues page diff --git a/detectors/pull_request.py b/detectors/pull_request.py new file mode 100644 index 0000000..3624232 --- /dev/null +++ b/detectors/pull_request.py @@ -0,0 +1,25 @@ +# Auditor for GitHub URLs +# Check if it is a valid GitHub Pull Request URL and extract PR number + +import re +import urlparse + + +def validate_github_url(db, cl, nodeid, newvalues): + url = newvalues.get('url', '') + if url == '': + return + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme == '': + url = 'https://' + url + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme not in ('http', 'https'): + raise ValueError("Invalid URL scheme in GitHub PR") + if 'github.com' not in parsed_url.netloc or 'pull' not in parsed_url.path: + raise ValueError("Invalid GitHub PR") + newvalues['url'] = parsed_url.geturl() + + +def init(db): + db.pull_request.audit('create', validate_github_url) + db.pull_request.audit('set', validate_github_url) diff --git a/html/issue.item.html b/html/issue.item.html index ddc4ec3..17eecd1 100644 --- a/html/issue.item.html +++ b/html/issue.item.html @@ -220,6 +220,14 @@ + + GitHub PR: + + + + + + @@ -273,6 +281,43 @@
+ + + + + + + + + + + + + + + + +
GitHub Pull Requests
LinkAuthorDateEditRemove
+ + GitHub PR link + + + creator's name + + creation date + + edit + +
+ + + +
+
+

diff --git a/schema.py b/schema.py index d91bf7b..2fef144 100644 --- a/schema.py +++ b/schema.py @@ -173,6 +173,9 @@ hgrepo = Class(db, "hgrepo", patchbranch=String(), ) +pull_request = Class(db, "pull_request", + url=String(),) + # IssueClass automatically gets these properties in addition to the Class ones: # title = String() # messages = Multilink("msg") @@ -194,7 +197,8 @@ issue = IssueClass(db, "issue", stage=Link('stage'), nosy_count=Number(), message_count=Number(), - hgrepos=Multilink('hgrepo')) + hgrepos=Multilink('hgrepo'), + pull_requests=Multilink('pull_request')) # # TRACKER SECURITY SETTINGS @@ -222,7 +226,7 @@ for r in 'User', 'Developer', 'Coordinator': for cl in ('issue_type', 'severity', 'component', 'version', 'priority', 'stage', 'status', 'resolution', - 'issue', 'keyword', 'hgrepo'): + 'issue', 'keyword', 'hgrepo', 'pull_request'): db.security.addPermissionToRole('User', 'View', cl) db.security.addPermissionToRole('Anonymous', 'View', cl) @@ -233,6 +237,13 @@ p = db.security.addPermission(name='Edit', klass='hgrepo', check=may_edit_hgrepo properties=['url', 'patchbranch']) db.security.addPermissionToRole('User', p) +def may_edit_github_url(db, userid, itemid): + return userid == db.pull_request.get(itemid, "creator") +db.security.addPermissionToRole('User', 'Create', 'pull_request') +p = db.security.addPermission(name='Edit', klass='pull_request', + check=may_edit_github_url, properties=['url']) +db.security.addPermissionToRole('User', p) + class may_view_spam: def __init__(self, klassname): self.klassname = klassname @@ -292,7 +303,7 @@ p = db.security.addPermission(name='Create', klass='issue', properties=('title', 'type', 'components', 'versions', 'severity', - 'messages', 'files', 'nosy', 'hgrepos'), + 'messages', 'files', 'nosy', 'hgrepos', 'pull_requests'), description='User can report and discuss issues') db.security.addPermissionToRole('User', p) @@ -300,7 +311,7 @@ p = db.security.addPermission(name='Edit', klass='issue', properties=('title', 'type', 'components', 'versions', 'severity', - 'messages', 'files', 'nosy', 'hgrepos'), + 'messages', 'files', 'nosy', 'hgrepos', 'pull_requests'), description='User can report and discuss issues') db.security.addPermissionToRole('User', p) @@ -335,7 +346,7 @@ for cl in ('issue', 'file', 'msg', 'keyword'): ########################## for cl in ('issue_type', 'severity', 'component', 'version', 'priority', 'stage', 'status', 'resolution', 'issue', - 'file', 'msg', 'hgrepo'): + 'file', 'msg', 'hgrepo', 'pull_request'): db.security.addPermissionToRole('Coordinator', 'View', cl) db.security.addPermissionToRole('Coordinator', 'Edit', cl) db.security.addPermissionToRole('Coordinator', 'Create', cl) From metatracker at psf.upfronthosting.co.za Sat Jul 23 00:40:26 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Sat, 23 Jul 2016 04:40:26 +0000 Subject: [Tracker-discuss] [issue586] Add GitHub Pull Request URL on issue page In-Reply-To: <1468311341.73.0.296282421587.issue586@psf.upfronthosting.co.za> Message-ID: <1469248826.0.0.206613066173.issue586@psf.upfronthosting.co.za> Maciej Szulik added the comment: LGTM _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sat Jul 23 00:43:31 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Sat, 23 Jul 2016 04:43:31 +0000 Subject: [Tracker-discuss] [issue587] Link GitHub pull requests in comments In-Reply-To: <1468870442.58.0.0827952665631.issue587@psf.upfronthosting.co.za> Message-ID: <1469249011.89.0.194870761313.issue587@psf.upfronthosting.co.za> Maciej Szulik added the comment: LGTM _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sun Jul 24 12:45:08 2016 From: metatracker at psf.upfronthosting.co.za (Lauren Brooks) Date: Sun, 24 Jul 2016 16:45:08 +0000 Subject: [Tracker-discuss] [issue601] Hacked personal doc and phone plus email s Message-ID: New submission from Lauren Brooks: Contact me at 618560 0589 or 7316149683 . My accounts have been compromised and it's a direct obstacle of me getting a job. ---------- messages: 3100 nosy: B.Brooksl status: unread title: Hacked personal doc and phone plus email s _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 12:54:16 2016 From: metatracker at psf.upfronthosting.co.za (Brett C.) Date: Mon, 25 Jul 2016 16:54:16 +0000 Subject: [Tracker-discuss] [issue601] Hacked personal doc and phone plus email s Message-ID: <1469465656.49.0.711845876928.issue601@psf.upfronthosting.co.za> New submission from Brett C.: Spam ---------- nosy: +brett.cannon priority: -> wish _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 17:08:15 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 25 Jul 2016 21:08:15 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469480895.67.0.252144392352.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: @anish.shah I still don't see my comments from previous review addressed. Additionally, since issue 586 has changed the schema you should update it here as well. @David: > Hmm. Good question. We could use a specific user to create such issues. The other option is to look for gh username, since we already store them and create the issue on behalf of that, falling back to that specific only when none is found. But using specific user is a good starting point. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 17:09:43 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 25 Jul 2016 21:09:43 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1469480983.78.0.937880975309.issue590@psf.upfronthosting.co.za> Maciej Szulik added the comment: @berker I've decided to split this into several steps for simplicity of tracking Anish progress. For that I'd prefer to keep it separate, if you don't mind. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 17:11:59 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 25 Jul 2016 21:11:59 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1469481119.75.0.355646731527.issue590@psf.upfronthosting.co.za> Maciej Szulik added the comment: @anish since issue 589 needs update so does this one. ---------- nosy: +anish.shah _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 17:16:04 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 25 Jul 2016 21:16:04 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1469481364.89.0.878352211779.issue592@psf.upfronthosting.co.za> Maciej Szulik added the comment: @David, @Berker the original idea of this patch is to entirely ignore gh notifications and have that information available in bpo. Moreover, instead of a bunch of comments you should get one combined information that the review has be posted with a link to the PR. The initial timeout we agreed on was 30 mins, iow. 30 mins of inactivity would cause this to create such comment on bpo. I'm currently reviewing those patches and I'll make sure this is working as described. Is that more to your liking? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 17:19:09 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Mon, 25 Jul 2016 21:19:09 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469481549.78.0.478120886074.issue589@psf.upfronthosting.co.za> R David Murray added the comment: Yes, I was assuming we'd post to the right account when we can determine it. It was only github accounts with no linkage where we'd need a 'generic' user for posting. And we *will* get PRs from people who won't open bugs.python.org accounts, even if asked to. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 17:21:47 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 25 Jul 2016 21:21:47 +0000 Subject: [Tracker-discuss] [issue600] Convert patches to GitHub Pull Request In-Reply-To: <1466359411.87.0.930389612417.issue600@psf.upfronthosting.co.za> Message-ID: <1469481707.52.0.0685504591214.issue600@psf.upfronthosting.co.za> Maciej Szulik added the comment: @Berker the work included in this issue is the main part of Anish work during his GSoC time. I'm currently in the process of reviewing his submissions. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 17:56:52 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Mon, 25 Jul 2016 21:56:52 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1469483812.67.0.962254584636.issue590@psf.upfronthosting.co.za> Berker Peksag added the comment: Sure, I suggested merging this into issue 586 because it was a bit hard to review and test the patch :) _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Jul 25 18:10:21 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Mon, 25 Jul 2016 22:10:21 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1469484621.95.0.588794854988.issue592@psf.upfronthosting.co.za> Berker Peksag added the comment: Maciej, that sounds good to me but I agree with David. This needs to be discussed on the core-workflow list. It would be nice to have a some sort of mockup or flowchart to see what kind of information will be displayed in these combined comments. It's a bit hard to see it from the attached patches. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 26 17:38:15 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Tue, 26 Jul 2016 21:38:15 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469569095.5.0.959316470344.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: Anish more comments: roundup/pull_request.py: > def __init__(self, client): > self.db = client.db > self.request = client.request > self.form = client.form > self.data = json.loads(self.form.value) > self.env = client.env I'd generally suggest loading the json only when you go through the verification. For example, after checking the event in _extract. The other thing, can you make the PR association being done by the user who created a PR (assuming you'll find one based on github name in bpo), otherwise use a environment set "special user" for that. Moreover, have you seen David's comment about creating new issues for the PRs that are being opened but do not mention bpo number, do you think you could add that functionality to this patch? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 26 20:02:29 2016 From: metatracker at psf.upfronthosting.co.za (Emanuel Barry) Date: Wed, 27 Jul 2016 00:02:29 +0000 Subject: [Tracker-discuss] [issue552] Modules and interest no longer displayed in nosy list completion In-Reply-To: <1410971215.15.0.384646968238.issue552@psf.upfronthosting.co.za> Message-ID: <1469577749.88.0.702787096673.issue552@psf.upfronthosting.co.za> Emanuel Barry added the comment: Bumping this up because this is happening again today. It's exactly as Serhiy described two years ago. ---------- nosy: +ebarry status: resolved -> unread _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 26 20:37:13 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 27 Jul 2016 00:37:13 +0000 Subject: [Tracker-discuss] [issue552] Modules and interest no longer displayed in nosy list completion In-Reply-To: <1410971215.15.0.384646968238.issue552@psf.upfronthosting.co.za> Message-ID: <1469579833.33.0.82630545014.issue552@psf.upfronthosting.co.za> Berker Peksag added the comment: It's broken because we've deleted the devguide repository from hg.python.org. Here is a patch. ---------- nosy: +berker.peksag status: unread -> chatting _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/extensions/jnosy.py b/extensions/jnosy.py --- a/extensions/jnosy.py +++ b/extensions/jnosy.py @@ -7,17 +7,17 @@ of the nosy list: """ import urllib try: import json except ImportError: import simplejson as json -url = 'http://hg.python.org/devguide/raw-file/default/experts.rst' +url = 'https://raw.githubusercontent.com/python/devguide/master/experts.rst' # possible states no_table = 0 # not parsing a table table_header = 1 # parsing the header table_content = 2 # parsing the content table_end = 3 # reached the end of the table def experts_as_json(): From metatracker at psf.upfronthosting.co.za Wed Jul 27 03:27:41 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 27 Jul 2016 07:27:41 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1469569095.5.0.959316470344.issue589@psf.upfronthosting.co.za> Message-ID: Anish Shah added the comment: Thank you for the review. I will update the patch. @David I can create a new issue if there's no issue number mentioned. But as Brett said that someone might forget to add issue number. I'm currently checking for issue id in PR title, body and issue comments. So, a reviewer/contributor can add a comment "fixes bpoNN" later on. Also, GitHub provides a template system [1] where we can ask the contributor to mention issue number and also whether this is a documentation PR. This might reduce the noise as mentioned by Berker & Brett. But, there will always be someone who won't follow the template system. [1] https://github.com/blog/2111-issue-and-pull-request-templates _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 27 05:38:19 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Wed, 27 Jul 2016 09:38:19 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469612299.86.0.847412883211.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: > But as Brett said that someone might forget to add issue number. I'm > currently checking for issue id in PR title, body and issue comments. So, a > reviewer/contributor can add a comment "fixes bpoNN" later on. According to [1] you won't get information when a new comment is posted. You'd have to specifically listen to [2] to get that comment. Either way a reviewer can actually add that PR manually to appropriate issue, as well. [1] https://developer.github.com/v3/activity/events/types/#pullrequestevent [2] https://developer.github.com/v3/activity/events/types/#pullrequestreviewcommentevent _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 27 10:34:35 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Wed, 27 Jul 2016 14:34:35 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469630075.45.0.649501515508.issue589@psf.upfronthosting.co.za> R David Murray added the comment: Maybe put the code in with a switch so we can turn it on and off? I'm pretty sure we're going to want it, but not positive. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 27 10:36:43 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 27 Jul 2016 14:36:43 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1469630075.45.0.649501515508.issue589@psf.upfronthosting.co.za> Message-ID: Anish Shah added the comment: > Maybe put the code in with a switch so we can turn it on and off? I'm pretty sure we're going to want it, but not positive. Sorry. I didn't get you. What do you want to turn on and off? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 27 10:45:17 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Wed, 27 Jul 2016 14:45:17 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469630717.35.0.701633708724.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: Anish the ability to create a new issue when you don't find bpoNNN string in title nor in text should be possible to turn on and off. Environment variable might be good for that, for example. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Jul 26 14:53:35 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Tue, 26 Jul 2016 18:53:35 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469559215.37.0.221046950925.issue589@psf.upfronthosting.co.za> Anish Shah added the comment: Updated the patch _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/roundup/cgi/client.py b/roundup/cgi/client.py index e71983d..abfbf51 100644 --- a/roundup/cgi/client.py +++ b/roundup/cgi/client.py @@ -22,6 +22,7 @@ from roundup.cgi.form_parser import FormParser from roundup.mailer import Mailer, MessageSendError, encode_quopri from roundup.cgi import accept_language from roundup import xmlrpc +from roundup.pull_request import GitHubHandler from roundup.anypy.cookie_ import CookieError, BaseCookie, SimpleCookie, \ get_cookie_date @@ -378,6 +379,8 @@ class Client: try: if self.path == 'xmlrpc': self.handle_xmlrpc() + elif self.path == 'pull_request': + self.handle_pull_request() else: self.inner_main() finally: @@ -385,6 +388,34 @@ class Client: self.db.close() + def handle_pull_request(self): + # Set the charset and language, since other parts of + # Roundup may depend upon that. + self.determine_charset() + self.determine_language() + # Open the database as the correct user. + self.determine_user() + self.check_anonymous_access() + + try: + handler = GitHubHandler(self) + handler.dispatch() + except Unauthorised, message: + self.response_code = 403 + self.write(message) + except UnsupportedMediaType, message: + self.response_code = 415 + self.write(message) + except MethodNotAllowed, message: + self.response_code = 405 + self.write(message) + except Reject, message: + self.response_code = 400 + self.write(message) + else: + self.write("Done!") + + def handle_xmlrpc(self): if self.env.get('CONTENT_TYPE') != 'text/xml': self.write("This is the endpoint of Roundup \d+)', re.I) + + def handle_create(self, url, issue_id): + issue_exists = len(self.db.issue.filter(None, {'id': issue_id})) == 1 + url_exists = len(self.db.pull_request.filter(None, {'url': url})) == 1 + if issue_exists and not url_exists: + url_id = self.db.pull_request.create(url=url) + urls = self.db.issue.get(issue_id, 'pull_requests') + urls.append(url_id) + self.db.issue.set(issue_id, pull_requests=urls) + self.db.commit() + + def _get_issue_id(self): + raise NotImplementedError + + def _get_url(self): + raise NotImplementedError + + +class PullRequest(Event): + + def __init__(self, db, data): + self.db = db + self.data = data + + def dispatch(self): + action = self.data['action'].encode('utf-8') + issue_id = self._get_issue_id() + url = self._get_url() + if action == 'opened': + self.handle_create(url, issue_id) + + def _get_issue_id(self): + title = self.data['pull_request']['title'].encode('utf-8') + body = self.data['pull_request']['body'].encode('utf-8') + title_match = self.issue_re.search(title) + body_match = self.issue_re.search(body) + if body_match: + return body_match.group('id') + elif title_match: + return title_match.group('id') + return None + + def _get_url(self): + return self.data['pull_request']['html_url'].encode('utf-8') + + +class IssueComment(Event): + + def __init__(self, db, data): + self.db = db + self.data = data + + def dispatch(self): + action = self.data['action'].encode('utf-8') + issue_id = self._get_issue_id() + url = self._get_url() + if action == 'created': + self.handle_create(url, issue_id) + + def _get_issue_id(self): + body = self.data['comment']['body'].encode('utf-8') + match = self.issue_re.search(body) + if match: + return match.group('id') + return None + + def _get_url(self): + if 'pull_request' in self.data['issue']: + return self.data['issue']['pull_request']['html_url']\ + .encode('utf-8') diff --git a/share/roundup/templates/classic/detectors/pull_request.py b/share/roundup/templates/classic/detectors/pull_request.py new file mode 100644 index 0000000..3624232 --- /dev/null +++ b/share/roundup/templates/classic/detectors/pull_request.py @@ -0,0 +1,25 @@ +# Auditor for GitHub URLs +# Check if it is a valid GitHub Pull Request URL and extract PR number + +import re +import urlparse + + +def validate_github_url(db, cl, nodeid, newvalues): + url = newvalues.get('url', '') + if url == '': + return + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme == '': + url = 'https://' + url + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme not in ('http', 'https'): + raise ValueError("Invalid URL scheme in GitHub PR") + if 'github.com' not in parsed_url.netloc or 'pull' not in parsed_url.path: + raise ValueError("Invalid GitHub PR") + newvalues['url'] = parsed_url.geturl() + + +def init(db): + db.pull_request.audit('create', validate_github_url) + db.pull_request.audit('set', validate_github_url) diff --git a/share/roundup/templates/classic/schema.py b/share/roundup/templates/classic/schema.py index 924e69a..fc3bfc2 100644 --- a/share/roundup/templates/classic/schema.py +++ b/share/roundup/templates/classic/schema.py @@ -65,6 +65,9 @@ msg = FileClass(db, "msg", file = FileClass(db, "file", name=String()) +pull_request = Class(db, "pull_request", + url=String()) + # IssueClass automatically gets these properties in addition to the Class ones: # title = String() # messages = Multilink("msg") @@ -75,7 +78,8 @@ issue = IssueClass(db, "issue", assignedto=Link("user"), keyword=Multilink("keyword"), priority=Link("priority"), - status=Link("status")) + status=Link("status"), + pull_requests=Multilink('pull_request')) # # TRACKER SECURITY SETTINGS @@ -92,7 +96,7 @@ db.security.addPermissionToRole('User', 'Email Access') # Assign the access and edit Permissions for issue, file and message # to regular users now -for cl in 'issue', 'file', 'msg', 'keyword': +for cl in 'issue', 'file', 'msg', 'keyword', 'pull_request': db.security.addPermissionToRole('User', 'View', cl) db.security.addPermissionToRole('User', 'Edit', cl) db.security.addPermissionToRole('User', 'Create', cl) @@ -167,7 +171,7 @@ db.security.addPermissionToRole('Anonymous', 'Register', 'user') # Allow anonymous users access to view issues (and the related, linked # information) -for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status': +for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status', 'pull_request': db.security.addPermissionToRole('Anonymous', 'View', cl) # [OPTIONAL] diff --git a/test/data/issuecommentevent.txt b/test/data/issuecommentevent.txt new file mode 100644 index 0000000..118b0ab --- /dev/null +++ b/test/data/issuecommentevent.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: issue_comment +X-GitHub-Delivery: c6d12700-270e-11e6-86c5-8e9c9c898175 +content-type: application/json +X-Hub-Signature: sha1=899e0fc0db5ed1a27215adb2f9d04351154bcaa1 +Content-Length: 8647 + +{"action":"created","issue":{"url":"https://api.github.com/repos/AnishShah/cpython/issues/1","repository_url":"https://api.github.com/repos/AnishShah/cpython","labels_url":"https://api.github.com/repos/AnishShah/cpython/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/1/comments","events_url":"https://api.github.com/repos/AnishShah/cpython/issues/1/events","html_url":"https://github.com/AnishShah/cpython/pull/1","id":156471938,"number":1,"title":"Test","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/sta rred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":1,"created_at":"2016-05-24T10:22:11Z","updated_at":"2016-05-31T09:05:10Z","closed_at":"2016-05-24T10:23:56Z","pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/1","html_url":"https://github.com/AnishShah/cpython/pull/1","diff_url":"https://github.com/AnishShah/cpython/pull/1.diff","patch_url":"https://github.com/AnishShah/cpython/pull/1.patch"},"body":""},"comment":{"url":"https://api.github.com/repos/AnishShah/cpython/issues/comments/222632341","html_url":"https://g ithub.com/AnishShah/cpython/pull/1#issuecomment-222632341","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/1","id":222632341,"user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/rece ived_events","type":"User","site_admin":false},"created_at":"2016-05-31T09:05:10Z","updated_at":"2016-05-31T09:05:10Z","body":"fixes bpo1"},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/pr ivacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.co m/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url": "https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}" ,"labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/us ers/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pingevent.txt b/test/data/pingevent.txt new file mode 100644 index 0000000..bf27133 --- /dev/null +++ b/test/data/pingevent.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: ping +X-GitHub-Delivery: 94a54100-20e0-11e6-8756-bf8bf3b91449 +content-type: application/json +X-Hub-Signature: sha1=ffda9754ba91e91ec414c2308bd25cd151c69960 +Content-Length: 6217 + +{"zen":"Mind your words, they are important.","hook_id":8488302,"hook":{"type":"Repository","id":8488302,"name":"web","active":true,"events":["issue_comment","pull_request"],"config":{"content_type":"json","insecure_ssl":"0","secret":"********","url":"http://90dedf29.ngrok.io/python-dev/github_pullrequest_url"},"updated_at":"2016-05-23T12:19:22Z","created_at":"2016-05-23T12:19:22Z","url":"https://api.github.com/repos/AnishShah/cpython/hooks/8488302","test_url":"https://api.github.com/repos/AnishShah/cpython/hooks/8488302/test","ping_url":"https://api.github.com/repos/AnishShah/cpython/hooks/8488302/pings","last_response":{"code":null,"status":"unused","message":null}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"htt ps://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishSh ah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.gi thub.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repo s/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-23T06:00:19Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url" :"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":335381,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https ://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestevent.txt b/test/data/pullrequestevent.txt new file mode 100644 index 0000000..035bd52 --- /dev/null +++ b/test/data/pullrequestevent.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: pull_request +X-GitHub-Delivery: fb465f80-21b1-11e6-9762-2c6f410a90f4 +content-type: application/json +X-Hub-Signature: sha1=bdc87a7e01ba9ae3386e409d034e592ca4781970 +Content-Length: 19658 + +{"action":"opened","number":2,"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/2","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/2","diff_url":"https://github.com/AnishShah/cpython/pull/2.diff","patch_url":"https://github.com/AnishShah/cpython/pull/2.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/2","number":2,"state":"open","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/u sers/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-24T13:18:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/2/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/2/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"l abel":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":f alse},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"ht ml_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.githu b.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/ number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/ releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:17:34Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github. com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers _url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/rep os/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"http s://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.githu b.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:17:34Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git"," clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/2"},"html":{"href":"https://github.com/AnishShah/cpython/pull/2"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/2/commits"},"statuses":{"href ":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":1,"additions":0,"deletions":2,"changed_files":1},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishS hah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpy thon/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/r epos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpyth on/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:17:34Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishSha h","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestevent1.txt b/test/data/pullrequestevent1.txt new file mode 100644 index 0000000..bcda453 --- /dev/null +++ b/test/data/pullrequestevent1.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: pull_request +X-GitHub-Delivery: 251f6480-3640-11e6-97d9-1d57a5a69e84 +content-type: application/json +X-Hub-Signature: sha1=33bf2b45321cd67fe671587f33b3f6bbde22268b +Content-Length: 19656 + +{"action":"opened","number":3,"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/3","id":74368420,"html_url":"https://github.com/AnishShah/cpython/pull/3","diff_url":"https://github.com/AnishShah/cpython/pull/3.diff","patch_url":"https://github.com/AnishShah/cpython/pull/3.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/3","number":3,"state":"open","locked":false,"title":"Created using GitHub API","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https:// api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Fixes bpo1","created_at":"2016-06-19T17:06:21Z","updated_at":"2016-06-19T17:06:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/3/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/3/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/3/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/17f854a76947193fadde6837d7d92123f47d 7e16","head":{"label":"AnishShah:test","ref":"test","sha":"17f854a76947193fadde6837d7d92123f47d7e16","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":fal se},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html _url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github. com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/nu mber}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/re leases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-06-15T19:43:02Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":205466,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"170f8a1f0ffbb733de656cd4a332ecea0c526d53","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.co m/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_u rl":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos /AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https: //api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github. com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-06-15T19:43:02Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","cl one_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":205466,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/3"},"html":{"href":"https://github.com/AnishShah/cpython/pull/3"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/3"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/3/commits"},"statuses":{"href": "https://api.github.com/repos/AnishShah/cpython/statuses/17f854a76947193fadde6837d7d92123f47d7e16"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":1,"additions":2,"deletions":0,"changed_files":1},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishSha h/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpyth on/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/rep os/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython /milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-06-15T19:43:02Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":205466,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah" ,"id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/test_pull_request.py b/test/test_pull_request.py new file mode 100644 index 0000000..2adecdf --- /dev/null +++ b/test/test_pull_request.py @@ -0,0 +1,128 @@ +import unittest +import os +import db_test_base +import cgi +from BaseHTTPServer import BaseHTTPRequestHandler +from StringIO import StringIO +from roundup.cgi import client +from roundup.backends import list_backends +from roundup.pull_request import GitHubHandler +from roundup.exceptions import * + +NEEDS_INSTANCE = 1 + + +class HTTPRequest(BaseHTTPRequestHandler): + def __init__(self, filename): + path = os.path.dirname(os.path.abspath(__file__)) + "/data/" + filename + request_file = open(path, 'r') + request_text = request_file.read() + request_file.close() + self.rfile = StringIO(request_text) + self.raw_requestline = self.rfile.readline() + self.error_code = self.error_message = None + self.parse_request() + + +class TestCase(unittest.TestCase): + + backend = None + + def setUp(self): + # instance + self.dirname = '_test_pull_request' + self.instance = db_test_base.setupTracker(self.dirname, self.backend) + self.env = { + 'PATH_INFO': 'http://localhost/pull_request', + 'HTTP_HOST': 'localhost', + 'TRACKER_NAME': 'test', + 'REQUEST_METHOD': 'POST', + 'CONTENT_TYPE': 'application/json' + } + os.environ['SECRET_KEY'] = "abcd" + + def _make_client(self, filename): + request = HTTPRequest(filename) + form = cgi.FieldStorage(fp=request.rfile, environ=self.env, + headers=request.headers) + dummy_client = client.Client(self.instance, request, self.env, form) + dummy_client.opendb("admin") + self.db = dummy_client.db + self.db.issue.create(title="Hello") + return dummy_client + + def testSecretKey(self): + os.environ['SECRET_KEY'] = "1234" + dummy_client = self._make_client("pingevent.txt") + with self.assertRaises(Unauthorised) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), + "The provided secret does not match") + + def testUnsupportedMediaType(self): + dummy_client = self._make_client("pingevent.txt") + dummy_client.env['CONTENT_TYPE'] = 'application/xml' + with self.assertRaises(UnsupportedMediaType) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), + "unsupported Content-Type application/xml") + + def testMethodNotAllowed(self): + dummy_client = self._make_client("pingevent.txt") + dummy_client.env['REQUEST_METHOD'] = 'GET' + with self.assertRaises(MethodNotAllowed) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), + "unsupported HTTP method GET") + + def testPingEvent(self): + dummy_client = self._make_client("pingevent.txt") + with self.assertRaises(Reject) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), "Unkown X-GitHub-Event ping") + + def testIssueCommentEvent(self): + dummy_client = self._make_client("issuecommentevent.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + urls = self.db.issue.get('1', 'pull_requests') + self.assertTrue(len(urls) == 1) + url = self.db.pull_request.get(urls[0], 'url') + self.assertEqual(url, 'https://github.com/AnishShah/cpython/pull/1') + + def testPullRequestEventForTitle(self): + # When the title of a PR has string "fixes bpo123" + dummy_client = self._make_client("pullrequestevent.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + urls = self.db.issue.get('1', 'pull_requests') + self.assertTrue(len(urls) == 1) + url = self.db.pull_request.get(urls[0], 'url') + self.assertEqual(url, 'https://github.com/AnishShah/cpython/pull/2') + + def testPullRequestEventForBody(self): + # When the body of a PR has string "fixes bpo123" + dummy_client = self._make_client("pullrequestevent1.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + urls = self.db.issue.get('1', 'pull_requests') + self.assertTrue(len(urls) == 1) + url = self.db.pull_request.get(urls[0], 'url') + self.assertEqual(url, 'https://github.com/AnishShah/cpython/pull/3') + + +def test_suite(): + suite = unittest.TestSuite() + for l in list_backends(): + dct = dict(backend=l) + subcls = type(TestCase)('TestCase_%s' % l, (TestCase,), dct) + suite.addTest(unittest.makeSuite(subcls)) + return suite + +if __name__ == '__main__': + runner = unittest.TextTestRunner() + unittest.main(testRunner=runner) From metatracker at psf.upfronthosting.co.za Wed Jul 27 15:38:21 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 27 Jul 2016 19:38:21 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1469648301.24.0.158100800243.issue592@psf.upfronthosting.co.za> Anish Shah added the comment: Description about this patch: This patch has a handler to handle GitHub PR review/diff comments event. First, it checks if any b.p.o issue is linked to this PR or not. Then, it checks when was the last time a "GitHub" msg was added. If there are no GitHub msg for last "X" minutes (here, 30 minutes), only then this comment is added to b.p.o. issue. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Jul 27 14:57:40 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 27 Jul 2016 18:57:40 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1469645860.86.0.0808926634671.issue589@psf.upfronthosting.co.za> Anish Shah added the comment: I have added few things to this updated patch: - load JSON while extracting - user who creates GitHub PR will be assigned as PR author on bpo if we find github name on bpo or else "anonymous" - if issue is not referenced in PR title or body and an environment variable is set, then a new issue is created on behalf of GitHub PR creator (if we find github name on bpo) _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/roundup/cgi/client.py b/roundup/cgi/client.py index e71983d..abfbf51 100644 --- a/roundup/cgi/client.py +++ b/roundup/cgi/client.py @@ -22,6 +22,7 @@ from roundup.cgi.form_parser import FormParser from roundup.mailer import Mailer, MessageSendError, encode_quopri from roundup.cgi import accept_language from roundup import xmlrpc +from roundup.pull_request import GitHubHandler from roundup.anypy.cookie_ import CookieError, BaseCookie, SimpleCookie, \ get_cookie_date @@ -378,6 +379,8 @@ class Client: try: if self.path == 'xmlrpc': self.handle_xmlrpc() + elif self.path == 'pull_request': + self.handle_pull_request() else: self.inner_main() finally: @@ -385,6 +388,34 @@ class Client: self.db.close() + def handle_pull_request(self): + # Set the charset and language, since other parts of + # Roundup may depend upon that. + self.determine_charset() + self.determine_language() + # Open the database as the correct user. + self.determine_user() + self.check_anonymous_access() + + try: + handler = GitHubHandler(self) + handler.dispatch() + except Unauthorised, message: + self.response_code = 403 + self.write(message) + except UnsupportedMediaType, message: + self.response_code = 415 + self.write(message) + except MethodNotAllowed, message: + self.response_code = 405 + self.write(message) + except Reject, message: + self.response_code = 400 + self.write(message) + else: + self.write("Done!") + + def handle_xmlrpc(self): if self.env.get('CONTENT_TYPE') != 'text/xml': self.write("This is the endpoint of Roundup \d+)', re.I) + + def handle_create(self, url, issue_id): + issue_exists = len(self.db.issue.filter(None, {'id': issue_id})) == 1 + url_exists = len(self.db.pull_request.filter(None, {'url': url})) == 1 + if issue_exists and not url_exists: + url_id = self.db.pull_request.create(url=url) + urls = self.db.issue.get(issue_id, 'pull_requests') + urls.append(url_id) + self.db.issue.set(issue_id, pull_requests=urls) + self.db.commit() + + def _get_issue_id(self): + raise NotImplementedError + + def _get_url(self): + raise NotImplementedError + + +class PullRequest(Event): + + def __init__(self, db, data): + self.db = db + self.data = data + + def dispatch(self): + github_username = self._get_github_username() + user_id = self.db.user.filter(None, {'github': github_username}) + if len(user_id) == 1: + username = self.db.user.get(user_id[0], 'username') + self.db.setCurrentUser(username) + action = self.data['action'].encode('utf-8') + issue_id = self._get_issue_id() + url = self._get_url() + if action == 'opened' and issue_id is not None: + self.handle_create(url, issue_id) + + def _get_issue_id(self): + title = self.data['pull_request']['title'].encode('utf-8') + body = self.data['pull_request']['body'].encode('utf-8') + title_match = self.issue_re.search(title) + body_match = self.issue_re.search(body) + if body_match: + return body_match.group('id') + elif title_match: + return title_match.group('id') + # No issue id found + create_issue = os.environ.get('CREATE_ISSUE', False) + if create_issue: + return self.db.issue.create(title=title) + return None + + def _get_url(self): + return self.data['pull_request']['html_url'].encode('utf-8') + + def _get_github_username(self): + return self.data['pull_request']['user']['login'].encode('utf-8') + + +class IssueComment(Event): + + def __init__(self, db, data): + self.db = db + self.data = data + + def dispatch(self): + github_username = self._get_github_username() + user_id = self.db.user.filter(None, {'github': github_username}) + if len(user_id) == 1: + username = self.db.user.get(user_id[0], 'username') + self.db.setCurrentUser(username) + action = self.data['action'].encode('utf-8') + issue_id = self._get_issue_id() + url = self._get_url() + if action == 'created' and issue_id is not None: + self.handle_create(url, issue_id) + + def _get_issue_id(self): + body = self.data['comment']['body'].encode('utf-8') + match = self.issue_re.search(body) + if match: + return match.group('id') + return None + + def _get_url(self): + if 'pull_request' in self.data['issue']: + return self.data['issue']['pull_request']['html_url']\ + .encode('utf-8') + + def _get_github_username(self): + return self.data['issue']['user']['login'].encode('utf-8') diff --git a/share/roundup/templates/classic/detectors/pull_request.py b/share/roundup/templates/classic/detectors/pull_request.py new file mode 100644 index 0000000..3624232 --- /dev/null +++ b/share/roundup/templates/classic/detectors/pull_request.py @@ -0,0 +1,25 @@ +# Auditor for GitHub URLs +# Check if it is a valid GitHub Pull Request URL and extract PR number + +import re +import urlparse + + +def validate_github_url(db, cl, nodeid, newvalues): + url = newvalues.get('url', '') + if url == '': + return + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme == '': + url = 'https://' + url + parsed_url = urlparse.urlparse(url) + if parsed_url.scheme not in ('http', 'https'): + raise ValueError("Invalid URL scheme in GitHub PR") + if 'github.com' not in parsed_url.netloc or 'pull' not in parsed_url.path: + raise ValueError("Invalid GitHub PR") + newvalues['url'] = parsed_url.geturl() + + +def init(db): + db.pull_request.audit('create', validate_github_url) + db.pull_request.audit('set', validate_github_url) diff --git a/share/roundup/templates/classic/schema.py b/share/roundup/templates/classic/schema.py index 924e69a..4ccb9f2 100644 --- a/share/roundup/templates/classic/schema.py +++ b/share/roundup/templates/classic/schema.py @@ -45,7 +45,8 @@ user = Class(db, "user", alternate_addresses=String(), queries=Multilink('query'), roles=String(), # comma-separated string of Role names - timezone=String()) + timezone=String(), + github=String()) user.setkey("username") db.security.addPermission(name='Register', klass='user', description='User is allowed to register new user') @@ -65,6 +66,9 @@ msg = FileClass(db, "msg", file = FileClass(db, "file", name=String()) +pull_request = Class(db, "pull_request", + url=String()) + # IssueClass automatically gets these properties in addition to the Class ones: # title = String() # messages = Multilink("msg") @@ -75,7 +79,8 @@ issue = IssueClass(db, "issue", assignedto=Link("user"), keyword=Multilink("keyword"), priority=Link("priority"), - status=Link("status")) + status=Link("status"), + pull_requests=Multilink('pull_request')) # # TRACKER SECURITY SETTINGS @@ -92,7 +97,7 @@ db.security.addPermissionToRole('User', 'Email Access') # Assign the access and edit Permissions for issue, file and message # to regular users now -for cl in 'issue', 'file', 'msg', 'keyword': +for cl in 'issue', 'file', 'msg', 'keyword', 'pull_request': db.security.addPermissionToRole('User', 'View', cl) db.security.addPermissionToRole('User', 'Edit', cl) db.security.addPermissionToRole('User', 'Create', cl) @@ -101,7 +106,7 @@ for cl in 'priority', 'status': # May users view other user information? Comment these lines out # if you don't want them to -p = db.security.addPermission(name='View', klass='user', +p = db.security.addPermission(name='View', klass='user', properties=('id', 'organisation', 'phone', 'realname', 'timezone', 'username')) db.security.addPermissionToRole('User', p) @@ -167,7 +172,7 @@ db.security.addPermissionToRole('Anonymous', 'Register', 'user') # Allow anonymous users access to view issues (and the related, linked # information) -for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status': +for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status', 'pull_request': db.security.addPermissionToRole('Anonymous', 'View', cl) # [OPTIONAL] diff --git a/test/data/issuecommentevent.txt b/test/data/issuecommentevent.txt new file mode 100644 index 0000000..118b0ab --- /dev/null +++ b/test/data/issuecommentevent.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: issue_comment +X-GitHub-Delivery: c6d12700-270e-11e6-86c5-8e9c9c898175 +content-type: application/json +X-Hub-Signature: sha1=899e0fc0db5ed1a27215adb2f9d04351154bcaa1 +Content-Length: 8647 + +{"action":"created","issue":{"url":"https://api.github.com/repos/AnishShah/cpython/issues/1","repository_url":"https://api.github.com/repos/AnishShah/cpython","labels_url":"https://api.github.com/repos/AnishShah/cpython/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/1/comments","events_url":"https://api.github.com/repos/AnishShah/cpython/issues/1/events","html_url":"https://github.com/AnishShah/cpython/pull/1","id":156471938,"number":1,"title":"Test","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/sta rred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":1,"created_at":"2016-05-24T10:22:11Z","updated_at":"2016-05-31T09:05:10Z","closed_at":"2016-05-24T10:23:56Z","pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/1","html_url":"https://github.com/AnishShah/cpython/pull/1","diff_url":"https://github.com/AnishShah/cpython/pull/1.diff","patch_url":"https://github.com/AnishShah/cpython/pull/1.patch"},"body":""},"comment":{"url":"https://api.github.com/repos/AnishShah/cpython/issues/comments/222632341","html_url":"https://g ithub.com/AnishShah/cpython/pull/1#issuecomment-222632341","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/1","id":222632341,"user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/rece ived_events","type":"User","site_admin":false},"created_at":"2016-05-31T09:05:10Z","updated_at":"2016-05-31T09:05:10Z","body":"fixes bpo1"},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/pr ivacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.co m/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url": "https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}" ,"labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/us ers/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pingevent.txt b/test/data/pingevent.txt new file mode 100644 index 0000000..bf27133 --- /dev/null +++ b/test/data/pingevent.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: ping +X-GitHub-Delivery: 94a54100-20e0-11e6-8756-bf8bf3b91449 +content-type: application/json +X-Hub-Signature: sha1=ffda9754ba91e91ec414c2308bd25cd151c69960 +Content-Length: 6217 + +{"zen":"Mind your words, they are important.","hook_id":8488302,"hook":{"type":"Repository","id":8488302,"name":"web","active":true,"events":["issue_comment","pull_request"],"config":{"content_type":"json","insecure_ssl":"0","secret":"********","url":"http://90dedf29.ngrok.io/python-dev/github_pullrequest_url"},"updated_at":"2016-05-23T12:19:22Z","created_at":"2016-05-23T12:19:22Z","url":"https://api.github.com/repos/AnishShah/cpython/hooks/8488302","test_url":"https://api.github.com/repos/AnishShah/cpython/hooks/8488302/test","ping_url":"https://api.github.com/repos/AnishShah/cpython/hooks/8488302/pings","last_response":{"code":null,"status":"unused","message":null}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"htt ps://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishSh ah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.gi thub.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repo s/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-23T06:00:19Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url" :"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":335381,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https ://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestevent.txt b/test/data/pullrequestevent.txt new file mode 100644 index 0000000..035bd52 --- /dev/null +++ b/test/data/pullrequestevent.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: pull_request +X-GitHub-Delivery: fb465f80-21b1-11e6-9762-2c6f410a90f4 +content-type: application/json +X-Hub-Signature: sha1=bdc87a7e01ba9ae3386e409d034e592ca4781970 +Content-Length: 19658 + +{"action":"opened","number":2,"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/2","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/2","diff_url":"https://github.com/AnishShah/cpython/pull/2.diff","patch_url":"https://github.com/AnishShah/cpython/pull/2.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/2","number":2,"state":"open","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/u sers/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-24T13:18:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/2/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/2/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"l abel":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":f alse},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"ht ml_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.githu b.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/ number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/ releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:17:34Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github. com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers _url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/rep os/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"http s://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.githu b.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:17:34Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git"," clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/2"},"html":{"href":"https://github.com/AnishShah/cpython/pull/2"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/2/commits"},"statuses":{"href ":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":1,"additions":0,"deletions":2,"changed_files":1},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishS hah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpy thon/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/r epos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpyth on/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:17:34Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishSha h","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestevent1.txt b/test/data/pullrequestevent1.txt new file mode 100644 index 0000000..bcda453 --- /dev/null +++ b/test/data/pullrequestevent1.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 2f3784dc.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/9667e0c +X-GitHub-Event: pull_request +X-GitHub-Delivery: 251f6480-3640-11e6-97d9-1d57a5a69e84 +content-type: application/json +X-Hub-Signature: sha1=33bf2b45321cd67fe671587f33b3f6bbde22268b +Content-Length: 19656 + +{"action":"opened","number":3,"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/3","id":74368420,"html_url":"https://github.com/AnishShah/cpython/pull/3","diff_url":"https://github.com/AnishShah/cpython/pull/3.diff","patch_url":"https://github.com/AnishShah/cpython/pull/3.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/3","number":3,"state":"open","locked":false,"title":"Created using GitHub API","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https:// api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Fixes bpo1","created_at":"2016-06-19T17:06:21Z","updated_at":"2016-06-19T17:06:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/3/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/3/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/3/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/17f854a76947193fadde6837d7d92123f47d 7e16","head":{"label":"AnishShah:test","ref":"test","sha":"17f854a76947193fadde6837d7d92123f47d7e16","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":fal se},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html _url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github. com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/nu mber}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/re leases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-06-15T19:43:02Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":205466,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"170f8a1f0ffbb733de656cd4a332ecea0c526d53","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.co m/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_u rl":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos /AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https: //api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github. com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-06-15T19:43:02Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","cl one_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":205466,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/3"},"html":{"href":"https://github.com/AnishShah/cpython/pull/3"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/3"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/3/commits"},"statuses":{"href": "https://api.github.com/repos/AnishShah/cpython/statuses/17f854a76947193fadde6837d7d92123f47d7e16"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":1,"additions":2,"deletions":0,"changed_files":1},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishSha h/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpyth on/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/rep os/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython /milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-06-15T19:43:02Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":205466,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah" ,"id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestevent2.txt b/test/data/pullrequestevent2.txt new file mode 100644 index 0000000..d16d58b --- /dev/null +++ b/test/data/pullrequestevent2.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 8900ffb8.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/0269732 +X-GitHub-Event: pull_request +X-GitHub-Delivery: 60418b80-2199-11e6-98bc-9ed2b8e584c9 +content-type: application/json +X-Hub-Signature: sha1=7d7354a77f1c8f4ad954065f7d193228209813a2 +Content-Length: 19626 + +{"action":"opened","number":1,"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/1","id":71194519,"html_url":"https://github.com/AnishShah/cpython/pull/1","diff_url":"https://github.com/AnishShah/cpython/pull/1.diff","patch_url":"https://github.com/AnishShah/cpython/pull/1.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/1","number":1,"state":"open","locked":false,"title":"Test","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users /AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-05-24T10:22:11Z","updated_at":"2016-05-24T10:22:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/1/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/1/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/1/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/17f854a76947193fadde6837d7d92123f47d7e16","head":{"label":"AnishSh ah:test","ref":"test","sha":"17f854a76947193fadde6837d7d92123f47d7e16","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"nam e":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Anis hShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/gi t/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"ht tps://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url" :"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T10:19:54Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276517,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"b998f589f341718f24013cc79e8358bec03dfde3","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":" https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/us ers/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_i d}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishSh ah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/me rges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T10:19:54Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/A nishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276517,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/1"},"html":{"href":"https://github.com/AnishShah/cpython/pull/1"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/1"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/ AnishShah/cpython/statuses/17f854a76947193fadde6837d7d92123f47d7e16"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":1,"additions":2,"deletions":0,"changed_files":1},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://a pi.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"ht tps://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscript ion","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notific ations_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T10:19:54Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276517,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"ht tps://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/test_pull_request.py b/test/test_pull_request.py new file mode 100644 index 0000000..c9fdd60 --- /dev/null +++ b/test/test_pull_request.py @@ -0,0 +1,142 @@ +import unittest +import os +import db_test_base +import cgi +from BaseHTTPServer import BaseHTTPRequestHandler +from StringIO import StringIO +from roundup.cgi import client +from roundup.backends import list_backends +from roundup.pull_request import GitHubHandler +from roundup.exceptions import * + +NEEDS_INSTANCE = 1 + + +class HTTPRequest(BaseHTTPRequestHandler): + def __init__(self, filename): + path = os.path.dirname(os.path.abspath(__file__)) + "/data/" + filename + request_file = open(path, 'r') + request_text = request_file.read() + request_file.close() + self.rfile = StringIO(request_text) + self.raw_requestline = self.rfile.readline() + self.error_code = self.error_message = None + self.parse_request() + + +class TestCase(unittest.TestCase): + + backend = None + + def setUp(self): + # instance + self.dirname = '_test_pull_request' + self.instance = db_test_base.setupTracker(self.dirname, self.backend) + self.env = { + 'PATH_INFO': 'http://localhost/pull_request', + 'HTTP_HOST': 'localhost', + 'TRACKER_NAME': 'test', + 'REQUEST_METHOD': 'POST', + 'CONTENT_TYPE': 'application/json' + } + os.environ['SECRET_KEY'] = "abcd" + os.environ['CREATE_ISSUE'] = 'yes' + + def _make_client(self, filename): + request = HTTPRequest(filename) + form = cgi.FieldStorage(fp=request.rfile, environ=self.env, + headers=request.headers) + dummy_client = client.Client(self.instance, request, self.env, form) + dummy_client.opendb("anonymous") + self.db = dummy_client.db + self.db.issue.create(title="Hello") + return dummy_client + + def testSecretKey(self): + os.environ['SECRET_KEY'] = "1234" + dummy_client = self._make_client("pingevent.txt") + with self.assertRaises(Unauthorised) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), + "The provided secret does not match") + + def testUnsupportedMediaType(self): + dummy_client = self._make_client("pingevent.txt") + dummy_client.env['CONTENT_TYPE'] = 'application/xml' + with self.assertRaises(UnsupportedMediaType) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), + "unsupported Content-Type application/xml") + + def testMethodNotAllowed(self): + dummy_client = self._make_client("pingevent.txt") + dummy_client.env['REQUEST_METHOD'] = 'GET' + with self.assertRaises(MethodNotAllowed) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), + "unsupported HTTP method GET") + + def testPingEvent(self): + dummy_client = self._make_client("pingevent.txt") + with self.assertRaises(Reject) as context: + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(str(context.exception), "Unkown X-GitHub-Event ping") + + def testIssueCommentEvent(self): + dummy_client = self._make_client("issuecommentevent.txt") + self.db.user.create(username="anish.shah", github="AnishShah") + handler = GitHubHandler(dummy_client) + handler.dispatch() + urls = self.db.issue.get('1', 'pull_requests') + self.assertTrue(len(urls) == 1) + url = self.db.pull_request.get(urls[0], 'url') + self.assertEqual(url, 'https://github.com/AnishShah/cpython/pull/1') + user_id = self.db.pull_request.get(urls[0], 'creator') + self.assertEqual(self.db.user.get(user_id, 'github'), 'AnishShah') + + def testPullRequestEventForTitle(self): + # When the title of a PR has string "fixes bpo123" + dummy_client = self._make_client("pullrequestevent.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + urls = self.db.issue.get('1', 'pull_requests') + self.assertTrue(len(urls) == 1) + url = self.db.pull_request.get(urls[0], 'url') + self.assertEqual(url, 'https://github.com/AnishShah/cpython/pull/2') + user_id = self.db.pull_request.get(urls[0], 'creator') + self.assertEqual(self.db.user.get(user_id, 'username'), 'anonymous') + + def testPullRequestEventForBody(self): + # When the body of a PR has string "fixes bpo123" + dummy_client = self._make_client("pullrequestevent1.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + urls = self.db.issue.get('1', 'pull_requests') + self.assertTrue(len(urls) == 1) + url = self.db.pull_request.get(urls[0], 'url') + self.assertEqual(url, 'https://github.com/AnishShah/cpython/pull/3') + + def testPullRequestEventWithoutIssueReference(self): + # When no issue is referenced in PR + dummy_client = self._make_client("pullrequestevent2.txt") + self.assertEqual(self.db.issue.count(), 1) + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(self.db.issue.count(), 2) + + +def test_suite(): + suite = unittest.TestSuite() + for l in list_backends(): + dct = dict(backend=l) + subcls = type(TestCase)('TestCase_%s' % l, (TestCase,), dct) + suite.addTest(unittest.makeSuite(subcls)) + return suite + +if __name__ == '__main__': + runner = unittest.TextTestRunner() + unittest.main(testRunner=runner)