-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzenhub.py
51 lines (44 loc) · 1.68 KB
/
zenhub.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from urllib2 import Request, urlopen, HTTPError
import json, datetime, logging
from google.appengine.ext import deferred
from model import Repo
zenhubUrl = 'https://api.zenhub.io/p1'
class Zenhub:
def __init__(self, repo):
"""Construct a zenhub object for a given repo"""
self.repo = repo
def get(self, url):
if zenhubUrl not in url:
url = '%s/repositories/%s%s' % (zenhubUrl, self.repo.data['id'], url)
logging.info('zenhub GET ' + url)
request = Request(url)
request.add_header('X-Authentication-Token', self.repo.auth.zenhubToken)
return json.load(urlopen(request))
def issue(self, number):
"""Load an issue with events from zenhub"""
issue = self.get('/issues/%s' % number)
issue['events'] = self.get('/issues/%s/events' % number)
return issue
def syncIssues(self):
for issue in self.repo.issues():
if not hasattr(issue, 'zenhub') or not issue.zenhubUpdate:
now = datetime.datetime.now()
issue.zenhub = self.issue(issue.number)
issue.zenhubUpdate = now
issue.upsert()
def syncIssues(repoKey):
try:
Zenhub(repoKey.get()).syncIssues()
except HTTPError as e:
if e.code == 403:
logging.info('Zenhub returned 403, trying again after a while...')
deferred.defer(syncIssues, repoKey, _countdown=20)
return
else:
logging.exception('Failed to sync Zenhub issues')
except:
logging.exception('Failed to sync Zenhub issues')
# For whatever reason, done syncing
repo = repoKey.get()
repo.syncing = False
repo.put()