diff --git a/Makefile b/Makefile index 9825ad9..debf9c3 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,5 @@ pep8: find apiclient samples -name "*.py" | xargs pep8 --ignore=E111,E202 + +test: + python runtests.py diff --git a/apiclient/discovery.py b/apiclient/discovery.py index 7d884af..93133a8 100644 --- a/apiclient/discovery.py +++ b/apiclient/discovery.py @@ -80,12 +80,12 @@ class JsonModel(object): def request(self, headers, params): model = params.get('body', None) query = '?alt=json&prettyprint=true' - headers['Accept'] = 'application/json' + headers['accept'] = 'application/json' if model == None: return (headers, params, query, None) else: model = {'data': model} - headers['Content-Type'] = 'application/json' + headers['content-type'] = 'application/json' del params['body'] return (headers, params, query, simplejson.dumps(model)) @@ -176,7 +176,7 @@ def createResource(http, baseUrl, model, resourceName, resourceDesc): for name, regex in pattern.iteritems(): if name in kwargs: if re.match(regex, kwargs[name]) is None: - raise TypeError('Parameter "%s" value "%s" does match the pattern "%s"' % (name, kwargs[name], regex)) + raise TypeError('Parameter "%s" value "%s" does not match the pattern "%s"' % (name, kwargs[name], regex)) params = {} for key, value in kwargs.iteritems(): diff --git a/tests/data/buzz.json b/tests/data/buzz.json new file mode 100644 index 0000000..0b25911 --- /dev/null +++ b/tests/data/buzz.json @@ -0,0 +1,988 @@ +{ + "data": { + "buzz": { + "v1": { + "baseUrl": "https://www.googleapis.com/", + "resources": { + "photos": { + "methods": { + "insert": { + "pathUrl": "buzz/v1/photos/{userId}/{albumId}", + "rpcName": "buzz.photos.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "albumId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "resource": { + "parameterType": "query", + "required": false + }, + "hl": { + "parameterType": "query", + "required": false + } + } + } + } + }, + "feeds": { + "methods": { + "insert": { + "pathUrl": "buzz/v1/feeds/{userId}/@self", + "rpcName": "buzz.feeds.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "update": { + "pathUrl": "buzz/v1/feeds/{userId}/@self/{siteId}", + "rpcName": "buzz.feeds.update", + "httpMethod": "PUT", + "methodType": "rest", + "parameters": { + "siteId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "list": { + "pathUrl": "buzz/v1/feeds/{userId}/{scope}", + "rpcName": "buzz.feeds.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "scope": { + "parameterType": "path", + "pattern": "@.*", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "delete": { + "pathUrl": "buzz/v1/feeds/{userId}/@self/{siteId}", + "rpcName": "buzz.feeds.delete", + "httpMethod": "DELETE", + "methodType": "rest", + "parameters": { + "siteId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + } + } + }, + "search": { + "methods": { + "extractPeople": { + "pathUrl": "buzz/v1/activities/search/@people", + "rpcName": "buzz.activities.search.extractPeople", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "lon": { + "parameterType": "query", + "required": false + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "bbox": { + "parameterType": "query", + "required": false + }, + "q": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "pid": { + "parameterType": "query", + "required": false + }, + "radius": { + "parameterType": "query", + "required": false + }, + "lat": { + "parameterType": "query", + "required": false + }, + "hl": { + "parameterType": "query", + "required": false + } + } + } + } + }, + "activities": { + "methods": { + "update": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}/{postId}", + "rpcName": "buzz.activities.update", + "httpMethod": "PUT", + "methodType": "rest", + "parameters": { + "scope": { + "parameterType": "path", + "pattern": "@.*", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + }, + "abuseType": { + "parameterType": "query", + "required": false + } + } + }, + "delete": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}/{postId}", + "rpcName": "buzz.activities.delete", + "httpMethod": "DELETE", + "methodType": "rest", + "parameters": { + "scope": { + "parameterType": "path", + "pattern": "@.*", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "insert": { + "pathUrl": "buzz/v1/activities/{userId}/@self", + "rpcName": "buzz.activities.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "preview": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "resource": { + "parameterType": "query", + "required": false + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "list": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}", + "rpcName": "buzz.activities.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "max-comments": { + "parameterType": "query", + "required": false + }, + "scope": { + "parameterType": "path", + "pattern": "@(self|public|consumption|liked|comments)*", + "required": true + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "max-liked": { + "parameterType": "query", + "required": false + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "get": { + "pathUrl": "buzz/v1/activities/{userId}/@self/{postId}", + "rpcName": "buzz.activities.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "search": { + "pathUrl": "buzz/v1/activities/search", + "rpcName": "buzz.activities.search", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "lon": { + "parameterType": "query", + "required": false + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "bbox": { + "parameterType": "query", + "required": false + }, + "q": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "pid": { + "parameterType": "query", + "required": false + }, + "radius": { + "parameterType": "query", + "required": false + }, + "lat": { + "parameterType": "query", + "required": false + }, + "hl": { + "parameterType": "query", + "required": false + } + } + } + } + }, + "people": { + "methods": { + "get": { + "pathUrl": "buzz/v1/people/{userId}/@self", + "rpcName": "buzz.people.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "search": { + "pathUrl": "buzz/v1/people/search", + "rpcName": "buzz.people.search", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "q": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "list": { + "pathUrl": "buzz/v1/people/{userId}/@groups/{groupId}", + "rpcName": "buzz.people.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "reshared": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}/{postId}/{groupId}", + "rpcName": "buzz.people.reshared", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "@reshared", + "required": true + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "delete": { + "pathUrl": "buzz/v1/people/{userId}/@groups/{groupId}/{personId}", + "rpcName": "buzz.people.delete", + "httpMethod": "DELETE", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "personId": { + "parameterType": "path", + "pattern": "(?!@self).*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "update": { + "pathUrl": "buzz/v1/people/{userId}/@groups/{groupId}/{personId}", + "rpcName": "buzz.people.update", + "httpMethod": "PUT", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "personId": { + "parameterType": "path", + "pattern": "(?!@self).*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "liked": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}/{postId}/{groupId}", + "rpcName": "buzz.people.liked", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "@liked", + "required": true + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + } + } + }, + "groups": { + "methods": { + "get": { + "pathUrl": "buzz/v1/people/{userId}/@groups/{groupId}/@self", + "rpcName": "buzz.groups.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "list": { + "pathUrl": "buzz/v1/people/{userId}/@groups", + "rpcName": "buzz.groups.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "delete": { + "pathUrl": "buzz/v1/people/{userId}/@groups/{groupId}", + "rpcName": "buzz.groups.delete", + "httpMethod": "DELETE", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "insert": { + "pathUrl": "buzz/v1/people/{userId}/@groups", + "rpcName": "buzz.groups.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "update": { + "pathUrl": "buzz/v1/people/{userId}/@groups/{groupId}/@self", + "rpcName": "buzz.groups.update", + "httpMethod": "PUT", + "methodType": "rest", + "parameters": { + "groupId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + } + } + }, + "comments": { + "methods": { + "update": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}/{postId}/@comments/{commentId}", + "rpcName": "buzz.comments.update", + "httpMethod": "PUT", + "methodType": "rest", + "parameters": { + "scope": { + "parameterType": "path", + "pattern": "@.*", + "required": true + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "commentId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + }, + "abuseType": { + "parameterType": "query", + "required": false + } + } + }, + "list": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}/{postId}/@comments", + "rpcName": "buzz.comments.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "scope": { + "parameterType": "path", + "pattern": "@.*", + "required": true + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "delete": { + "pathUrl": "buzz/v1/activities/{userId}/@self/{postId}/@comments/{commentId}", + "rpcName": "buzz.comments.delete", + "httpMethod": "DELETE", + "methodType": "rest", + "parameters": { + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "commentId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "insert": { + "pathUrl": "buzz/v1/activities/{userId}/@self/{postId}/@comments", + "rpcName": "buzz.comments.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + }, + "get": { + "pathUrl": "buzz/v1/activities/{userId}/@self/{postId}/@comments/{commentId}", + "rpcName": "buzz.comments.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "commentId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + } + } + } + } + }, + "related": { + "methods": { + "list": { + "pathUrl": "buzz/v1/activities/{userId}/{scope}/{postId}/@related", + "rpcName": "buzz.related.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "scope": { + "parameterType": "path", + "pattern": "@.*", + "required": true + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "c": { + "parameterType": "query", + "required": false + }, + "alt": { + "parameterType": "query", + "required": false + }, + "userId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "hl": { + "parameterType": "query", + "required": false + }, + "postId": { + "parameterType": "path", + "pattern": ".*", + "required": true + } + } + } + } + } + } + } + } + } +} diff --git a/tests/data/latitude.json b/tests/data/latitude.json new file mode 100644 index 0000000..29dc80f --- /dev/null +++ b/tests/data/latitude.json @@ -0,0 +1,103 @@ +{ + "data": { + "latitude": { + "v1": { + "baseUrl": "https://www.googleapis.com/", + "resources": { + "location": { + "methods": { + "insert": { + "pathUrl": "latitude/v1/location", + "rpcName": "latitude.location.insert", + "httpMethod": "POST", + "methodType": "rest" + }, + "list": { + "pathUrl": "latitude/v1/location", + "rpcName": "latitude.location.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "max-time": { + "parameterType": "query", + "required": false + }, + "min-time": { + "parameterType": "query", + "required": false + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "granularity": { + "parameterType": "query", + "required": false + } + } + }, + "get": { + "pathUrl": "latitude/v1/location/{locationId}", + "rpcName": "latitude.location.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "granularity": { + "parameterType": "query", + "required": false + }, + "locationId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "delete": { + "pathUrl": "latitude/v1/location/{locationId}", + "rpcName": "latitude.location.delete", + "httpMethod": "DELETE", + "methodType": "rest", + "parameters": { + "locationId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + } + } + }, + "currentLocation": { + "methods": { + "insert": { + "pathUrl": "latitude/v1/currentLocation", + "rpcName": "latitude.currentLocation.insert", + "httpMethod": "POST", + "methodType": "rest" + }, + "delete": { + "pathUrl": "latitude/v1/currentLocation", + "rpcName": "latitude.currentLocation.delete", + "httpMethod": "DELETE", + "methodType": "rest" + }, + "get": { + "pathUrl": "latitude/v1/currentLocation", + "rpcName": "latitude.currentLocation.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "granularity": { + "parameterType": "query", + "required": false + } + } + } + } + } + } + } + } + } +} diff --git a/tests/data/moderator.json b/tests/data/moderator.json new file mode 100644 index 0000000..3ac3f2c --- /dev/null +++ b/tests/data/moderator.json @@ -0,0 +1,528 @@ +{ + "data": { + "moderator": { + "v1": { + "baseUrl": "https://www.googleapis.com/", + "resources": { + "tags": { + "methods": { + "delete": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}/tags/{tagId}", + "rpcName": "moderator.tags.delete", + "httpMethod": "DELETE", + "methodType": "rest", + "parameters": { + "tagId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}/tags", + "rpcName": "moderator.tags.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "insert": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}/tags", + "rpcName": "moderator.tags.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + } + } + }, + "series": { + "methods": { + "list": { + "pathUrl": "moderator/v1/series/@me/mine", + "rpcName": "moderator.my.series.list", + "httpMethod": "GET", + "methodType": "rest" + }, + "list": { + "pathUrl": "moderator/v1/series", + "rpcName": "moderator.series.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "max-results": { + "parameterType": "query", + "required": false + }, + "start-index": { + "parameterType": "query", + "required": false + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/@me/recent", + "rpcName": "moderator.myrecent.series.list", + "httpMethod": "GET", + "methodType": "rest" + }, + "update": { + "pathUrl": "moderator/v1/series/{seriesId}", + "rpcName": "moderator.series.update", + "httpMethod": "PUT", + "methodType": "rest", + "parameters": { + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "insert": { + "pathUrl": "moderator/v1/series", + "rpcName": "moderator.series.insert", + "httpMethod": "POST", + "methodType": "rest" + }, + "get": { + "pathUrl": "moderator/v1/series/{seriesId}", + "rpcName": "moderator.series.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/featured", + "rpcName": "moderator.featured.series.list", + "httpMethod": "GET", + "methodType": "rest" + } + } + }, + "topics": { + "methods": { + "list": { + "pathUrl": "moderator/v1/series/{seriesId}/topics", + "rpcName": "moderator.topics.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "max-results": { + "parameterType": "query", + "required": false + }, + "start-index": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "insert": { + "pathUrl": "moderator/v1/series/{seriesId}/topics", + "rpcName": "moderator.topics.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "get": { + "pathUrl": "moderator/v1/series/{seriesId}/topics/{topicId}", + "rpcName": "moderator.topics.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "topicId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + } + } + }, + "votes": { + "methods": { + "update": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}/votes/@me", + "rpcName": "moderator.votes.update", + "httpMethod": "PUT", + "methodType": "rest", + "parameters": { + "userId": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/{seriesId}/votes/@me", + "rpcName": "moderator.votes.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "max-results": { + "parameterType": "query", + "required": false + }, + "start-index": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "get": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}/votes/@me", + "rpcName": "moderator.votes.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "userId": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "insert": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}/votes/@me", + "rpcName": "moderator.votes.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + } + } + }, + "submissions": { + "methods": { + "get": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}", + "rpcName": "moderator.submissions.get", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions", + "rpcName": "moderator.series.submissions.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "author": { + "parameterType": "query", + "required": false + }, + "sort": { + "parameterType": "query", + "required": false + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "q": { + "parameterType": "query", + "required": false + }, + "hasAttachmentVideo": { + "parameterType": "query", + "required": false + }, + "start-index": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "insert": { + "pathUrl": "moderator/v1/series/{seriesId}/topics/{topicId}/submissions", + "rpcName": "moderator.submissions.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "topicId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/{seriesId}/topics/{topicId}/submissions", + "rpcName": "moderator.topics.submissions.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "author": { + "parameterType": "query", + "required": false + }, + "hasAttachedVideo": { + "parameterType": "query", + "required": false + }, + "sort": { + "parameterType": "query", + "required": false + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "q": { + "parameterType": "query", + "required": false + }, + "topicId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "start-index": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + } + } + }, + "profiles": { + "methods": { + "get": { + "pathUrl": "moderator/v1/profiles/@me", + "rpcName": "moderator.profiles.get", + "httpMethod": "GET", + "methodType": "rest" + }, + "update": { + "pathUrl": "moderator/v1/profiles/@me", + "rpcName": "moderator.profiles.update", + "httpMethod": "PUT", + "methodType": "rest" + } + } + }, + "responses": { + "methods": { + "insert": { + "pathUrl": "moderator/v1/series/{seriesId}/topics/{topicId}/submissions/{parentSubmissionId}/responses", + "rpcName": "moderator.responses.insert", + "httpMethod": "POST", + "methodType": "rest", + "parameters": { + "parentSubmissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "topicId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/{seriesId}/submissions/{submissionId}/responses", + "rpcName": "moderator.responses.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "author": { + "parameterType": "query", + "required": false + }, + "hasAttachedVideo": { + "parameterType": "query", + "required": false + }, + "sort": { + "parameterType": "query", + "required": false + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "q": { + "parameterType": "query", + "required": false + }, + "start-index": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + }, + "submissionId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + }, + "list": { + "pathUrl": "moderator/v1/series/{seriesId}/responses", + "rpcName": "moderator.series.responses.list", + "httpMethod": "GET", + "methodType": "rest", + "parameters": { + "author": { + "parameterType": "query", + "required": false + }, + "hasAttachedVideo": { + "parameterType": "query", + "required": false + }, + "sort": { + "parameterType": "query", + "required": false + }, + "max-results": { + "parameterType": "query", + "required": false + }, + "q": { + "parameterType": "query", + "required": false + }, + "start-index": { + "parameterType": "query", + "required": false + }, + "seriesId": { + "parameterType": "path", + "pattern": "[^/]+", + "required": true + } + } + } + } + } + } + } + } + } +} diff --git a/tests/test_discovery.py b/tests/test_discovery.py new file mode 100644 index 0000000..a217932 --- /dev/null +++ b/tests/test_discovery.py @@ -0,0 +1,78 @@ +#!/usr/bin/python2.4 +# +# Copyright 2010 Google Inc. All Rights Reserved. + +"""Discovery document tests + +Unit tests for objects created from discovery documents. +""" + +__author__ = 'jcgregorio@google.com (Joe Gregorio)' + +from apiclient.discovery import build +import httplib2 +import os +import unittest + +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 + + +class Discovery(unittest.TestCase): + def test_method_error_checking(self): + self.http = HttpMock('buzz.json', {'status': '200'}) + buzz = build('buzz', 'v1', self.http) + + # Missing required parameters + try: + buzz.activities().list() + self.fail() + except TypeError, e: + self.assertTrue('Missing' in str(e)) + + # Parameter doesn't match regex + try: + buzz.activities().list(scope='@self', userId='') + self.fail() + except TypeError, e: + self.assertTrue('does not match' in str(e)) + + # Parameter doesn't match regex + try: + buzz.activities().list(scope='not@', userId='foo') + self.fail() + except TypeError, e: + self.assertTrue('does not match' in str(e)) + + # Unexpected parameter + try: + buzz.activities().list(flubber=12) + self.fail() + except TypeError, e: + self.assertTrue('unexpected' in str(e)) + + def test_resources(self): + self.http = HttpMock('buzz.json', {'status': '200'}) + buzz = build('buzz', 'v1', self.http) + self.assertTrue(getattr(buzz, 'activities')) + self.assertTrue(getattr(buzz, 'search')) + self.assertTrue(getattr(buzz, 'feeds')) + self.assertTrue(getattr(buzz, 'photos')) + self.assertTrue(getattr(buzz, 'people')) + self.assertTrue(getattr(buzz, 'groups')) + self.assertTrue(getattr(buzz, 'comments')) + self.assertTrue(getattr(buzz, 'related')) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_json_model.py b/tests/test_json_model.py new file mode 100644 index 0000000..477f88d --- /dev/null +++ b/tests/test_json_model.py @@ -0,0 +1,45 @@ +#!/usr/bin/python2.4 +# +# Copyright 2010 Google Inc. All Rights Reserved. + +"""Discovery document tests + +Unit tests for objects created from discovery documents. +""" + +__author__ = 'jcgregorio@google.com (Joe Gregorio)' + +from apiclient.discovery import JsonModel +import os +import unittest + + +class Model(unittest.TestCase): + def test_json_no_body(self): + model = JsonModel() + + headers = {} + params = {} + + headers, params, query, body = model.request(headers, params) + + self.assertEqual(headers['accept'], 'application/json') + self.assertTrue('content-type' not in headers) + self.assertNotEqual(query, '') + self.assertEqual(body, None) + + def test_json_body(self): + model = JsonModel() + + headers = {} + params = {'body': {}} + + headers, params, query, body = model.request(headers, params) + + self.assertEqual(headers['accept'], 'application/json') + self.assertEqual(headers['content-type'], 'application/json') + self.assertNotEqual(query, '') + self.assertEqual(body, '{"data": {}}') + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_oauth.py b/tests/test_oauth.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_pagination.py b/tests/test_pagination.py deleted file mode 100644 index e69de29..0000000