| Index: third_party/google-endpoints/past/types/oldstr.py
|
| diff --git a/third_party/google-endpoints/past/types/oldstr.py b/third_party/google-endpoints/past/types/oldstr.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1b90e3e11e2fcb744c16dc5752855ce209e2e471
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/past/types/oldstr.py
|
| @@ -0,0 +1,132 @@
|
| +"""
|
| +Pure-Python implementation of a Python 2-like str object for Python 3.
|
| +"""
|
| +
|
| +from collections import Iterable
|
| +from numbers import Integral
|
| +
|
| +from past.utils import PY2, with_metaclass
|
| +
|
| +
|
| +_builtin_bytes = bytes
|
| +
|
| +
|
| +class BaseOldStr(type):
|
| + def __instancecheck__(cls, instance):
|
| + return isinstance(instance, _builtin_bytes)
|
| +
|
| +
|
| +def unescape(s):
|
| + """
|
| + Interprets strings with escape sequences
|
| +
|
| + Example:
|
| + >>> s = unescape(r'abc\\def') # i.e. 'abc\\\\def'
|
| + >>> print(s)
|
| + 'abc\def'
|
| + >>> s2 = unescape('abc\\ndef')
|
| + >>> len(s2)
|
| + 8
|
| + >>> print(s2)
|
| + abc
|
| + def
|
| + """
|
| + return s.encode().decode('unicode_escape')
|
| +
|
| +
|
| +class oldstr(with_metaclass(BaseOldStr, _builtin_bytes)):
|
| + """
|
| + A forward port of the Python 2 8-bit string object to Py3
|
| + """
|
| + # Python 2 strings have no __iter__ method:
|
| + @property
|
| + def __iter__(self):
|
| + raise AttributeError
|
| +
|
| + def __dir__(self):
|
| + return [thing for thing in dir(_builtin_bytes) if thing != '__iter__']
|
| +
|
| + # def __new__(cls, *args, **kwargs):
|
| + # """
|
| + # From the Py3 bytes docstring:
|
| +
|
| + # bytes(iterable_of_ints) -> bytes
|
| + # bytes(string, encoding[, errors]) -> bytes
|
| + # bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
|
| + # bytes(int) -> bytes object of size given by the parameter initialized with null bytes
|
| + # bytes() -> empty bytes object
|
| + #
|
| + # Construct an immutable array of bytes from:
|
| + # - an iterable yielding integers in range(256)
|
| + # - a text string encoded using the specified encoding
|
| + # - any object implementing the buffer API.
|
| + # - an integer
|
| + # """
|
| + #
|
| + # if len(args) == 0:
|
| + # return super(newbytes, cls).__new__(cls)
|
| + # # Was: elif isinstance(args[0], newbytes):
|
| + # # We use type() instead of the above because we're redefining
|
| + # # this to be True for all unicode string subclasses. Warning:
|
| + # # This may render newstr un-subclassable.
|
| + # elif type(args[0]) == newbytes:
|
| + # return args[0]
|
| + # elif isinstance(args[0], _builtin_bytes):
|
| + # value = args[0]
|
| + # elif isinstance(args[0], unicode):
|
| + # if 'encoding' not in kwargs:
|
| + # raise TypeError('unicode string argument without an encoding')
|
| + # ###
|
| + # # Was: value = args[0].encode(**kwargs)
|
| + # # Python 2.6 string encode() method doesn't take kwargs:
|
| + # # Use this instead:
|
| + # newargs = [kwargs['encoding']]
|
| + # if 'errors' in kwargs:
|
| + # newargs.append(kwargs['errors'])
|
| + # value = args[0].encode(*newargs)
|
| + # ###
|
| + # elif isinstance(args[0], Iterable):
|
| + # if len(args[0]) == 0:
|
| + # # What is this?
|
| + # raise ValueError('unknown argument type')
|
| + # elif len(args[0]) > 0 and isinstance(args[0][0], Integral):
|
| + # # It's a list of integers
|
| + # value = b''.join([chr(x) for x in args[0]])
|
| + # else:
|
| + # raise ValueError('item cannot be interpreted as an integer')
|
| + # elif isinstance(args[0], Integral):
|
| + # if args[0] < 0:
|
| + # raise ValueError('negative count')
|
| + # value = b'\x00' * args[0]
|
| + # else:
|
| + # value = args[0]
|
| + # return super(newbytes, cls).__new__(cls, value)
|
| +
|
| + def __repr__(self):
|
| + s = super(oldstr, self).__repr__() # e.g. b'abc' on Py3, b'abc' on Py3
|
| + return s[1:]
|
| +
|
| + def __str__(self):
|
| + s = super(oldstr, self).__str__() # e.g. "b'abc'" or "b'abc\\ndef'
|
| + # TODO: fix this:
|
| + assert s[:2] == "b'" and s[-1] == "'"
|
| + return unescape(s[2:-1]) # e.g. 'abc' or 'abc\ndef'
|
| +
|
| + def __getitem__(self, y):
|
| + if isinstance(y, Integral):
|
| + return super(oldstr, self).__getitem__(slice(y, y+1))
|
| + else:
|
| + return super(oldstr, self).__getitem__(y)
|
| +
|
| + def __getslice__(self, *args):
|
| + return self.__getitem__(slice(*args))
|
| +
|
| + def __contains__(self, key):
|
| + if isinstance(key, int):
|
| + return False
|
| +
|
| + def __native__(self):
|
| + return bytes(self)
|
| +
|
| +
|
| +__all__ = ['oldstr']
|
|
|