Clean up doc strings and unused imports
This commit is contained in:
		| @@ -14,12 +14,10 @@ | ||||
|  | ||||
| """Client for discovery based APIs | ||||
|  | ||||
| A client library for Google's discovery | ||||
| based APIs. | ||||
| A client library for Google's discovery based APIs. | ||||
| """ | ||||
|  | ||||
| __author__ = 'jcgregorio@google.com (Joe Gregorio)' | ||||
|  | ||||
| __all__ = [ | ||||
|     'build', 'build_from_document' | ||||
|     ] | ||||
| @@ -48,8 +46,9 @@ DISCOVERY_URI = ('https://www.googleapis.com/discovery/v0.2beta1/describe/' | ||||
|  | ||||
|  | ||||
| def key2param(key): | ||||
|   """ | ||||
|   max-results -> max_results | ||||
|   """Converts key names into parameter names. | ||||
|  | ||||
|   For example, converting "max-results" -> "max_results" | ||||
|   """ | ||||
|   result = [] | ||||
|   key = list(key) | ||||
| @@ -106,10 +105,10 @@ def build(serviceName, version, | ||||
|   resp, content = http.request(requested_url) | ||||
|   service = simplejson.loads(content) | ||||
|  | ||||
|   fn = os.path.join(os.path.dirname(__file__), "contrib", | ||||
|       serviceName, "future.json") | ||||
|   fn = os.path.join(os.path.dirname(__file__), 'contrib', | ||||
|       serviceName, 'future.json') | ||||
|   try: | ||||
|     f = file(fn, "r") | ||||
|     f = file(fn, 'r') | ||||
|     future = f.read() | ||||
|     f.close() | ||||
|   except IOError: | ||||
| @@ -275,9 +274,9 @@ def createResource(http, baseUrl, model, requestBuilder, | ||||
|  | ||||
|     docs = ['A description of how to use this function\n\n'] | ||||
|     for arg in argmap.iterkeys(): | ||||
|       required = "" | ||||
|       required = '' | ||||
|       if arg in required_params: | ||||
|         required = " (required)" | ||||
|         required = ' (required)' | ||||
|       docs.append('%s - A parameter%s\n' % (arg, required)) | ||||
|  | ||||
|     setattr(method, '__doc__', ''.join(docs)) | ||||
| @@ -363,7 +362,7 @@ def createResource(http, baseUrl, model, requestBuilder, | ||||
|   if futureDesc and 'methods' in futureDesc: | ||||
|     for methodName, methodDesc in futureDesc['methods'].iteritems(): | ||||
|       if 'next' in methodDesc and methodName in resourceDesc['methods']: | ||||
|         createNextMethod(Resource, methodName + "_next", | ||||
|         createNextMethod(Resource, methodName + '_next', | ||||
|                          resourceDesc['methods'][methodName], | ||||
|                          methodDesc['next']) | ||||
|  | ||||
|   | ||||
| @@ -23,7 +23,7 @@ class HttpRequest(object): | ||||
|   """ | ||||
|  | ||||
|   def __init__(self, http, postproc, uri, | ||||
|                method="GET", | ||||
|                method='GET', | ||||
|                body=None, | ||||
|                headers=None, | ||||
|                methodId=None): | ||||
| @@ -139,7 +139,7 @@ class RequestMockBuilder(object): | ||||
|     """ | ||||
|     self.responses = responses | ||||
|  | ||||
|   def __call__(self, http, postproc, uri, method="GET", body=None, | ||||
|   def __call__(self, http, postproc, uri, method='GET', body=None, | ||||
|                headers=None, methodId=None): | ||||
|     """Implements the callable interface that discovery.build() expects | ||||
|     of requestBuilder, which is to build an object compatible with | ||||
| @@ -169,7 +169,7 @@ class HttpMock(object): | ||||
|     self.headers = headers | ||||
|  | ||||
|   def request(self, uri, | ||||
|               method="GET", | ||||
|               method='GET', | ||||
|               body=None, | ||||
|               headers=None, | ||||
|               redirections=1, | ||||
|   | ||||
| @@ -8,7 +8,6 @@ Utilities for making it easier to work with OAuth. | ||||
| __author__ = 'jcgregorio@google.com (Joe Gregorio)' | ||||
|  | ||||
| import copy | ||||
| import datetime | ||||
| import httplib2 | ||||
| import logging | ||||
| import oauth2 as oauth | ||||
| @@ -18,9 +17,9 @@ import urlparse | ||||
| from anyjson import simplejson | ||||
|  | ||||
| try: | ||||
|     from urlparse import parse_qs, parse_qsl | ||||
|   from urlparse import parse_qsl | ||||
| except ImportError: | ||||
|     from cgi import parse_qs, parse_qsl | ||||
|   from cgi import parse_qsl | ||||
|  | ||||
|  | ||||
| class Error(Exception): | ||||
| @@ -137,7 +136,7 @@ class OAuthCredentials(Credentials): | ||||
|         req = oauth.Request.from_consumer_and_token( | ||||
|             self.consumer, self.token, http_method=method, http_url=uri) | ||||
|         req.sign_request(signer, self.consumer, self.token) | ||||
|         if headers == None: | ||||
|         if headers is None: | ||||
|           headers = {} | ||||
|         headers.update(req.to_header()) | ||||
|         if 'user-agent' in headers: | ||||
| @@ -210,7 +209,7 @@ class FlowThreeLegged(Flow): | ||||
|     resp, content = client.request(uri, 'POST', headers=headers, | ||||
|                                    body=body) | ||||
|     if resp['status'] != '200': | ||||
|       logging.error('Failed to retrieve temporary authorization: %s' % content) | ||||
|       logging.error('Failed to retrieve temporary authorization: %s', content) | ||||
|       raise RequestError('Invalid response %s.' % resp['status']) | ||||
|  | ||||
|     self.request_token = dict(parse_qsl(content)) | ||||
| @@ -247,7 +246,7 @@ class FlowThreeLegged(Flow): | ||||
|     uri = _oauth_uri('access', self.discovery, self.params) | ||||
|     resp, content = client.request(uri, 'POST', headers=headers) | ||||
|     if resp['status'] != '200': | ||||
|       logging.error('Failed to retrieve access token: %s' % content) | ||||
|       logging.error('Failed to retrieve access token: %s', content) | ||||
|       raise RequestError('Invalid response %s.' % resp['status']) | ||||
|  | ||||
|     oauth_params = dict(parse_qsl(content)) | ||||
|   | ||||
| @@ -14,8 +14,7 @@ | ||||
|  | ||||
| """Utilities for Google App Engine | ||||
|  | ||||
| Utilities for making it easier to use OAuth 2.0 | ||||
| on Google App Engine. | ||||
| Utilities for making it easier to use OAuth 2.0 on Google App Engine. | ||||
| """ | ||||
|  | ||||
| __author__ = 'jcgregorio@google.com (Joe Gregorio)' | ||||
| @@ -29,8 +28,9 @@ from client import Storage | ||||
|  | ||||
|  | ||||
| class FlowProperty(db.Property): | ||||
|   """Utility property that allows easy | ||||
|   storage and retreival of an | ||||
|   """App Engine datastore Property for Flow. | ||||
|  | ||||
|   Utility property that allows easy storage and retreival of an | ||||
|   oauth2client.Flow""" | ||||
|  | ||||
|   # Tell what the user type is. | ||||
| @@ -60,8 +60,9 @@ class FlowProperty(db.Property): | ||||
|  | ||||
|  | ||||
| class CredentialsProperty(db.Property): | ||||
|   """Utility property that allows easy | ||||
|   storage and retrieval of | ||||
|   """App Engine datastore Property for Credentials. | ||||
|  | ||||
|   Utility property that allows easy storage and retrieval of | ||||
|   oath2client.Credentials | ||||
|   """ | ||||
|  | ||||
| @@ -109,9 +110,9 @@ class StorageByKeyName(Storage): | ||||
|       key_name: string, key name for the entity that has the credentials | ||||
|       property_name: string, name of the property that is an CredentialsProperty | ||||
|     """ | ||||
|     self.model = model | ||||
|     self.key_name = key_name | ||||
|     self.property_name = property_name | ||||
|     self._model = model | ||||
|     self._key_name = key_name | ||||
|     self._property_name = property_name | ||||
|  | ||||
|   def get(self): | ||||
|     """Retrieve Credential from datastore. | ||||
| @@ -119,8 +120,8 @@ class StorageByKeyName(Storage): | ||||
|     Returns: | ||||
|       oauth2client.Credentials | ||||
|     """ | ||||
|     entity = self.model.get_or_insert(self.key_name) | ||||
|     credential = getattr(entity, self.property_name) | ||||
|     entity = self._model.get_or_insert(self._key_name) | ||||
|     credential = getattr(entity, self._property_name) | ||||
|     if credential and hasattr(credential, 'set_store'): | ||||
|       credential.set_store(self.put) | ||||
|     return credential | ||||
| @@ -131,6 +132,6 @@ class StorageByKeyName(Storage): | ||||
|     Args: | ||||
|       credentials: Credentials, the credentials to store. | ||||
|     """ | ||||
|     entity = self.model.get_or_insert(self.key_name) | ||||
|     setattr(entity, self.property_name, credentials) | ||||
|     entity = self._model.get_or_insert(self._key_name) | ||||
|     setattr(entity, self._property_name, credentials) | ||||
|     entity.put() | ||||
|   | ||||
| @@ -113,12 +113,12 @@ class OAuth2Credentials(Credentials): | ||||
|     the OAuth2WebServerFlow. | ||||
|  | ||||
|     Args: | ||||
|       token_uri: string, URI of token endpoint | ||||
|       client_id: string, client identifier | ||||
|       client_secret: string, client secret | ||||
|       access_token: string, access token | ||||
|       token_expiry: datetime, when the access_token expires | ||||
|       refresh_token: string, refresh token | ||||
|       token_uri: string, URI of token endpoint. | ||||
|       client_id: string, client identifier. | ||||
|       client_secret: string, client secret. | ||||
|       access_token: string, access token. | ||||
|       token_expiry: datetime, when the access_token expires. | ||||
|       refresh_token: string, refresh token. | ||||
|       user_agent: string, The HTTP User-Agent to provide for this application. | ||||
|  | ||||
|  | ||||
| @@ -178,14 +178,16 @@ class OAuth2Credentials(Credentials): | ||||
|         'user-agent': self.user_agent, | ||||
|         'content-type': 'application/x-www-form-urlencoded' | ||||
|     } | ||||
|     resp, content = http_request(self.token_uri, method='POST', body=body, headers=headers) | ||||
|     resp, content = http_request( | ||||
|         self.token_uri, method='POST', body=body, headers=headers) | ||||
|     if resp.status == 200: | ||||
|       # TODO(jcgregorio) Raise an error if loads fails? | ||||
|       d = simplejson.loads(content) | ||||
|       self.access_token = d['access_token'] | ||||
|       self.refresh_token = d.get('refresh_token', self.refresh_token) | ||||
|       if 'expires_in' in d: | ||||
|         self.token_expiry = datetime.timedelta(seconds = int(d['expires_in'])) + datetime.datetime.now() | ||||
|         self.token_expiry = datetime.timedelta( | ||||
|             seconds = int(d['expires_in'])) + datetime.datetime.now() | ||||
|       else: | ||||
|         self.token_expiry = None | ||||
|       if self.store is not None: | ||||
| @@ -195,7 +197,8 @@ class OAuth2Credentials(Credentials): | ||||
|       raise RequestError('Invalid response %s.' % resp['status']) | ||||
|  | ||||
|   def authorize(self, http): | ||||
|     """ | ||||
|     """Authorize an httplib2.Http instance with these credentials. | ||||
|  | ||||
|     Args: | ||||
|        http: An instance of httplib2.Http | ||||
|            or something that acts like it. | ||||
| @@ -232,7 +235,7 @@ class OAuth2Credentials(Credentials): | ||||
|       else: | ||||
|         headers['user-agent'] = self.user_agent | ||||
|       resp, content = request_orig(uri, method, body, headers, | ||||
|                           redirections, connection_type) | ||||
|                                    redirections, connection_type) | ||||
|       if resp.status == 401: | ||||
|         logging.info("Refreshing because we got a 401") | ||||
|         self._refresh(request_orig) | ||||
| @@ -252,18 +255,20 @@ class OAuth2WebServerFlow(Flow): | ||||
|   """ | ||||
|  | ||||
|   def __init__(self, client_id, client_secret, scope, user_agent, | ||||
|       authorization_uri='https://www.google.com/accounts/o8/oauth2/authorization', | ||||
|       auth_uri='https://www.google.com/accounts/o8/oauth2/authorization', | ||||
|       token_uri='https://www.google.com/accounts/o8/oauth2/token', | ||||
|       **kwargs): | ||||
|     """Constructor for OAuth2WebServerFlow | ||||
|  | ||||
|     Args: | ||||
|       client_id: string, client identifier | ||||
|       client_secret: string client secret | ||||
|       scope: string, scope of the credentials being requested | ||||
|       client_id: string, client identifier. | ||||
|       client_secret: string client secret. | ||||
|       scope: string, scope of the credentials being requested. | ||||
|       user_agent: string, HTTP User-Agent to provide for this application. | ||||
|       authorization_uri: string, URI for authorization endpoint | ||||
|       token_uri: string, URI for token endpoint | ||||
|       auth_uri: string, URI for authorization endpoint. For convenience | ||||
|         defaults to Google's endpoints but any OAuth 2.0 provider can be used. | ||||
|       token_uri: string, URI for token endpoint. For convenience | ||||
|         defaults to Google's endpoints but any OAuth 2.0 provider can be used. | ||||
|       **kwargs: dict, The keyword arguments are all optional and required | ||||
|                         parameters for the OAuth calls. | ||||
|     """ | ||||
| @@ -271,7 +276,7 @@ class OAuth2WebServerFlow(Flow): | ||||
|     self.client_secret = client_secret | ||||
|     self.scope = scope | ||||
|     self.user_agent = user_agent | ||||
|     self.authorization_uri = authorization_uri | ||||
|     self.auth_uri = auth_uri | ||||
|     self.token_uri = token_uri | ||||
|     self.params = kwargs | ||||
|     self.redirect_uri = None | ||||
| @@ -298,7 +303,7 @@ class OAuth2WebServerFlow(Flow): | ||||
|       'scope': self.scope, | ||||
|       } | ||||
|     query.update(self.params) | ||||
|     parts = list(urlparse.urlparse(self.authorization_uri)) | ||||
|     parts = list(urlparse.urlparse(self.auth_uri)) | ||||
|     query.update(dict(parse_qsl(parts[4]))) # 4 is the index of the query part | ||||
|     parts[4] = urllib.urlencode(query) | ||||
|     return urlparse.urlunparse(parts) | ||||
| @@ -324,8 +329,8 @@ class OAuth2WebServerFlow(Flow): | ||||
|       'scope': self.scope | ||||
|       }) | ||||
|     headers = { | ||||
|         'user-agent': self.user_agent, | ||||
|         'content-type': 'application/x-www-form-urlencoded' | ||||
|       'user-agent': self.user_agent, | ||||
|       'content-type': 'application/x-www-form-urlencoded' | ||||
|     } | ||||
|     h = httplib2.Http() | ||||
|     resp, content = h.request(self.token_uri, method='POST', body=body, headers=headers) | ||||
| @@ -340,8 +345,8 @@ class OAuth2WebServerFlow(Flow): | ||||
|  | ||||
|       logging.info('Successfully retrieved access token: %s' % content) | ||||
|       return OAuth2Credentials(access_token, self.client_id, self.client_secret, | ||||
|           refresh_token, token_expiry, self.token_uri, | ||||
|           self.user_agent) | ||||
|                                refresh_token, token_expiry, self.token_uri, | ||||
|                                self.user_agent) | ||||
|     else: | ||||
|       logging.error('Failed to retrieve access token: %s' % content) | ||||
|       raise RequestError('Invalid response %s.' % resp['status']) | ||||
|   | ||||
| @@ -1,3 +1,13 @@ | ||||
| # Copyright 2010 Google Inc. All Rights Reserved. | ||||
|  | ||||
| """OAuth 2.0 utilities for Django. | ||||
|  | ||||
| Utilities for using OAuth 2.0 in conjunction with | ||||
| the Django datastore. | ||||
| """ | ||||
|  | ||||
| __author__ = 'jcgregorio@google.com (Joe Gregorio)' | ||||
|  | ||||
| import oauth2client | ||||
| import base64 | ||||
| import pickle | ||||
| @@ -31,7 +41,6 @@ class FlowField(models.Field): | ||||
|     return 'VARCHAR' | ||||
|  | ||||
|   def to_python(self, value): | ||||
|     print "In to_python", value | ||||
|     if value is None: | ||||
|       return None | ||||
|     if isinstance(value, oauth2client.client.Flow): | ||||
|   | ||||
| @@ -17,21 +17,22 @@ class Storage(BaseStorage): | ||||
|   """Store and retrieve a single credential to and from a file.""" | ||||
|  | ||||
|   def __init__(self, filename): | ||||
|     self.filename = filename | ||||
|     self._filename = filename | ||||
|  | ||||
|   def get(self): | ||||
|     """Retrieve Credential from file. | ||||
|  | ||||
|     Returns: | ||||
|       apiclient.oauth.Credentials | ||||
|       oauth2client.client.Credentials | ||||
|     """ | ||||
|     try: | ||||
|       f = open(self.filename, 'r') | ||||
|       f = open(self._filename, 'r') | ||||
|       credentials = pickle.loads(f.read()) | ||||
|       f.close() | ||||
|       credentials.set_store(self.put) | ||||
|     except: | ||||
|       credentials = None | ||||
|  | ||||
|     return credentials | ||||
|  | ||||
|   def put(self, credentials): | ||||
| @@ -40,6 +41,6 @@ class Storage(BaseStorage): | ||||
|     Args: | ||||
|       credentials: Credentials, the credentials to store. | ||||
|     """ | ||||
|     f = open(self.filename, 'w') | ||||
|     f = open(self._filename, 'w') | ||||
|     f.write(pickle.dumps(credentials)) | ||||
|     f.close() | ||||
|   | ||||
| @@ -14,14 +14,13 @@ | ||||
|  | ||||
| """Command-line tools for authenticating via OAuth 2.0 | ||||
|  | ||||
| Do the OAuth 2.0 Web Server dance for | ||||
| a command line application. Stores the generated | ||||
| credentials in a common file that is used by | ||||
| other example apps in the same directory. | ||||
| Do the OAuth 2.0 Web Server dance for a command line application. Stores the | ||||
| generated credentials in a common file that is used by other example apps in | ||||
| the same directory. | ||||
| """ | ||||
|  | ||||
| __author__ = 'jcgregorio@google.com (Joe Gregorio)' | ||||
| __all__ = ["run"] | ||||
| __all__ = ['run'] | ||||
|  | ||||
|  | ||||
| def run(flow, storage): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Joe Gregorio
					Joe Gregorio