From 1b74cc0a9a3c0f9ec8e8e1495bd054c09a983abd Mon Sep 17 00:00:00 2001 From: paulrzcz Date: Tue, 5 Nov 2013 00:15:01 +0100 Subject: [PATCH 1/3] Bitbucket with authorization and on requests --- bugwarrior/services/bitbucket.py | 40 ++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/bugwarrior/services/bitbucket.py b/bugwarrior/services/bitbucket.py index b150525ec..c516b8d5a 100644 --- a/bugwarrior/services/bitbucket.py +++ b/bugwarrior/services/bitbucket.py @@ -4,9 +4,7 @@ from bugwarrior.config import die import datetime -import urllib2 -import json - +import requests class BitbucketService(IssueService): base_api = 'https://api.bitbucket.org/1.0' @@ -24,6 +22,11 @@ class BitbucketService(IssueService): def __init__(self, *args, **kw): super(BitbucketService, self).__init__(*args, **kw) + login = self.config.get(self.target, 'login') + password = self.config.get(self.target, 'passw') + + self.auth = (login, password) + @classmethod def validate_config(cls, config, target): if not config.has_option(target, 'username'): @@ -36,21 +39,13 @@ def validate_config(cls, config, target): # Note -- not actually rate limited, I think. def pull(self, tag): url = self.base_api + '/repositories/%s/issues/' % tag - try: - f = urllib2.urlopen(url) - except urllib2.HTTPError as e: - if '403' in str(e): - return [] - else: - raise e - response = json.loads(f.read()) + response = _getter(url, auth=self.auth) return [(tag, issue) for issue in response['issues']] def annotations(self, tag, issue): url = self.base_api + '/repositories/%s/issues/%i/comments' % ( tag, issue['local_id']) - f = urllib2.urlopen(url) - response = json.loads(f.read()) + response = _getter(url, auth = self.auth) _parse = lambda s: datetime.datetime.strptime(s[:10], "%Y-%m-%d") return dict([ self.format_annotation( @@ -68,8 +63,7 @@ def issues(self): user = self.config.get(self.target, 'username') url = self.base_api + '/users/' + user + '/' - f = urllib2.urlopen(url) - response = json.loads(f.read()) + response = _getter(url, auth=self.auth) repos = [ repo.get('slug') for repo in response.get('repositories') if repo.get('has_issues') @@ -101,3 +95,19 @@ def issues(self): ), **self.annotations(tag, issue) ) for tag, issue in issues] + +def _getter(url, auth): + response = requests.get(url, auth=auth) + + # And.. if we didn't get good results, just bail. + if response.status_code != 200: + raise IOError( + "Non-200 status code %r; %r; %r" % ( + response.status_code, url, response.json)) + + if callable(response.json): + # Newer python-requests + return response.json() + else: + # Older python-requests + return response.json From c388c6b895051d49a0cd48f5e5bb8e40f7e5b690 Mon Sep 17 00:00:00 2001 From: paulrzcz Date: Tue, 5 Nov 2013 14:14:00 +0100 Subject: [PATCH 2/3] Bitbucket - password asking logic --- bugwarrior/services/bitbucket.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bugwarrior/services/bitbucket.py b/bugwarrior/services/bitbucket.py index c516b8d5a..2e7031d3d 100644 --- a/bugwarrior/services/bitbucket.py +++ b/bugwarrior/services/bitbucket.py @@ -1,7 +1,7 @@ from twiggy import log from bugwarrior.services import IssueService -from bugwarrior.config import die +from bugwarrior.config import die, get_service_password import datetime import requests @@ -24,6 +24,11 @@ def __init__(self, *args, **kw): login = self.config.get(self.target, 'login') password = self.config.get(self.target, 'passw') + if not password or password.startswith('@oracle:'): + username = self.config.get(self.target, 'username') + service = "bitbucket://%s@bitbucket.org/%s" % (login, username) + password = get_service_password(service, login, oracle=password, + interactive=self.config.interactive) self.auth = (login, password) From 5b2556247ffd288e7e6c313f0827808b45349ff2 Mon Sep 17 00:00:00 2001 From: paulrzcz Date: Tue, 5 Nov 2013 14:16:19 +0100 Subject: [PATCH 3/3] Reformat by pep8 --- bugwarrior/services/bitbucket.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bugwarrior/services/bitbucket.py b/bugwarrior/services/bitbucket.py index 2e7031d3d..3ab8fd314 100644 --- a/bugwarrior/services/bitbucket.py +++ b/bugwarrior/services/bitbucket.py @@ -6,6 +6,7 @@ import datetime import requests + class BitbucketService(IssueService): base_api = 'https://api.bitbucket.org/1.0' base_url = 'http://bitbucket.org/' @@ -28,7 +29,7 @@ def __init__(self, *args, **kw): username = self.config.get(self.target, 'username') service = "bitbucket://%s@bitbucket.org/%s" % (login, username) password = get_service_password(service, login, oracle=password, - interactive=self.config.interactive) + interactive=self.config.interactive) self.auth = (login, password) @@ -50,7 +51,7 @@ def pull(self, tag): def annotations(self, tag, issue): url = self.base_api + '/repositories/%s/issues/%i/comments' % ( tag, issue['local_id']) - response = _getter(url, auth = self.auth) + response = _getter(url, auth=self.auth) _parse = lambda s: datetime.datetime.strptime(s[:10], "%Y-%m-%d") return dict([ self.format_annotation( @@ -101,6 +102,7 @@ def issues(self): **self.annotations(tag, issue) ) for tag, issue in issues] + def _getter(url, auth): response = requests.get(url, auth=auth)