view bugzilla @ 1:aca76355e4d8

Added make_caching_json_request() and .hgignore
author Atul Varma <avarma@mozilla.com>
date Mon, 12 Apr 2010 23:41:13 -0700
parents 349a78c460e2
children 04f5ad537f36
line wrap: on
line source
#! /usr/bin/env python

import httplib
import urllib
from urlparse import urlparse

try:
    import json
except ImportError:
    import simplejson as json

def json_request(method, url, query_args=None, body=None):
    if query_args is None:
        query_args = {}

    headers = {'Accept': 'application/json',
               'Content-Type': 'application/json'}

    urlparts = urlparse(url)
    if urlparts.scheme == 'https':
        connclass = httplib.HTTPSConnection
    elif urlparts.scheme == 'http':
        connclass = httplib.HTTPConnection
    else:
        raise ValueError('unknown scheme "%s"' % urlparts.scheme)
    conn = connclass(urlparts.netloc)
    path = urlparts.path
    if query_args:
        path += '?%s' % urllib.urlencode(query_args)
    if body is not None:
        body = json.dumps(body)
    conn.request(method, path, body, headers)
    response = conn.getresponse()
    status, reason = response.status, response.reason
    mimetype = response.msg.gettype()
    data = response.read()
    conn.close()

    if mimetype == 'application/json':
        data = json.loads(data)

    return {'status': response.status,
            'reason': response.reason,
            'content_type': mimetype,
            'body': data}

def make_caching_json_request(cachedir, json_request=json_request):
    from hashlib import sha512 as hashfunc

    def caching_json_request(method, url, query_args=None, body=None):
        key = repr((method, url, query_args, body))
        hashfile = '%s.json' % hashfunc(key).hexdigest()
        hashpath = os.path.join(cachedir, hashfile)
        if not os.path.exists(hashpath):
            response = json_request(method=method,
                                    url=url,
                                    query_args=query_args,
                                    body=body)
            open(hashpath, 'w').write(json.dumps(response))
        return json.loads(open(hashpath, 'r').read())

    return caching_json_request

def main(config, json_request=json_request):
    print json_request('GET',
                       '%s/attachment/436897' % config['api_server'],
                       query_args={'attachmentdata': 1})

if __name__ == '__main__':
    import os
    import sys

    mypath = __import__('__main__').__file__
    mydir = os.path.dirname(mypath)
    configfile = os.path.join(mydir, 'bugzilla-config.json')
    config = json.loads(open(configfile).read())

    if 'username' in config and 'password' not in config:
        from getpass import getpass

        try:
            config['password'] = getpass('Enter password for %s: ' %
                                         config['username'])
        except KeyboardInterrupt:
            config['password'] = None

        if not config['password']:
            print "Aborted."
            sys.exit(1)

    cachedir = os.path.join(mydir, 'cache')
    main(config=config,
         json_request=make_caching_json_request(cachedir))