Skip to content

Commit

Permalink
Get vendored-in modules importable.
Browse files Browse the repository at this point in the history
  • Loading branch information
tseaver committed Oct 16, 2015
1 parent d60a679 commit e4ab851
Show file tree
Hide file tree
Showing 7 changed files with 20 additions and 149 deletions.
1 change: 1 addition & 0 deletions gcloud/_apitools/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Vendored-in for from google-apitools 0.4.11
3 changes: 1 addition & 2 deletions gcloud/_apitools/buffered_stream.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
#!/usr/bin/env python
"""Small helper class to provide a small slice of a stream.
This class reads ahead to detect if we are at the end of the stream.
"""

from apitools.base.py import exceptions
from gcloud._apitools import exceptions


# TODO(user): Consider replacing this with a StringIO.
Expand Down
1 change: 0 additions & 1 deletion gcloud/_apitools/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#!/usr/bin/env python
"""Exceptions for generated client libraries."""


Expand Down
5 changes: 2 additions & 3 deletions gcloud/_apitools/http_wrapper.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#!/usr/bin/env python
"""HTTP wrapper for apitools.
This library wraps the underlying http library we use, which is
Expand All @@ -16,8 +15,8 @@
from six.moves import http_client
from six.moves.urllib import parse

from apitools.base.py import exceptions
from apitools.base.py import util
from gcloud._apitools import exceptions
from gcloud._apitools import util

__all__ = [
'CheckResponse',
Expand Down
3 changes: 1 addition & 2 deletions gcloud/_apitools/stream_slice.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#!/usr/bin/env python
"""Small helper class to provide a small slice of a stream."""

from apitools.base.py import exceptions
from gcloud._apitools import exceptions


class StreamSlice(object):
Expand Down
11 changes: 5 additions & 6 deletions gcloud/_apitools/transfer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#!/usr/bin/env python
"""Upload and download support for apitools."""
from __future__ import print_function

Expand All @@ -14,11 +13,11 @@
import six
from six.moves import http_client

from apitools.base.py import buffered_stream
from apitools.base.py import exceptions
from apitools.base.py import http_wrapper
from apitools.base.py import stream_slice
from apitools.base.py import util
from gcloud._apitools import buffered_stream
from gcloud._apitools import exceptions
from gcloud._apitools import http_wrapper
from gcloud._apitools import stream_slice
from gcloud._apitools import util

__all__ = [
'Download',
Expand Down
145 changes: 10 additions & 135 deletions gcloud/_apitools/util.py
Original file line number Diff line number Diff line change
@@ -1,69 +1,20 @@
#!/usr/bin/env python
"""Assorted utilities shared between parts of apitools."""
"""Assorted utilities shared between parts of apitools.
import collections
import os
import random

import six
from six.moves import http_client
import six.moves.urllib.error as urllib_error
import six.moves.urllib.parse as urllib_parse
import six.moves.urllib.request as urllib_request

from apitools.base.protorpclite import messages
from apitools.base.py import encoding
from apitools.base.py import exceptions

__all__ = [
'DetectGae',
'DetectGce',
]
Pruned to include only helpers used by other vendored-in modules:
_RESERVED_URI_CHARS = r":/?#[]@!$&'()*+,;="
``gcloud._apidools.transfer`` uses:
- Typecheck
- AcceptableMimeType
def DetectGae():
"""Determine whether or not we're running on GAE.
``gcloud._apitools.http_wrapper`` uses:
This is based on:
https://developers.google.com/appengine/docs/python/#The_Environment
Returns:
True iff we're running on GAE.
"""
server_software = os.environ.get('SERVER_SOFTWARE', '')
return (server_software.startswith('Development/') or
server_software.startswith('Google App Engine/'))
- CalculateWaitForRetry
"""

import random

def DetectGce():
"""Determine whether or not we're running on GCE.
This is based on:
https://cloud.google.com/compute/docs/metadata#runninggce
Returns:
True iff we're running on a GCE instance.
"""
try:
o = urllib_request.build_opener(urllib_request.ProxyHandler({})).open(
urllib_request.Request('http://metadata.google.internal'))
except urllib_error.URLError:
return False
return (o.getcode() == http_client.OK and
o.headers.get('metadata-flavor') == 'Google')


def NormalizeScopes(scope_spec):
"""Normalize scope_spec to a set of strings."""
if isinstance(scope_spec, six.string_types):
return set(scope_spec.split(' '))
elif isinstance(scope_spec, collections.Iterable):
return set(scope_spec)
raise exceptions.TypecheckError(
'NormalizeScopes expected string or iterable, found %s' % (
type(scope_spec),))
from gcloud._apitools import exceptions


def Typecheck(arg, arg_type, msg=None):
Expand All @@ -78,45 +29,6 @@ def Typecheck(arg, arg_type, msg=None):
return arg


def ExpandRelativePath(method_config, params, relative_path=None):
"""Determine the relative path for request."""
path = relative_path or method_config.relative_path or ''

for param in method_config.path_params:
param_template = '{%s}' % param
# For more details about "reserved word expansion", see:
# http://tools.ietf.org/html/rfc6570#section-3.2.2
reserved_chars = ''
reserved_template = '{+%s}' % param
if reserved_template in path:
reserved_chars = _RESERVED_URI_CHARS
path = path.replace(reserved_template, param_template)
if param_template not in path:
raise exceptions.InvalidUserInputError(
'Missing path parameter %s' % param)
try:
# TODO(craigcitro): Do we want to support some sophisticated
# mapping here?
value = params[param]
except KeyError:
raise exceptions.InvalidUserInputError(
'Request missing required parameter %s' % param)
if value is None:
raise exceptions.InvalidUserInputError(
'Request missing required parameter %s' % param)
try:
if not isinstance(value, six.string_types):
value = str(value)
path = path.replace(param_template,
urllib_parse.quote(value.encode('utf_8'),
reserved_chars))
except TypeError as e:
raise exceptions.InvalidUserInputError(
'Error setting required parameter %s to value %s: %s' % (
param, value, e))
return path


def CalculateWaitForRetry(retry_attempt, max_wait=60):
"""Calculates amount of time to wait before a retry attempt.
Expand Down Expand Up @@ -173,40 +85,3 @@ def MimeTypeMatches(pattern, mime_type):

return any(MimeTypeMatches(pattern, mime_type)
for pattern in accept_patterns)


def MapParamNames(params, request_type):
"""Reverse parameter remappings for URL construction."""
return [encoding.GetCustomJsonFieldMapping(request_type, json_name=p) or p
for p in params]


def MapRequestParams(params, request_type):
"""Perform any renames/remappings needed for URL construction.
Currently, we have several ways to customize JSON encoding, in
particular of field names and enums. This works fine for JSON
bodies, but also needs to be applied for path and query parameters
in the URL.
This function takes a dictionary from param names to values, and
performs any registered mappings. We also need the request type (to
look up the mappings).
Args:
params: (dict) Map from param names to values
request_type: (protorpc.messages.Message) request type for this API call
Returns:
A new dict of the same size, with all registered mappings applied.
"""
new_params = dict(params)
for param_name, value in params.items():
field_remapping = encoding.GetCustomJsonFieldMapping(
request_type, python_name=param_name)
if field_remapping is not None:
new_params[field_remapping] = new_params.pop(param_name)
if isinstance(value, messages.Enum):
new_params[param_name] = encoding.GetCustomJsonEnumMapping(
type(value), python_name=str(value)) or str(value)
return new_params

0 comments on commit e4ab851

Please sign in to comment.