Source

python-bitbucket / api.py

Full commit
# -*- coding: utf-8 -*-
import cookielib
import urllib2
import base64
import json
from urllib import urlencode

class Issue(object):
    title = ""
    content = ""
    component = None
    milestone = None
    version = None
    responsible = None
    priority = "major"
    status = "new"
    kind = "bug"
    def __init__(self, api, username, repository, data=None):
        self.api = api
        self.responsible = username
        self.url = 'repositories/%s/%s/issues/' % (username, repository)
        if data:
	    self.url = 'repositories/%s/%s/issues/%s/' % (username, repository, data['local_id'])
	    self.title = data['title']
	    self.content = data['content']
	    self.component = data['metadata']['component']
	    self.milestone = data['metadata']['milestone']
	    self.version = data['metadata']['version']
	    self.responsible = data['responsible']['username']
	    self.priority = data['priority']
	    self.status = data['status']
	    self.kind = data['metadata']['kind']

    def as_dict(self):
        data = {'title':self.title, 'content':self.content, 'priority':self.priority, 'status':self.status, 'kind':self.kind}
        data.update({'responsible':self.responsible})
        if self.component:
	    data.update({'component':self.component})
	if self.milestone:
	    data.update({'milestone':self.milestone})
	if self.version:
	    data.update({'version':self.version})
	return data

    def save(self):
        self.json = self.api.post(self.url, self.as_dict())
        return self.json

class API(object):
    api_url = 'https://api.bitbucket.org/1.0/'

    def __init__(self, username, password, proxy=None):
        encodedstring = base64.encodestring("%s:%s" % (username, password))[:-1]
        self._auth = "Basic %s" % encodedstring
        self._opener = self._create_opener(proxy)

    def _create_opener(self, proxy=None):
        cj = cookielib.LWPCookieJar()
        cookie_handler = urllib2.HTTPCookieProcessor(cj)
        if proxy:
            proxy_handler = urllib2.ProxyHandler(proxy)
            opener = urllib2.build_opener(cookie_handler, proxy_handler)
        else:
            opener = urllib2.build_opener(cookie_handler)
        return opener

    def _request(self, url, data=None):
        query_url = self.api_url + url
        if data:
	  data = urlencode(data)
        try:
	    req = urllib2.Request(query_url, data, {"Authorization": self._auth })
	    handler = self._opener.open(req)
	except urllib2.HTTPError, e:
	    print e.headers
	    raise e
	return json.load(handler)

    def post(self, url, data):
        return self._request(url, data)

    def get(self, url):
        return self._request(url, None)
    
    def get_issues(self, username, repository):
        json = self.get('repositories/%s/%s/issues/' % (username, repository))
        issues = []
        for i in json['issues']:
	    issue = Issue(self, username, repository, i)
	    issues.append(issue)
	return issues
        
    def new_issue(self, username, repository):
        return Issue(self, username, repository)