Add in the abilitiy to run from a local static (as opposed to cached) discovery document. Also added sample for same.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index fb9b7c5..b39e1b2 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -83,17 +83,48 @@
serviceName, "future.json")
try:
f = file(fn, "r")
- d = simplejson.load(f)
+ future = f.read()
f.close()
- future = d['resources']
- auth_discovery = d['auth']
except IOError:
+ future = None
+
+ return build_from_document(content, discoveryServiceUrl, future,
+ http, developerKey, model, requestBuilder)
+
+def build_from_document(
+ service,
+ base,
+ future=None,
+ http=None,
+ developerKey=None,
+ model=JsonModel(),
+ requestBuilder=HttpRequest):
+ """
+ Args:
+ service: string, discovery document
+ base: string, base URI for all HTTP requests, usually the discovery URI
+ future: string, discovery document with future capabilities
+ auth_discovery: dict, information about the authentication the API supports
+ http: httplib2.Http, An instance of httplib2.Http or something that acts like
+ it that HTTP requests will be made through.
+ developerKey: string, Key for controlling API usage, generated
+ from the API Console.
+ model: Model class instance that serializes and
+ de-serializes requests and responses.
+ requestBuilder: Takes an http request and packages it up to be executed.
+ """
+
+ service = simplejson.loads(service)
+ base = urlparse.urljoin(base, service['restBasePath'])
+ resources = service['resources']
+ if future:
+ doc = simplejson.loads(future)
+ future = doc['resources']
+ auth_discovery = doc.get('auth', {})
+ else:
future = {}
auth_discovery = {}
- base = urlparse.urljoin(discoveryServiceUrl, service['restBasePath'])
- resources = service['resources']
-
class Service(object):
"""Top level interface for a service"""
diff --git a/samples/localdiscovery/buzz.json b/samples/localdiscovery/buzz.json
new file mode 100644
index 0000000..083d086
--- /dev/null
+++ b/samples/localdiscovery/buzz.json
@@ -0,0 +1,1429 @@
+{
+ "name": "buzz",
+ "version": "v1",
+ "description": "Buzz APIs for Buzz Posts, etc.",
+ "restBasePath": "/buzz/v1/",
+ "rpcPath": "/rpc",
+ "resources": {
+ "activities": {
+ "methods": {
+ "count": {
+ "restPath": "activities/count",
+ "rpcMethod": "chili.activities.count",
+ "httpMethod": "GET",
+ "parameters": {
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ }
+ }
+ },
+ "delete": {
+ "restPath": "activities/{userId}/{scope}/{postId}",
+ "rpcMethod": "chili.activities.delete",
+ "httpMethod": "DELETE",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "extractPeopleFromSearch": {
+ "restPath": "activities/search/@people",
+ "rpcMethod": "chili.activities.extractPeopleFromSearch",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "bbox": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "lat": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "lon": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "pid": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "q": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "radius": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ }
+ }
+ },
+ "get": {
+ "restPath": "activities/{userId}/@self/{postId}",
+ "rpcMethod": "chili.activities.get",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "targetLang": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "truncateAtom": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "insert": {
+ "restPath": "activities/{userId}/@self",
+ "rpcMethod": "chili.activities.insert",
+ "httpMethod": "POST",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "preview": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "list": {
+ "restPath": "activities/{userId}/{scope}",
+ "rpcMethod": "chili.activities.list",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-comments": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-liked": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@(self|public|consumption|liked|comments)*",
+ "required": true,
+ "repeated": false
+ },
+ "targetLang": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "truncateAtom": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "search": {
+ "restPath": "activities/search",
+ "rpcMethod": "chili.activities.search",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "bbox": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "lat": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "lon": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "pid": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "q": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "radius": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "targetLang": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "truncateAtom": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ }
+ }
+ },
+ "track": {
+ "restPath": "activities/track",
+ "rpcMethod": "chili.activities.track",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "bbox": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "lat": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "lon": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "pid": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "q": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "radius": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ }
+ }
+ },
+ "update": {
+ "restPath": "activities/{userId}/{scope}/{postId}",
+ "rpcMethod": "chili.activities.update",
+ "httpMethod": "PUT",
+ "parameters": {
+ "abuseType": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ }
+ }
+ },
+ "comments": {
+ "methods": {
+ "delete": {
+ "restPath": "activities/{userId}/@self/{postId}/@comments/{commentId}",
+ "rpcMethod": "chili.comments.delete",
+ "httpMethod": "DELETE",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "commentId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "get": {
+ "restPath": "activities/{userId}/@self/{postId}/@comments/{commentId}",
+ "rpcMethod": "chili.comments.get",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "commentId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "targetLang": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "insert": {
+ "restPath": "activities/{userId}/@self/{postId}/@comments",
+ "rpcMethod": "chili.comments.insert",
+ "httpMethod": "POST",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "list": {
+ "restPath": "activities/{userId}/{scope}/{postId}/@comments",
+ "rpcMethod": "chili.comments.list",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "targetLang": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "update": {
+ "restPath": "activities/{userId}/{scope}/{postId}/@comments/{commentId}",
+ "rpcMethod": "chili.comments.update",
+ "httpMethod": "PUT",
+ "parameters": {
+ "abuseType": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "commentId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ }
+ }
+ },
+ "groups": {
+ "methods": {
+ "delete": {
+ "restPath": "people/{userId}/@groups/{groupId}",
+ "rpcMethod": "chili.groups.delete",
+ "httpMethod": "DELETE",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "get": {
+ "restPath": "people/{userId}/@groups/{groupId}/@self",
+ "rpcMethod": "chili.groups.get",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "insert": {
+ "restPath": "people/{userId}/@groups",
+ "rpcMethod": "chili.groups.insert",
+ "httpMethod": "POST",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "list": {
+ "restPath": "people/{userId}/@groups",
+ "rpcMethod": "chili.groups.list",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "update": {
+ "restPath": "people/{userId}/@groups/{groupId}/@self",
+ "rpcMethod": "chili.groups.update",
+ "httpMethod": "PUT",
+ "parameters": {
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ }
+ }
+ },
+ "people": {
+ "methods": {
+ "delete": {
+ "restPath": "people/{userId}/@groups/{groupId}/{personId}",
+ "rpcMethod": "chili.people.delete",
+ "httpMethod": "DELETE",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "personId": {
+ "restParameterType": "path",
+ "pattern": "(?!@self).*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "get": {
+ "restPath": "people/{userId}/@self",
+ "rpcMethod": "chili.people.get",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "liked": {
+ "restPath": "activities/{userId}/{scope}/{postId}/{groupId}",
+ "rpcMethod": "chili.people.liked",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "@liked",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "list": {
+ "restPath": "people/{userId}/@groups/{groupId}",
+ "rpcMethod": "chili.people.list",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "relatedToUri": {
+ "restPath": "people/{userId}/@related",
+ "rpcMethod": "chili.people.relatedToUri",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "uri": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "reshared": {
+ "restPath": "activities/{userId}/{scope}/{postId}/{groupId}",
+ "rpcMethod": "chili.people.reshared",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "@reshared",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "search": {
+ "restPath": "people/search",
+ "rpcMethod": "chili.people.search",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "q": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ }
+ }
+ },
+ "update": {
+ "restPath": "people/{userId}/@groups/{groupId}/{personId}",
+ "rpcMethod": "chili.people.update",
+ "httpMethod": "PUT",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "groupId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "personId": {
+ "restParameterType": "path",
+ "pattern": "(?!@self).*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ }
+ }
+ },
+ "photoAlbums": {
+ "methods": {
+ "delete": {
+ "restPath": "photos/{userId}/@self/{albumId}",
+ "rpcMethod": "chili.photoAlbums.delete",
+ "httpMethod": "DELETE",
+ "parameters": {
+ "albumId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "get": {
+ "restPath": "photos/{userId}/@self/{albumId}",
+ "rpcMethod": "chili.photoAlbums.get",
+ "httpMethod": "GET",
+ "parameters": {
+ "albumId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "insert": {
+ "restPath": "photos/{userId}/@self",
+ "rpcMethod": "chili.photoAlbums.insert",
+ "httpMethod": "POST",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "list": {
+ "restPath": "photos/{userId}/{scope}",
+ "rpcMethod": "chili.photoAlbums.list",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@(self)*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ }
+ }
+ },
+ "photos": {
+ "methods": {
+ "delete": {
+ "restPath": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
+ "rpcMethod": "chili.photos.delete",
+ "httpMethod": "DELETE",
+ "parameters": {
+ "albumId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "photoId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "get": {
+ "restPath": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
+ "rpcMethod": "chili.photos.get",
+ "httpMethod": "GET",
+ "parameters": {
+ "albumId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "photoId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "insert": {
+ "restPath": "photos/{userId}/{albumId}",
+ "rpcMethod": "chili.photos.insert",
+ "httpMethod": "POST",
+ "parameters": {
+ "albumId": {
+ "restParameterType": "path",
+ "pattern": "(@new|[^@].*)",
+ "required": true,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "insert2": {
+ "restPath": "photos/{userId}/@self/{albumId}/@photos",
+ "rpcMethod": "chili.photos.insert2",
+ "httpMethod": "GET",
+ "parameters": {
+ "albumId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "listByAlbum": {
+ "restPath": "photos/{userId}/@self/{albumId}/@photos",
+ "rpcMethod": "chili.photos.listByAlbum",
+ "httpMethod": "GET",
+ "parameters": {
+ "albumId": {
+ "restParameterType": "path",
+ "pattern": "[^@].*",
+ "required": true,
+ "repeated": false
+ },
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ },
+ "listByScope": {
+ "restPath": "photos/{userId}/@self/{scope}/@photos",
+ "rpcMethod": "chili.photos.listByScope",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ }
+ }
+ },
+ "related": {
+ "methods": {
+ "list": {
+ "restPath": "activities/{userId}/{scope}/{postId}/@related",
+ "rpcMethod": "chili.related.list",
+ "httpMethod": "GET",
+ "parameters": {
+ "alt": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "c": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "hl": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "max-results": {
+ "restParameterType": "query",
+ "required": false,
+ "repeated": false
+ },
+ "postId": {
+ "restParameterType": "path",
+ "pattern": ".*",
+ "required": true,
+ "repeated": false
+ },
+ "scope": {
+ "restParameterType": "path",
+ "pattern": "@.*",
+ "required": true,
+ "repeated": false
+ },
+ "userId": {
+ "restParameterType": "path",
+ "pattern": "[^/]+",
+ "required": true,
+ "repeated": false
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/samples/localdiscovery/buzz.py b/samples/localdiscovery/buzz.py
new file mode 100644
index 0000000..416f58c
--- /dev/null
+++ b/samples/localdiscovery/buzz.py
@@ -0,0 +1,90 @@
+#!/usr/bin/python2.4
+# -*- coding: utf-8 -*-
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+"""Simple command-line example for Buzz.
+
+Command-line application that retrieves the users
+latest content and then adds a new entry.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+from apiclient.discovery import build_from_document
+
+import httplib2
+import pickle
+import pprint
+
+# Uncomment the next line to get very detailed logging
+#httplib2.debuglevel = 4
+
+
+def main():
+ # Load the credentials and authorize
+ f = open("buzz.dat", "r")
+ credentials = pickle.loads(f.read())
+ f.close()
+
+ http = httplib2.Http()
+ http = credentials.authorize(http)
+
+ # Load the local copy of the discovery document
+ f = file("buzz.json", "r")
+ discovery = f.read()
+ f.close()
+
+ # Optionally load a futures discovery document
+ f = file("../../apiclient/contrib/buzz/future.json", "r")
+ future = f.read()
+ f.close()
+
+ # Construct a service from the local documents
+ p = build_from_document(discovery,
+ base="https://www.googleapis.com/",
+ future=future,
+ http=http,
+ developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
+ activities = p.activities()
+
+ # Retrieve the first two activities
+ activitylist = activities.list(
+ max_results='2', scope='@self', userId='@me').execute()
+ print "Retrieved the first two activities"
+
+ # Retrieve the next two activities
+ if activitylist:
+ activitylist = activities.list_next(activitylist).execute()
+ print "Retrieved the next two activities"
+
+ # Add a new activity
+ new_activity_body = {
+ "data": {
+ 'title': 'Testing insert',
+ 'object': {
+ 'content': u'Just a short note to show that insert is working. ☄',
+ 'type': 'note'}
+ }
+ }
+ activity = activities.insert(userId='@me', body=new_activity_body).execute()
+ print "Added a new activity"
+
+ activitylist = activities.list(
+ max_results='2', scope='@self', userId='@me').execute()
+
+ # Add a comment to that activity
+ comment_body = {
+ "data": {
+ "content": "This is a comment"
+ }
+ }
+ item = activitylist['items'][0]
+ comment = p.comments().insert(
+ userId=item['actor']['id'], postId=item['id'], body=comment_body
+ ).execute()
+ print 'Added a comment to the new activity'
+ pprint.pprint(comment)
+
+if __name__ == '__main__':
+ main()
diff --git a/samples/localdiscovery/three_legged_dance.py b/samples/localdiscovery/three_legged_dance.py
new file mode 100644
index 0000000..2dc26e5
--- /dev/null
+++ b/samples/localdiscovery/three_legged_dance.py
@@ -0,0 +1,40 @@
+# Copyright (C) 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.
+
+"""Do the OAuth 1.0a three legged dance.
+
+Do the OAuth 1.0a three legged dance for
+a Buzz command line application. Store the generated
+credentials in a common file that is used by
+other example apps in the same directory.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+from apiclient.discovery import build
+from apiclient.oauth import FlowThreeLegged
+from apiclient.ext.authtools import run
+
+
+buzz_discovery = build("buzz", "v1").auth_discovery()
+
+flow = FlowThreeLegged(buzz_discovery,
+ consumer_key='anonymous',
+ consumer_secret='anonymous',
+ user_agent='google-api-client-python-buzz-cmdline/1.0',
+ domain='anonymous',
+ scope='https://www.googleapis.com/auth/buzz',
+ xoauth_displayname='Google API Client Example App')
+
+run(flow, 'buzz.dat')