Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 23 additions & 18 deletions googleapiclient/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@


# Standard library imports
import StringIO
import copy
from email.generator import Generator
from email.mime.multipart import MIMEMultipart
Expand All @@ -39,7 +38,11 @@
import os
import re
import urllib
import urlparse

# Support Python3
import six
StringIO = six.StringIO
urlparse = six.moves.urllib.parse

try:
from urlparse import parse_qsl
Expand Down Expand Up @@ -204,8 +207,10 @@ def build(serviceName,
raise HttpError(resp, content, uri=requested_url)

try:
if isinstance(content, bytes) and hasattr(content, 'decode'):
content = content.decode("utf-8")
service = json.loads(content)
except ValueError, e:
except ValueError as e:
logger.error('Failed to parse as JSON: ' + content)
raise InvalidJsonError()

Expand Down Expand Up @@ -253,7 +258,7 @@ def build_from_document(
# future is no longer used.
future = {}

if isinstance(service, basestring):
if isinstance(service, six.string_types):
service = json.loads(service)
base = urlparse.urljoin(service['rootUrl'], service['servicePath'])
schema = Schemas(service)
Expand All @@ -271,7 +276,7 @@ def build_from_document(
credentials.create_scoped_required()):
scopes = service.get('auth', {}).get('oauth2', {}).get('scopes', {})
if scopes:
credentials = credentials.create_scoped(scopes.keys())
credentials = credentials.create_scoped(six.iterkeys(scopes))
else:
# No need to authorize the http object
# if the service does not require authentication.
Expand Down Expand Up @@ -329,7 +334,7 @@ def _media_size_to_long(maxSize):
The size as an integer value.
"""
if len(maxSize) < 2:
return 0L
return 0

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

units = maxSize[-2:].upper()
bit_shift = _MEDIA_SIZE_BIT_SHIFTS.get(units)
if bit_shift is not None:
Expand Down Expand Up @@ -385,7 +390,7 @@ def _fix_up_parameters(method_desc, root_desc, http_method):
parameters = method_desc.setdefault('parameters', {})

# Add in the parameters common to all methods.
for name, description in root_desc.get('parameters', {}).iteritems():
for name, description in six.iteritems(root_desc.get('parameters', {})):
parameters[name] = description

# Add in undocumented query parameters.
Expand Down Expand Up @@ -551,7 +556,7 @@ def set_parameters(self, method_desc):
comes from the dictionary of methods stored in the 'methods' key in
the deserialized discovery document.
"""
for arg, desc in method_desc.get('parameters', {}).iteritems():
for arg, desc in six.iteritems(method_desc.get('parameters', {})):
param = key2param(arg)
self.argmap[param] = arg

Expand Down Expand Up @@ -599,12 +604,12 @@ def createMethod(methodName, methodDesc, rootDesc, schema):
def method(self, **kwargs):
# Don't bother with doc string, it will be over-written by createMethod.

for name in kwargs.iterkeys():
for name in six.iterkeys(kwargs):
if name not in parameters.argmap:
raise TypeError('Got an unexpected keyword argument "%s"' % name)

# Remove args that have a value of None.
keys = kwargs.keys()
keys = six.iterkeys(kwargs)
for name in keys:
if kwargs[name] is None:
del kwargs[name]
Expand All @@ -613,7 +618,7 @@ def method(self, **kwargs):
if name not in kwargs:
raise TypeError('Missing required parameter "%s"' % name)

for name, regex in parameters.pattern_params.iteritems():
for name, regex in six.iteritems(parameters.pattern_params):
if name in kwargs:
if isinstance(kwargs[name], basestring):
pvalues = [kwargs[name]]
Expand All @@ -625,7 +630,7 @@ def method(self, **kwargs):
'Parameter "%s" value "%s" does not match the pattern "%s"' %
(name, pvalue, regex))

for name, enums in parameters.enum_params.iteritems():
for name, enums in six.iteritems(parameters.enum_params):
if name in kwargs:
# We need to handle the case of a repeated enum
# name differently, since we want to handle both
Expand All @@ -643,7 +648,7 @@ def method(self, **kwargs):

actual_query_params = {}
actual_path_params = {}
for key, value in kwargs.iteritems():
for key, value in six.iteritems(kwargs):
to_type = parameters.param_types.get(key, 'string')
# For repeated parameters we cast each member of the list.
if key in parameters.repeated_params and type(value) == type([]):
Expand Down Expand Up @@ -757,10 +762,10 @@ def method(self, **kwargs):
docs.append('Args:\n')

# Skip undocumented params and params common to all methods.
skip_parameters = rootDesc.get('parameters', {}).keys()
skip_parameters = list(rootDesc.get('parameters', {}))
skip_parameters.extend(STACK_QUERY_PARAMETERS)

all_args = parameters.argmap.keys()
all_args = six.iterkeys(parameters.argmap)
args_ordered = [key2param(s) for s in methodDesc.get('parameterOrder', [])]

# Move body to the front of the line.
Expand Down Expand Up @@ -932,7 +937,7 @@ def _set_service_methods(self):
def _add_basic_methods(self, resourceDesc, rootDesc, schema):
# Add basic methods to Resource
if 'methods' in resourceDesc:
for methodName, methodDesc in resourceDesc['methods'].iteritems():
for methodName, methodDesc in six.iteritems(resourceDesc['methods']):
fixedMethodName, method = createMethod(
methodName, methodDesc, rootDesc, schema)
self._set_dynamic_attr(fixedMethodName,
Expand Down Expand Up @@ -971,7 +976,7 @@ def methodResource(self):

return (methodName, methodResource)

for methodName, methodDesc in resourceDesc['resources'].iteritems():
for methodName, methodDesc in six.iteritems(resourceDesc['resources']):
fixedMethodName, method = createResourceMethod(methodName, methodDesc)
self._set_dynamic_attr(fixedMethodName,
method.__get__(self, self.__class__))
Expand All @@ -981,7 +986,7 @@ def _add_next_methods(self, resourceDesc, schema):
# Look for response bodies in schema that contain nextPageToken, and methods
# that take a pageToken parameter.
if 'methods' in resourceDesc:
for methodName, methodDesc in resourceDesc['methods'].iteritems():
for methodName, methodDesc in six.iteritems(resourceDesc['methods']):
if 'response' in methodDesc:
responseSchema = methodDesc['response']
if '$ref' in responseSchema:
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ def _DetectBadness():
'httplib2>=0.8',
'oauth2client>=1.3',
'uritemplate>=0.6',
'six>=1.8.0'
]

if sys.version_info < (2, 7):
Expand Down