| Index: third_party/google-endpoints/past/utils/__init__.py
|
| diff --git a/third_party/google-endpoints/past/utils/__init__.py b/third_party/google-endpoints/past/utils/__init__.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..02f06d5957a70e0187650ba6f6e188c0b2903e72
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/past/utils/__init__.py
|
| @@ -0,0 +1,97 @@
|
| +"""
|
| +Various non-built-in utility functions and definitions for Py2
|
| +compatibility in Py3.
|
| +
|
| +For example:
|
| +
|
| + >>> # The old_div() function behaves like Python 2's / operator
|
| + >>> # without "from __future__ import division"
|
| + >>> from past.utils import old_div
|
| + >>> old_div(3, 2) # like 3/2 in Py2
|
| + 0
|
| + >>> old_div(3, 2.0) # like 3/2.0 in Py2
|
| + 1.5
|
| +"""
|
| +
|
| +import sys
|
| +import numbers
|
| +
|
| +PY3 = sys.version_info[0] == 3
|
| +PY2 = sys.version_info[0] == 2
|
| +PYPY = hasattr(sys, 'pypy_translation_info')
|
| +
|
| +
|
| +def with_metaclass(meta, *bases):
|
| + """
|
| + Function from jinja2/_compat.py. License: BSD.
|
| +
|
| + Use it like this::
|
| +
|
| + class BaseForm(object):
|
| + pass
|
| +
|
| + class FormType(type):
|
| + pass
|
| +
|
| + class Form(with_metaclass(FormType, BaseForm)):
|
| + pass
|
| +
|
| + This requires a bit of explanation: the basic idea is to make a
|
| + dummy metaclass for one level of class instantiation that replaces
|
| + itself with the actual metaclass. Because of internal type checks
|
| + we also need to make sure that we downgrade the custom metaclass
|
| + for one level to something closer to type (that's why __call__ and
|
| + __init__ comes back from type etc.).
|
| +
|
| + This has the advantage over six.with_metaclass of not introducing
|
| + dummy classes into the final MRO.
|
| + """
|
| + class metaclass(meta):
|
| + __call__ = type.__call__
|
| + __init__ = type.__init__
|
| + def __new__(cls, name, this_bases, d):
|
| + if this_bases is None:
|
| + return type.__new__(cls, name, (), d)
|
| + return meta(name, bases, d)
|
| + return metaclass('temporary_class', None, {})
|
| +
|
| +
|
| +def native(obj):
|
| + """
|
| + On Py2, this is a no-op: native(obj) -> obj
|
| +
|
| + On Py3, returns the corresponding native Py3 types that are
|
| + superclasses for forward-ported objects from Py2:
|
| +
|
| + >>> from past.builtins import str, dict
|
| +
|
| + >>> native(str(b'ABC')) # Output on Py3 follows. On Py2, output is 'ABC'
|
| + b'ABC'
|
| + >>> type(native(str(b'ABC')))
|
| + bytes
|
| +
|
| + Existing native types on Py3 will be returned unchanged:
|
| +
|
| + >>> type(native(b'ABC'))
|
| + bytes
|
| + """
|
| + if hasattr(obj, '__native__'):
|
| + return obj.__native__()
|
| + else:
|
| + return obj
|
| +
|
| +
|
| +# An alias for future.utils.old_div():
|
| +def old_div(a, b):
|
| + """
|
| + Equivalent to ``a / b`` on Python 2 without ``from __future__ import
|
| + division``.
|
| +
|
| + TODO: generalize this to other objects (like arrays etc.)
|
| + """
|
| + if isinstance(a, numbers.Integral) and isinstance(b, numbers.Integral):
|
| + return a // b
|
| + else:
|
| + return a / b
|
| +
|
| +__all__ = ['PY3', 'PY2', 'PYPY', 'with_metaclass', 'native', 'old_div']
|
|
|