Merge
diff --git a/.hgignore b/.hgignore
index c0447dd..9d35255 100644
--- a/.hgignore
+++ b/.hgignore
@@ -1,6 +1,7 @@
syntax: glob
*.pyc
+*.dat
.*.swp
*/.git/*
.gitignore
diff --git a/Makefile b/Makefile
index 12c6ff9..ef0ec30 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,5 @@
pep8:
- find apiclient samples -name "*.py" | xargs pep8 --ignore=E111,E202
+ find apiclient samples -name "*.py" | xargs pep8 --ignore=E111,E202
test:
- python runtests.py
-
-skeletons:
- python discovery_extras.py tests/data/buzz.json tests/data/latitude.json tests/data/moderator.json
+ python runtests.py
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index e516eeb..36d38e7 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -32,31 +32,15 @@
from urlparse import parse_qsl
except ImportError:
from cgi import parse_qsl
+
from apiclient.http import HttpRequest
from apiclient.json import simplejson
+from apiclient.model import JsonModel
+from apiclient.errors import HttpError
+from apiclient.errors import UnknownLinkType
URITEMPLATE = re.compile('{[^}]*}')
VARNAME = re.compile('[a-zA-Z0-9_-]+')
-
-class Error(Exception):
- """Base error for this module."""
- pass
-
-
-class HttpError(Error):
- """HTTP data was invalid or unexpected."""
- def __init__(self, resp, detail):
- self.resp = resp
- self.detail = detail
- def __str__(self):
- return self.detail
-
-
-class UnknownLinkType(Error):
- """Link type unknown or unexpected."""
- pass
-
-
DISCOVERY_URI = ('https://www.googleapis.com/discovery/v0.2beta1/describe/'
'{api}/{apiVersion}')
@@ -78,53 +62,12 @@
return ''.join(result)
-class JsonModel(object):
-
- def request(self, headers, path_params, query_params, body_value):
- query = self.build_query(query_params)
- headers['accept'] = 'application/json'
- if 'user-agent' in headers:
- headers['user-agent'] += ' '
- else:
- headers['user-agent'] = ''
- headers['user-agent'] += 'google-api-python-client/1.0'
- if body_value is None:
- return (headers, path_params, query, None)
- else:
- headers['content-type'] = 'application/json'
- return (headers, path_params, query, simplejson.dumps(body_value))
-
- def build_query(self, params):
- params.update({'alt': 'json'})
- params.update({'pp': '1'})
- astuples = []
- for key, value in params.iteritems():
- if getattr(value, 'encode', False) and callable(value.encode):
- value = value.encode('utf-8')
- astuples.append((key, value))
- return '?' + urllib.urlencode(astuples)
-
- def response(self, resp, content):
- # Error handling is TBD, for example, do we retry
- # for some operation/error combinations?
- if resp.status < 300:
- if resp.status == 204:
- # A 204: No Content response should be treated differently to all the other success states
- return simplejson.loads('{}')
- body = simplejson.loads(content)
- if isinstance(body, dict) and 'data' in body:
- body = body['data']
- return body
- else:
- logging.error('Content from bad request was: %s' % content)
- if resp.get('content-type', '').startswith('application/json'):
- raise HttpError(resp, simplejson.loads(content)['error'])
- else:
- raise HttpError(resp, '%d %s' % (resp.status, resp.reason))
-
-
-def build(serviceName, version, http=None,
- discoveryServiceUrl=DISCOVERY_URI, developerKey=None, model=JsonModel()):
+def build(serviceName, version,
+ http=None,
+ discoveryServiceUrl=DISCOVERY_URI,
+ developerKey=None,
+ model=JsonModel(),
+ requestBuilder=HttpRequest):
params = {
'api': serviceName,
'apiVersion': version
@@ -160,6 +103,7 @@
self._baseUrl = base
self._model = model
self._developerKey = developerKey
+ self._requestBuilder = requestBuilder
def auth_discovery(self):
return auth_discovery
@@ -168,7 +112,8 @@
def method(self):
return createResource(self._http, self._baseUrl, self._model,
- methodName, self._developerKey, methodDesc, futureDesc)
+ self._requestBuilder, methodName,
+ self._developerKey, methodDesc, futureDesc)
setattr(method, '__doc__', 'A description of how to use this function')
setattr(method, '__is_resource__', True)
@@ -179,8 +124,8 @@
return Service()
-def createResource(http, baseUrl, model, resourceName, developerKey,
- resourceDesc, futureDesc):
+def createResource(http, baseUrl, model, requestBuilder, resourceName,
+ developerKey, resourceDesc, futureDesc):
class Resource(object):
"""A class for interacting with a resource."""
@@ -190,11 +135,13 @@
self._baseUrl = baseUrl
self._model = model
self._developerKey = developerKey
+ self._requestBuilder = requestBuilder
def createMethod(theclass, methodName, methodDesc, futureDesc):
pathUrl = methodDesc['restPath']
pathUrl = re.sub(r'\{', r'{+', pathUrl)
httpMethod = methodDesc['httpMethod']
+ methodId = methodDesc['rpcMethod']
argmap = {}
if httpMethod in ['PUT', 'POST']:
@@ -258,18 +205,23 @@
headers, params, query, body = self._model.request(headers,
actual_path_params, actual_query_params, body_value)
- # TODO(ade) This exists to fix a bug in V1 of the Buzz discovery document.
- # Base URLs should not contain any path elements. If they do then urlparse.urljoin will strip them out
- # This results in an incorrect URL which returns a 404
+ # TODO(ade) This exists to fix a bug in V1 of the Buzz discovery
+ # document. Base URLs should not contain any path elements. If they do
+ # then urlparse.urljoin will strip them out This results in an incorrect
+ # URL which returns a 404
url_result = urlparse.urlsplit(self._baseUrl)
new_base_url = url_result.scheme + '://' + url_result.netloc
expanded_url = uritemplate.expand(pathUrl, params)
- url = urlparse.urljoin(new_base_url, url_result.path + expanded_url + query)
+ url = urlparse.urljoin(new_base_url,
+ url_result.path + expanded_url + query)
logging.info('URL being requested: %s' % url)
- return HttpRequest(self._http, url, method=httpMethod, body=body,
- headers=headers, postproc=self._model.response)
+ return self._requestBuilder(self._http, url,
+ method=httpMethod, body=body,
+ headers=headers,
+ postproc=self._model.response,
+ methodId=methodId)
docs = ['A description of how to use this function\n\n']
for arg in argmap.iterkeys():
@@ -281,7 +233,8 @@
setattr(method, '__doc__', ''.join(docs))
setattr(theclass, methodName, method)
- def createNextMethod(theclass, methodName, methodDesc):
+ def createNextMethod(theclass, methodName, methodDesc, futureDesc):
+ methodId = methodDesc['rpcMethod'] + '.next'
def method(self, previous):
"""
@@ -292,12 +245,12 @@
Returns None if there are no more items in
the collection.
"""
- if methodDesc['type'] != 'uri':
- raise UnknownLinkType(methodDesc['type'])
+ if futureDesc['type'] != 'uri':
+ raise UnknownLinkType(futureDesc['type'])
try:
p = previous
- for key in methodDesc['location']:
+ for key in futureDesc['location']:
p = p[key]
url = p
except (KeyError, TypeError):
@@ -316,8 +269,10 @@
logging.info('URL being requested: %s' % url)
resp, content = self._http.request(url, method='GET', headers=headers)
- return HttpRequest(self._http, url, method='GET',
- headers=headers, postproc=self._model.response)
+ return self._requestBuilder(self._http, url, method='GET',
+ headers=headers,
+ postproc=self._model.response,
+ methodId=methodId)
setattr(theclass, methodName, method)
@@ -332,6 +287,7 @@
# Add in nested resources
if 'resources' in resourceDesc:
+
def createMethod(theclass, methodName, methodDesc, futureDesc):
def method(self):
@@ -347,12 +303,15 @@
future = futureDesc['resources'].get(methodName, {})
else:
future = {}
- createMethod(Resource, methodName, methodDesc, future.get(methodName, {}))
+ createMethod(Resource, methodName, methodDesc,
+ future.get(methodName, {}))
# Add <m>_next() methods to Resource
if futureDesc:
for methodName, methodDesc in futureDesc['methods'].iteritems():
if 'next' in methodDesc and methodName in resourceDesc['methods']:
- createNextMethod(Resource, methodName + "_next", methodDesc['next'])
+ createNextMethod(Resource, methodName + "_next",
+ resourceDesc['methods'][methodName],
+ methodDesc['next'])
return Resource()
diff --git a/apiclient/errors.py b/apiclient/errors.py
new file mode 100644
index 0000000..b3a7d13
--- /dev/null
+++ b/apiclient/errors.py
@@ -0,0 +1,32 @@
+#!/usr/bin/python2.4
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+"""Errors for the library.
+
+All exceptions defined by the library
+should be defined in this file.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+
+class Error(Exception):
+ """Base error for this module."""
+ pass
+
+
+class HttpError(Error):
+ """HTTP data was invalid or unexpected."""
+
+ def __init__(self, resp, detail):
+ self.resp = resp
+ self.detail = detail
+
+ def __str__(self):
+ return self.detail
+
+
+class UnknownLinkType(Error):
+ """Link type unknown or unexpected."""
+ pass
diff --git a/apiclient/ext/django_orm.py b/apiclient/ext/django_orm.py
index 4217eaa..d8cb92d 100644
--- a/apiclient/ext/django_orm.py
+++ b/apiclient/ext/django_orm.py
@@ -1,5 +1,6 @@
from django.db import models
+
class OAuthCredentialsField(models.Field):
__metaclass__ = models.SubfieldBase
@@ -17,6 +18,7 @@
def get_db_prep_value(self, value):
return base64.b64encode(pickle.dumps(value))
+
class FlowThreeLeggedField(models.Field):
__metaclass__ = models.SubfieldBase
diff --git a/apiclient/http.py b/apiclient/http.py
index 25d646e..d616c07 100644
--- a/apiclient/http.py
+++ b/apiclient/http.py
@@ -1,19 +1,42 @@
# Copyright 2010 Google Inc. All Rights Reserved.
-"""One-line documentation for http module.
+"""Classes to encapsulate a single HTTP request.
-A detailed description of http.
+The classes implement a command pattern, with every
+object supporting an execute() method that does the
+actuall HTTP request.
"""
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+__all__ = [
+ 'HttpRequest', 'RequestMockBuilder'
+ ]
+
+from httplib2 import Response
+from apiclient.model import JsonModel
class HttpRequest(object):
- """Encapsulate an HTTP request.
+ """Encapsulates a single HTTP request.
"""
def __init__(self, http, uri, method="GET", body=None, headers=None,
- postproc=None):
+ postproc=None, methodId=None):
+ """Constructor for an HttpRequest.
+
+ Only http and uri are required.
+
+ Args:
+ http: httplib2.Http, the transport object to use to make a request
+ uri: string, the absolute URI to send the request to
+ method: string, the HTTP method to use
+ body: string, the request body of the HTTP request
+ headers: dict, the HTTP request headers
+ postproc: callable, called on the HTTP response and content to transform
+ it into a data object before returning, or raising an exception
+ on an error.
+ methodId: string, a unique identifier for the API method being called.
+ """
self.uri = uri
self.method = method
self.body = body
@@ -24,8 +47,17 @@
def execute(self, http=None):
"""Execute the request.
- If an http object is passed in it is used instead of the
- httplib2.Http object that the request was constructed with.
+ Args:
+ http: httplib2.Http, an http object to be used in place of the
+ one the HttpRequest request object was constructed with.
+
+ Returns:
+ A deserialized object model of the response body as determined
+ by the postproc.
+
+ Raises:
+ apiclient.errors.HttpError if the response was not a 2xx.
+ httplib2.Error if a transport error has occured.
"""
if http is None:
http = self.http
@@ -33,3 +65,87 @@
body=self.body,
headers=self.headers)
return self.postproc(resp, content)
+
+
+class HttpRequestMock(object):
+ """Mock of HttpRequest.
+
+ Do not construct directly, instead use RequestMockBuilder.
+ """
+
+ def __init__(self, resp, content, postproc):
+ """Constructor for HttpRequestMock
+
+ Args:
+ resp: httplib2.Response, the response to emulate coming from the request
+ content: string, the response body
+ postproc: callable, the post processing function usually supplied by
+ the model class. See model.JsonModel.response() as an example.
+ """
+ self.resp = resp
+ self.content = content
+ self.postproc = postproc
+ if resp is None:
+ self.resp = Response({'status': 200, 'reason': 'OK'})
+ if 'reason' in self.resp:
+ self.resp.reason = self.resp['reason']
+
+ def execute(self, http=None):
+ """Execute the request.
+
+ Same behavior as HttpRequest.execute(), but the response is
+ mocked and not really from an HTTP request/response.
+ """
+ return self.postproc(self.resp, self.content)
+
+
+class RequestMockBuilder(object):
+ """A simple mock of HttpRequest
+
+ Pass in a dictionary to the constructor that maps request methodIds to
+ tuples of (httplib2.Response, content) that should be returned when that
+ method is called. None may also be passed in for the httplib2.Response, in
+ which case a 200 OK response will be generated.
+
+ Example:
+ response = '{"data": {"id": "tag:google.c...'
+ requestBuilder = RequestMockBuilder(
+ {
+ 'chili.activities.get': (None, response),
+ }
+ )
+ apiclient.discovery.build("buzz", "v1", requestBuilder=requestBuilder)
+
+ Methods that you do not supply a response for will return a
+ 200 OK with an empty string as the response content. The methodId
+ is taken from the rpcName in the discovery document.
+
+ For more details see the project wiki.
+ """
+
+ def __init__(self, responses):
+ """Constructor for RequestMockBuilder
+
+ The constructed object should be a callable object
+ that can replace the class HttpResponse.
+
+ responses - A dictionary that maps methodIds into tuples
+ of (httplib2.Response, content). The methodId
+ comes from the 'rpcName' field in the discovery
+ document.
+ """
+ self.responses = responses
+
+ def __call__(self, http, uri, method="GET", body=None, headers=None,
+ postproc=None, methodId=None):
+ """Implements the callable interface that discovery.build() expects
+ of requestBuilder, which is to build an object compatible with
+ HttpRequest.execute(). See that method for the description of the
+ parameters and the expected response.
+ """
+ if methodId in self.responses:
+ resp, content = self.responses[methodId]
+ return HttpRequestMock(resp, content, postproc)
+ else:
+ model = JsonModel()
+ return HttpRequestMock(None, '{}', model.response)
diff --git a/apiclient/model.py b/apiclient/model.py
new file mode 100644
index 0000000..fb2bdf8
--- /dev/null
+++ b/apiclient/model.py
@@ -0,0 +1,105 @@
+#!/usr/bin/python2.4
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+"""Model objects for requests and responses
+
+Each API may support one or more serializations, such
+as JSON, Atom, etc. The model classes are responsible
+for converting between the wire format and the Python
+object representation.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+import logging
+import urllib
+
+from apiclient.json import simplejson
+from apiclient.errors import HttpError
+
+
+class JsonModel(object):
+ """Model class for JSON.
+
+ Serializes and de-serializes between JSON and the Python
+ object representation of HTTP request and response bodies.
+ """
+
+ def request(self, headers, path_params, query_params, body_value):
+ """Updates outgoing requests with JSON bodies.
+
+ Args:
+ headers: dict, request headers
+ path_params: dict, parameters that appear in the request path
+ query_params: dict, parameters that appear in the query
+ body_value: object, the request body as a Python object, which must be
+ serializable by simplejson.
+ Returns:
+ A tuple of (headers, path_params, query, body)
+
+ headers: dict, request headers
+ path_params: dict, parameters that appear in the request path
+ query: string, query part of the request URI
+ body: string, the body serialized as JSON
+ """
+ query = self._build_query(query_params)
+ headers['accept'] = 'application/json'
+ if 'user-agent' in headers:
+ headers['user-agent'] += ' '
+ else:
+ headers['user-agent'] = ''
+ headers['user-agent'] += 'google-api-python-client/1.0'
+ if body_value is None:
+ return (headers, path_params, query, None)
+ else:
+ headers['content-type'] = 'application/json'
+ return (headers, path_params, query, simplejson.dumps(body_value))
+
+ def _build_query(self, params):
+ """Builds a query string.
+
+ Args:
+ params: dict, the query parameters
+
+ Returns:
+ The query parameters properly encoded into an HTTP URI query string.
+ """
+ params.update({'alt': 'json'})
+ astuples = []
+ for key, value in params.iteritems():
+ if getattr(value, 'encode', False) and callable(value.encode):
+ value = value.encode('utf-8')
+ astuples.append((key, value))
+ return '?' + urllib.urlencode(astuples)
+
+ def response(self, resp, content):
+ """Convert the response wire format into a Python object.
+
+ Args:
+ resp: httplib2.Response, the HTTP response headers and status
+ content: string, the body of the HTTP response
+
+ Returns:
+ The body de-serialized as a Python object.
+
+ Raises:
+ apiclient.errors.HttpError if a non 2xx response is received.
+ """
+ # Error handling is TBD, for example, do we retry
+ # for some operation/error combinations?
+ if resp.status < 300:
+ if resp.status == 204:
+ # A 204: No Content response should be treated differently
+ # to all the other success states
+ return simplejson.loads('{}')
+ body = simplejson.loads(content)
+ if isinstance(body, dict) and 'data' in body:
+ body = body['data']
+ return body
+ else:
+ logging.debug('Content from bad request was: %s' % content)
+ if resp.get('content-type', '').startswith('application/json'):
+ raise HttpError(resp, simplejson.loads(content)['error'])
+ else:
+ raise HttpError(resp, '%d %s' % (resp.status, resp.reason))
diff --git a/apiclient/oauth.py b/apiclient/oauth.py
index 9907c46..9cc6e66 100644
--- a/apiclient/oauth.py
+++ b/apiclient/oauth.py
@@ -131,9 +131,9 @@
headers = {}
headers.update(req.to_header())
if 'user-agent' in headers:
- headers['user-agent'] = self.user_agent + ' ' + headers['user-agent']
+ headers['user-agent'] = self.user_agent + ' ' + headers['user-agent']
else:
- headers['user-agent'] = self.user_agent
+ headers['user-agent'] = self.user_agent
return request_orig(uri, method, body, headers,
redirections, connection_type)
diff --git a/docs/apiclient.contrib.html b/docs/apiclient.contrib.html
new file mode 100644
index 0000000..513802a
--- /dev/null
+++ b/docs/apiclient.contrib.html
@@ -0,0 +1,21 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: package apiclient.contrib</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.contrib</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/contrib/__init__.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/contrib/__init__.py</a></font></td></tr></table>
+ <p></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.discovery.html b/docs/apiclient.discovery.html
new file mode 100644
index 0000000..7936c9f
--- /dev/null
+++ b/docs/apiclient.discovery.html
@@ -0,0 +1,59 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.discovery</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.discovery</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/discovery.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/discovery.py</a></font></td></tr></table>
+ <p><tt>Client for discovery based APIs<br>
+ <br>
+A client library for Google's discovery<br>
+based APIs.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="httplib2.html">httplib2</a><br>
+<a href="logging.html">logging</a><br>
+</td><td width="25%" valign=top><a href="os.html">os</a><br>
+<a href="re.html">re</a><br>
+</td><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+<a href="uritemplate.html">uritemplate</a><br>
+</td><td width="25%" valign=top><a href="urllib.html">urllib</a><br>
+<a href="urlparse.html">urlparse</a><br>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td>
+<td width="100%"><dl><dt><a name="-build"><strong>build</strong></a>(serviceName, version, http<font color="#909090">=None</font>, discoveryServiceUrl<font color="#909090">='https://www.googleapis.com/discovery/v0.2beta1/describe/{api}/{apiVersion}'</font>, developerKey<font color="#909090">=None</font>, model<font color="#909090">=<apiclient.model.JsonModel object></font>, requestBuilder<font color="#909090">=<class 'apiclient.http.HttpRequest'></font>)</dt></dl>
+ <dl><dt><a name="-createResource"><strong>createResource</strong></a>(http, baseUrl, model, requestBuilder, resourceName, developerKey, resourceDesc, futureDesc)</dt></dl>
+ <dl><dt><a name="-key2param"><strong>key2param</strong></a>(key)</dt><dd><tt>max-results -> max_results</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
+<td width="100%"><strong>DISCOVERY_URI</strong> = 'https://www.googleapis.com/discovery/v0.2beta1/describe/{api}/{apiVersion}'<br>
+<strong>URITEMPLATE</strong> = <_sre.SRE_Pattern object><br>
+<strong>VARNAME</strong> = <_sre.SRE_Pattern object><br>
+<strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td>
+<td width="100%">jcgregorio@google.com (Joe Gregorio)</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.errors.html b/docs/apiclient.errors.html
new file mode 100644
index 0000000..af69a51
--- /dev/null
+++ b/docs/apiclient.errors.html
@@ -0,0 +1,234 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.errors</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.errors</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/errors.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/errors.py</a></font></td></tr></table>
+ <p><tt>Errors for the library.<br>
+ <br>
+All exceptions defined by the library<br>
+should be defined in this file.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="exceptions.html#Exception">exceptions.Exception</a>(<a href="exceptions.html#BaseException">exceptions.BaseException</a>)
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.errors.html#Error">Error</a>
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.errors.html#HttpError">HttpError</a>
+</font></dt><dt><font face="helvetica, arial"><a href="apiclient.errors.html#UnknownLinkType">UnknownLinkType</a>
+</font></dt></dl>
+</dd>
+</dl>
+</dd>
+</dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="Error">class <strong>Error</strong></a>(<a href="exceptions.html#Exception">exceptions.Exception</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Base error for this module.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.errors.html#Error">Error</a></dd>
+<dd><a href="exceptions.html#Exception">exceptions.Exception</a></dd>
+<dd><a href="exceptions.html#BaseException">exceptions.BaseException</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Methods inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><a name="Error-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__init__">__init__</a>(...) initializes x; see x.__class__.__doc__ for signature</tt></dd></dl>
+
+<hr>
+Data and other attributes inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><strong>__new__</strong> = <built-in method __new__ of type object><dd><tt>T.<a href="#Error-__new__">__new__</a>(S, ...) -> a new object with type S, a subtype of T</tt></dl>
+
+<hr>
+Methods inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><a name="Error-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__delattr__">__delattr__</a>('name') <==> del x.name</tt></dd></dl>
+
+<dl><dt><a name="Error-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__getattribute__">__getattribute__</a>('name') <==> x.name</tt></dd></dl>
+
+<dl><dt><a name="Error-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__getitem__">__getitem__</a>(y) <==> x[y]</tt></dd></dl>
+
+<dl><dt><a name="Error-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__getslice__">__getslice__</a>(i, j) <==> x[i:j]<br>
+ <br>
+Use of negative indices is not supported.</tt></dd></dl>
+
+<dl><dt><a name="Error-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="Error-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__repr__">__repr__</a>() <==> repr(x)</tt></dd></dl>
+
+<dl><dt><a name="Error-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__setattr__">__setattr__</a>('name', value) <==> x.name = value</tt></dd></dl>
+
+<dl><dt><a name="Error-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="Error-__str__"><strong>__str__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__str__">__str__</a>() <==> str(x)</tt></dd></dl>
+
+<dl><dt><a name="Error-__unicode__"><strong>__unicode__</strong></a>(...)</dt></dl>
+
+<hr>
+Data descriptors inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+</dl>
+<dl><dt><strong>args</strong></dt>
+</dl>
+<dl><dt><strong>message</strong></dt>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="HttpError">class <strong>HttpError</strong></a>(<a href="apiclient.errors.html#Error">Error</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>HTTP data was invalid or unexpected.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.errors.html#HttpError">HttpError</a></dd>
+<dd><a href="apiclient.errors.html#Error">Error</a></dd>
+<dd><a href="exceptions.html#Exception">exceptions.Exception</a></dd>
+<dd><a href="exceptions.html#BaseException">exceptions.BaseException</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Methods defined here:<br>
+<dl><dt><a name="HttpError-__init__"><strong>__init__</strong></a>(self, resp, detail)</dt></dl>
+
+<dl><dt><a name="HttpError-__str__"><strong>__str__</strong></a>(self)</dt></dl>
+
+<hr>
+Data descriptors inherited from <a href="apiclient.errors.html#Error">Error</a>:<br>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Data and other attributes inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><strong>__new__</strong> = <built-in method __new__ of type object><dd><tt>T.<a href="#HttpError-__new__">__new__</a>(S, ...) -> a new object with type S, a subtype of T</tt></dl>
+
+<hr>
+Methods inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><a name="HttpError-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#HttpError-__delattr__">__delattr__</a>('name') <==> del x.name</tt></dd></dl>
+
+<dl><dt><a name="HttpError-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#HttpError-__getattribute__">__getattribute__</a>('name') <==> x.name</tt></dd></dl>
+
+<dl><dt><a name="HttpError-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#HttpError-__getitem__">__getitem__</a>(y) <==> x[y]</tt></dd></dl>
+
+<dl><dt><a name="HttpError-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#HttpError-__getslice__">__getslice__</a>(i, j) <==> x[i:j]<br>
+ <br>
+Use of negative indices is not supported.</tt></dd></dl>
+
+<dl><dt><a name="HttpError-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="HttpError-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#HttpError-__repr__">__repr__</a>() <==> repr(x)</tt></dd></dl>
+
+<dl><dt><a name="HttpError-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#HttpError-__setattr__">__setattr__</a>('name', value) <==> x.name = value</tt></dd></dl>
+
+<dl><dt><a name="HttpError-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="HttpError-__unicode__"><strong>__unicode__</strong></a>(...)</dt></dl>
+
+<hr>
+Data descriptors inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+</dl>
+<dl><dt><strong>args</strong></dt>
+</dl>
+<dl><dt><strong>message</strong></dt>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="UnknownLinkType">class <strong>UnknownLinkType</strong></a>(<a href="apiclient.errors.html#Error">Error</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Link type unknown or unexpected.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.errors.html#UnknownLinkType">UnknownLinkType</a></dd>
+<dd><a href="apiclient.errors.html#Error">Error</a></dd>
+<dd><a href="exceptions.html#Exception">exceptions.Exception</a></dd>
+<dd><a href="exceptions.html#BaseException">exceptions.BaseException</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Data descriptors inherited from <a href="apiclient.errors.html#Error">Error</a>:<br>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Methods inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><a name="UnknownLinkType-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__init__">__init__</a>(...) initializes x; see x.__class__.__doc__ for signature</tt></dd></dl>
+
+<hr>
+Data and other attributes inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><strong>__new__</strong> = <built-in method __new__ of type object><dd><tt>T.<a href="#UnknownLinkType-__new__">__new__</a>(S, ...) -> a new object with type S, a subtype of T</tt></dl>
+
+<hr>
+Methods inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><a name="UnknownLinkType-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__delattr__">__delattr__</a>('name') <==> del x.name</tt></dd></dl>
+
+<dl><dt><a name="UnknownLinkType-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__getattribute__">__getattribute__</a>('name') <==> x.name</tt></dd></dl>
+
+<dl><dt><a name="UnknownLinkType-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__getitem__">__getitem__</a>(y) <==> x[y]</tt></dd></dl>
+
+<dl><dt><a name="UnknownLinkType-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__getslice__">__getslice__</a>(i, j) <==> x[i:j]<br>
+ <br>
+Use of negative indices is not supported.</tt></dd></dl>
+
+<dl><dt><a name="UnknownLinkType-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="UnknownLinkType-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__repr__">__repr__</a>() <==> repr(x)</tt></dd></dl>
+
+<dl><dt><a name="UnknownLinkType-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__setattr__">__setattr__</a>('name', value) <==> x.name = value</tt></dd></dl>
+
+<dl><dt><a name="UnknownLinkType-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="UnknownLinkType-__str__"><strong>__str__</strong></a>(...)</dt><dd><tt>x.<a href="#UnknownLinkType-__str__">__str__</a>() <==> str(x)</tt></dd></dl>
+
+<dl><dt><a name="UnknownLinkType-__unicode__"><strong>__unicode__</strong></a>(...)</dt></dl>
+
+<hr>
+Data descriptors inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+</dl>
+<dl><dt><strong>args</strong></dt>
+</dl>
+<dl><dt><strong>message</strong></dt>
+</dl>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
+<td width="100%"><strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td>
+<td width="100%">jcgregorio@google.com (Joe Gregorio)</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.ext.appengine.html b/docs/apiclient.ext.appengine.html
new file mode 100644
index 0000000..90cd6ca
--- /dev/null
+++ b/docs/apiclient.ext.appengine.html
@@ -0,0 +1,224 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.ext.appengine</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.<a href="apiclient.ext.html"><font color="#ffffff">ext</font></a>.appengine</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/ext/appengine.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/ext/appengine.py</a></font></td></tr></table>
+ <p><tt>Utilities for Google App Engine<br>
+ <br>
+Utilities for making it easier to use the<br>
+Google API Client for Python on Google App Engine.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="google.appengine.ext.db.html">google.appengine.ext.db</a><br>
+</td><td width="25%" valign=top><a href="pickle.html">pickle</a><br>
+</td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>(<a href="__builtin__.html#object">__builtin__.object</a>)
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.ext.appengine.html#FlowThreeLeggedProperty">FlowThreeLeggedProperty</a>
+</font></dt><dt><font face="helvetica, arial"><a href="apiclient.ext.appengine.html#OAuthCredentialsProperty">OAuthCredentialsProperty</a>
+</font></dt></dl>
+</dd>
+</dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="FlowThreeLeggedProperty">class <strong>FlowThreeLeggedProperty</strong></a>(<a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Utility property that allows easy<br>
+storage and retreival of an<br>
+apiclient.oauth.FlowThreeLegged<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.ext.appengine.html#FlowThreeLeggedProperty">FlowThreeLeggedProperty</a></dd>
+<dd><a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Methods defined here:<br>
+<dl><dt><a name="FlowThreeLeggedProperty-empty"><strong>empty</strong></a>(self, value)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-get_value_for_datastore"><strong>get_value_for_datastore</strong></a>(self, model_instance)</dt><dd><tt># For writing to datastore.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-make_value_from_datastore"><strong>make_value_from_datastore</strong></a>(self, value)</dt><dd><tt># For reading from datastore.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-validate"><strong>validate</strong></a>(self, value)</dt></dl>
+
+<hr>
+Data and other attributes defined here:<br>
+<dl><dt><strong>data_type</strong> = <class 'apiclient.oauth.FlowThreeLegged'><dd><tt>Does the Three Legged Dance for OAuth 1.0a.</tt></dl>
+
+<hr>
+Methods inherited from <a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>:<br>
+<dl><dt><a name="FlowThreeLeggedProperty-__get__"><strong>__get__</strong></a>(self, model_instance, model_class)</dt><dd><tt>Returns the value for this property on the given model instance.<br>
+ <br>
+See <a href="http://docs.python.org/ref/descriptors.html">http://docs.python.org/ref/descriptors.html</a> for a description of<br>
+the arguments to this class and what they mean.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, default<font color="#909090">=None</font>, required<font color="#909090">=False</font>, validator<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, indexed<font color="#909090">=True</font>)</dt><dd><tt>Initializes this <a href="google.appengine.ext.db.html#Property">Property</a> with the given options.<br>
+ <br>
+Args:<br>
+ verbose_name: User friendly name of property.<br>
+ name: Storage name for property. By default, uses attribute name<br>
+ as it is assigned in the Model sub-class.<br>
+ default: Default value for property if none is assigned.<br>
+ required: Whether property is required.<br>
+ validator: User provided method used for validation.<br>
+ choices: User provided set of valid property values.<br>
+ indexed: Whether property is indexed.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-__property_config__"><strong>__property_config__</strong></a>(self, model_class, property_name)</dt><dd><tt>Configure property, connecting it to its model.<br>
+ <br>
+Configure the property so that it knows its property name and what class<br>
+it belongs to.<br>
+ <br>
+Args:<br>
+ model_class: Model class which <a href="google.appengine.ext.db.html#Property">Property</a> will belong to.<br>
+ property_name: Name of property within Model instance to store property<br>
+ values in. By default this will be the property name preceded by<br>
+ an underscore, but may change for different subclasses.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-__set__"><strong>__set__</strong></a>(self, model_instance, value)</dt><dd><tt>Sets the value for this property on the given model instance.<br>
+ <br>
+See <a href="http://docs.python.org/ref/descriptors.html">http://docs.python.org/ref/descriptors.html</a> for a description of<br>
+the arguments to this class and what they mean.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-datastore_type"><strong>datastore_type</strong></a>(self)</dt><dd><tt>Deprecated backwards-compatible accessor method for self.<strong>data_type</strong>.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedProperty-default_value"><strong>default_value</strong></a>(self)</dt><dd><tt>Default value for unassigned values.<br>
+ <br>
+Returns:<br>
+ Default value as provided by <a href="#FlowThreeLeggedProperty-__init__">__init__</a>(default).</tt></dd></dl>
+
+<hr>
+Data descriptors inherited from <a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Data and other attributes inherited from <a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>:<br>
+<dl><dt><strong>creation_counter</strong> = 0</dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="OAuthCredentialsProperty">class <strong>OAuthCredentialsProperty</strong></a>(<a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Utility property that allows easy<br>
+storage and retrieval of<br>
+apiclient.oath.OAuthCredentials<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.ext.appengine.html#OAuthCredentialsProperty">OAuthCredentialsProperty</a></dd>
+<dd><a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Methods defined here:<br>
+<dl><dt><a name="OAuthCredentialsProperty-empty"><strong>empty</strong></a>(self, value)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-get_value_for_datastore"><strong>get_value_for_datastore</strong></a>(self, model_instance)</dt><dd><tt># For writing to datastore.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-make_value_from_datastore"><strong>make_value_from_datastore</strong></a>(self, value)</dt><dd><tt># For reading from datastore.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-validate"><strong>validate</strong></a>(self, value)</dt></dl>
+
+<hr>
+Data and other attributes defined here:<br>
+<dl><dt><strong>data_type</strong> = <class 'apiclient.oauth.OAuthCredentials'><dd><tt>Credentials object for OAuth 1.0a</tt></dl>
+
+<hr>
+Methods inherited from <a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>:<br>
+<dl><dt><a name="OAuthCredentialsProperty-__get__"><strong>__get__</strong></a>(self, model_instance, model_class)</dt><dd><tt>Returns the value for this property on the given model instance.<br>
+ <br>
+See <a href="http://docs.python.org/ref/descriptors.html">http://docs.python.org/ref/descriptors.html</a> for a description of<br>
+the arguments to this class and what they mean.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, default<font color="#909090">=None</font>, required<font color="#909090">=False</font>, validator<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, indexed<font color="#909090">=True</font>)</dt><dd><tt>Initializes this <a href="google.appengine.ext.db.html#Property">Property</a> with the given options.<br>
+ <br>
+Args:<br>
+ verbose_name: User friendly name of property.<br>
+ name: Storage name for property. By default, uses attribute name<br>
+ as it is assigned in the Model sub-class.<br>
+ default: Default value for property if none is assigned.<br>
+ required: Whether property is required.<br>
+ validator: User provided method used for validation.<br>
+ choices: User provided set of valid property values.<br>
+ indexed: Whether property is indexed.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-__property_config__"><strong>__property_config__</strong></a>(self, model_class, property_name)</dt><dd><tt>Configure property, connecting it to its model.<br>
+ <br>
+Configure the property so that it knows its property name and what class<br>
+it belongs to.<br>
+ <br>
+Args:<br>
+ model_class: Model class which <a href="google.appengine.ext.db.html#Property">Property</a> will belong to.<br>
+ property_name: Name of property within Model instance to store property<br>
+ values in. By default this will be the property name preceded by<br>
+ an underscore, but may change for different subclasses.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-__set__"><strong>__set__</strong></a>(self, model_instance, value)</dt><dd><tt>Sets the value for this property on the given model instance.<br>
+ <br>
+See <a href="http://docs.python.org/ref/descriptors.html">http://docs.python.org/ref/descriptors.html</a> for a description of<br>
+the arguments to this class and what they mean.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-datastore_type"><strong>datastore_type</strong></a>(self)</dt><dd><tt>Deprecated backwards-compatible accessor method for self.<strong>data_type</strong>.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsProperty-default_value"><strong>default_value</strong></a>(self)</dt><dd><tt>Default value for unassigned values.<br>
+ <br>
+Returns:<br>
+ Default value as provided by <a href="#OAuthCredentialsProperty-__init__">__init__</a>(default).</tt></dd></dl>
+
+<hr>
+Data descriptors inherited from <a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Data and other attributes inherited from <a href="google.appengine.ext.db.html#Property">google.appengine.ext.db.Property</a>:<br>
+<dl><dt><strong>creation_counter</strong> = 0</dl>
+
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
+<td width="100%"><strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td>
+<td width="100%">jcgregorio@google.com (Joe Gregorio)</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.ext.django_orm.html b/docs/apiclient.ext.django_orm.html
new file mode 100644
index 0000000..7832fcf
--- /dev/null
+++ b/docs/apiclient.ext.django_orm.html
@@ -0,0 +1,234 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.ext.django_orm</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.<a href="apiclient.ext.html"><font color="#ffffff">ext</font></a>.django_orm</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/ext/django_orm.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/ext/django_orm.py</a></font></td></tr></table>
+ <p></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="django.db.models.html">django.db.models</a><br>
+</td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>(<a href="__builtin__.html#object">__builtin__.object</a>)
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.ext.django_orm.html#FlowThreeLeggedField">FlowThreeLeggedField</a>
+</font></dt><dt><font face="helvetica, arial"><a href="apiclient.ext.django_orm.html#OAuthCredentialsField">OAuthCredentialsField</a>
+</font></dt></dl>
+</dd>
+</dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="FlowThreeLeggedField">class <strong>FlowThreeLeggedField</strong></a>(<a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>)</font></td></tr>
+
+<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.ext.django_orm.html#FlowThreeLeggedField">FlowThreeLeggedField</a></dd>
+<dd><a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Methods defined here:<br>
+<dl><dt><a name="FlowThreeLeggedField-contribute_to_class"><strong>contribute_to_class</strong></a>(self, cls, name)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-db_type"><strong>db_type</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_db_prep_value"><strong>get_db_prep_value</strong></a>(self, value)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-to_python"><strong>to_python</strong></a>(self, value)</dt></dl>
+
+<hr>
+Data and other attributes defined here:<br>
+<dl><dt><strong>__metaclass__</strong> = <class 'django.db.models.fields.subclassing.SubfieldBase'><dd><tt>A metaclass for custom <a href="django.db.models.fields.html#Field">Field</a> subclasses. This ensures the model's attribute<br>
+has the descriptor protocol attached to it.</tt></dl>
+
+<hr>
+Methods inherited from <a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>:<br>
+<dl><dt><a name="FlowThreeLeggedField-__cmp__"><strong>__cmp__</strong></a>(self, other)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-__deepcopy__"><strong>__deepcopy__</strong></a>(self, memodict)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=<class django.db.models.fields.NOT_PROVIDED></font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-bind"><strong>bind</strong></a>(self, fieldmapping, original, bound_field_class)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-formfield"><strong>formfield</strong></a>(self, form_class<font color="#909090">=<class 'django.forms.fields.CharField'></font>, **kwargs)</dt><dd><tt>Returns a django.forms.<a href="django.db.models.fields.html#Field">Field</a> instance for this database <a href="django.db.models.fields.html#Field">Field</a>.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_attname"><strong>get_attname</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_attname_column"><strong>get_attname_column</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_cache_name"><strong>get_cache_name</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_choices"><strong>get_choices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns choices with a default blank choices included, for use<br>
+as SelectField choices for this field.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_choices_default"><strong>get_choices_default</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Returns field's value prepared for database lookup.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_db_prep_save"><strong>get_db_prep_save</strong></a>(self, value)</dt><dd><tt>Returns field's value prepared for saving into a database.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_default"><strong>get_default</strong></a>(self)</dt><dd><tt>Returns the default value for this field.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_flatchoices"><strong>get_flatchoices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns flattened choices with a default blank choice included.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-get_validator_unique_lookup_type"><strong>get_validator_unique_lookup_type</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-has_default"><strong>has_default</strong></a>(self)</dt><dd><tt>Returns a boolean of whether this field has a default value.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-pre_save"><strong>pre_save</strong></a>(self, model_instance, add)</dt><dd><tt>Returns field's value just before saving.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-save_form_data"><strong>save_form_data</strong></a>(self, instance, data)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-set_attributes_from_name"><strong>set_attributes_from_name</strong></a>(self, name)</dt></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-value_from_object"><strong>value_from_object</strong></a>(self, obj)</dt><dd><tt>Returns the value of this field in the given model instance.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLeggedField-value_to_string"><strong>value_to_string</strong></a>(self, obj)</dt><dd><tt>Returns a string value of this field from the passed obj.<br>
+This is used by the serialization framework.</tt></dd></dl>
+
+<hr>
+Data descriptors inherited from <a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>choices</strong></dt>
+</dl>
+<dl><dt><strong>flatchoices</strong></dt>
+<dd><tt>Flattened version of choices tuple.</tt></dd>
+</dl>
+<dl><dt><strong>unique</strong></dt>
+</dl>
+<hr>
+Data and other attributes inherited from <a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>:<br>
+<dl><dt><strong>auto_creation_counter</strong> = -1</dl>
+
+<dl><dt><strong>creation_counter</strong> = 0</dl>
+
+<dl><dt><strong>empty_strings_allowed</strong> = True</dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="OAuthCredentialsField">class <strong>OAuthCredentialsField</strong></a>(<a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>)</font></td></tr>
+
+<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.ext.django_orm.html#OAuthCredentialsField">OAuthCredentialsField</a></dd>
+<dd><a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Methods defined here:<br>
+<dl><dt><a name="OAuthCredentialsField-contribute_to_class"><strong>contribute_to_class</strong></a>(self, cls, name)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-db_type"><strong>db_type</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_db_prep_value"><strong>get_db_prep_value</strong></a>(self, value)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-to_python"><strong>to_python</strong></a>(self, value)</dt></dl>
+
+<hr>
+Data and other attributes defined here:<br>
+<dl><dt><strong>__metaclass__</strong> = <class 'django.db.models.fields.subclassing.SubfieldBase'><dd><tt>A metaclass for custom <a href="django.db.models.fields.html#Field">Field</a> subclasses. This ensures the model's attribute<br>
+has the descriptor protocol attached to it.</tt></dl>
+
+<hr>
+Methods inherited from <a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>:<br>
+<dl><dt><a name="OAuthCredentialsField-__cmp__"><strong>__cmp__</strong></a>(self, other)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-__deepcopy__"><strong>__deepcopy__</strong></a>(self, memodict)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-__init__"><strong>__init__</strong></a>(self, verbose_name<font color="#909090">=None</font>, name<font color="#909090">=None</font>, primary_key<font color="#909090">=False</font>, max_length<font color="#909090">=None</font>, unique<font color="#909090">=False</font>, blank<font color="#909090">=False</font>, null<font color="#909090">=False</font>, db_index<font color="#909090">=False</font>, rel<font color="#909090">=None</font>, default<font color="#909090">=<class django.db.models.fields.NOT_PROVIDED></font>, editable<font color="#909090">=True</font>, serialize<font color="#909090">=True</font>, unique_for_date<font color="#909090">=None</font>, unique_for_month<font color="#909090">=None</font>, unique_for_year<font color="#909090">=None</font>, choices<font color="#909090">=None</font>, help_text<font color="#909090">=''</font>, db_column<font color="#909090">=None</font>, db_tablespace<font color="#909090">=None</font>, auto_created<font color="#909090">=False</font>)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-bind"><strong>bind</strong></a>(self, fieldmapping, original, bound_field_class)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-formfield"><strong>formfield</strong></a>(self, form_class<font color="#909090">=<class 'django.forms.fields.CharField'></font>, **kwargs)</dt><dd><tt>Returns a django.forms.<a href="django.db.models.fields.html#Field">Field</a> instance for this database <a href="django.db.models.fields.html#Field">Field</a>.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_attname"><strong>get_attname</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_attname_column"><strong>get_attname_column</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_cache_name"><strong>get_cache_name</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_choices"><strong>get_choices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns choices with a default blank choices included, for use<br>
+as SelectField choices for this field.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_choices_default"><strong>get_choices_default</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_db_prep_lookup"><strong>get_db_prep_lookup</strong></a>(self, lookup_type, value)</dt><dd><tt>Returns field's value prepared for database lookup.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_db_prep_save"><strong>get_db_prep_save</strong></a>(self, value)</dt><dd><tt>Returns field's value prepared for saving into a database.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_default"><strong>get_default</strong></a>(self)</dt><dd><tt>Returns the default value for this field.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_flatchoices"><strong>get_flatchoices</strong></a>(self, include_blank<font color="#909090">=True</font>, blank_choice<font color="#909090">=[('', '---------')]</font>)</dt><dd><tt>Returns flattened choices with a default blank choice included.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_internal_type"><strong>get_internal_type</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-get_validator_unique_lookup_type"><strong>get_validator_unique_lookup_type</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-has_default"><strong>has_default</strong></a>(self)</dt><dd><tt>Returns a boolean of whether this field has a default value.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-pre_save"><strong>pre_save</strong></a>(self, model_instance, add)</dt><dd><tt>Returns field's value just before saving.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-save_form_data"><strong>save_form_data</strong></a>(self, instance, data)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-set_attributes_from_name"><strong>set_attributes_from_name</strong></a>(self, name)</dt></dl>
+
+<dl><dt><a name="OAuthCredentialsField-value_from_object"><strong>value_from_object</strong></a>(self, obj)</dt><dd><tt>Returns the value of this field in the given model instance.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentialsField-value_to_string"><strong>value_to_string</strong></a>(self, obj)</dt><dd><tt>Returns a string value of this field from the passed obj.<br>
+This is used by the serialization framework.</tt></dd></dl>
+
+<hr>
+Data descriptors inherited from <a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>choices</strong></dt>
+</dl>
+<dl><dt><strong>flatchoices</strong></dt>
+<dd><tt>Flattened version of choices tuple.</tt></dd>
+</dl>
+<dl><dt><strong>unique</strong></dt>
+</dl>
+<hr>
+Data and other attributes inherited from <a href="django.db.models.fields.html#Field">django.db.models.fields.Field</a>:<br>
+<dl><dt><strong>auto_creation_counter</strong> = -1</dl>
+
+<dl><dt><strong>creation_counter</strong> = 0</dl>
+
+<dl><dt><strong>empty_strings_allowed</strong> = True</dl>
+
+</td></tr></table></td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.ext.html b/docs/apiclient.ext.html
new file mode 100644
index 0000000..f9b24a0
--- /dev/null
+++ b/docs/apiclient.ext.html
@@ -0,0 +1,23 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: package apiclient.ext</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.ext</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/ext/__init__.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/ext/__init__.py</a></font></td></tr></table>
+ <p></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="apiclient.ext.appengine.html">appengine</a><br>
+</td><td width="25%" valign=top><a href="apiclient.ext.django_orm.html">django_orm</a><br>
+</td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.html b/docs/apiclient.html
new file mode 100644
index 0000000..6b8dfbb
--- /dev/null
+++ b/docs/apiclient.html
@@ -0,0 +1,29 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: package apiclient</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong>apiclient</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/__init__.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/__init__.py</a></font></td></tr></table>
+ <p></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="apiclient.contrib.html"><strong>contrib</strong> (package)</a><br>
+<a href="apiclient.discovery.html">discovery</a><br>
+</td><td width="25%" valign=top><a href="apiclient.errors.html">errors</a><br>
+<a href="apiclient.ext.html"><strong>ext</strong> (package)</a><br>
+</td><td width="25%" valign=top><a href="apiclient.http.html">http</a><br>
+<a href="apiclient.json.html">json</a><br>
+</td><td width="25%" valign=top><a href="apiclient.model.html">model</a><br>
+<a href="apiclient.oauth.html">oauth</a><br>
+</td></tr></table></td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.http.html b/docs/apiclient.http.html
new file mode 100644
index 0000000..9810823
--- /dev/null
+++ b/docs/apiclient.http.html
@@ -0,0 +1,149 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.http</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.http</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/http.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/http.py</a></font></td></tr></table>
+ <p><tt>Classes to encapsulate a single HTTP request.<br>
+ <br>
+The classes implement a command pattern, with every<br>
+<a href="__builtin__.html#object">object</a> supporting an execute() method that does the<br>
+actuall HTTP request.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.http.html#HttpRequest">HttpRequest</a>
+</font></dt><dt><font face="helvetica, arial"><a href="apiclient.http.html#RequestMockBuilder">RequestMockBuilder</a>
+</font></dt></dl>
+</dd>
+</dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="HttpRequest">class <strong>HttpRequest</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Encapsulates a single HTTP request.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="HttpRequest-__init__"><strong>__init__</strong></a>(self, http, uri, method<font color="#909090">='GET'</font>, body<font color="#909090">=None</font>, headers<font color="#909090">=None</font>, postproc<font color="#909090">=None</font>, methodId<font color="#909090">=None</font>)</dt><dd><tt>Constructor for an <a href="#HttpRequest">HttpRequest</a>.<br>
+ <br>
+Only http and uri are required.<br>
+ <br>
+Args:<br>
+ http: httplib2.Http, the transport <a href="__builtin__.html#object">object</a> to use to make a request<br>
+ uri: string, the absolute URI to send the request to<br>
+ method: string, the HTTP method to use<br>
+ body: string, the request body of the HTTP request<br>
+ headers: dict, the HTTP request headers<br>
+ postproc: callable, called on the HTTP response and content to transform<br>
+ it into a data <a href="__builtin__.html#object">object</a> before returning, or raising an exception<br>
+ on an error.<br>
+ methodId: string, a unique identifier for the API method being called.</tt></dd></dl>
+
+<dl><dt><a name="HttpRequest-execute"><strong>execute</strong></a>(self, http<font color="#909090">=None</font>)</dt><dd><tt>Execute the request.<br>
+ <br>
+Args:<br>
+ http: httplib2.Http, an http <a href="__builtin__.html#object">object</a> to be used in place of the<br>
+ one the <a href="#HttpRequest">HttpRequest</a> request <a href="__builtin__.html#object">object</a> was constructed with.<br>
+ <br>
+Returns:<br>
+ A deserialized <a href="__builtin__.html#object">object</a> model of the response body as determined<br>
+ by the postproc.<br>
+ <br>
+Raises:<br>
+ apiclient.errors.HttpError if the response was not a 2xx.<br>
+ httplib2.Error if a transport error has occured.</tt></dd></dl>
+
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="RequestMockBuilder">class <strong>RequestMockBuilder</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>A simple mock of <a href="#HttpRequest">HttpRequest</a><br>
+ <br>
+Pass in a dictionary to the constructor that maps request methodIds to<br>
+tuples of (httplib2.Response, content) that should be returned when that<br>
+method is called. None may also be passed in for the httplib2.Response, in<br>
+which case a 200 OK response will be generated.<br>
+ <br>
+Example:<br>
+ response = '{"data": {"id": "tag:google.c...'<br>
+ requestBuilder = <a href="#RequestMockBuilder">RequestMockBuilder</a>(<br>
+ {<br>
+ 'chili.activities.get': (None, response),<br>
+ }<br>
+ )<br>
+ apiclient.discovery.build("buzz", "v1", requestBuilder=requestBuilder)<br>
+ <br>
+Methods that you do not supply a response for will return a<br>
+200 OK with an empty string as the response content. The methodId<br>
+is taken from the rpcName in the discovery document.<br>
+ <br>
+For more details see the project wiki.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="RequestMockBuilder-__call__"><strong>__call__</strong></a>(self, http, uri, method<font color="#909090">='GET'</font>, body<font color="#909090">=None</font>, headers<font color="#909090">=None</font>, postproc<font color="#909090">=None</font>, methodId<font color="#909090">=None</font>)</dt><dd><tt>Implements the callable interface that discovery.build() expects<br>
+of requestBuilder, which is to build an <a href="__builtin__.html#object">object</a> compatible with<br>
+<a href="#HttpRequest">HttpRequest</a>.execute(). See that method for the description of the<br>
+parameters and the expected response.</tt></dd></dl>
+
+<dl><dt><a name="RequestMockBuilder-__init__"><strong>__init__</strong></a>(self, responses)</dt><dd><tt>Constructor for <a href="#RequestMockBuilder">RequestMockBuilder</a><br>
+ <br>
+The constructed <a href="__builtin__.html#object">object</a> should be a callable <a href="__builtin__.html#object">object</a><br>
+that can replace the class HttpResponse.<br>
+ <br>
+responses - A dictionary that maps methodIds into tuples<br>
+ of (httplib2.Response, content). The methodId<br>
+ comes from the 'rpcName' field in the discovery<br>
+ document.</tt></dd></dl>
+
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
+<td width="100%"><strong>__all__</strong> = ['HttpRequest', 'RequestMockBuilder']<br>
+<strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td>
+<td width="100%">jcgregorio@google.com (Joe Gregorio)</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.json.html b/docs/apiclient.json.html
new file mode 100644
index 0000000..00c56ab
--- /dev/null
+++ b/docs/apiclient.json.html
@@ -0,0 +1,39 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.json</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.json</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/json.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/json.py</a></font></td></tr></table>
+ <p><tt>Utility module to import a JSON module<br>
+ <br>
+Hides all the messy details of exactly where<br>
+we get a simplejson module from.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+</td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
+<td width="100%"><strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td>
+<td width="100%">jcgregorio@google.com (Joe Gregorio)</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.model.html b/docs/apiclient.model.html
new file mode 100644
index 0000000..32ea8b9
--- /dev/null
+++ b/docs/apiclient.model.html
@@ -0,0 +1,107 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.model</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.model</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/model.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/model.py</a></font></td></tr></table>
+ <p><tt>Model objects for requests and responses<br>
+ <br>
+Each API may support one or more serializations, such<br>
+as JSON, Atom, etc. The model classes are responsible<br>
+for converting between the wire format and the Python<br>
+<a href="__builtin__.html#object">object</a> representation.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="logging.html">logging</a><br>
+</td><td width="25%" valign=top><a href="simplejson.html">simplejson</a><br>
+</td><td width="25%" valign=top><a href="urllib.html">urllib</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.model.html#JsonModel">JsonModel</a>
+</font></dt></dl>
+</dd>
+</dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="JsonModel">class <strong>JsonModel</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Model class for JSON.<br>
+ <br>
+Serializes and de-serializes between JSON and the Python<br>
+<a href="__builtin__.html#object">object</a> representation of HTTP request and response bodies.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="JsonModel-request"><strong>request</strong></a>(self, headers, path_params, query_params, body_value)</dt><dd><tt>Updates outgoing requests with JSON bodies.<br>
+ <br>
+Args:<br>
+ headers: dict, request headers<br>
+ path_params: dict, parameters that appear in the request path<br>
+ query_params: dict, parameters that appear in the query<br>
+ body_value: <a href="__builtin__.html#object">object</a>, the request body as a Python <a href="__builtin__.html#object">object</a>, which must be<br>
+ serializable by simplejson.<br>
+Returns:<br>
+ A tuple of (headers, path_params, query, body)<br>
+ <br>
+ headers: dict, request headers<br>
+ path_params: dict, parameters that appear in the request path<br>
+ query: string, query part of the request URI<br>
+ body: string, the body serialized as JSON</tt></dd></dl>
+
+<dl><dt><a name="JsonModel-response"><strong>response</strong></a>(self, resp, content)</dt><dd><tt>Convert the response wire format into a Python <a href="__builtin__.html#object">object</a>.<br>
+ <br>
+Args:<br>
+ resp: httplib2.Response, the HTTP response headers and status<br>
+ content: string, the body of the HTTP response<br>
+ <br>
+Returns:<br>
+ The body de-serialized as a Python <a href="__builtin__.html#object">object</a>.<br>
+ <br>
+Raises:<br>
+ apiclient.errors.HttpError if a non 2xx response is received.</tt></dd></dl>
+
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
+<td width="100%"><strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td>
+<td width="100%">jcgregorio@google.com (Joe Gregorio)</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/apiclient.oauth.html b/docs/apiclient.oauth.html
new file mode 100644
index 0000000..e55af8c
--- /dev/null
+++ b/docs/apiclient.oauth.html
@@ -0,0 +1,375 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module apiclient.oauth</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="apiclient.html"><font color="#ffffff">apiclient</font></a>.oauth</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/usr/local/google/home/jcgregorio/projects/apiary/apiclient/oauth.py">/usr/local/google/home/jcgregorio/projects/apiary/apiclient/oauth.py</a></font></td></tr></table>
+ <p><tt>Utilities for OAuth.<br>
+ <br>
+Utilities for making it easier to work with OAuth.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="copy.html">copy</a><br>
+<a href="httplib2.html">httplib2</a><br>
+</td><td width="25%" valign=top><a href="logging.html">logging</a><br>
+<a href="oauth2.html">oauth2</a><br>
+</td><td width="25%" valign=top><a href="urllib.html">urllib</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.oauth.html#Credentials">Credentials</a>
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.oauth.html#OAuthCredentials">OAuthCredentials</a>
+</font></dt></dl>
+</dd>
+<dt><font face="helvetica, arial"><a href="apiclient.oauth.html#FlowThreeLegged">FlowThreeLegged</a>
+</font></dt></dl>
+</dd>
+<dt><font face="helvetica, arial"><a href="exceptions.html#Exception">exceptions.Exception</a>(<a href="exceptions.html#BaseException">exceptions.BaseException</a>)
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.oauth.html#Error">Error</a>
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="apiclient.oauth.html#MissingParameter">MissingParameter</a>
+</font></dt><dt><font face="helvetica, arial"><a href="apiclient.oauth.html#RequestError">RequestError</a>
+</font></dt></dl>
+</dd>
+</dl>
+</dd>
+</dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="Credentials">class <strong>Credentials</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Base class for all <a href="#Credentials">Credentials</a> objects.<br>
+ <br>
+Subclasses must define an <a href="#Credentials-authorize">authorize</a>() method<br>
+that applies the credentials to an HTTP transport.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="Credentials-authorize"><strong>authorize</strong></a>(self, http)</dt><dd><tt>Take an httplib2.Http instance (or equivalent) and<br>
+authorizes it for the set of credentials, usually by<br>
+replacing http.request() with a method that adds in<br>
+the appropriate headers and then delegates to the original<br>
+Http.request() method.</tt></dd></dl>
+
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="Error">class <strong>Error</strong></a>(<a href="exceptions.html#Exception">exceptions.Exception</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Base error for this module.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.oauth.html#Error">Error</a></dd>
+<dd><a href="exceptions.html#Exception">exceptions.Exception</a></dd>
+<dd><a href="exceptions.html#BaseException">exceptions.BaseException</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Methods inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><a name="Error-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__init__">__init__</a>(...) initializes x; see x.__class__.__doc__ for signature</tt></dd></dl>
+
+<hr>
+Data and other attributes inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><strong>__new__</strong> = <built-in method __new__ of type object><dd><tt>T.<a href="#Error-__new__">__new__</a>(S, ...) -> a new <a href="__builtin__.html#object">object</a> with type S, a subtype of T</tt></dl>
+
+<hr>
+Methods inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><a name="Error-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__delattr__">__delattr__</a>('name') <==> del x.name</tt></dd></dl>
+
+<dl><dt><a name="Error-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__getattribute__">__getattribute__</a>('name') <==> x.name</tt></dd></dl>
+
+<dl><dt><a name="Error-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__getitem__">__getitem__</a>(y) <==> x[y]</tt></dd></dl>
+
+<dl><dt><a name="Error-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__getslice__">__getslice__</a>(i, j) <==> x[i:j]<br>
+ <br>
+Use of negative indices is not supported.</tt></dd></dl>
+
+<dl><dt><a name="Error-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="Error-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__repr__">__repr__</a>() <==> repr(x)</tt></dd></dl>
+
+<dl><dt><a name="Error-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__setattr__">__setattr__</a>('name', value) <==> x.name = value</tt></dd></dl>
+
+<dl><dt><a name="Error-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="Error-__str__"><strong>__str__</strong></a>(...)</dt><dd><tt>x.<a href="#Error-__str__">__str__</a>() <==> str(x)</tt></dd></dl>
+
+<dl><dt><a name="Error-__unicode__"><strong>__unicode__</strong></a>(...)</dt></dl>
+
+<hr>
+Data descriptors inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+</dl>
+<dl><dt><strong>args</strong></dt>
+</dl>
+<dl><dt><strong>message</strong></dt>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="FlowThreeLegged">class <strong>FlowThreeLegged</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt>Does the Three Legged Dance for OAuth 1.0a.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="FlowThreeLegged-__init__"><strong>__init__</strong></a>(self, discovery, consumer_key, consumer_secret, user_agent, **kwargs)</dt><dd><tt>discovery - Section of the API discovery document that describes<br>
+ the OAuth endpoints.<br>
+consumer_key - OAuth consumer key<br>
+consumer_secret - OAuth consumer secret<br>
+user_agent - The HTTP User-Agent that identifies the application.<br>
+**kwargs - The keyword arguments are all optional and required<br>
+ parameters for the OAuth calls.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLegged-step1_get_authorize_url"><strong>step1_get_authorize_url</strong></a>(self, oauth_callback<font color="#909090">='oob'</font>)</dt><dd><tt>Returns a URI to redirect to the provider.<br>
+ <br>
+oauth_callback - Either the string 'oob' for a non-web-based application,<br>
+ or a URI that handles the callback from the authorization<br>
+ server.<br>
+ <br>
+If oauth_callback is 'oob' then pass in the<br>
+generated verification code to step2_exchange,<br>
+otherwise pass in the query parameters received<br>
+at the callback uri to step2_exchange.</tt></dd></dl>
+
+<dl><dt><a name="FlowThreeLegged-step2_exchange"><strong>step2_exchange</strong></a>(self, verifier)</dt><dd><tt>Exhanges an authorized request token<br>
+for <a href="#OAuthCredentials">OAuthCredentials</a>.<br>
+ <br>
+verifier - either the verifier token, or a dictionary<br>
+ of the query parameters to the callback, which contains<br>
+ the oauth_verifier.</tt></dd></dl>
+
+<hr>
+Data descriptors defined here:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="MissingParameter">class <strong>MissingParameter</strong></a>(<a href="apiclient.oauth.html#Error">Error</a>)</font></td></tr>
+
+<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.oauth.html#MissingParameter">MissingParameter</a></dd>
+<dd><a href="apiclient.oauth.html#Error">Error</a></dd>
+<dd><a href="exceptions.html#Exception">exceptions.Exception</a></dd>
+<dd><a href="exceptions.html#BaseException">exceptions.BaseException</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Data descriptors inherited from <a href="apiclient.oauth.html#Error">Error</a>:<br>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Methods inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><a name="MissingParameter-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__init__">__init__</a>(...) initializes x; see x.__class__.__doc__ for signature</tt></dd></dl>
+
+<hr>
+Data and other attributes inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><strong>__new__</strong> = <built-in method __new__ of type object><dd><tt>T.<a href="#MissingParameter-__new__">__new__</a>(S, ...) -> a new <a href="__builtin__.html#object">object</a> with type S, a subtype of T</tt></dl>
+
+<hr>
+Methods inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><a name="MissingParameter-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__delattr__">__delattr__</a>('name') <==> del x.name</tt></dd></dl>
+
+<dl><dt><a name="MissingParameter-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__getattribute__">__getattribute__</a>('name') <==> x.name</tt></dd></dl>
+
+<dl><dt><a name="MissingParameter-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__getitem__">__getitem__</a>(y) <==> x[y]</tt></dd></dl>
+
+<dl><dt><a name="MissingParameter-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__getslice__">__getslice__</a>(i, j) <==> x[i:j]<br>
+ <br>
+Use of negative indices is not supported.</tt></dd></dl>
+
+<dl><dt><a name="MissingParameter-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="MissingParameter-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__repr__">__repr__</a>() <==> repr(x)</tt></dd></dl>
+
+<dl><dt><a name="MissingParameter-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__setattr__">__setattr__</a>('name', value) <==> x.name = value</tt></dd></dl>
+
+<dl><dt><a name="MissingParameter-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="MissingParameter-__str__"><strong>__str__</strong></a>(...)</dt><dd><tt>x.<a href="#MissingParameter-__str__">__str__</a>() <==> str(x)</tt></dd></dl>
+
+<dl><dt><a name="MissingParameter-__unicode__"><strong>__unicode__</strong></a>(...)</dt></dl>
+
+<hr>
+Data descriptors inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+</dl>
+<dl><dt><strong>args</strong></dt>
+</dl>
+<dl><dt><strong>message</strong></dt>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="OAuthCredentials">class <strong>OAuthCredentials</strong></a>(<a href="apiclient.oauth.html#Credentials">Credentials</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt><a href="#Credentials">Credentials</a> <a href="__builtin__.html#object">object</a> for OAuth 1.0a<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.oauth.html#OAuthCredentials">OAuthCredentials</a></dd>
+<dd><a href="apiclient.oauth.html#Credentials">Credentials</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Methods defined here:<br>
+<dl><dt><a name="OAuthCredentials-__init__"><strong>__init__</strong></a>(self, consumer, token, user_agent)</dt><dd><tt>consumer - An instance of oauth.Consumer.<br>
+token - An instance of oauth.Token constructed with<br>
+ the access token and secret.<br>
+user_agent - The HTTP User-Agent to provide for this application.</tt></dd></dl>
+
+<dl><dt><a name="OAuthCredentials-authorize"><strong>authorize</strong></a>(self, http)</dt><dd><tt>Args:<br>
+ http - An instance of httplib2.Http<br>
+ or something that acts like it.<br>
+ <br>
+Returns:<br>
+ A modified instance of http that was passed in.<br>
+ <br>
+Example:<br>
+ <br>
+ h = httplib2.Http()<br>
+ h = credentials.<a href="#OAuthCredentials-authorize">authorize</a>(h)<br>
+ <br>
+You can't create a new OAuth<br>
+subclass of httplib2.Authenication because<br>
+it never gets passed the absolute URI, which is<br>
+needed for signing. So instead we have to overload<br>
+'request' with a closure that adds in the<br>
+Authorization header and then calls the original version<br>
+of 'request()'.</tt></dd></dl>
+
+<hr>
+Data descriptors inherited from <a href="apiclient.oauth.html#Credentials">Credentials</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="RequestError">class <strong>RequestError</strong></a>(<a href="apiclient.oauth.html#Error">Error</a>)</font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
+<td colspan=2><tt><a href="#Error">Error</a> occurred during request.<br> </tt></td></tr>
+<tr><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="apiclient.oauth.html#RequestError">RequestError</a></dd>
+<dd><a href="apiclient.oauth.html#Error">Error</a></dd>
+<dd><a href="exceptions.html#Exception">exceptions.Exception</a></dd>
+<dd><a href="exceptions.html#BaseException">exceptions.BaseException</a></dd>
+<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
+</dl>
+<hr>
+Data descriptors inherited from <a href="apiclient.oauth.html#Error">Error</a>:<br>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Methods inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><a name="RequestError-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__init__">__init__</a>(...) initializes x; see x.__class__.__doc__ for signature</tt></dd></dl>
+
+<hr>
+Data and other attributes inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
+<dl><dt><strong>__new__</strong> = <built-in method __new__ of type object><dd><tt>T.<a href="#RequestError-__new__">__new__</a>(S, ...) -> a new <a href="__builtin__.html#object">object</a> with type S, a subtype of T</tt></dl>
+
+<hr>
+Methods inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><a name="RequestError-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__delattr__">__delattr__</a>('name') <==> del x.name</tt></dd></dl>
+
+<dl><dt><a name="RequestError-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__getattribute__">__getattribute__</a>('name') <==> x.name</tt></dd></dl>
+
+<dl><dt><a name="RequestError-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__getitem__">__getitem__</a>(y) <==> x[y]</tt></dd></dl>
+
+<dl><dt><a name="RequestError-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__getslice__">__getslice__</a>(i, j) <==> x[i:j]<br>
+ <br>
+Use of negative indices is not supported.</tt></dd></dl>
+
+<dl><dt><a name="RequestError-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="RequestError-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__repr__">__repr__</a>() <==> repr(x)</tt></dd></dl>
+
+<dl><dt><a name="RequestError-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__setattr__">__setattr__</a>('name', value) <==> x.name = value</tt></dd></dl>
+
+<dl><dt><a name="RequestError-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
+
+<dl><dt><a name="RequestError-__str__"><strong>__str__</strong></a>(...)</dt><dd><tt>x.<a href="#RequestError-__str__">__str__</a>() <==> str(x)</tt></dd></dl>
+
+<dl><dt><a name="RequestError-__unicode__"><strong>__unicode__</strong></a>(...)</dt></dl>
+
+<hr>
+Data descriptors inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+</dl>
+<dl><dt><strong>args</strong></dt>
+</dl>
+<dl><dt><strong>message</strong></dt>
+</dl>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
+<td width="100%"><strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt> </tt></td><td> </td>
+<td width="100%">jcgregorio@google.com (Joe Gregorio)</td></tr></table>
+</body></html>
\ No newline at end of file
diff --git a/docs/build.sh b/docs/build.sh
new file mode 100755
index 0000000..1ea5060
--- /dev/null
+++ b/docs/build.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+# Author: jcgregorio@google.com (Joe Gregorio)
+#
+# Creates the documentation set for the library by
+# running pydoc on all the files in apiclient.
+#
+# Notes: You may have to update the location of the
+# App Engine library for your local system.
+
+set GOOGLE_APPENGINE=$HOME/projects/google_appengine/
+set DJANGO_SETTINGS_MODULE=fakesettings
+set PYTHONPATH=`pwd`/..:$GOOGLE_APPENGINE
+find ../apiclient/ -name "*.py" | sed "s/\/__init__.py//" | sed "s/\.py//" | sed "s/^\.\.\///" | sed "s#/#.#g" | xargs pydoc -w
+
diff --git a/docs/fakesettings.py b/docs/fakesettings.py
new file mode 100644
index 0000000..565d2e5
--- /dev/null
+++ b/docs/fakesettings.py
@@ -0,0 +1,83 @@
+# Django settings for django_sample project.
+import os
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+ # ('Your Name', 'your_email@domain.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'sqlite3'
+DATABASE_NAME = 'database.sqlite3'
+DATABASE_USER = ''
+DATABASE_PASSWORD = ''
+DATABASE_HOST = ''
+DATABASE_PORT = ''
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'America/New_York'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = '_=9hq-$t_uv1ckf&s!y2$9g$1dm*6p1cl%*!^mg=7gr)!zj32d'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+ 'django.template.loaders.filesystem.load_template_source',
+ 'django.template.loaders.app_directories.load_template_source',
+# 'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+)
+
+ROOT_URLCONF = 'django_sample.urls'
+
+TEMPLATE_DIRS = (
+ # Put strings here, like "/home/html/django_templates"
+ # Always use forward slashes, even on Windows.
+ # Don't forget to use absolute paths, not relative paths.
+ os.path.join(os.path.dirname(__file__), 'templates')
+)
+
+INSTALLED_APPS = (
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+ 'django_sample.buzz'
+)
diff --git a/samples/api-python-client-doc/main.py b/samples/api-python-client-doc/main.py
index 366f4b0..d5ae558 100755
--- a/samples/api-python-client-doc/main.py
+++ b/samples/api-python-client-doc/main.py
@@ -28,7 +28,11 @@
from google.appengine.ext.webapp import util
# Replicate render_doc here from pydoc.py as it isn't available in Python 2.5
-class _OldStyleClass: pass
+
+
+class _OldStyleClass:
+ pass
+
def render_doc(thing, title='Python Library Documentation: %s', forceload=0):
"""Render text documentation, given an object or a path to an object."""
@@ -77,7 +81,8 @@
def get(self, service_name, version):
service = build(service_name, version)
- page = "<p><a href='/'>Home</a></p><pre>%s</pre>" % pydoc.plain(render_doc(service))
+ page = "<p><a href='/'>Home</a></p><pre>%s</pre>" % (
+ pydoc.plain(render_doc(service)),)
collections = []
for name in dir(service):
@@ -85,7 +90,8 @@
collections.append(name)
for name in collections:
- page = re.sub('(%s) =' % name, r'<a href="/%s/%s/%s">\1</a> =' % (service_name, version, name), page)
+ page = re.sub('(%s) =' % name, r'<a href="/%s/%s/%s">\1</a> =' % (
+ service_name, version, name), page)
self.response.out.write(page)
@@ -101,16 +107,19 @@
service = getattr(service, method)()
method = getattr(service, path[-1])
obj = method()
- page = "<p><a href='/'>Home</a></p><pre>%s</pre>" % pydoc.plain(render_doc(obj))
+ page = "<p><a href='/'>Home</a></p><pre>%s</pre>" % (
+ pydoc.plain(render_doc(obj)),)
if hasattr(method, '__is_resource__'):
collections = []
for name in dir(obj):
- if not "_" in name and callable(getattr(obj, name)) and hasattr(getattr(obj, name), '__is_resource__'):
+ if not "_" in name and callable(getattr(obj, name)) and hasattr(
+ getattr(obj, name), '__is_resource__'):
collections.append(name)
for name in collections:
- page = re.sub('(%s) =' % name, r'<a href="/%s/%s/%s">\1</a> =' % (service_name, version, collection + "/" + name), page)
+ page = re.sub('(%s) =' % name, r'<a href="/%s/%s/%s">\1</a> =' % (
+ service_name, version, collection + "/" + name), page)
self.response.out.write(page)
diff --git a/samples/buzz/buzz.py b/samples/buzz/buzz.py
index 9cebd79..18bdfb0 100644
--- a/samples/buzz/buzz.py
+++ b/samples/buzz/buzz.py
@@ -20,6 +20,7 @@
# Uncomment the next line to get very detailed logging
#httplib2.debuglevel = 4
+
def main():
f = open("buzz.dat", "r")
credentials = pickle.loads(f.read())
diff --git a/samples/customsearch/main.py b/samples/customsearch/main.py
index d13f53c..105f891 100644
--- a/samples/customsearch/main.py
+++ b/samples/customsearch/main.py
@@ -17,9 +17,10 @@
# Uncomment the next line to get very detailed logging
# httplib2.debuglevel = 4
-def main():
- p = build("customsearch", "v1", developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
+def main():
+ p = build("customsearch", "v1",
+ developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
res = p.cse().list(
q='lectures',
cx='017576662512468239146:omuauf_lfve',
diff --git a/samples/diacritize/main.py b/samples/diacritize/main.py
index e9bee69..1935868 100644
--- a/samples/diacritize/main.py
+++ b/samples/diacritize/main.py
@@ -20,9 +20,10 @@
# Uncomment the next line to get very detailed logging
# httplib2.debuglevel = 4
-def main():
- p = build("diacritize", "v1", developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
+def main():
+ p = build("diacritize", "v1",
+ developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
print p.diacritize().corpus().get(
lang='ar',
last_letter='false',
diff --git a/samples/django_sample/buzz/models.py b/samples/django_sample/buzz/models.py
index 10a83ef..11a408d 100644
--- a/samples/django_sample/buzz/models.py
+++ b/samples/django_sample/buzz/models.py
@@ -8,22 +8,26 @@
from apiclient.ext.django_orm import FlowThreeLeggedField
from apiclient.ext.django_orm import OAuthCredentialsField
-# Create your models here.
-
# The Flow could also be stored in memcache since it is short lived.
+
+
class Flow(models.Model):
id = models.ForeignKey(User, primary_key=True)
flow = FlowThreeLeggedField()
+
class Credential(models.Model):
id = models.ForeignKey(User, primary_key=True)
credential = OAuthCredentialsField()
+
class CredentialAdmin(admin.ModelAdmin):
pass
+
class FlowAdmin(admin.ModelAdmin):
pass
+
admin.site.register(Credential, CredentialAdmin)
admin.site.register(Flow, FlowAdmin)
diff --git a/samples/django_sample/buzz/tests.py b/samples/django_sample/buzz/tests.py
index 2247054..927cadf 100644
--- a/samples/django_sample/buzz/tests.py
+++ b/samples/django_sample/buzz/tests.py
@@ -7,7 +7,9 @@
from django.test import TestCase
+
class SimpleTest(TestCase):
+
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
@@ -20,4 +22,3 @@
>>> 1 + 1 == 2
True
"""}
-
diff --git a/samples/django_sample/buzz/views.py b/samples/django_sample/buzz/views.py
index aeb0ca2..5c5a5d1 100644
--- a/samples/django_sample/buzz/views.py
+++ b/samples/django_sample/buzz/views.py
@@ -11,9 +11,9 @@
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
-print os.environ
STEP2_URI = 'http://localhost:8000/auth_return'
+
@login_required
def index(request):
try:
@@ -45,6 +45,7 @@
f.save()
return HttpResponseRedirect(authorize_url)
+
@login_required
def auth_return(request):
try:
diff --git a/samples/django_sample/settings.py b/samples/django_sample/settings.py
index 834ce1f..565d2e5 100644
--- a/samples/django_sample/settings.py
+++ b/samples/django_sample/settings.py
@@ -10,12 +10,12 @@
MANAGERS = ADMINS
-DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
-DATABASE_NAME = 'database.sqlite3' # Or path to database file if using sqlite3.
-DATABASE_USER = '' # Not used with sqlite3.
-DATABASE_PASSWORD = '' # Not used with sqlite3.
-DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
-DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
+DATABASE_ENGINE = 'sqlite3'
+DATABASE_NAME = 'database.sqlite3'
+DATABASE_USER = ''
+DATABASE_PASSWORD = ''
+DATABASE_HOST = ''
+DATABASE_PORT = ''
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
@@ -67,7 +67,7 @@
ROOT_URLCONF = 'django_sample.urls'
TEMPLATE_DIRS = (
- # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+ # Put strings here, like "/home/html/django_templates"
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(os.path.dirname(__file__), 'templates')
diff --git a/samples/latitude/latitude.py b/samples/latitude/latitude.py
index 492300c..029b74a 100644
--- a/samples/latitude/latitude.py
+++ b/samples/latitude/latitude.py
@@ -20,6 +20,7 @@
# Uncomment to get detailed logging
# httplib2.debuglevel = 4
+
def main():
f = open("latitude.dat", "r")
credentials = pickle.loads(f.read())
@@ -32,11 +33,11 @@
body = {
"data": {
- "kind":"latitude#location",
- "latitude":37.420352,
- "longitude":-122.083389,
- "accuracy":130,
- "altitude":35
+ "kind": "latitude#location",
+ "latitude": 37.420352,
+ "longitude": -122.083389,
+ "accuracy": 130,
+ "altitude": 35
}
}
print p.currentLocation().insert(body=body).execute()
diff --git a/samples/latitude/three_legged_dance.py b/samples/latitude/three_legged_dance.py
index d8d89ba..56f4f59 100644
--- a/samples/latitude/three_legged_dance.py
+++ b/samples/latitude/three_legged_dance.py
@@ -36,10 +36,10 @@
# https://www.google.com/accounts/ManageDomains
consumer_key='REGISTERED DOMAIN NAME',
consumer_secret='KEY GIVEN DURING REGISTRATION',
- user_agent='google-api-client-python-latitude-cmdline/1.0',
+ user_agent='google-api-client-python-latitude/1.0',
domain='REGISTERED DOMAIN NAME',
scope='https://www.googleapis.com/auth/latitude',
- xoauth_displayname='Google API Latitude Client Example App',
+ xoauth_displayname='Google API Latitude Example',
location='current',
granularity='city'
)
diff --git a/samples/local/main.py b/samples/local/main.py
index 7c62fef..472ac5a 100644
--- a/samples/local/main.py
+++ b/samples/local/main.py
@@ -22,9 +22,10 @@
import pickle
import pprint
-DISCOVERY_URI = ('http://gregorio-ub.i:3990/discovery/v0.2beta1/describe/'
+DISCOVERY_URI = ('http://localhost:3990/discovery/v0.2beta1/describe/'
'{api}/{apiVersion}')
+
def main():
http = httplib2.Http()
diff --git a/samples/moderator/moderator.py b/samples/moderator/moderator.py
index da8d344..89ec9ca 100644
--- a/samples/moderator/moderator.py
+++ b/samples/moderator/moderator.py
@@ -20,6 +20,7 @@
# Uncomment to get detailed logging
# httplib2.debuglevel = 4
+
def main():
f = open("moderator.dat", "r")
credentials = pickle.loads(f.read())
@@ -32,7 +33,7 @@
series_body = {
"data": {
- "description": "Share and rank tips for eating healthily on the cheaps!",
+ "description": "Share and rank tips for eating healthy and cheap!",
"name": "Eating Healthy & Cheap",
"videoSubmissionAllowed": False
}
@@ -47,7 +48,8 @@
"presenter": "liz"
}
}
- topic = p.topics().insert(seriesId=series['id']['seriesId'], body=topic_body).execute()
+ topic = p.topics().insert(seriesId=series['id']['seriesId'],
+ body=topic_body).execute()
print "Created a new topic"
submission_body = {
@@ -69,7 +71,9 @@
"vote": "PLUS"
}
}
- p.votes().insert(seriesId=topic['id']['seriesId'], submissionId=submission['id']['submissionId'], body=vote_body)
+ p.votes().insert(seriesId=topic['id']['seriesId'],
+ submissionId=submission['id']['submissionId'],
+ body=vote_body)
print "Voted on the submission"
diff --git a/samples/threadqueue/main.py b/samples/threadqueue/main.py
index 1b3b6af..4e5c511 100644
--- a/samples/threadqueue/main.py
+++ b/samples/threadqueue/main.py
@@ -22,6 +22,7 @@
Implements an exponential backoff algorithm.
"""
+
def __init__(self, maxretries=8):
self.retry = 0
self.maxretries = maxretries
@@ -36,7 +37,7 @@
def fail(self):
self.retry += 1
- delay = 2**self.retry
+ delay = 2 ** self.retry
time.sleep(delay)
@@ -67,8 +68,8 @@
t.daemon = True
t.start()
-def main():
+def main():
f = open("moderator.dat", "r")
credentials = pickle.loads(f.read())
f.close()
@@ -98,7 +99,8 @@
"presenter": "me"
}
}
- topic_request = p.topics().insert(seriesId=series['id']['seriesId'], body=topic_body)
+ topic_request = p.topics().insert(seriesId=series['id']['seriesId'],
+ body=topic_body)
print "Adding request to queue"
queue.put(topic_request)
diff --git a/samples/threadqueue/three_legged_dance.py b/samples/threadqueue/three_legged_dance.py
index 97f4d11..b833e3a 100644
--- a/samples/threadqueue/three_legged_dance.py
+++ b/samples/threadqueue/three_legged_dance.py
@@ -32,7 +32,7 @@
flow = FlowThreeLegged(moderator_discovery,
consumer_key='anonymous',
consumer_secret='anonymous',
- user_agent='google-api-client-python-threadqueue-sample/1.0',
+ user_agent='google-api-client-python-thread-sample/1.0',
domain='anonymous',
scope='https://www.googleapis.com/auth/moderator',
#scope='tag:google.com,2010:auth/moderator',
diff --git a/samples/translate/main.py b/samples/translate/main.py
index cf0e4e7..24f0648 100644
--- a/samples/translate/main.py
+++ b/samples/translate/main.py
@@ -18,9 +18,11 @@
# Uncomment the next line to get very detailed logging
# httplib2.debuglevel = 4
+
def main():
- p = build("translate", "v2", developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
+ p = build("translate", "v2",
+ developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
print p.translations().list(
source="en",
target="fr",
diff --git a/setup.py b/setup.py
index a34514f..dac0ce4 100644
--- a/setup.py
+++ b/setup.py
@@ -37,7 +37,7 @@
else:
print 'Loaded setuptools'
-long_desc = """The Google API Client for Python is a client library for
+long_desc = """The Google API Client for Python is a client library for
accessing the Buzz, Moderator, and Latitude APIs."""
setup(name="google-api-python-client",
diff --git a/tests/test_discovery.py b/tests/test_discovery.py
index 7d52b3d..44dbd6a 100644
--- a/tests/test_discovery.py
+++ b/tests/test_discovery.py
@@ -32,20 +32,7 @@
from cgi import parse_qs
from apiclient.discovery import build, key2param
-
-DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
-
-
-class HttpMock(object):
-
- def __init__(self, filename, headers):
- f = file(os.path.join(DATA_DIR, filename), 'r')
- self.data = f.read()
- f.close()
- self.headers = headers
-
- def request(self, uri, method="GET", body=None, headers=None, redirections=1, connection_type=None):
- return httplib2.Response(self.headers), self.data
+from tests.util import HttpMock
class Utilities(unittest.TestCase):
diff --git a/tests/test_mocks.py b/tests/test_mocks.py
new file mode 100644
index 0000000..3216a06
--- /dev/null
+++ b/tests/test_mocks.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python2.4
+#
+# Copyright 2010 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Mock tests
+
+Unit tests for the Mocks.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+from apiclient.discovery import HttpError
+from apiclient.discovery import build
+from apiclient.http import RequestMockBuilder
+from tests.util import HttpMock
+
+import unittest
+import httplib2
+
+
+class Mocks(unittest.TestCase):
+ def setUp(self):
+ self.http = HttpMock('buzz.json', {'status': '200'})
+
+ def test_default_response(self):
+ requestBuilder = RequestMockBuilder({})
+ buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+ activity = buzz.activities().get(postId='tag:blah', userId='@me').execute()
+ self.assertEqual({}, activity)
+
+ def test_simple_response(self):
+ requestBuilder = RequestMockBuilder({
+ 'chili.activities.get': (None, '{"data": {"foo": "bar"}}')
+ })
+ buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+
+ activity = buzz.activities().get(postId='tag:blah', userId='@me').execute()
+ self.assertEqual({"foo": "bar"}, activity)
+
+
+ def test_errors(self):
+ errorResponse = httplib2.Response({'status': 500, 'reason': 'Server Error'})
+ requestBuilder = RequestMockBuilder({
+ 'chili.activities.list': (errorResponse, '{}')
+ })
+ buzz = build('buzz', 'v1', http=self.http, requestBuilder=requestBuilder)
+
+ try:
+ activity = buzz.activities().list(scope='@self', userId='@me').execute()
+ self.fail('An exception should have been thrown')
+ except HttpError, e:
+ self.assertEqual('500 Server Error', e.detail)
+ self.assertEqual(500, e.resp.status)
+ self.assertEqual('Server Error', e.resp.reason)
+
+
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/util.py b/tests/util.py
new file mode 100644
index 0000000..101079f
--- /dev/null
+++ b/tests/util.py
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.4
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+"""One-line documentation for util module.
+
+A detailed description of util.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+import httplib2
+import os
+
+DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
+
+
+class HttpMock(object):
+
+ def __init__(self, filename, headers):
+ f = file(os.path.join(DATA_DIR, filename), 'r')
+ self.data = f.read()
+ f.close()
+ self.headers = headers
+
+ def request(self, uri, method="GET", body=None, headers=None, redirections=1, connection_type=None):
+ return httplib2.Response(self.headers), self.data