diff --git a/cpyamf/util.pyx b/cpyamf/util.pyx index 85460ed0..7c7bc131 100644 --- a/cpyamf/util.pyx +++ b/cpyamf/util.pyx @@ -903,6 +903,8 @@ cdef class cBufferedByteStream(object): def __nonzero__(self): return self.length > 0 + __bool__ = __nonzero__ + cdef class BufferedByteStream(cBufferedByteStream): """ diff --git a/doc/tutorials/examples/actionscript/addressbook/python/controller.py b/doc/tutorials/examples/actionscript/addressbook/python/controller.py index 1c6d6cd0..db195d2e 100644 --- a/doc/tutorials/examples/actionscript/addressbook/python/controller.py +++ b/doc/tutorials/examples/actionscript/addressbook/python/controller.py @@ -8,6 +8,7 @@ """ from datetime import datetime +from six import iteritems import pyamf @@ -59,13 +60,13 @@ def insertDefaultData(self): user.first_name = 'Bill' user.last_name = 'Lumbergh' user.created = datetime.utcnow() - for label, email in {'personal': 'bill@yahoo.com', 'work': 'bill@initech.com'}.iteritems(): + for label, email in iteritems({'personal': 'bill@yahoo.com', 'work': 'bill@initech.com'}): email_obj = models.Email() email_obj.label = label email_obj.email = email user.emails.append(email_obj) - for label, number in {'personal': '1-800-555-5555', 'work': '1-555-555-5555'}.iteritems(): + for label, number in iteritems({'personal': '1-800-555-5555', 'work': '1-555-555-5555'}): phone_obj = models.PhoneNumber() phone_obj.label = label phone_obj.number = number diff --git a/doc/tutorials/examples/actionscript/guestbook/python/guestbook.py b/doc/tutorials/examples/actionscript/guestbook/python/guestbook.py index e6c7760c..0904205a 100644 --- a/doc/tutorials/examples/actionscript/guestbook/python/guestbook.py +++ b/doc/tutorials/examples/actionscript/guestbook/python/guestbook.py @@ -8,9 +8,9 @@ """ -from datetime import datetime -from urlparse import urlparse import re +from urlparse import urlparse +from six import string_types try: from genshi.input import HTML @@ -33,12 +33,12 @@ # This is MySQL specific, make sure that if you use a different database server # this is updated to ensure sql injection attacks don't occur def sql_safe(value): - if isinstance(value, basestring): + if isinstance(value, string_types): return value.replace("'", "\\'") elif isinstance(type(value), (int, float)): return value - raise TypeError, 'basestring, int or float expected' + raise TypeError('basestring, int or float expected') def is_valid_url(url): @@ -93,8 +93,8 @@ def __init__(self, pool): self.conn_pool = pool LoopingCall(self._keepAlive).start(3600, False) - def _keepAlive(): - print 'Running Keep Alive...' + def _keepAlive(self): + print('Running Keep Alive...') self.conn_pool.runOperation('SELECT 1') def getMessages(self): @@ -135,35 +135,35 @@ def addMessage(self, request, msg): email = msg._amf_object.email message = msg._amf_object.message - if not isinstance(name, basestring): + if not isinstance(name, string_types): name = str(name) if len(name) > 50: - raise IOError, "Name exceeds maximum length (50 chars max)" + raise IOError("Name exceeds maximum length (50 chars max)") - if not isinstance(url, basestring): + if not isinstance(url, string_types): url = str(url) if len(url) > 255: - raise IOError, "Website url exceeds maximum length (255 chars max)" + raise IOError("Website url exceeds maximum length (255 chars max)") if len(url) > 0: valid_url, reason = is_valid_url(url) if not valid_url: - raise ValueError, "Website url not valid" + raise ValueError("Website url not valid") - if not isinstance(email, basestring): + if not isinstance(email, string_types): email = str(email) if not is_valid_email(email): - raise ValueError, "Email address is not valid" + raise ValueError("Email address is not valid") - if not isinstance(message, basestring): + if not isinstance(message, string_types): message = str(message) if len(message) == 0: - raise ValueError, "Message is required" + raise ValueError("Message is required") message = strip_message(message) response_deferred = defer.Deferred() diff --git a/doc/tutorials/examples/gateways/appengine/demo/simplejson/decoder.py b/doc/tutorials/examples/gateways/appengine/demo/simplejson/decoder.py index 6a73e9af..d449e0eb 100644 --- a/doc/tutorials/examples/gateways/appengine/demo/simplejson/decoder.py +++ b/doc/tutorials/examples/gateways/appengine/demo/simplejson/decoder.py @@ -3,6 +3,7 @@ """ import re import sys +from six import text_type from simplejson.scanner import Scanner, pattern try: @@ -92,8 +93,8 @@ def scanstring(s, end, encoding=None, _b=BACKSLASH, _m=STRINGCHUNK.match): end = chunk.end() content, terminator = chunk.groups() if content: - if not isinstance(content, unicode): - content = unicode(content, encoding) + if not isinstance(content, text_type): + content = content.decode(encoding) _append(content) if terminator == '"': break diff --git a/doc/tutorials/examples/gateways/appengine/demo/simplejson/encoder.py b/doc/tutorials/examples/gateways/appengine/demo/simplejson/encoder.py index 1c69b023..675b9b23 100644 --- a/doc/tutorials/examples/gateways/appengine/demo/simplejson/encoder.py +++ b/doc/tutorials/examples/gateways/appengine/demo/simplejson/encoder.py @@ -2,6 +2,7 @@ Implementation of JSONEncoder """ import re +from six import iteritems try: from simplejson import _speedups except ImportError: @@ -233,7 +234,7 @@ def _iterencode_dict(self, dct, markers=None): keys.sort() items = [(k, dct[k]) for k in keys] else: - items = dct.iteritems() + items = iteritems(dct) _encoding = self.encoding _do_decode = (_encoding is not None and not (_need_utf8 and _encoding == 'utf-8')) diff --git a/pyamf/__init__.py b/pyamf/__init__.py index d8654dbd..738c5b6d 100644 --- a/pyamf/__init__.py +++ b/pyamf/__init__.py @@ -13,6 +13,7 @@ import types import inspect +from six import iteritems from pyamf import util, _version from pyamf.adapters import register_adapters @@ -89,6 +90,8 @@ def __repr__(self): def __nonzero__(self): return False + __bool__ = __nonzero__ + #: Represents the C{undefined} value in the Adobe Flash Player client. Undefined = UndefinedType() @@ -607,7 +610,7 @@ def _check_type(type_): if type_ in TYPE_MAP: raise KeyError('Type %r already exists' % (type_,)) - if isinstance(type_, types.TupleType): + if isinstance(type_, tuple): for x in type_: _check_type(x) else: @@ -626,7 +629,7 @@ def get_type(type_): if isinstance(type_, list): type_ = tuple(type_) - for k, v in TYPE_MAP.iteritems(): + for k, v in iteritems(TYPE_MAP): if k == type_: return v @@ -717,11 +720,11 @@ def remove_error_class(klass): if klass not in ERROR_CLASS_MAP: raise ValueError('Code %s is not registered' % (klass,)) elif isinstance(klass, python.class_types): - classes = ERROR_CLASS_MAP.values() + classes = list(ERROR_CLASS_MAP.values()) if klass not in classes: raise ValueError('Class %s is not registered' % (klass,)) - klass = ERROR_CLASS_MAP.keys()[classes.index(klass)] + klass = list(ERROR_CLASS_MAP.keys())[classes.index(klass)] else: raise TypeError("Invalid type, expected class or string") @@ -753,7 +756,7 @@ def register_alias_type(klass, *args): - At least one type must be supplied """ def check_type_registered(arg): - for k, v in ALIAS_TYPES.iteritems(): + for k, v in iteritems(ALIAS_TYPES): for kl in v: if arg is kl: raise RuntimeError('%r is already registered under %r' % ( @@ -781,7 +784,7 @@ def check_type_registered(arg): ALIAS_TYPES[klass] = args - for k, v in CLASS_CACHE.copy().iteritems(): + for k, v in iteritems(CLASS_CACHE.copy()): new_alias = util.get_class_alias(v.klass) if new_alias is klass: diff --git a/pyamf/adapters/_django_db_models_base.py b/pyamf/adapters/_django_db_models_base.py index 10ad4f8d..06f2924f 100644 --- a/pyamf/adapters/_django_db_models_base.py +++ b/pyamf/adapters/_django_db_models_base.py @@ -13,6 +13,7 @@ from django.db.models.fields import related, files import datetime +from six import iteritems import pyamf @@ -172,7 +173,7 @@ def getEncodableAttributes(self, obj, **kwargs): if not attrs: attrs = {} - for name, prop in self.fields.iteritems(): + for name, prop in iteritems(self.fields): if name not in attrs.keys(): continue @@ -184,7 +185,7 @@ def getEncodableAttributes(self, obj, **kwargs): if key.startswith('_'): del attrs[key] - for name, relation in self.relations.iteritems(): + for name, relation in iteritems(self.relations): if '_%s_cache' % name in obj.__dict__: attrs[name] = getattr(obj, name) @@ -235,7 +236,7 @@ def getDecodableAttributes(self, obj, attrs, **kwargs): pass if not getattr(obj, pk_attr): - for name, relation in self.relations.iteritems(): + for name, relation in iteritems(self.relations): if isinstance(relation, related.ManyToManyField): try: if len(attrs[name]) == 0: diff --git a/pyamf/adapters/_django_utils_translation.py b/pyamf/adapters/_django_utils_translation.py index 83b0f684..5fbd60a0 100644 --- a/pyamf/adapters/_django_utils_translation.py +++ b/pyamf/adapters/_django_utils_translation.py @@ -16,13 +16,13 @@ def convert_lazy(l, encoder=None): try: if l.__class__._delegate_text: - return unicode(l) + return u'l' except AttributeError: if l.__class__._delegate_unicode: - return unicode(l) + return u'l' if l.__class__._delegate_str: - return str(l) + return b'1' raise ValueError('Don\'t know how to convert lazy value %s' % (repr(l),)) diff --git a/pyamf/adapters/_google_appengine_ext_db.py b/pyamf/adapters/_google_appengine_ext_db.py index 687db243..57478a49 100644 --- a/pyamf/adapters/_google_appengine_ext_db.py +++ b/pyamf/adapters/_google_appengine_ext_db.py @@ -15,6 +15,7 @@ from google.appengine.ext import db from google.appengine.ext.db import polymodel import datetime +from six import integer_types, iteritems, string_types import pyamf from pyamf.adapters import util @@ -112,7 +113,7 @@ def getCustomProperties(self): self.properties = {} reverse_props = [] - for name, prop in self.klass.properties().iteritems(): + for name, prop in iteritems(self.klass.properties()): self.properties[name] = prop props.append(name) @@ -127,7 +128,7 @@ def getCustomProperties(self): # check if the property is a defined as a collection_name. These types # of properties are read-only and the datastore freaks out if you # attempt to meddle with it. We delete the attribute entirely .. - for name, value in self.klass.__dict__.iteritems(): + for name, value in iteritems(self.klass.__dict__): if isinstance(value, db._ReverseReferenceProperty): reverse_props.append(name) @@ -149,7 +150,7 @@ def getEncodableAttributes(self, obj, codec=None): gae_objects = getGAEObjects(codec.context) if codec else None if self.reference_properties and gae_objects: - for name, prop in self.reference_properties.iteritems(): + for name, prop in iteritems(self.reference_properties): klass = prop.reference_class key = prop.get_value_for_datastore(obj) @@ -210,11 +211,11 @@ def getDecodableAttributes(self, obj, attrs, codec=None): v = attrs[k] if isinstance(prop, db.FloatProperty) and \ - isinstance(v, (int, long)): + isinstance(v, integer_types): attrs[k] = float(v) elif isinstance(prop, db.IntegerProperty) and \ isinstance(v, float): - x = long(v) + x = int(v) # only convert the type if there is no mantissa - otherwise # let the chips fall where they may @@ -280,7 +281,7 @@ def loadInstanceFromDatastore(klass, key, codec=None): 'expected db.Model/db.Expando class, got %s' % (klass,) ) - if not isinstance(key, basestring): + if not isinstance(key, string_types): raise TypeError('string expected for key, got %s', (repr(key),)) key = str(key) diff --git a/pyamf/adapters/util.py b/pyamf/adapters/util.py index 16f03abd..256ff2b9 100644 --- a/pyamf/adapters/util.py +++ b/pyamf/adapters/util.py @@ -7,10 +7,7 @@ @since: 0.4 """ -import __builtin__ - -if not hasattr(__builtin__, 'set'): - from sets import Set as set +from six.moves import builtins def to_list(obj, encoder): diff --git a/pyamf/alias.py b/pyamf/alias.py index 36a18b33..fff29f76 100644 --- a/pyamf/alias.py +++ b/pyamf/alias.py @@ -8,6 +8,7 @@ """ import inspect +from six import iteritems, string_types import pyamf from pyamf import python, util @@ -123,7 +124,7 @@ def compile(self): self.decodable_properties.update(self.klass.__slots__) self.encodable_properties.update(self.klass.__slots__) - for k, v in self.klass.__dict__.iteritems(): + for k, v in iteritems(self.klass.__dict__): if not isinstance(v, property): continue @@ -313,7 +314,7 @@ def __repr__(self): ) def __eq__(self, other): - if isinstance(other, basestring): + if isinstance(other, string_types): return self.alias == other elif isinstance(other, self.__class__): return self.klass == other.klass @@ -421,14 +422,14 @@ def getEncodableAttributes(self, obj, codec=None): if self.proxy_attrs is not None and attrs and codec: context = codec.context - for k, v in attrs.copy().iteritems(): + for k, v in iteritems(attrs.copy()): if k in self.proxy_attrs: attrs[k] = context.getProxyForObject(v) if self.synonym_attrs: missing = object() - for k, v in self.synonym_attrs.iteritems(): + for k, v in iteritems(self.synonym_attrs): value = attrs.pop(k, missing) if value is missing: @@ -510,7 +511,7 @@ def getDecodableAttributes(self, obj, attrs, codec=None): if self.synonym_attrs: missing = object() - for k, v in self.synonym_attrs.iteritems(): + for k, v in iteritems(self.synonym_attrs): value = attrs.pop(v, missing) if value is missing: diff --git a/pyamf/amf0.py b/pyamf/amf0.py index 46707d40..f6dbef4b 100644 --- a/pyamf/amf0.py +++ b/pyamf/amf0.py @@ -17,6 +17,8 @@ """ import datetime +from six import iteritems, integer_types, text_type +from six.moves import xrange import pyamf from pyamf import util, codec, xml, python @@ -24,70 +26,70 @@ #: Represented as 9 bytes: 1 byte for C{0x00} and 8 bytes a double #: representing the value of the number. -TYPE_NUMBER = '\x00' +TYPE_NUMBER = b'\x00' #: Represented as 2 bytes: 1 byte for C{0x01} and a second, C{0x00} #: for C{False}, C{0x01} for C{True}. -TYPE_BOOL = '\x01' +TYPE_BOOL = b'\x01' #: Represented as 3 bytes + len(String): 1 byte C{0x02}, then a UTF8 string, #: including the top two bytes representing string length as a C{int}. -TYPE_STRING = '\x02' +TYPE_STRING = b'\x02' #: Represented as 1 byte, C{0x03}, then pairs of UTF8 string, the key, and #: an AMF element, ended by three bytes, C{0x00} C{0x00} C{0x09}. -TYPE_OBJECT = '\x03' +TYPE_OBJECT = b'\x03' #: MovieClip does not seem to be supported by Remoting. #: It may be used by other AMF clients such as SharedObjects. -TYPE_MOVIECLIP = '\x04' +TYPE_MOVIECLIP = b'\x04' #: 1 single byte, C{0x05} indicates null. -TYPE_NULL = '\x05' +TYPE_NULL = b'\x05' #: 1 single byte, C{0x06} indicates null. -TYPE_UNDEFINED = '\x06' +TYPE_UNDEFINED = b'\x06' #: When an ActionScript object refers to itself, such C{this.self = this}, #: or when objects are repeated within the same scope (for example, as the #: two parameters of the same function called), a code of C{0x07} and an #: C{int}, the reference number, are written. -TYPE_REFERENCE = '\x07' +TYPE_REFERENCE = b'\x07' #: A MixedArray is indicated by code C{0x08}, then a Long representing the #: highest numeric index in the array, or 0 if there are none or they are #: all negative. After that follow the elements in key : value pairs. -TYPE_MIXEDARRAY = '\x08' +TYPE_MIXEDARRAY = b'\x08' #: @see: L{TYPE_OBJECT} -TYPE_OBJECTTERM = '\x09' +TYPE_OBJECTTERM = b'\x09' #: An array is indicated by C{0x0A}, then a Long for array length, then the #: array elements themselves. Arrays are always sparse; values for #: inexistant keys are set to null (C{0x06}) to maintain sparsity. -TYPE_ARRAY = '\x0A' +TYPE_ARRAY = b'\x0A' #: Date is represented as C{0x0B}, then a double, then an C{int}. The double #: represents the number of milliseconds since 01/01/1970. The C{int} #: represents the timezone offset in minutes between GMT. Note for the latter #: than values greater than 720 (12 hours) are represented as M{2^16} - the #: value. Thus GMT+1 is 60 while GMT-5 is 65236. -TYPE_DATE = '\x0B' +TYPE_DATE = b'\x0B' #: LongString is reserved for strings larger then M{2^16} characters long. It #: is represented as C{0x0C} then a LongUTF. -TYPE_LONGSTRING = '\x0C' +TYPE_LONGSTRING = b'\x0C' #: Trying to send values which don't make sense, such as prototypes, functions, #: built-in objects, etc. will be indicated by a single C{00x0D} byte. -TYPE_UNSUPPORTED = '\x0D' +TYPE_UNSUPPORTED = b'\x0D' #: Remoting Server -> Client only. #: @see: L{RecordSet} #: @see: U{RecordSet structure on OSFlash #: } -TYPE_RECORDSET = '\x0E' +TYPE_RECORDSET = b'\x0E' #: The XML element is indicated by C{0x0F} and followed by a LongUTF containing #: the string representation of the XML object. The receiving gateway may which #: to wrap this string inside a language-specific standard XML object, or #: simply pass as a string. -TYPE_XML = '\x0F' +TYPE_XML = b'\x0F' #: A typed object is indicated by C{0x10}, then a UTF string indicating class #: name, and then the same structure as a normal C{0x03} Object. The receiving #: gateway may use a mapping scheme, or send back as a vanilla object or #: associative array. -TYPE_TYPEDOBJECT = '\x10' +TYPE_TYPEDOBJECT = b'\x10' #: An AMF message sent from an AVM+ client such as the Flash Player 9 may break #: out into L{AMF3} mode. In this case the next byte will be the #: AMF3 type code and the data will be in AMF3 format until the decoded object #: reaches it's logical conclusion (for example, an object has no more keys). -TYPE_AMF3 = '\x11' +TYPE_AMF3 = b'\x11' class Context(codec.Context): @@ -243,7 +245,7 @@ def readMixedArray(self): attrs = self.readObjectAttributes(obj) - for key, value in attrs.iteritems(): + for key, value in iteritems(attrs): try: key = int(key) except ValueError: @@ -302,11 +304,11 @@ def readAMF3(self): def readObjectAttributes(self, obj): obj_attrs = {} - key = self.readString(True) + key = self.readString() while self.stream.peek() != TYPE_OBJECTTERM: obj_attrs[key] = self.readElement() - key = self.readString(True) + key = self.readString() # discard the end marker (TYPE_OBJECTTERM) self.stream.read(1) @@ -481,7 +483,7 @@ def serialiseString(self, s): """ Similar to L{writeString} but does not encode a type byte. """ - if type(s) is unicode: + if isinstance(s, text_type): s = self.context.getBytesForString(s) l = len(s) @@ -541,12 +543,20 @@ def _writeDict(self, o): @param o: The C{dict} data to be encoded to the AMF0 data stream. """ - for key, val in o.iteritems(): - if type(key) in python.int_types: + e = pyamf.EncodeError('Unable to encode %r (type %r)' % (o, type(o))) + try: + keys = sorted(o) + except TypeError: + raise e + for key in keys: + value = o[key] + if isinstance(key, python.int_types): key = str(key) + elif not isinstance(key, python.str_types): + raise e self.serialiseString(key) - self.writeElement(val) + self.writeElement(value) def writeMixedArray(self, o): """ @@ -566,7 +576,7 @@ def writeMixedArray(self, o): # list comprehensions to save the day max_index = max([ y[0] for y in o.items() - if isinstance(y[0], (int, long)) + if isinstance(y[0], integer_types) ]) if max_index < 0: @@ -580,7 +590,7 @@ def writeMixedArray(self, o): self._writeEndObject() def _writeEndObject(self): - self.stream.write('\x00\x00' + TYPE_OBJECTTERM) + self.stream.write(b'\x00\x00' + TYPE_OBJECTTERM) def writeObject(self, o): """ @@ -610,7 +620,7 @@ def writeObject(self, o): attrs = alias.getEncodableAttributes(o, codec=self) if alias.static_attrs and attrs: - for key in alias.static_attrs: + for key in sorted(alias.static_attrs): value = attrs.pop(key) self.serialiseString(key) @@ -655,7 +665,7 @@ def writeXML(self, e): data = xml.tostring(e) - if isinstance(data, unicode): + if isinstance(data, text_type): data = data.encode('utf-8') self.stream.write_ulong(len(data)) diff --git a/pyamf/amf3.py b/pyamf/amf3.py index 88b941c7..c5761ed5 100644 --- a/pyamf/amf3.py +++ b/pyamf/amf3.py @@ -23,6 +23,8 @@ import datetime import zlib +from six import binary_type, iteritems, text_type +from six.moves import xrange import pyamf from pyamf import codec, util, xml, python @@ -44,37 +46,37 @@ #: The undefined type is represented by the undefined type marker. No further #: information is encoded for this value. -TYPE_UNDEFINED = '\x00' +TYPE_UNDEFINED = b'\x00' #: The null type is represented by the null type marker. No further #: information is encoded for this value. -TYPE_NULL = '\x01' +TYPE_NULL = b'\x01' #: The false type is represented by the false type marker and is used to #: encode a Boolean value of C{false}. No further information is encoded for #: this value. -TYPE_BOOL_FALSE = '\x02' +TYPE_BOOL_FALSE = b'\x02' #: The true type is represented by the true type marker and is used to encode #: a Boolean value of C{true}. No further information is encoded for this #: value. -TYPE_BOOL_TRUE = '\x03' +TYPE_BOOL_TRUE = b'\x03' #: In AMF 3 integers are serialized using a variable length signed 29-bit #: integer. #: @see: U{Parsing Integers on OSFlash (external) #: } -TYPE_INTEGER = '\x04' +TYPE_INTEGER = b'\x04' #: This type is used to encode an ActionScript Number or an ActionScript #: C{int} of value greater than or equal to 2^28 or an ActionScript uint of #: value greater than or equal to 2^29. The encoded value is is always an 8 #: byte IEEE-754 double precision floating point value in network byte order #: (sign bit in low memory). The AMF 3 number type is encoded in the same #: manner as the AMF 0 L{Number} type. -TYPE_NUMBER = '\x05' +TYPE_NUMBER = b'\x05' #: ActionScript String values are represented using a single string type in #: AMF 3 - the concept of string and long string types from AMF 0 is not used. #: Strings can be sent as a reference to a previously occurring String by #: using an index to the implicit string reference table. Strings are encoding #: using UTF-8 - however the header may either describe a string literal or a #: string reference. -TYPE_STRING = '\x06' +TYPE_STRING = b'\x06' #: ActionScript 3.0 introduced a new XML type however the legacy C{XMLDocument} #: type from ActionScript 1.0 and 2.0.is retained in the language as #: C{flash.xml.XMLDocument}. Similar to AMF 0, the structure of an @@ -86,29 +88,29 @@ #: @see: U{OSFlash documentation (external) #: } -TYPE_XML = '\x07' +TYPE_XML = b'\x07' #: In AMF 3 an ActionScript Date is serialized as the number of #: milliseconds elapsed since the epoch of midnight, 1st Jan 1970 in the #: UTC time zone. Local time zone information is not sent. -TYPE_DATE = '\x08' +TYPE_DATE = b'\x08' #: ActionScript Arrays are described based on the nature of their indices, #: i.e. their type and how they are positioned in the Array. -TYPE_ARRAY = '\x09' +TYPE_ARRAY = b'\x09' #: A single AMF 3 type handles ActionScript Objects and custom user classes. -TYPE_OBJECT = '\x0A' +TYPE_OBJECT = b'\x0A' #: ActionScript 3.0 introduces a new top-level XML class that supports #: U{E4X} syntax. #: For serialization purposes the XML type needs to be flattened into a #: string representation. As with other strings in AMF, the content is #: encoded using UTF-8. -TYPE_XMLSTRING = '\x0B' +TYPE_XMLSTRING = b'\x0B' #: ActionScript 3.0 introduces the L{ByteArray} type to hold an Array #: of bytes. AMF 3 serializes this type using a variable length encoding #: 29-bit integer for the byte-length prefix followed by the raw bytes #: of the L{ByteArray}. #: @see: U{Parsing ByteArrays on OSFlash (external) #: } -TYPE_BYTEARRAY = '\x0C' +TYPE_BYTEARRAY = b'\x0C' #: Reference bit. REFERENCE_BIT = 0x01 @@ -249,7 +251,7 @@ def writeMultiByte(self, value, charset): @see: U{Supported character sets on Adobe Help (external) } """ - if type(value) is unicode: + if isinstance(value, text_type): value = value.encode(charset) self.stream.write(value) @@ -318,10 +320,10 @@ def writeUTFBytes(self, value): """ val = None - if isinstance(value, unicode): + if isinstance(value, text_type): val = value else: - val = unicode(value, 'utf8') + val = value.decode('utf8') self.stream.write_utf8_string(val) @@ -356,9 +358,9 @@ def readBoolean(self): """ byte = self.stream.read(1) - if byte == '\x00': + if byte == b'\x00': return False - elif byte == '\x01': + elif byte == b'\x01': return True else: raise ValueError("Error reading boolean") @@ -417,7 +419,7 @@ def readMultiByte(self, length, charset): # FIXME nick: how to work out the code point byte size (on the fly)? bytes = self.stream.read(length) - return unicode(bytes, charset) + return bytes.decode(charset) def readObject(self): """ @@ -508,7 +510,7 @@ class ByteArray(util.BufferedByteStream, DataInput, DataOutput): } """ - _zlib_header = '\x78\x9c' + _zlib_header = b'\x78\x9c' class __amf__: amf3 = True @@ -532,13 +534,13 @@ def writeObject(self, obj): return super(ByteArray, self).writeObject(obj) - def __cmp__(self, other): + def __eq__(self, other): if isinstance(other, ByteArray): - return cmp(self.getvalue(), other.getvalue()) + return self.getvalue() == other.getvalue() - return cmp(self.getvalue(), other) + return self.getvalue() == other - def __str__(self): + def encode(self): buf = self.getvalue() if not self.compressed: @@ -546,7 +548,7 @@ def __str__(self): buf = zlib.compress(buf) # FIXME nick: hacked - return buf[0] + '\xda' + buf[2:] + return buf[0] + b'\xda' + buf[2:] def compress(self): """ @@ -664,7 +666,7 @@ def addString(self, s): @raise TypeError: The parameter C{s} is not of C{basestring} type. """ - if not isinstance(s, basestring): + if not isinstance(s, binary_type): raise TypeError if len(s) == 0: @@ -869,7 +871,7 @@ def readBytes(self): return self.context.getString(length) if length == 0: - return '' + return b'' result = self.stream.read(length) self.context.addString(result) @@ -931,7 +933,7 @@ def readArray(self): size >>= 1 - key = self.readBytes() + key = self.readString() if key == '': # integer indexes only -> python list @@ -948,7 +950,7 @@ def readArray(self): while key: result[key] = self.readElement() - key = self.readBytes() + key = self.readString() for i in xrange(size): el = self.readElement() @@ -968,7 +970,7 @@ def _getClassDefinition(self, ref): return class_def - name = self.readBytes() + name = self.readString() alias = None if name == '': @@ -990,7 +992,7 @@ def _getClassDefinition(self, ref): if class_def.attr_len > 0: for i in xrange(class_def.attr_len): - key = self.readBytes() + key = self.readString() class_def.static_properties.append(key) @@ -1003,11 +1005,11 @@ def _readStatic(self, class_def, obj): obj[attr] = self.readElement() def _readDynamic(self, class_def, obj): - attr = self.readBytes() + attr = self.readString() while attr: obj[attr] = self.readElement() - attr = self.readBytes() + attr = self.readString() def readObject(self): """ @@ -1240,7 +1242,7 @@ def serialiseString(self, s): @type s: C{str} @param s: The string data to be encoded to the AMF3 data stream. """ - if type(s) is unicode: + if isinstance(s, text_type): s = self.context.getBytesForString(s) self.serialiseBytes(s) @@ -1324,7 +1326,7 @@ def writeList(self, n, is_proxy=False): self.context.addObject(n) self._writeInteger((len(n) << 1) | REFERENCE_BIT) - self.stream.write('\x01') + self.stream.write(b'\x01') [self.writeElement(x) for x in n] @@ -1465,7 +1467,7 @@ def writeObject(self, obj, is_proxy=False): definition.reference << 2 | REFERENCE_BIT) if alias.anonymous: - self.stream.write('\x01') + self.stream.write(b'\x01') else: self.serialiseString(alias.alias) @@ -1483,9 +1485,9 @@ def writeObject(self, obj, is_proxy=False): if alias.static_attrs: if not class_ref: - [self.serialiseString(attr) for attr in alias.static_attrs] + [self.serialiseString(attr) for attr in sorted(alias.static_attrs)] - for attr in alias.static_attrs: + for attr in sorted(alias.static_attrs): value = attrs.pop(attr) self.writeElement(value) @@ -1495,14 +1497,22 @@ def writeObject(self, obj, is_proxy=False): if definition.encoding == ObjectEncoding.DYNAMIC: if attrs: - for attr, value in attrs.iteritems(): - if type(attr) in python.int_types: - attr = str(attr) - - self.serialiseString(attr) + e = pyamf.EncodeError('Unable to encode %r (type %r)' % (obj, type(obj))) + try: + keys = sorted(attrs) + except TypeError: + raise e + for key in keys: + value = attrs[key] + if isinstance(key, python.int_types): + key = str(key) + elif not isinstance(key, python.str_types): + raise e + + self.serialiseString(key) self.writeElement(value) - self.stream.write('\x01') + self.stream.write(b'\x01') def writeByteArray(self, n): """ @@ -1522,7 +1532,7 @@ def writeByteArray(self, n): self.context.addObject(n) - buf = str(n) + buf = n.encode() l = len(buf) self._writeInteger(l << 1 | REFERENCE_BIT) self.stream.write(buf) @@ -1544,7 +1554,7 @@ def writeXML(self, n): self.context.addObject(n) - self.serialiseString(xml.tostring(n).encode('utf-8')) + self.serialiseString(xml.tostring(n)) def encode_int(n): @@ -1570,31 +1580,31 @@ def encode_int(n): if n < 0: n += 0x20000000 - bytes = '' + encoded = bytearray() real_value = None if n > 0x1fffff: real_value = n n >>= 1 - bytes += chr(0x80 | ((n >> 21) & 0xff)) + encoded.append(0x80 | ((n >> 21) & 0xff)) if n > 0x3fff: - bytes += chr(0x80 | ((n >> 14) & 0xff)) + encoded.append(0x80 | ((n >> 14) & 0xff)) if n > 0x7f: - bytes += chr(0x80 | ((n >> 7) & 0xff)) + encoded.append(0x80 | ((n >> 7) & 0xff)) if real_value is not None: n = real_value if n > 0x1fffff: - bytes += chr(n & 0xff) + encoded.append(n & 0xff) else: - bytes += chr(n & 0x7f) - - ENCODED_INT_CACHE[n] = bytes + encoded.append(n & 0x7f) - return bytes + encoded = bytes(encoded) + ENCODED_INT_CACHE[n] = encoded + return encoded def decode_int(stream, signed=False): diff --git a/pyamf/codec.py b/pyamf/codec.py index e51904ae..e91164e3 100644 --- a/pyamf/codec.py +++ b/pyamf/codec.py @@ -7,6 +7,7 @@ import types import datetime +from six import binary_type, text_type, iteritems import pyamf from pyamf import util, python, xml @@ -18,13 +19,6 @@ 'Encoder' ] -try: - unicode -except NameError: - # py3k support - unicode = str - str = bytes - class IndexedCollection(object): """ @@ -281,7 +275,7 @@ class _Codec(object): def __init__(self, stream=None, context=None, strict=False, timezone_offset=None): - if isinstance(stream, basestring) or stream is None: + if isinstance(stream, binary_type) or stream is None: stream = util.BufferedByteStream(stream) self.stream = stream @@ -334,6 +328,8 @@ def next(self): # all data was successfully decoded from the stream raise StopIteration + __next__ = next + def readElement(self): """ Reads an AMF3 element from the data stream. @@ -444,11 +440,9 @@ def writeGenerator(self, gen): """ Iterates over a generator object and encodes all that is returned. """ - n = getattr(gen, 'next') - while True: try: - self.writeElement(n()) + self.writeElement(next(gen)) except StopIteration: break @@ -463,9 +457,9 @@ def getTypeFunc(self, data): t = type(data) # try types that we know will work - if t is str or issubclass(t, str): + if t is binary_type or issubclass(t, binary_type): return self.writeBytes - if t is unicode or issubclass(t, unicode): + if t is text_type or issubclass(t, text_type): return self.writeString elif t is bool: return self.writeBoolean @@ -485,7 +479,7 @@ def getTypeFunc(self, data): return self.writeXML # check for any overridden types - for type_, func in pyamf.TYPE_MAP.iteritems(): + for type_, func in iteritems(pyamf.TYPE_MAP): try: if isinstance(data, type_): return _CustomTypeFunc(self, func) @@ -550,5 +544,7 @@ def next(self): return self.stream.read(end_pos - start_pos) + __next__ = next + def __iter__(self): return self diff --git a/pyamf/flex/messaging.py b/pyamf/flex/messaging.py index 67b3093f..e634e974 100644 --- a/pyamf/flex/messaging.py +++ b/pyamf/flex/messaging.py @@ -570,7 +570,7 @@ def decode_uuid(obj): @since: 0.5 """ - return uuid.UUID(bytes=str(obj)) + return uuid.UUID(bytes=obj.encode()) pyamf.register_package(globals(), package=NAMESPACE) diff --git a/pyamf/remoting/__init__.py b/pyamf/remoting/__init__.py index 53c12be4..e8faf0af 100644 --- a/pyamf/remoting/__init__.py +++ b/pyamf/remoting/__init__.py @@ -26,6 +26,9 @@ @since: 0.1 """ +from six import iteritems, text_type +from six.moves import xrange + import pyamf from pyamf import util @@ -172,6 +175,8 @@ def __getitem__(self, name): def __nonzero__(self): return len(self.bodies) != 0 or len(self.headers) != 0 + __bool__ = __nonzero__ + def __iter__(self): for body in self.bodies: yield body[0], body[1] @@ -335,7 +340,7 @@ def raiseException(self): Raises an exception based on the fault object. There is no traceback available. """ - raise get_exception_from_fault(self), self.description, None + raise get_exception_from_fault(self)(self.description) class ErrorFault(BaseFault): @@ -429,14 +434,14 @@ def _read_args(): # does not keep the array of args in the object references lookup type_byte = stream.peek(1) - if type_byte == '\x11': + if type_byte == b'\x11': if not decoder.use_amf3: raise pyamf.DecodeError( "Unexpected AMF3 type with incorrect message type") return decoder.readElement() - if type_byte != '\x0a': + if type_byte != b'\x0a': raise pyamf.DecodeError("Array type required for request body") stream.read(1) @@ -450,7 +455,7 @@ def _read_args(): status = STATUS_OK is_request = True - for code, s in STATUS_CODES.iteritems(): + for code, s in iteritems(STATUS_CODES): if not target.endswith(s): continue @@ -502,7 +507,7 @@ def _encode_body(message): return - stream.write('\x0a') + stream.write(b'\x0a') stream.write_ulong(len(message.body)) for x in message.body: encoder.writeElement(x) @@ -513,13 +518,11 @@ def _encode_body(message): target = None if isinstance(message, Request): - target = unicode(message.target) + target = text_type(message.target) else: target = u"%s%s" % (name, _get_status(message.status)) - target = target.encode('utf8') - - stream.write_ushort(len(target)) + stream.write_ushort(len(target.encode('utf8'))) stream.write_utf8_string(target) response = 'null' @@ -578,8 +581,8 @@ def get_fault(data): e = {} - for x, y in data.iteritems(): - if isinstance(x, unicode): + for x, y in iteritems(data): + if isinstance(x, text_type): e[str(x)] = y else: e[x] = y @@ -694,7 +697,7 @@ def encode(msg, strict=False, logger=None, timezone_offset=None): stream.write_ushort(msg.amfVersion) stream.write_ushort(len(msg.headers)) - for name, header in msg.headers.iteritems(): + for name, header in iteritems(msg.headers): _write_header( name, header, @@ -706,7 +709,7 @@ def encode(msg, strict=False, logger=None, timezone_offset=None): stream.write_short(len(msg)) - for name, message in msg.iteritems(): + for name, message in iteritems(msg): encoder.context.clear() _write_body(name, message, stream, encoder, strict) diff --git a/pyamf/remoting/amf0.py b/pyamf/remoting/amf0.py index 151f19fb..6fa33461 100644 --- a/pyamf/remoting/amf0.py +++ b/pyamf/remoting/amf0.py @@ -9,6 +9,7 @@ import traceback import sys +from six import text_type from pyamf import remoting from pyamf.remoting import gateway @@ -156,6 +157,6 @@ def build_fault(cls, e, tb, include_traceback=False): return remoting.ErrorFault( code=code, - description=unicode(e), + description=text_type(e), details=details ) diff --git a/pyamf/remoting/amf3.py b/pyamf/remoting/amf3.py index 08a38419..32dd4e9e 100644 --- a/pyamf/remoting/amf3.py +++ b/pyamf/remoting/amf3.py @@ -15,6 +15,7 @@ import time import uuid import sys +from six import text_type import pyamf.python from pyamf import remoting @@ -77,13 +78,13 @@ def generate_error(request, cls, e, tb, include_traceback=False): faultString = None if hasattr(e, 'message'): - faultString = unicode(e.message) + faultString = text_type(e.message) elif hasattr(e, 'args') and e.args: if isinstance(e.args[0], pyamf.python.str_types): - faultString = unicode(e.args[0]) + faultString = text_type(e.args[0]) if details: - faultDetail = unicode(details) + faultDetail = text_type(details) return messaging.ErrorMessage( messageId=generate_random_id(), diff --git a/pyamf/remoting/client/__init__.py b/pyamf/remoting/client/__init__.py index 283b955d..c7d3f177 100644 --- a/pyamf/remoting/client/__init__.py +++ b/pyamf/remoting/client/__init__.py @@ -7,8 +7,10 @@ @since: 0.1 """ -import urllib2 -import urlparse +from six import iteritems, string_types +from six.moves.urllib.error import URLError +from six.moves.urllib.parse import urlparse +from six.moves.urllib.request import Request, urlopen import pyamf from pyamf import remoting @@ -18,10 +20,7 @@ except ImportError: GzipFile = False -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO +from six import BytesIO #: Default user agent is `PyAMF/x.x(.x)`. @@ -224,7 +223,7 @@ def __init__(self, url, amf_version=pyamf.AMF0, **kwargs): self.referer = kwargs.pop('referer', None) self.strict = kwargs.pop('strict', False) self.logger = kwargs.pop('logger', None) - self.opener = kwargs.pop('opener', urllib2.urlopen) + self.opener = kwargs.pop('opener', urlopen) if kwargs: raise TypeError('Unexpected keyword arguments %r' % (kwargs,)) @@ -232,7 +231,7 @@ def __init__(self, url, amf_version=pyamf.AMF0, **kwargs): self._setUrl(url) def _setUrl(self, url): - self.url = urlparse.urlparse(url) + self.url = urlparse(url) self._root_url = url if not self.url[0] in ('http', 'https'): @@ -285,7 +284,7 @@ def getService(self, name, auto_execute=True): @rtype: L{ServiceProxy} @raise TypeError: Unexpected type for string C{name}. """ - if not isinstance(name, basestring): + if not isinstance(name, string_types): raise TypeError('string type required') return ServiceProxy(self, name, auto_execute) @@ -398,7 +397,7 @@ def execute_single(self, request): strict=self.strict ) - http_request = urllib2.Request( + http_request = Request( self._root_url, body.getvalue(), self._get_execute_headers() ) @@ -425,7 +424,7 @@ def execute(self): strict=self.strict ) - http_request = urllib2.Request( + http_request = Request( self._root_url, body.getvalue(), self._get_execute_headers() ) @@ -446,7 +445,7 @@ def _getResponse(self, http_request): try: fbh = self.opener(http_request) - except urllib2.URLError, e: + except URLError as e: if self.logger: self.logger.exception('Failed request for %s', self._root_url) @@ -484,7 +483,7 @@ def _getResponse(self, http_request): 'Decompression of Content-Encoding: %s not available.' % ( content_encoding,)) - compressedstream = StringIO(bytes) + compressedstream = BytesIO(bytes) gzipper = GzipFile(fileobj=compressedstream) bytes = gzipper.read() gzipper.close() @@ -509,7 +508,7 @@ def _getResponse(self, http_request): if remoting.REQUEST_PERSISTENT_HEADER in response.headers: data = response.headers[remoting.REQUEST_PERSISTENT_HEADER] - for k, v in data.iteritems(): + for k, v in iteritems(data): self.headers[k] = v return response @@ -521,8 +520,8 @@ def setCredentials(self, username, password): self.addHeader( 'Credentials', dict( - userid=username.decode('utf-8'), - password=password.decode('utf-8') + userid=username, + password=password ), True ) diff --git a/pyamf/remoting/gateway/__init__.py b/pyamf/remoting/gateway/__init__.py index b5e32aaf..924fe630 100644 --- a/pyamf/remoting/gateway/__init__.py +++ b/pyamf/remoting/gateway/__init__.py @@ -10,6 +10,7 @@ import sys import types import datetime +from six import class_types, integer_types, iteritems, string_types import pyamf from pyamf import remoting, util, python @@ -70,11 +71,11 @@ def __init__(self, service, description=None, authenticator=None, self.expose_request = expose_request self.preprocessor = preprocessor - def __cmp__(self, other): + def __eq__(self, other): if isinstance(other, ServiceWrapper): - return cmp(self.__dict__, other.__dict__) + return self.__dict__ == other.__dict__ - return cmp(self.service, other) + return self.service == other def _get_service_func(self, method, params): """ @@ -85,7 +86,7 @@ def _get_service_func(self, method, params): """ service = None - if isinstance(self.service, (type, types.ClassType)): + if isinstance(self.service, class_types): service = self.service() else: service = self.service @@ -238,7 +239,7 @@ class ServiceCollection(dict): I hold a collection of services, mapping names to objects. """ def __contains__(self, value): - if isinstance(value, basestring): + if isinstance(value, string_types): return value in self.keys() return value in self.values() @@ -276,7 +277,7 @@ def __init__(self, services=None, **kwargs): if services is None: services = {} - if not hasattr(services, 'iteritems'): + if not hasattr(services, 'items'): raise TypeError("dict type required for services") self.services = ServiceCollection() @@ -292,7 +293,7 @@ def __init__(self, services=None, **kwargs): if kwargs: raise TypeError('Unknown kwargs: %r' % (kwargs,)) - for name, service in services.iteritems(): + for name, service in iteritems(services): self.addService(service, name) def addService(self, service, name=None, description=None, @@ -308,25 +309,12 @@ def addService(self, service, name=None, description=None, @raise TypeError: C{service} cannot be a scalar value. @raise TypeError: C{service} must be C{callable} or a module. """ - if isinstance(service, (int, long, float, basestring)): + if isinstance(service, integer_types + (float,) + string_types): raise TypeError("Service cannot be a scalar value") - allowed_types = ( - types.ModuleType, - types.FunctionType, - types.DictType, - types.MethodType, - types.InstanceType, - types.ObjectType, - ) - - if not python.callable(service) and \ - not isinstance(service, allowed_types): - raise TypeError("Service must be a callable, module, or an object") - if name is None: # TODO: include the module in the name - if isinstance(service, (type, types.ClassType)): + if isinstance(service, class_types): name = service.__name__ elif isinstance(service, types.FunctionType): name = service.func_name @@ -364,7 +352,7 @@ def removeService(self, service): @type service: C{callable} or a class instance @raise NameError: Service not found. """ - for name, wrapper in self.services.iteritems(): + for name, wrapper in iteritems(self.services): if service in (name, wrapper.service): del self.services[name] return @@ -546,7 +534,7 @@ def authenticate(func, c, expose_request=False): attr = func - if isinstance(func, types.UnboundMethodType): + if isinstance(func, types.MethodType): attr = func.im_func if expose_request is True: @@ -566,7 +554,7 @@ def expose_request(func): if not python.callable(func): raise TypeError("func must be callable") - if isinstance(func, types.UnboundMethodType): + if isinstance(func, types.MethodType): setattr(func.im_func, '_pyamf_expose_request', True) else: setattr(func, '_pyamf_expose_request', True) @@ -592,7 +580,7 @@ def preprocess(func, c, expose_request=False): attr = func - if isinstance(func, types.UnboundMethodType): + if isinstance(func, types.MethodType): attr = func.im_func if expose_request is True: diff --git a/pyamf/sol.py b/pyamf/sol.py index 6d0c7888..fa9cec8d 100644 --- a/pyamf/sol.py +++ b/pyamf/sol.py @@ -16,13 +16,14 @@ import pyamf from pyamf import util +from six import iteritems, string_types #: Magic Number - 2 bytes -HEADER_VERSION = '\x00\xbf' +HEADER_VERSION = b'\x00\xbf' #: Marker - 10 bytes -HEADER_SIGNATURE = 'TCSO\x00\x04\x00\x00\x00\x00' +HEADER_SIGNATURE = b'TCSO\x00\x04\x00\x00\x00\x00' #: Padding - 4 bytes -PADDING_BYTE = '\x00' +PADDING_BYTE = b'\x00' def decode(stream, strict=True): @@ -118,7 +119,7 @@ def encode(name, values, strict=True, encoding=pyamf.AMF0): stream.write(PADDING_BYTE * 3) stream.write_uchar(encoding) - for n, v in values.iteritems(): + for n, v in iteritems(values): encoder.serialiseString(n) encoder.writeElement(v) @@ -144,7 +145,7 @@ def load(name_or_file): f = name_or_file opened = False - if isinstance(name_or_file, basestring): + if isinstance(name_or_file, string_types): f = open(name_or_file, 'rb') opened = True elif not hasattr(f, 'read'): @@ -153,7 +154,7 @@ def load(name_or_file): name, values = decode(f.read()) s = SOL(name) - for n, v in values.iteritems(): + for n, v in iteritems(values): s[n] = v if opened is True: @@ -172,7 +173,7 @@ def save(sol, name_or_file, encoding=pyamf.AMF0): f = name_or_file opened = False - if isinstance(name_or_file, basestring): + if isinstance(name_or_file, string_types): f = open(name_or_file, 'wb+') opened = True elif not hasattr(f, 'write'): diff --git a/pyamf/tests/adapters/test_array.py b/pyamf/tests/adapters/test_array.py index 85f96983..ef3bc457 100644 --- a/pyamf/tests/adapters/test_array.py +++ b/pyamf/tests/adapters/test_array.py @@ -25,13 +25,13 @@ def setUp(self): if not array: self.skipTest("'array' not available") - self.orig = ['f', 'o', 'o'] + self.orig = [ord('f'), ord('o'), ord('o')] - self.obj = array.array('c') + self.obj = array.array('b') - self.obj.append('f') - self.obj.append('o') - self.obj.append('o') + self.obj.append(ord('f')) + self.obj.append(ord('o')) + self.obj.append(ord('o')) def encdec(self, encoding): return pyamf.decode( diff --git a/pyamf/tests/adapters/test_google.py b/pyamf/tests/adapters/test_google.py index 6150cf4d..73740ec3 100644 --- a/pyamf/tests/adapters/test_google.py +++ b/pyamf/tests/adapters/test_google.py @@ -1149,7 +1149,7 @@ class BlobStoreTestCase(BaseTestCase): 'content_type': 'text/plain', 'size': 1234567, 'filename': 'not-telling.ogg', - 'creation': datetime.datetime(2010, 07, 11, 14, 15, 01) + 'creation': datetime.datetime(2010, 7, 11, 14, 15, 1) } def setUp(self): diff --git a/pyamf/tests/gateway/test_google.py b/pyamf/tests/gateway/test_google.py index d63cbb2b..02697668 100644 --- a/pyamf/tests/gateway/test_google.py +++ b/pyamf/tests/gateway/test_google.py @@ -11,7 +11,7 @@ import unittest -from StringIO import StringIO +from six import StringIO try: from google.appengine.ext import webapp diff --git a/pyamf/tests/modules/test_decimal.py b/pyamf/tests/modules/test_decimal.py index 288bb837..ee50a5fc 100644 --- a/pyamf/tests/modules/test_decimal.py +++ b/pyamf/tests/modules/test_decimal.py @@ -17,7 +17,7 @@ def test_amf0_encode(self): self.assertEqual( pyamf.encode(x, encoding=pyamf.AMF0, strict=False).getvalue(), - '\x00?\xf3\xc0\xc6\xd8\xa18\xfa' + b'\x00?\xf3\xc0\xc6\xd8\xa18\xfa' ) with self.assertRaises(pyamf.EncodeError): @@ -28,7 +28,7 @@ def test_amf3_encode(self): self.assertEqual( pyamf.encode(x, encoding=pyamf.AMF3, strict=False).getvalue(), - '\x05?\xf3\xc0\xc6\xd8\xa18\xfa' + b'\x05?\xf3\xc0\xc6\xd8\xa18\xfa' ) with self.assertRaises(pyamf.EncodeError): diff --git a/pyamf/tests/modules/test_sets.py b/pyamf/tests/modules/test_sets.py deleted file mode 100644 index 5ac36240..00000000 --- a/pyamf/tests/modules/test_sets.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) The PyAMF Project. -# See LICENSE.txt for details. - -""" -Tests for the C{sets} module integration. -""" - -import unittest -import sets - -import pyamf -from pyamf.tests.util import check_buffer - - -class ImmutableSetTestCase(unittest.TestCase): - def test_amf0_encode(self): - x = sets.ImmutableSet(['1', '2', '3']) - - self.assertTrue(check_buffer( - pyamf.encode(x, encoding=pyamf.AMF0).getvalue(), ( - '\n\x00\x00\x00\x03', ( - '\x02\x00\x011', - '\x02\x00\x013', - '\x02\x00\x012' - ) - ) - )) - - def test_amf3_encode(self): - x = sets.ImmutableSet(['1', '2', '3']) - - self.assertTrue(check_buffer( - pyamf.encode(x, encoding=pyamf.AMF3).getvalue(), ( - '\t\x07\x01', ( - '\x06\x031', - '\x06\x033', - '\x06\x032' - ) - ) - )) diff --git a/pyamf/tests/remoting/test_client.py b/pyamf/tests/remoting/test_client.py index d8fd5350..75d651f5 100644 --- a/pyamf/tests/remoting/test_client.py +++ b/pyamf/tests/remoting/test_client.py @@ -10,7 +10,7 @@ """ import unittest -import urllib2 +from six.moves.urllib.error import URLError import pyamf from pyamf import remoting, util @@ -226,7 +226,7 @@ def __init__(self, test, response=None): def open(self, request, data=None, timeout=None): if self.response.code != 200: - raise urllib2.URLError(self.response.code) + raise URLError(self.response.code) self.request = request self.data = data @@ -265,10 +265,10 @@ class BaseServiceTestCase(unittest.TestCase): """ canned_response = ( - '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00' - '\x04null\x00\x00\x00\x00\n\x00\x00\x00\x03\x00?\xf0\x00\x00' - '\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00@\x08\x00' - '\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00' + b'\x04null\x00\x00\x00\x00\n\x00\x00\x00\x03\x00?\xf0\x00\x00' + b'\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00@\x08\x00' + b'\x00\x00\x00\x00\x00' ) headers = { @@ -450,9 +450,9 @@ def test_execute_single(self): self.assertEqual(r.get_full_url(), 'http://example.org/amf-gateway') self.assertEqual( - r.get_data(), - '\x00\x00\x00\x00\x00\x01\x00\x07baz.gak\x00\x02/1\x00\x00\x00' - '\x00\x0a\x00\x00\x00\x00' + r.data, + b'\x00\x00\x00\x00\x00\x01\x00\x07baz.gak\x00\x02/1\x00\x00\x00' + b'\x00\x0a\x00\x00\x00\x00' ) self.assertEqual(response.status, remoting.STATUS_OK) @@ -481,14 +481,14 @@ def test_execute(self): self.assertEqual(r.get_full_url(), 'http://example.org/amf-gateway') self.assertEqual( - r.get_data(), - '\x00\x00\x00\x00\x00\x02\x00\x07baz.gak\x00\x02/1\x00\x00\x00\x00' - '\n\x00\x00\x00\x00\x00\tspam.eggs\x00\x02/2\x00\x00\x00\x00\n\x00' - '\x00\x00\x00' + r.data, + b'\x00\x00\x00\x00\x00\x02\x00\x07baz.gak\x00\x02/1\x00\x00\x00\x00' + b'\n\x00\x00\x00\x00\x00\tspam.eggs\x00\x02/2\x00\x00\x00\x00\n\x00' + b'\x00\x00\x00' ) def test_get_response(self): - self.setResponse(200, '\x00\x00\x00\x00\x00\x00\x00\x00') + self.setResponse(200, b'\x00\x00\x00\x00\x00\x00\x00\x00') self.gw._getResponse(None) @@ -520,8 +520,8 @@ def test_credentials(self): def test_append_url_header(self): self.setResponse( 200, - '\x00\x00\x00\x01\x00\x12AppendToGatewayUrl\x01\x00\x00\x00\x00' - '\x02\x00\x05hello\x00\x00\x00\x00', + b'\x00\x00\x00\x01\x00\x12AppendToGatewayUrl\x01\x00\x00\x00\x00' + b'\x02\x00\x05hello\x00\x00\x00\x00', {'Content-Type': 'application/x-amf'} ) @@ -536,8 +536,8 @@ def test_append_url_header(self): def test_replace_url_header(self): self.setResponse( 200, - '\x00\x00\x00\x01\x00\x11ReplaceGatewayUrl\x01\x00\x00\x00\x00\x02' - '\x00\x10http://spam.eggs\x00\x00\x00\x00', + b'\x00\x00\x00\x01\x00\x11ReplaceGatewayUrl\x01\x00\x00\x00\x00\x02' + b'\x00\x10http://spam.eggs\x00\x00\x00\x00', {'Content-Type': 'application/x-amf'} ) @@ -575,8 +575,8 @@ def test_http_request_headers(self): self.setResponse( 200, - '\x00\x00\x00\x01\x00\x11ReplaceGatewayUrl\x01\x00\x00\x00\x00\x02' - '\x00\x10http://spam.eggs\x00\x00\x00\x00' + b'\x00\x00\x00\x01\x00\x11ReplaceGatewayUrl\x01\x00\x00\x00\x00\x02' + b'\x00\x10http://spam.eggs\x00\x00\x00\x00' ) self.gw.execute() @@ -588,8 +588,8 @@ def test_http_request_headers(self): def test_empty_content_length(self): self.setResponse( 200, - '\x00\x00\x00\x01\x00\x11ReplaceGatewayUrl\x01\x00\x00\x00\x00\x02' - '\x00\x10http://spam.eggs\x00\x00\x00\x00', + b'\x00\x00\x00\x01\x00\x11ReplaceGatewayUrl\x01\x00\x00\x00\x00\x02' + b'\x00\x10http://spam.eggs\x00\x00\x00\x00', { 'Content-Type': 'application/x-amf', 'Content-Length': '' @@ -657,7 +657,7 @@ def test_good_response(self): self.gw._getResponse(None) def test_bad_response(self): - self.headers['Content-Length'] = len('foobar') - self.setResponse(200, 'foobar', self.headers) + self.headers['Content-Length'] = len(b'foobar') + self.setResponse(200, b'foobar', self.headers) self.assertRaises(IOError, self.gw._getResponse, None) diff --git a/pyamf/tests/test_adapters_util.py b/pyamf/tests/test_adapters_util.py index 5e4b30f0..97bb2a72 100644 --- a/pyamf/tests/test_adapters_util.py +++ b/pyamf/tests/test_adapters_util.py @@ -8,15 +8,10 @@ """ import unittest +from six.moves import builtins from pyamf.adapters import util -# check for set function in python 2.3 -import __builtin__ - -if not hasattr(__builtin__, 'set'): - from sets import Set as set - class Iterable(object): """ diff --git a/pyamf/tests/test_alias.py b/pyamf/tests/test_alias.py index 5872d7ca..b3cc1e28 100644 --- a/pyamf/tests/test_alias.py +++ b/pyamf/tests/test_alias.py @@ -15,11 +15,6 @@ from pyamf import ClassAlias from pyamf.tests.util import ClassCacheClearingTestCase, Spam, get_fqcn -try: - set -except NameError: - from sets import Set as set - class ClassAliasTestCase(ClassCacheClearingTestCase): """ @@ -107,7 +102,8 @@ class NewFoo(object): def __init__(self, foo, bar): pass - self.assertRaises(TypeError, ClassAlias, ClassicFoo) + if not isinstance(ClassicFoo, type): + self.assertRaises(TypeError, ClassAlias, ClassicFoo) ClassAlias(NewFoo) def test_createInstance(self): @@ -198,9 +194,7 @@ def test_proxy(self): attrs = self.alias.getEncodableAttributes(self.obj, c) - k = attrs.keys() - - k.sort() + k = sorted(attrs.keys()) self.assertEqual(k, ['bar', 'foo']) @@ -1016,6 +1010,9 @@ class C(B): class D(C, B): __slots__ = ('spam',) + if isinstance(A, object): + return + a = ClassAlias(A) self.assertFalse(a.dynamic) diff --git a/pyamf/tests/test_amf0.py b/pyamf/tests/test_amf0.py index 402cd93b..af194df1 100644 --- a/pyamf/tests/test_amf0.py +++ b/pyamf/tests/test_amf0.py @@ -24,24 +24,24 @@ class TypesTestCase(unittest.TestCase): """ def test_types(self): - self.assertEqual(amf0.TYPE_NUMBER, '\x00') - self.assertEqual(amf0.TYPE_BOOL, '\x01') - self.assertEqual(amf0.TYPE_STRING, '\x02') - self.assertEqual(amf0.TYPE_OBJECT, '\x03') - self.assertEqual(amf0.TYPE_MOVIECLIP, '\x04') - self.assertEqual(amf0.TYPE_NULL, '\x05') - self.assertEqual(amf0.TYPE_UNDEFINED, '\x06') - self.assertEqual(amf0.TYPE_REFERENCE, '\x07') - self.assertEqual(amf0.TYPE_MIXEDARRAY, '\x08') - self.assertEqual(amf0.TYPE_OBJECTTERM, '\x09') - self.assertEqual(amf0.TYPE_ARRAY, '\x0a') - self.assertEqual(amf0.TYPE_DATE, '\x0b') - self.assertEqual(amf0.TYPE_LONGSTRING, '\x0c') - self.assertEqual(amf0.TYPE_UNSUPPORTED, '\x0d') - self.assertEqual(amf0.TYPE_RECORDSET, '\x0e') - self.assertEqual(amf0.TYPE_XML, '\x0f') - self.assertEqual(amf0.TYPE_TYPEDOBJECT, '\x10') - self.assertEqual(amf0.TYPE_AMF3, '\x11') + self.assertEqual(amf0.TYPE_NUMBER, b'\x00') + self.assertEqual(amf0.TYPE_BOOL, b'\x01') + self.assertEqual(amf0.TYPE_STRING, b'\x02') + self.assertEqual(amf0.TYPE_OBJECT, b'\x03') + self.assertEqual(amf0.TYPE_MOVIECLIP, b'\x04') + self.assertEqual(amf0.TYPE_NULL, b'\x05') + self.assertEqual(amf0.TYPE_UNDEFINED, b'\x06') + self.assertEqual(amf0.TYPE_REFERENCE, b'\x07') + self.assertEqual(amf0.TYPE_MIXEDARRAY, b'\x08') + self.assertEqual(amf0.TYPE_OBJECTTERM, b'\x09') + self.assertEqual(amf0.TYPE_ARRAY, b'\x0a') + self.assertEqual(amf0.TYPE_DATE, b'\x0b') + self.assertEqual(amf0.TYPE_LONGSTRING, b'\x0c') + self.assertEqual(amf0.TYPE_UNSUPPORTED, b'\x0d') + self.assertEqual(amf0.TYPE_RECORDSET, b'\x0e') + self.assertEqual(amf0.TYPE_XML, b'\x0f') + self.assertEqual(amf0.TYPE_TYPEDOBJECT, b'\x10') + self.assertEqual(amf0.TYPE_AMF3, b'\x11') class EncoderTestCase(ClassCacheClearingTestCase, EncoderMixIn): @@ -56,113 +56,113 @@ def setUp(self): EncoderMixIn.setUp(self) def test_number(self): - self.assertEncoded(0, '\x00\x00\x00\x00\x00\x00\x00\x00\x00') - self.assertEncoded(0.2, '\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a') - self.assertEncoded(1, '\x00\x3f\xf0\x00\x00\x00\x00\x00\x00') - self.assertEncoded(42, '\x00\x40\x45\x00\x00\x00\x00\x00\x00') - self.assertEncoded(-123, '\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00') - self.assertEncoded(1.23456789, '\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b') + self.assertEncoded(0, b'\x00\x00\x00\x00\x00\x00\x00\x00\x00') + self.assertEncoded(0.2, b'\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a') + self.assertEncoded(1, b'\x00\x3f\xf0\x00\x00\x00\x00\x00\x00') + self.assertEncoded(42, b'\x00\x40\x45\x00\x00\x00\x00\x00\x00') + self.assertEncoded(-123, b'\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00') + self.assertEncoded(1.23456789, b'\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b') def test_boolean(self): - self.assertEncoded(True, '\x01\x01') - self.assertEncoded(False, '\x01\x00') + self.assertEncoded(True, b'\x01\x01') + self.assertEncoded(False, b'\x01\x00') def test_string(self): - self.assertEncoded('', '\x02\x00\x00') - self.assertEncoded('hello', '\x02\x00\x05hello') + self.assertEncoded('', b'\x02\x00\x00') + self.assertEncoded('hello', b'\x02\x00\x05hello') # unicode taken from http://www.columbia.edu/kermit/utf8.html self.assertEncoded( - u'ᚠᛇᚻ', '\x02\x00\t\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb' + u'ᚠᛇᚻ', b'\x02\x00\t\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb' ) def test_null(self): - self.assertEncoded(None, '\x05') + self.assertEncoded(None, b'\x05') def test_undefined(self): - self.assertEncoded(pyamf.Undefined, '\x06') + self.assertEncoded(pyamf.Undefined, b'\x06') def test_list(self): - self.assertEncoded([], '\x0a\x00\x00\x00\x00') + self.assertEncoded([], b'\x0a\x00\x00\x00\x00') self.assertEncoded( [1, 2, 3], - '\x0a\x00\x00\x00\x03\x00\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x40' - '\x00\x00\x00\x00\x00\x00\x00\x00\x40\x08\x00\x00\x00\x00\x00\x00' + b'\x0a\x00\x00\x00\x03\x00\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x40' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x40\x08\x00\x00\x00\x00\x00\x00' ) self.assertEncoded( (1, 2, 3), - '\x0a\x00\x00\x00\x03\x00\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x40' - '\x00\x00\x00\x00\x00\x00\x00\x00\x40\x08\x00\x00\x00\x00\x00\x00' + b'\x0a\x00\x00\x00\x03\x00\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x40' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x40\x08\x00\x00\x00\x00\x00\x00' ) def test_list_references(self): x = [] - self.assertEqual(self.encode(x, x), '\n\x00\x00\x00\x00\x07\x00\x00') + self.assertEqual(self.encode(x, x), b'\n\x00\x00\x00\x00\x07\x00\x00') def test_longstring(self): - s = 'a' * 65537 + s = b'a' * 65537 - self.assertEncoded(s, '\x0c\x00\x01\x00\x01' + s) + self.assertEncoded(s, b'\x0c\x00\x01\x00\x01' + s) def test_dict(self): - self.assertEncoded({'a': 'a'}, '\x03\x00\x01a\x02\x00\x01a\x00\x00\t') + self.assertEncoded({'a': b'a'}, b'\x03\x00\x01a\x02\x00\x01a\x00\x00\t') - self.assertEncoded({12: True, 42: "Testing"}, '\x03', ( - '\x00\x0242\x02\x00\x07Testing', - '\x00\x0212\x01\x01' - ), '\x00\x00\t') + self.assertEncoded({12: True, 42: "Testing"}, b'\x03', ( + b'\x00\x0242\x02\x00\x07Testing', + b'\x00\x0212\x01\x01' + ), b'\x00\x00\t') def test_mixed_array(self): d = pyamf.MixedArray(a=1, b=2, c=3) - bytes = ('\x08\x00\x00\x00\x00', ( - '\x00\x01a\x00?\xf0\x00\x00\x00\x00\x00\x00', - '\x00\x01c\x00@\x08\x00\x00\x00\x00\x00\x00', - '\x00\x01b\x00@\x00\x00\x00\x00\x00\x00\x00' - ), '\x00\x00\t') + bytes = (b'\x08\x00\x00\x00\x00', ( + b'\x00\x01a\x00?\xf0\x00\x00\x00\x00\x00\x00', + b'\x00\x01c\x00@\x08\x00\x00\x00\x00\x00\x00', + b'\x00\x01b\x00@\x00\x00\x00\x00\x00\x00\x00' + ), b'\x00\x00\t') self.assertEncoded(d, bytes) # test the reference - self.assertEqual(self.encode(d), '\x07\x00\x00') + self.assertEqual(self.encode(d), b'\x07\x00\x00') def test_date(self): self.assertEncoded( datetime.datetime(2005, 3, 18, 1, 58, 31), - '\x0bBp+6!\x15\x80\x00\x00\x00' + b'\x0bBp+6!\x15\x80\x00\x00\x00' ) self.assertEncoded( datetime.date(2003, 12, 1), - '\x0bBo%\xe2\xb2\x80\x00\x00\x00\x00' + b'\x0bBo%\xe2\xb2\x80\x00\x00\x00\x00' ) self.assertEncoded( datetime.datetime(2009, 3, 8, 23, 30, 47, 770122), - '\x0bBq\xfe\x86\xca5\xa1\xf4\x00\x00' + b'\x0bBq\xfe\x86\xca5\xa1\xf4\x00\x00' ) self.assertRaises(pyamf.EncodeError, self.encode, datetime.time(22, 3)) def test_xml(self): - blob = 'hello world' + blob = b'hello world' self.assertEncoded( xml.fromstring(blob), - '\x0f\x00\x00\x00\x19' + blob + b'\x0f\x00\x00\x00\x19' + blob ) def test_xml_references(self): - blob = 'hello world' + blob = b'hello world' x = xml.fromstring(blob) self.assertEncoded( [x, x], - '\n\x00\x00\x00\x02' + ('\x0f\x00\x00\x00\x19' + blob) * 2 + b'\n\x00\x00\x00\x02' + (b'\x0f\x00\x00\x00\x19' + blob) * 2 ) def test_object(self): self.assertEncoded( {'a': 'b'}, - '\x03\x00\x01a\x02\x00\x01b\x00\x00\x09' + b'\x03\x00\x01a\x02\x00\x01b\x00\x00\x09' ) def test_force_amf3(self): @@ -172,7 +172,7 @@ def test_force_amf3(self): x = Spam() x.x = 'y' - self.assertEncoded(x, '\x11\n\x0b\x13spam.eggs\x03x\x06\x03y\x01') + self.assertEncoded(x, b'\x11\n\x0b\x13spam.eggs\x03x\x06\x03y\x01') def test_typed_object(self): pyamf.register_class(Spam, alias='org.pyamf.spam') @@ -182,28 +182,28 @@ def test_typed_object(self): self.assertEncoded( x, - '\x10\x00\x0eorg.pyamf.spam\x00\x03baz\x02\x00\x05hello\x00\x00\t' + b'\x10\x00\x0eorg.pyamf.spam\x00\x03baz\x02\x00\x05hello\x00\x00\t' ) def test_complex_list(self): self.assertEncoded( [[1.0]], - '\x0a\x00\x00\x00\x01\x0a\x00\x00\x00\x01\x00\x3f\xf0\x00\x00\x00' - '\x00\x00\x00' + b'\x0a\x00\x00\x00\x01\x0a\x00\x00\x00\x01\x00\x3f\xf0\x00\x00\x00' + b'\x00\x00\x00' ) self.assertEncoded( [['test', 'test', 'test', 'test']], - '\x0a\x00\x00\x00\x01\x0a\x00\x00\x00\x04' + - ('\x02\x00\x04test' * 4) + b'\x0a\x00\x00\x00\x01\x0a\x00\x00\x00\x04' + + (b'\x02\x00\x04test' * 4) ) x = {'a': 'spam', 'b': 'eggs'} self.assertEncoded( [[x, x]], - '\n\x00\x00\x00\x01\n\x00\x00\x00\x02\x03\x00\x01a\x02\x00\x04spam' - '\x00\x01b\x02\x00\x04eggs\x00\x00\t\x07\x00\x02' + b'\n\x00\x00\x00\x01\n\x00\x00\x00\x02\x03\x00\x01a\x02\x00\x04spam' + b'\x00\x01b\x02\x00\x04eggs\x00\x00\t\x07\x00\x02' ) def test_amf3(self): @@ -211,7 +211,7 @@ def test_amf3(self): o = Spam() - self.assertEncoded(o, '\x11\n\x0b\x01\x01') + self.assertEncoded(o, b'\x11\n\x0b\x01\x01') def test_anonymous(self): pyamf.register_class(Spam) @@ -222,9 +222,9 @@ def test_anonymous(self): self.assertEncoded( x, - '\x03', - ('\x00\x05hello\x02\x00\x05world', '\x00\x04spam\x02\x00\x04eggs'), - '\x00\x00\t' + b'\x03', + (b'\x00\x05hello\x02\x00\x05world', b'\x00\x04spam\x02\x00\x04eggs'), + b'\x00\x00\t' ) def test_dynamic(self): @@ -241,7 +241,7 @@ def test_dynamic(self): self.assertTrue(alias.dynamic) - self.assertEncoded(x, '\x03\x00\x05hello\x02\x00\x05world\x00\x00\t') + self.assertEncoded(x, b'\x03\x00\x05hello\x02\x00\x05world\x00\x00\t') def test_dynamic_static(self): x = Spam() @@ -258,9 +258,9 @@ def test_dynamic_static(self): self.assertEncoded( x, - '\x03', - ('\x00\x05hello\x02\x00\x05world', '\x00\x03foo\x02\x00\x03bar'), - '\x00\x00\t' + b'\x03', + (b'\x00\x05hello\x02\x00\x05world', b'\x00\x03foo\x02\x00\x03bar'), + b'\x00\x00\t' ) def test_dynamic_registered(self): @@ -279,9 +279,9 @@ def test_dynamic_registered(self): self.assertEncoded( x, - '\x10\x00\x01x', - '\x00\x05hello\x02\x00\x05world', - '\x00\x00\t' + b'\x10\x00\x01x', + b'\x00\x05hello\x02\x00\x05world', + b'\x00\x00\t' ) def test_custom_type(self): @@ -305,8 +305,8 @@ def __iter__(self): self.assertEqual( self.buf.getvalue(), - '\n\x00\x00\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00' - '\x00\x00\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00' + b'\n\x00\x00\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00' + b'\x00\x00\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00' ) def test_old_style_classes(self): @@ -321,10 +321,10 @@ class Person: self.encoder.writeElement(u) - self.assertEncoded(u, '\x10\x00\x10spam.eggs.Person', ( - '\x00\x0bfamily_name\x02\x00\x03Doe', - '\x00\ngiven_name\x02\x00\x04Jane' - ), '\x00\x00\t') + self.assertEncoded(u, b'\x10\x00\x10spam.eggs.Person', ( + b'\x00\x0bfamily_name\x02\x00\x03Doe', + b'\x00\ngiven_name\x02\x00\x04Jane' + ), b'\x00\x00\t') def test_slots(self): class Person(object): @@ -334,10 +334,10 @@ class Person(object): u.family_name = 'Doe' u.given_name = 'Jane' - self.assertEncoded(u, '\x03', ( - '\x00\x0bfamily_name\x02\x00\x03Doe', - '\x00\ngiven_name\x02\x00\x04Jane' - ), '\x00\x00\t') + self.assertEncoded(u, b'\x03', ( + b'\x00\x0bfamily_name\x02\x00\x03Doe', + b'\x00\ngiven_name\x02\x00\x04Jane' + ), b'\x00\x00\t') def test_slots_registered(self): class Person(object): @@ -349,10 +349,10 @@ class Person(object): pyamf.register_class(Person, 'spam.eggs.Person') - self.assertEncoded(u, '\x10\x00\x10spam.eggs.Person', ( - '\x00\x0bfamily_name\x02\x00\x03Doe', - '\x00\ngiven_name\x02\x00\x04Jane' - ), '\x00\x00\t') + self.assertEncoded(u, b'\x10\x00\x10spam.eggs.Person', ( + b'\x00\x0bfamily_name\x02\x00\x03Doe', + b'\x00\ngiven_name\x02\x00\x04Jane' + ), b'\x00\x00\t') def test_elementtree_tag(self): """ @@ -372,12 +372,12 @@ def __iter__(self): self.assertEncoded( foo, - '\x03', ( - '\x00\x04text\x02\x00\x03bar', - '\x00\x04tail\x05', - '\x00\x03tag\x02\x00\x03foo', + b'\x03', ( + b'\x00\x04text\x02\x00\x03bar', + b'\x00\x04tail\x05', + b'\x00\x03tag\x02\x00\x03foo', ), - '\x00\x00\t' + b'\x00\x00\t' ) def test_funcs(self): @@ -405,7 +405,7 @@ def __writeamf__(self, o): a.append('foo') a.append('bar') - self.assertEncoded(a, '\x10\x00\x01a\x00\x00\t') + self.assertEncoded(a, b'\x10\x00\x01a\x00\x00\t') def test_nonexternal_subclassed_list(self): class L(list): @@ -419,7 +419,7 @@ class L(list): a.append('bar') self.assertEncoded( - a, '\n\x00\x00\x00\x02\x02\x00\x03foo\x02\x00\x03bar' + a, b'\n\x00\x00\x00\x02\x02\x00\x03foo\x02\x00\x03bar' ) def test_amf3_xml(self): @@ -444,8 +444,8 @@ def test_use_amf3(self): self.assertEncoded( x, - '\x11\n\x0b', - ('\x01\x07foo\x06\x07bar', '\x07baz\x06\x07gak\x01') + b'\x11\n\x0b', + (b'\x01\x07baz\x06\x07gak', b'\x07foo\x06\x07bar\x01') ) def test_static_attrs(self): @@ -461,9 +461,9 @@ class __amf__: self.assertEncoded( x, - '\x03', - ('\x00\x03bar\x02\x00\x03gak', '\x00\x03foo\x02\x00\x03baz'), - '\x00\x00\t' + b'\x03', + (b'\x00\x03bar\x02\x00\x03gak', b'\x00\x03foo\x02\x00\x03baz'), + b'\x00\x00\t' ) def test_class(self): @@ -483,19 +483,19 @@ def test_timezone(self): d = datetime.datetime(2009, 9, 24, 14, 23, 23) self.encoder.timezone_offset = datetime.timedelta(hours=-5) - self.assertEncoded(d, '\x0bBr>\xd8\x1f\xff\x80\x00\x00\x00') + self.assertEncoded(d, b'\x0bBr>\xd8\x1f\xff\x80\x00\x00\x00') def test_generators(self): def foo(): yield [1, 2, 3] - yield '\xff' + yield b'\xff' yield pyamf.Undefined self.assertEncoded( foo(), - '\n\x00\x00\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00' - '\x00\x00\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00\x02\x00\x01' - '\xff\x06' + b'\n\x00\x00\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00' + b'\x00\x00\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00\x02\x00\x01' + b'\xff\x06' ) def test_iterate(self): @@ -505,11 +505,11 @@ def test_iterate(self): self.encoder.send('hello') self.encoder.send(u'ƒøø') - self.assertEqual(self.encoder.next(), '\x02\x00\x00') - self.assertEqual(self.encoder.next(), '\x02\x00\x05hello') + self.assertEqual(self.encoder.next(), b'\x02\x00\x00') + self.assertEqual(self.encoder.next(), b'\x02\x00\x05hello') self.assertEqual( self.encoder.next(), - '\x02\x00\x06\xc6\x92\xc3\xb8\xc3\xb8' + b'\x02\x00\x06\xc6\x92\xc3\xb8\xc3\xb8' ) self.assertRaises(StopIteration, self.encoder.next) @@ -517,7 +517,7 @@ def test_iterate(self): self.assertIdentical(iter(self.encoder), self.encoder) self.assertEqual( self.buf.getvalue(), - '\x02\x00\x00\x02\x00\x05hello\x02\x00\x06\xc6\x92\xc3\xb8\xc3\xb8' + b'\x02\x00\x00\x02\x00\x05hello\x02\x00\x06\xc6\x92\xc3\xb8\xc3\xb8' ) def test_subclassed_tuple(self): @@ -535,8 +535,8 @@ class Foo(tuple): self.assertEqual( self.encoder.next(), - '\n\x00\x00\x00\x02\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00' - '\x00\x00\x00\x00\x00' + b'\n\x00\x00\x00\x02\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00' + b'\x00\x00\x00\x00\x00' ) @@ -552,27 +552,27 @@ def setUp(self): DecoderMixIn.setUp(self) def test_undefined(self): - self.assertDecoded(pyamf.Undefined, '\x06') + self.assertDecoded(pyamf.Undefined, b'\x06') def test_number(self): - self.assertDecoded(0, '\x00\x00\x00\x00\x00\x00\x00\x00\x00') - self.assertDecoded(0.2, '\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a') - self.assertDecoded(1, '\x00\x3f\xf0\x00\x00\x00\x00\x00\x00') - self.assertDecoded(42, '\x00\x40\x45\x00\x00\x00\x00\x00\x00') - self.assertDecoded(-123, '\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00') - self.assertDecoded(1.23456789, '\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b') + self.assertDecoded(0, b'\x00\x00\x00\x00\x00\x00\x00\x00\x00') + self.assertDecoded(0.2, b'\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a') + self.assertDecoded(1, b'\x00\x3f\xf0\x00\x00\x00\x00\x00\x00') + self.assertDecoded(42, b'\x00\x40\x45\x00\x00\x00\x00\x00\x00') + self.assertDecoded(-123, b'\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00') + self.assertDecoded(1.23456789, b'\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b') def test_number_types(self): nr_types = [ - ('\x00\x00\x00\x00\x00\x00\x00\x00\x00', int), - ('\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a', float), - ('\x00\x3f\xf0\x00\x00\x00\x00\x00\x00', int), - ('\x00\x40\x45\x00\x00\x00\x00\x00\x00', int), - ('\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00', int), - ('\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b', float), - ('\x00\xff\xf8\x00\x00\x00\x00\x00\x00', float), # nan - ('\x00\xff\xf0\x00\x00\x00\x00\x00\x00', float), # -inf - ('\x00\x7f\xf0\x00\x00\x00\x00\x00\x00', float), # inf + (b'\x00\x00\x00\x00\x00\x00\x00\x00\x00', int), + (b'\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a', float), + (b'\x00\x3f\xf0\x00\x00\x00\x00\x00\x00', int), + (b'\x00\x40\x45\x00\x00\x00\x00\x00\x00', int), + (b'\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00', int), + (b'\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b', float), + (b'\x00\xff\xf8\x00\x00\x00\x00\x00\x00', float), # nan + (b'\x00\xff\xf0\x00\x00\x00\x00\x00\x00', float), # -inf + (b'\x00\x7f\xf0\x00\x00\x00\x00\x00\x00', float), # inf ] for t in nr_types: @@ -584,53 +584,53 @@ def test_number_types(self): def test_infinites(self): self.buf.truncate() - self.buf.write('\x00\xff\xf8\x00\x00\x00\x00\x00\x00') + self.buf.write(b'\x00\xff\xf8\x00\x00\x00\x00\x00\x00') self.buf.seek(0) x = self.decoder.readElement() self.assertTrue(python.isNaN(x)) self.buf.truncate() - self.buf.write('\x00\xff\xf0\x00\x00\x00\x00\x00\x00') + self.buf.write(b'\x00\xff\xf0\x00\x00\x00\x00\x00\x00') self.buf.seek(0) x = self.decoder.readElement() self.assertTrue(python.isNegInf(x)) self.buf.truncate() - self.buf.write('\x00\x7f\xf0\x00\x00\x00\x00\x00\x00') + self.buf.write(b'\x00\x7f\xf0\x00\x00\x00\x00\x00\x00') self.buf.seek(0) x = self.decoder.readElement() self.assertTrue(python.isPosInf(x)) def test_boolean(self): - self.assertDecoded(True, '\x01\x01') - self.assertDecoded(False, '\x01\x00') + self.assertDecoded(True, b'\x01\x01') + self.assertDecoded(False, b'\x01\x00') def test_string(self): - self.assertDecoded('', '\x02\x00\x00') - self.assertDecoded('hello', '\x02\x00\x05hello') + self.assertDecoded('', b'\x02\x00\x00') + self.assertDecoded('hello', b'\x02\x00\x05hello') self.assertDecoded( u'ᚠᛇᚻ', - '\x02\x00\t\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb' + b'\x02\x00\t\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb' ) def test_longstring(self): a = 'a' * 65537 - self.assertDecoded(a, '\x0c\x00\x01\x00\x01' + a) + self.assertDecoded(a, b'\x0c\x00\x01\x00\x01' + a.encode('utf-8')) def test_null(self): - self.assertDecoded(None, '\x05') + self.assertDecoded(None, b'\x05') def test_list(self): - self.assertDecoded([], '\x0a\x00\x00\x00\x00') + self.assertDecoded([], b'\x0a\x00\x00\x00\x00') self.assertDecoded( [1, 2, 3], - '\x0a\x00\x00\x00\x03\x00\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x40' - '\x00\x00\x00\x00\x00\x00\x00\x00\x40\x08\x00\x00\x00\x00\x00\x00' + b'\x0a\x00\x00\x00\x03\x00\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x40' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x40\x08\x00\x00\x00\x00\x00\x00' ) def test_dict(self): - bytes = '\x08\x00\x00\x00\x00\x00\x01\x61\x02\x00\x01\x61\x00\x00\x09' + bytes = b'\x08\x00\x00\x00\x00\x00\x01\x61\x02\x00\x01\x61\x00\x00\x09' self.assertDecoded({'a': 'a'}, bytes) @@ -640,9 +640,9 @@ def test_dict(self): def test_mixed_array(self): bytes = ( - '\x08\x00\x00\x00\x00\x00\x01a\x00?\xf0\x00\x00\x00\x00\x00\x00' - '\x00\x01c\x00@\x08\x00\x00\x00\x00\x00\x00\x00\x01b\x00@\x00\x00' - '\x00\x00\x00\x00\x00\x00\x00\t' + b'\x08\x00\x00\x00\x00\x00\x01a\x00?\xf0\x00\x00\x00\x00\x00\x00' + b'\x00\x01c\x00@\x08\x00\x00\x00\x00\x00\x00\x00\x01b\x00@\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\t' ) self.assertDecoded(pyamf.MixedArray(a=1, b=2, c=3), bytes) @@ -654,23 +654,23 @@ def test_mixed_array(self): def test_date(self): self.assertDecoded( datetime.datetime(2005, 3, 18, 1, 58, 31), - '\x0bBp+6!\x15\x80\x00\x00\x00' + b'\x0bBp+6!\x15\x80\x00\x00\x00' ) self.assertDecoded( datetime.datetime(2009, 3, 8, 23, 30, 47, 770122), - '\x0bBq\xfe\x86\xca5\xa1\xf4\x00\x00' + b'\x0bBq\xfe\x86\xca5\xa1\xf4\x00\x00' ) def test_xml(self): - e = 'hello world' - ret = self.decode('\x0f\x00\x00\x00\x19' + e) + e = b'hello world' + ret = self.decode(b'\x0f\x00\x00\x00\x19' + e) self.assertEqual(xml.tostring(ret), e) def test_xml_references(self): self.buf.truncate(0) self.buf.write( - '\x0f\x00\x00\x00\x19hello world\x07\x00\x00' + b'\x0f\x00\x00\x00\x19hello world\x07\x00\x00' ) self.buf.seek(0) @@ -683,7 +683,7 @@ def test_xml_references(self): xml.tostring(self.decoder.readElement())) def test_object(self): - bytes = '\x03\x00\x01a\x02\x00\x01b\x00\x00\x09' + bytes = b'\x03\x00\x01a\x02\x00\x01b\x00\x00\x09' self.assertDecoded({'a': 'b'}, bytes) @@ -695,8 +695,8 @@ def test_registered_class(self): pyamf.register_class(Spam, alias='org.pyamf.spam') bytes = ( - '\x10\x00\x0eorg.pyamf.spam\x00\x03baz\x02\x00\x05hello\x00\x00' - '\x09' + b'\x10\x00\x0eorg.pyamf.spam\x00\x03baz\x02\x00\x05hello\x00\x00' + b'\x09' ) obj = self.decode(bytes) @@ -711,26 +711,26 @@ def test_complex_list(self): self.assertDecoded( [['test', 'test', 'test', 'test']], - '\x0A\x00\x00\x00\x01\x0A\x00\x00\x00\x04\x02\x00\x04\x74\x65\x73' - '\x74\x02\x00\x04\x74\x65\x73\x74\x02\x00\x04\x74\x65\x73\x74\x02' - '\x00\x04\x74\x65\x73\x74' + b'\x0A\x00\x00\x00\x01\x0A\x00\x00\x00\x04\x02\x00\x04\x74\x65\x73' + b'\x74\x02\x00\x04\x74\x65\x73\x74\x02\x00\x04\x74\x65\x73\x74\x02' + b'\x00\x04\x74\x65\x73\x74' ) self.assertDecoded( [x], - '\x0a\x00\x00\x00\x01\x0b\x42\x71\x60\x48\xcf\xed\xd0\x00\x00\x00' + b'\x0a\x00\x00\x00\x01\x0b\x42\x71\x60\x48\xcf\xed\xd0\x00\x00\x00' ) self.assertDecoded( - [[{u'a': u'spam', u'b': u'eggs'}, {u'a': u'spam', u'b': u'eggs'}]], - '\n\x00\x00\x00\x01\n\x00\x00\x00\x02\x08\x00\x00\x00\x00\x00\x01' - 'a\x02\x00\x04spam\x00\x01b\x02\x00\x04eggs\x00\x00\t\x07\x00\x02') + [[{'a': u'spam', 'b': u'eggs'}, {'a': u'spam', 'b': u'eggs'}]], + b'\n\x00\x00\x00\x01\n\x00\x00\x00\x02\x08\x00\x00\x00\x00\x00\x01' + b'a\x02\x00\x04spam\x00\x01b\x02\x00\x04eggs\x00\x00\t\x07\x00\x02') self.assertDecoded( [[1.0]], - '\x0A\x00\x00\x00\x01\x0A\x00\x00\x00\x01\x00\x3F\xF0\x00\x00\x00' - '\x00\x00\x00' + b'\x0A\x00\x00\x00\x01\x0A\x00\x00\x00\x01\x00\x3F\xF0\x00\x00\x00' + b'\x00\x00\x00' ) def test_amf3(self): - self.buf.write('\x11\x04\x01') + self.buf.write(b'\x11\x04\x01') self.buf.seek(0) self.assertEqual(self.decoder.readElement(), 1) @@ -748,15 +748,15 @@ class Foo(pyamf.ASObject): self.assertDecoded( x, - '\x10\x00\x01x\x00\x03foo\x02\x00\x03bar\x00\x05hello\x02\x00\x05w' - 'orld\x00\x00\t' + b'\x10\x00\x01x\x00\x03foo\x02\x00\x03bar\x00\x05hello\x02\x00\x05w' + b'orld\x00\x00\t' ) def test_classic_class(self): pyamf.register_class(ClassicSpam, 'spam.eggs') self.buf.write( - '\x10\x00\tspam.eggs\x00\x03foo\x02\x00\x03bar\x00\x00\t' + b'\x10\x00\tspam.eggs\x00\x03foo\x02\x00\x03bar\x00\x00\t' ) self.buf.seek(0) @@ -769,7 +769,7 @@ def test_not_strict(self): # write a typed object to the stream self.buf.write( - '\x10\x00\tspam.eggs\x00\x03foo\x02\x00\x03bar\x00\x00\t' + b'\x10\x00\tspam.eggs\x00\x03foo\x02\x00\x03bar\x00\x00\t' ) self.buf.seek(0) @@ -788,7 +788,7 @@ def test_strict(self): # write a typed object to the stream self.buf.write( - '\x10\x00\tspam.eggs\x00\x03foo\x02\x00\x03bar\x00\x00\t' + b'\x10\x00\tspam.eggs\x00\x03foo\x02\x00\x03bar\x00\x00\t' ) self.buf.seek(0) @@ -801,8 +801,8 @@ class Person(object): __slots__ = ('family_name', 'given_name') self.buf.write( - '\x03\x00\x0bfamily_name\x02\x00\x03Doe\x00\ngiven_name\x02\x00' - '\x04Jane\x00\x00\t' + b'\x03\x00\x0bfamily_name\x02\x00\x03Doe\x00\ngiven_name\x02\x00' + b'\x04Jane\x00\x00\t' ) self.buf.seek(0) @@ -818,8 +818,8 @@ class Person(object): pyamf.register_class(Person, 'spam.eggs.Person') self.buf.write( - '\x10\x00\x10spam.eggs.Person\x00\x0bfamily_name\x02\x00\x03Doe' - '\x00\ngiven_name\x02\x00\x04Jane\x00\x00\t' + b'\x10\x00\x10spam.eggs.Person\x00\x0bfamily_name\x02\x00\x03Doe' + b'\x00\ngiven_name\x02\x00\x04Jane\x00\x00\t' ) self.buf.seek(0) @@ -848,7 +848,7 @@ def test_ioerror_buffer_position(self): def test_timezone(self): self.decoder.timezone_offset = datetime.timedelta(hours=-5) - self.buf.write('\x0bBr>\xc6\xf5w\x80\x00\x00\x00') + self.buf.write(b'\x0bBr>\xc6\xf5w\x80\x00\x00\x00') self.buf.seek(0) f = self.decoder.readElement() @@ -856,17 +856,17 @@ def test_timezone(self): self.assertEqual(f, datetime.datetime(2009, 9, 24, 9, 23, 23)) def test_unsupported(self): - self.assertDecoded(None, '\x0D') + self.assertDecoded(None, b'\x0D') def test_bad_reference(self): - self.assertRaises(pyamf.ReferenceError, self.decode, '\x07\x00\x03') + self.assertRaises(pyamf.ReferenceError, self.decode, b'\x07\x00\x03') def test_iterate(self): self.assertRaises(StopIteration, self.decoder.next) - self.decoder.send('\x02\x00\x00') - self.decoder.send('\x02\x00\x05hello') - self.decoder.send('\x02\x00\t\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb') + self.decoder.send(b'\x02\x00\x00') + self.decoder.send(b'\x02\x00\x05hello') + self.decoder.send(b'\x02\x00\t\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb') self.assertEqual(self.decoder.next(), '') self.assertEqual(self.decoder.next(), 'hello') @@ -877,7 +877,7 @@ def test_iterate(self): self.assertIdentical(iter(self.decoder), self.decoder) def test_bad_type(self): - self.assertRaises(pyamf.DecodeError, self.decode, '\xff') + self.assertRaises(pyamf.DecodeError, self.decode, b'\xff') def test_kwargs(self): """ @@ -886,7 +886,7 @@ def test_kwargs(self): def f(**kwargs): self.assertEqual(kwargs, {'a': 'a'}) - kwargs = self.decode('\x03\x00\x01a\x02\x00\x01a\x00\x00\t') + kwargs = self.decode(b'\x03\x00\x01a\x02\x00\x01a\x00\x00\t') f(**kwargs) @@ -913,21 +913,21 @@ class RecordSetTestCase(unittest.TestCase, EncoderMixIn, DecoderMixIn): amf_type = pyamf.AMF0 blob = ( - '\x10\x00\tRecordSet\x00\nserverInfo\x03', ( - '\x00\x06cursor\x00?\xf0\x00\x00\x00\x00\x00\x00', - '\x00\x0bcolumnNames\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b' - '\x02\x00\x01c', - '\x00\x0binitialData\n\x00\x00\x00\x03\n\x00\x00\x00\x03\x00?\xf0' - '\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00' - '@\x08\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x03\x00@\x10\x00' - '\x00\x00\x00\x00\x00\x00@\x14\x00\x00\x00\x00\x00\x00\x00@\x18' - '\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x03\x00@\x1c\x00\x00' - '\x00\x00\x00\x00\x00@ \x00\x00\x00\x00\x00\x00\x00@"\x00\x00' - '\x00\x00\x00\x00', - '\x00\x07version\x00?\xf0\x00\x00\x00\x00\x00\x00', - '\x00\ntotalCount\x00@\x08\x00\x00\x00\x00\x00\x00' + b'\x10\x00\tRecordSet\x00\nserverInfo\x03', ( + b'\x00\x06cursor\x00?\xf0\x00\x00\x00\x00\x00\x00', + b'\x00\x0bcolumnNames\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b' + b'\x02\x00\x01c', + b'\x00\x0binitialData\n\x00\x00\x00\x03\n\x00\x00\x00\x03\x00?\xf0' + b'\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00' + b'@\x08\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x03\x00@\x10\x00' + b'\x00\x00\x00\x00\x00\x00@\x14\x00\x00\x00\x00\x00\x00\x00@\x18' + b'\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x03\x00@\x1c\x00\x00' + b'\x00\x00\x00\x00\x00@ \x00\x00\x00\x00\x00\x00\x00@"\x00\x00' + b'\x00\x00\x00\x00', + b'\x00\x07version\x00?\xf0\x00\x00\x00\x00\x00\x00', + b'\x00\ntotalCount\x00@\x08\x00\x00\x00\x00\x00\x00' ), - '\x00\x00\t\x00\x00\t' + b'\x00\x00\t\x00\x00\t' ) def setUp(self): @@ -1081,11 +1081,11 @@ class __amf__: self.assertEncoded( x, - '\x10\x00\x01B', ( - '\x00\x01a\x02\x00\x04spam', - '\x00\x01b\x02\x00\x04eggs' + b'\x10\x00\x01B', ( + b'\x00\x01a\x02\x00\x04spam', + b'\x00\x01b\x02\x00\x04eggs' ), - '\x00\x00\t' + b'\x00\x00\t' ) def test_deep(self): @@ -1112,12 +1112,12 @@ class __amf__: self.assertEncoded( x, - '\x10\x00\x01C', ( - '\x00\x01a\x02\x00\x04spam', - '\x00\x01c\x02\x00\x03foo', - '\x00\x01b\x02\x00\x04eggs' + b'\x10\x00\x01C', ( + b'\x00\x01a\x02\x00\x04spam', + b'\x00\x01c\x02\x00\x03foo', + b'\x00\x01b\x02\x00\x04eggs' ), - '\x00\x00\t' + b'\x00\x00\t' ) @@ -1135,13 +1135,13 @@ def setUp(self): def test_exception(self): try: raise Exception('foo bar') - except Exception, e: + except Exception as e: self.encoder.writeElement(e) self.assertEqual( self.buffer.getvalue(), - '\x03\x00\x07message\x02\x00\x07foo bar\x00\x04name\x02\x00\t' - 'Exception\x00\x00\t' + b'\x03\x00\x07message\x02\x00\x07foo bar\x00\x04name\x02\x00\t' + b'Exception\x00\x00\t' ) def test_user_defined(self): @@ -1150,13 +1150,13 @@ class FooBar(Exception): try: raise FooBar('foo bar') - except Exception, e: + except Exception as e: self.encoder.writeElement(e) self.assertEqual( self.buffer.getvalue(), - '\x03\x00\x07message\x02\x00\x07foo bar\x00\x04name\x02\x00\x06Foo' - 'Bar\x00\x00\t' + b'\x03\x00\x07message\x02\x00\x07foo bar\x00\x04name\x02\x00\x06Foo' + b'Bar\x00\x00\t' ) def test_typed(self): @@ -1167,13 +1167,13 @@ class XYZ(Exception): try: raise XYZ('blarg') - except Exception, e: + except Exception as e: self.encoder.writeElement(e) self.assertEqual( self.buffer.getvalue(), - '\x10\x00\x07foo.bar\x00\x07message\x02\x00\x05blarg\x00\x04name' - '\x02\x00\x03XYZ\x00\x00\t' + b'\x10\x00\x07foo.bar\x00\x07message\x02\x00\x05blarg\x00\x04name' + b'\x02\x00\x03XYZ\x00\x00\t' ) @@ -1182,21 +1182,21 @@ class AMF0ContextTestCase(unittest.TestCase): """ bytes = ( - '\x00\x03\x00\x02\x00\x0eServiceLicense\x00\x00\x00\x00O\x11\n\x0b' - '\x01-serviceConfigurationId\x06\t1234\x15licenseKey\x06Axxxxxxxxxxxxx' - 'xxxxxxxxxxxxxxxxxxx\x01\x00\tSessionId\x00\x00\x00\x00\xb2\x11\n\x0b' - '\x01\x0bToken\x06\x82Iyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' - 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' - 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\x01\x00\x01\x00\x0cR' - 'egisterUser\x00\x02/3\x00\x00\x01k\n\x00\x00\x00\x07\x11\n#\x01\rform' - 'at\x0bvalue\x069urn:TribalDDB:identity:email\x06!tester@trial.com\x11' - '\n#\x01\x02\ttype\x06\x0fpasswrd\x06Kurn:TribalDDB:authentication:pas' - 'sword\x11\nS\x01\x19EmailAddress\x15PostalCode\x17DateOfBirth\x11Last' - 'Name\x13FirstName\x06\x06\x06\x0b12345\n3\x12\x0bmonth\x07day\tyear' - '\x04\x04\x04\x0f\x04\x8fF\x06\rewrwer\x06\x07wer\x11\n3\x1fSectionTra' - 'cking\tCsId\x11TrtmntId\x13LocalCsId\x04\x00\x04\x86\x94z\x04\x00\x11' - '\n\x13\x11Tracking\x07CTC\x06\x07555\x11\t\x03\x01\n#\x13UserOptIn' - '\x1dliveModeEnable\x05id\x02\x04\x884\x02\x00\x10wwwwwwwwwwwwwwww' + b'\x00\x03\x00\x02\x00\x0eServiceLicense\x00\x00\x00\x00O\x11\n\x0b' + b'\x01-serviceConfigurationId\x06\t1234\x15licenseKey\x06Axxxxxxxxxxxxx' + b'xxxxxxxxxxxxxxxxxxx\x01\x00\tSessionId\x00\x00\x00\x00\xb2\x11\n\x0b' + b'\x01\x0bToken\x06\x82Iyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' + b'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' + b'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\x01\x00\x01\x00\x0cR' + b'egisterUser\x00\x02/3\x00\x00\x01k\n\x00\x00\x00\x07\x11\n#\x01\rform' + b'at\x0bvalue\x069urn:TribalDDB:identity:email\x06!tester@trial.com\x11' + b'\n#\x01\x02\ttype\x06\x0fpasswrd\x06Kurn:TribalDDB:authentication:pas' + b'sword\x11\nS\x01\x19EmailAddress\x15PostalCode\x17DateOfBirth\x11Last' + b'Name\x13FirstName\x06\x06\x06\x0b12345\n3\x12\x0bmonth\x07day\tyear' + b'\x04\x04\x04\x0f\x04\x8fF\x06\rewrwer\x06\x07wer\x11\n3\x1fSectionTra' + b'cking\tCsId\x11TrtmntId\x13LocalCsId\x04\x00\x04\x86\x94z\x04\x00\x11' + b'\n\x13\x11Tracking\x07CTC\x06\x07555\x11\t\x03\x01\n#\x13UserOptIn' + b'\x1dliveModeEnable\x05id\x02\x04\x884\x02\x00\x10wwwwwwwwwwwwwwww' ) def test_decode(self): diff --git a/pyamf/tests/test_amf3.py b/pyamf/tests/test_amf3.py index 099ee5bd..245cc6ce 100644 --- a/pyamf/tests/test_amf3.py +++ b/pyamf/tests/test_amf3.py @@ -11,6 +11,7 @@ import unittest import datetime +from six.moves import xrange import pyamf from pyamf import amf3, util, xml, python @@ -53,19 +54,19 @@ class TypesTestCase(unittest.TestCase): Tests the type mappings. """ def test_types(self): - self.assertEqual(amf3.TYPE_UNDEFINED, '\x00') - self.assertEqual(amf3.TYPE_NULL, '\x01') - self.assertEqual(amf3.TYPE_BOOL_FALSE, '\x02') - self.assertEqual(amf3.TYPE_BOOL_TRUE, '\x03') - self.assertEqual(amf3.TYPE_INTEGER, '\x04') - self.assertEqual(amf3.TYPE_NUMBER, '\x05') - self.assertEqual(amf3.TYPE_STRING, '\x06') - self.assertEqual(amf3.TYPE_XML, '\x07') - self.assertEqual(amf3.TYPE_DATE, '\x08') - self.assertEqual(amf3.TYPE_ARRAY, '\x09') - self.assertEqual(amf3.TYPE_OBJECT, '\x0a') - self.assertEqual(amf3.TYPE_XMLSTRING, '\x0b') - self.assertEqual(amf3.TYPE_BYTEARRAY, '\x0c') + self.assertEqual(amf3.TYPE_UNDEFINED, b'\x00') + self.assertEqual(amf3.TYPE_NULL, b'\x01') + self.assertEqual(amf3.TYPE_BOOL_FALSE, b'\x02') + self.assertEqual(amf3.TYPE_BOOL_TRUE, b'\x03') + self.assertEqual(amf3.TYPE_INTEGER, b'\x04') + self.assertEqual(amf3.TYPE_NUMBER, b'\x05') + self.assertEqual(amf3.TYPE_STRING, b'\x06') + self.assertEqual(amf3.TYPE_XML, b'\x07') + self.assertEqual(amf3.TYPE_DATE, b'\x08') + self.assertEqual(amf3.TYPE_ARRAY, b'\x09') + self.assertEqual(amf3.TYPE_OBJECT, b'\x0a') + self.assertEqual(amf3.TYPE_XMLSTRING, b'\x0b') + self.assertEqual(amf3.TYPE_BYTEARRAY, b'\x0c') class ContextTestCase(ClassCacheClearingTestCase): @@ -79,13 +80,13 @@ def test_create(self): def test_add_string(self): x = amf3.Context() - y = 'abc' + y = b'abc' self.assertEqual(x.addString(y), 0) self.assertTrue(y in x.strings) self.assertEqual(len(x.strings), 1) - self.assertEqual(x.addString(''), -1) + self.assertEqual(x.addString(b''), -1) self.assertRaises(TypeError, x.addString, 132) @@ -105,7 +106,7 @@ def test_clear(self): y = [1, 2, 3] x.addObject(y) - x.addString('spameggs') + x.addString(b'spameggs') x.clear() self.assertEqual(x.strings, []) @@ -132,8 +133,8 @@ class Bar: x.addObject(y) x.addObject(z) - x.addString('abc') - x.addString('def') + x.addString(b'abc') + x.addString(b'def') x.addClass(a, Foo) x.addClass(b, Bar) @@ -143,10 +144,10 @@ class Bar: self.assertRaises(TypeError, x.getObject, '') self.assertRaises(TypeError, x.getObject, 2.2323) - self.assertEqual(x.getString(0), 'abc') - self.assertEqual(x.getString(1), 'def') + self.assertEqual(x.getString(0), b'abc') + self.assertEqual(x.getString(1), b'def') self.assertEqual(x.getString(2), None) - self.assertRaises(TypeError, x.getString, '') + self.assertRaises(TypeError, x.getString, b'') self.assertRaises(TypeError, x.getString, 2.2323) self.assertEqual(x.getClass(Foo), a) @@ -179,8 +180,8 @@ class Foo: ref1 = x.addObject(y) ref2 = x.addObject(z) - x.addString('abc') - x.addString('def') + x.addString(b'abc') + x.addString(b'def') x.addClass(a, Spam) x.addClass(b, Foo) @@ -188,9 +189,9 @@ class Foo: self.assertEqual(x.getObjectReference(z), ref2) self.assertEqual(x.getObjectReference({}), -1) - self.assertEqual(x.getStringReference('abc'), 0) - self.assertEqual(x.getStringReference('def'), 1) - self.assertEqual(x.getStringReference('asdfas'), -1) + self.assertEqual(x.getStringReference(b'abc'), 0) + self.assertEqual(x.getStringReference(b'def'), 1) + self.assertEqual(x.getStringReference(b'asdfas'), -1) self.assertEqual(x.getClass(Spam), a) self.assertEqual(x.getClass(Foo), b) @@ -258,9 +259,9 @@ def setUp(self): def test_list_references(self): y = [0, 1, 2, 3] - self.assertEncoded(y, '\x09\x09\x01\x04\x00\x04\x01\x04\x02\x04\x03') - self.assertEncoded(y, '\x09\x00', clear=False) - self.assertEncoded(y, '\x09\x00', clear=False) + self.assertEncoded(y, b'\x09\x09\x01\x04\x00\x04\x01\x04\x02\x04\x03') + self.assertEncoded(y, b'\x09\x00', clear=False) + self.assertEncoded(y, b'\x09\x00', clear=False) def test_list_proxy_references(self): self.encoder.use_proxies = True @@ -268,46 +269,46 @@ def test_list_proxy_references(self): self.assertEncoded( y, - '\n\x07Cflex.messaging.io.ArrayCollection\t\t\x01\x04\x00\x04\x01' - '\x04\x02\x04\x03' + b'\n\x07Cflex.messaging.io.ArrayCollection\t\t\x01\x04\x00\x04\x01' + b'\x04\x02\x04\x03' ) - self.assertEncoded(y, '\n\x00', clear=False) - self.assertEncoded(y, '\n\x00', clear=False) + self.assertEncoded(y, b'\n\x00', clear=False) + self.assertEncoded(y, b'\n\x00', clear=False) def test_dict(self): - self.assertEncoded({'spam': 'eggs'}, '\n\x0b\x01\tspam\x06\teggs\x01') + self.assertEncoded({'spam': 'eggs'}, b'\n\x0b\x01\tspam\x06\teggs\x01') self.assertEncoded( {'a': u'e', 'b': u'f', 'c': u'g', 'd': u'h'}, - '\n\x0b\x01', ( - '\x03c\x06\x03g', - '\x03b\x06\x03f', - '\x03a\x06\x03e', - '\x03d\x06\x03h' + b'\n\x0b\x01', ( + b'\x03c\x06\x03g', + b'\x03b\x06\x03f', + b'\x03a\x06\x03e', + b'\x03d\x06\x03h' ), - '\x01' + b'\x01' ) - self.assertEncoded({12: True, 42: "Testing"}, ('\n\x0b', ( - '\x01\x0542\x06\x0fTesting', - '\x0512\x03\x01' + self.assertEncoded({12: True, 42: "Testing"}, (b'\n\x0b', ( + b'\x01\x0512\x03' + b'\x0542\x06\x0fTesting\x01', ))) def test_boolean(self): - self.assertEncoded(True, '\x03') - self.assertEncoded(False, '\x02') + self.assertEncoded(True, b'\x03') + self.assertEncoded(False, b'\x02') def test_mixed_array(self): x = pyamf.MixedArray() x.update({0: u'hello', 'spam': u'eggs'}) - self.assertEncoded(x, '\t\x03\tspam\x06\teggs\x01\x06\x0bhello') + self.assertEncoded(x, b'\t\x03\tspam\x06\teggs\x01\x06\x0bhello') x = pyamf.MixedArray() x.update({0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 'a': 'a'}) self.assertEncoded( x, - '\x09\x0d\x03\x61\x06\x00\x01\x04\x00\x04\x01\x04\x02\x04\x03\x04' - '\x04\x04\x05' + b'\x09\x0d\x03\x61\x06\x00\x01\x04\x00\x04\x01\x04\x02\x04\x03\x04' + b'\x04\x04\x05' ) def test_empty_key_string(self): @@ -329,7 +330,7 @@ def x(): def test_object(self): self.assertEncoded( {'a': u'spam', 'b': 5}, - '\n\x0b\x01\x03a\x06\tspam\x03b\x04\x05\x01' + b'\n\x0b\x01\x03a\x06\tspam\x03b\x04\x05\x01' ) pyamf.register_class(Spam, 'org.pyamf.spam') @@ -339,31 +340,31 @@ def test_object(self): self.assertEncoded( obj, - '\n\x0b\x1dorg.pyamf.spam\x07baz\x06\x0bhello\x01' + b'\n\x0b\x1dorg.pyamf.spam\x07baz\x06\x0bhello\x01' ) def test_date(self): x = datetime.datetime(2005, 3, 18, 1, 58, 31) - self.assertEncoded(x, '\x08\x01Bp+6!\x15\x80\x00') - self.assertEncoded(x, '\x08\x00', clear=False) + self.assertEncoded(x, b'\x08\x01Bp+6!\x15\x80\x00') + self.assertEncoded(x, b'\x08\x00', clear=False) self.assertRaises(pyamf.EncodeError, self.encode, datetime.time(22, 3)) def test_byte_array(self): - self.assertEncoded(amf3.ByteArray('hello'), '\x0c\x0bhello') + self.assertEncoded(amf3.ByteArray(b'hello'), b'\x0c\x0bhello') def test_xmlstring(self): x = xml.fromstring('hello world') - self.assertEqual(self.encode(x), '\x0b\x33hello world') - self.assertEqual(self.encode(x), '\x0b\x00') + self.assertEqual(self.encode(x), b'\x0b\x33hello world') + self.assertEqual(self.encode(x), b'\x0b\x00') def test_anonymous(self): pyamf.register_class(Spam) x = Spam({'spam': 'eggs'}) - self.assertEncoded(x, '\n\x0b\x01\x09spam\x06\x09eggs\x01') + self.assertEncoded(x, b'\n\x0b\x01\x09spam\x06\x09eggs\x01') def test_custom_type(self): def write_as_list(list_interface_obj, encoder): @@ -381,7 +382,7 @@ def __iter__(self): pyamf.add_type(ListWrapper, write_as_list) x = ListWrapper() - self.assertEncoded(x, '\t\x07\x01\x04\x01\x04\x02\x04\x03') + self.assertEncoded(x, b'\t\x07\x01\x04\x01\x04\x02\x04\x03') self.assertTrue(x.ran) def test_old_style_classes(self): @@ -394,8 +395,8 @@ class Person: u.family_name = 'Doe' u.given_name = 'Jane' - self.assertEncoded(u, '\n\x0b!spam.eggs.Person', ( - '\x17family_name\x06\x07Doe', '\x15given_name\x06\tJane'), '\x01') + self.assertEncoded(u, b'\n\x0b!spam.eggs.Person', ( + b'\x17family_name\x06\x07Doe', b'\x15given_name\x06\tJane'), b'\x01') def test_slots(self): class Person(object): @@ -407,11 +408,11 @@ class Person(object): self.assertEncoded( u, - '\n\x0b\x01', ( - '\x17family_name\x06\x07Doe', - '\x15given_name\x06\tJane' + b'\n\x0b\x01', ( + b'\x17family_name\x06\x07Doe', + b'\x15given_name\x06\tJane' ), - '\x01' + b'\x01' ) def test_slots_registered(self): @@ -424,8 +425,8 @@ class Person(object): u.family_name = 'Doe' u.given_name = 'Jane' - self.assertEncoded(u, '\n\x0b!spam.eggs.Person', ( - '\x17family_name\x06\x07Doe', '\x15given_name\x06\tJane'), '\x01') + self.assertEncoded(u, b'\n\x0b!spam.eggs.Person', ( + b'\x17family_name\x06\x07Doe', b'\x15given_name\x06\tJane'), b'\x01') def test_elementtree_tag(self): class NotAnElement(object): @@ -441,12 +442,12 @@ def __iter__(self): self.assertEncoded( foo, - '\n\x0b\x01', ( - '\ttext\x06\x07bar', - '\ttail\x01', - '\x07tag\x06\x07foo' + b'\n\x0b\x01', ( + b'\ttext\x06\x07bar', + b'\ttail\x01', + b'\x07tag\x06\x07foo' ), - '\x01' + b'\x01' ) def test_funcs(self): @@ -461,8 +462,8 @@ def test_29b_ints(self): Tests for ints that don't fit into 29bits. Reference: #519 """ ints = [ - (amf3.MIN_29B_INT - 1, '\x05\xc1\xb0\x00\x00\x01\x00\x00\x00'), - (amf3.MAX_29B_INT + 1, '\x05A\xb0\x00\x00\x00\x00\x00\x00') + (amf3.MIN_29B_INT - 1, b'\x05\xc1\xb0\x00\x00\x01\x00\x00\x00'), + (amf3.MAX_29B_INT + 1, b'\x05A\xb0\x00\x00\x00\x00\x00\x00') ] for i, val in ints: @@ -473,23 +474,23 @@ def test_29b_ints(self): def test_number(self): vals = [ - (0, '\x04\x00'), - (0.2, '\x05\x3f\xc9\x99\x99\x99\x99\x99\x9a'), - (1, '\x04\x01'), - (127, '\x04\x7f'), - (128, '\x04\x81\x00'), - (0x3fff, '\x04\xff\x7f'), - (0x4000, '\x04\x81\x80\x00'), - (0x1FFFFF, '\x04\xff\xff\x7f'), - (0x200000, '\x04\x80\xc0\x80\x00'), - (0x3FFFFF, '\x04\x80\xff\xff\xff'), - (0x400000, '\x04\x81\x80\x80\x00'), - (-1, '\x04\xff\xff\xff\xff'), - (42, '\x04\x2a'), - (-123, '\x04\xff\xff\xff\x85'), - (amf3.MIN_29B_INT, '\x04\xc0\x80\x80\x00'), - (amf3.MAX_29B_INT, '\x04\xbf\xff\xff\xff'), - (1.23456789, '\x05\x3f\xf3\xc0\xca\x42\x83\xde\x1b') + (0, b'\x04\x00'), + (0.2, b'\x05\x3f\xc9\x99\x99\x99\x99\x99\x9a'), + (1, b'\x04\x01'), + (127, b'\x04\x7f'), + (128, b'\x04\x81\x00'), + (0x3fff, b'\x04\xff\x7f'), + (0x4000, b'\x04\x81\x80\x00'), + (0x1FFFFF, b'\x04\xff\xff\x7f'), + (0x200000, b'\x04\x80\xc0\x80\x00'), + (0x3FFFFF, b'\x04\x80\xff\xff\xff'), + (0x400000, b'\x04\x81\x80\x80\x00'), + (-1, b'\x04\xff\xff\xff\xff'), + (42, b'\x04\x2a'), + (-123, b'\x04\xff\xff\xff\x85'), + (amf3.MIN_29B_INT, b'\x04\xc0\x80\x80\x00'), + (amf3.MAX_29B_INT, b'\x04\xbf\xff\xff\xff'), + (1.23456789, b'\x05\x3f\xf3\xc0\xca\x42\x83\xde\x1b') ] for i, val in vals: @@ -516,7 +517,7 @@ def test_proxy(self): Test to ensure that only C{dict} objects will be proxied correctly """ self.encoder.use_proxies = True - bytes = '\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01\x01' + bytes = b'\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01\x01' self.assertEncoded(pyamf.ASObject(), bytes) self.assertEncoded({}, bytes) @@ -526,7 +527,7 @@ class Foo(object): pass self.encoder.use_proxies = True - bytes = '\n\x0b\x01\x01' + bytes = b'\n\x0b\x01\x01' self.assertEncoded(Foo(), bytes) @@ -538,7 +539,7 @@ def test_timezone(self): self.assertEqual( self.buf.getvalue(), - '\x08\x01Br>\xd8\x1f\xff\x80\x00' + b'\x08\x01Br>\xd8\x1f\xff\x80\x00' ) def test_generator(self): @@ -549,8 +550,8 @@ def foo(): self.assertEncoded( foo(), - '\t\x07\x01\x04\x01\x04\x02\x04\x03\x06\x05' - '\xc3\xbf\x00' + b'\t\x07\x01\x04\x01\x04\x02\x04\x03\x06\x05' + b'\xc3\xbf\x00' ) def test_iterate(self): @@ -560,16 +561,16 @@ def test_iterate(self): self.encoder.send('hello') self.encoder.send(u'ƒøø') - self.assertEqual(self.encoder.next(), '\x06\x01') - self.assertEqual(self.encoder.next(), '\x06\x0bhello') - self.assertEqual(self.encoder.next(), '\x06\r\xc6\x92\xc3\xb8\xc3\xb8') + self.assertEqual(self.encoder.next(), b'\x06\x01') + self.assertEqual(self.encoder.next(), b'\x06\x0bhello') + self.assertEqual(self.encoder.next(), b'\x06\r\xc6\x92\xc3\xb8\xc3\xb8') self.assertRaises(StopIteration, self.encoder.next) self.assertIdentical(iter(self.encoder), self.encoder) self.assertEqual( self.buf.getvalue(), - '\x06\x01\x06\x0bhello\x06\r\xc6\x92\xc3\xb8\xc3\xb8' + b'\x06\x01\x06\x0bhello\x06\r\xc6\x92\xc3\xb8\xc3\xb8' ) def test_subclassed_tuple(self): @@ -585,7 +586,7 @@ class Foo(tuple): self.encoder.send(x) - self.assertEqual(self.encoder.next(), '\t\x05\x01\x04\x01\x04\x02') + self.assertEqual(self.encoder.next(), b'\t\x05\x01\x04\x01\x04\x02') class DecoderTestCase(ClassCacheClearingTestCase, DecoderMixIn): @@ -600,75 +601,75 @@ def setUp(self): DecoderMixIn.setUp(self) def test_undefined(self): - self.assertDecoded(pyamf.Undefined, '\x00') + self.assertDecoded(pyamf.Undefined, b'\x00') def test_number(self): - self.assertDecoded(0, '\x04\x00') - self.assertDecoded(0.2, '\x05\x3f\xc9\x99\x99\x99\x99\x99\x9a') - self.assertDecoded(1, '\x04\x01') - self.assertDecoded(-1, '\x04\xff\xff\xff\xff') - self.assertDecoded(42, '\x04\x2a') + self.assertDecoded(0, b'\x04\x00') + self.assertDecoded(0.2, b'\x05\x3f\xc9\x99\x99\x99\x99\x99\x9a') + self.assertDecoded(1, b'\x04\x01') + self.assertDecoded(-1, b'\x04\xff\xff\xff\xff') + self.assertDecoded(42, b'\x04\x2a') # two ways to represent -123, as an int and as a float - self.assertDecoded(-123, '\x04\xff\xff\xff\x85') - self.assertDecoded(-123, '\x05\xc0\x5e\xc0\x00\x00\x00\x00\x00') + self.assertDecoded(-123, b'\x04\xff\xff\xff\x85') + self.assertDecoded(-123, b'\x05\xc0\x5e\xc0\x00\x00\x00\x00\x00') - self.assertDecoded(1.23456789, '\x05\x3f\xf3\xc0\xca\x42\x83\xde\x1b') + self.assertDecoded(1.23456789, b'\x05\x3f\xf3\xc0\xca\x42\x83\xde\x1b') def test_integer(self): - self.assertDecoded(0, '\x04\x00') - self.assertDecoded(0x35, '\x04\x35') - self.assertDecoded(0x7f, '\x04\x7f') - self.assertDecoded(0x80, '\x04\x81\x00') - self.assertDecoded(0xd4, '\x04\x81\x54') - self.assertDecoded(0x3fff, '\x04\xff\x7f') - self.assertDecoded(0x4000, '\x04\x81\x80\x00') - self.assertDecoded(0x1a53f, '\x04\x86\xca\x3f') - self.assertDecoded(0x1fffff, '\x04\xff\xff\x7f') - self.assertDecoded(0x200000, '\x04\x80\xc0\x80\x00') - self.assertDecoded(-0x01, '\x04\xff\xff\xff\xff') - self.assertDecoded(-0x2a, '\x04\xff\xff\xff\xd6') - self.assertDecoded(0xfffffff, '\x04\xbf\xff\xff\xff') - self.assertDecoded(-0x10000000, '\x04\xc0\x80\x80\x00') + self.assertDecoded(0, b'\x04\x00') + self.assertDecoded(0x35, b'\x04\x35') + self.assertDecoded(0x7f, b'\x04\x7f') + self.assertDecoded(0x80, b'\x04\x81\x00') + self.assertDecoded(0xd4, b'\x04\x81\x54') + self.assertDecoded(0x3fff, b'\x04\xff\x7f') + self.assertDecoded(0x4000, b'\x04\x81\x80\x00') + self.assertDecoded(0x1a53f, b'\x04\x86\xca\x3f') + self.assertDecoded(0x1fffff, b'\x04\xff\xff\x7f') + self.assertDecoded(0x200000, b'\x04\x80\xc0\x80\x00') + self.assertDecoded(-0x01, b'\x04\xff\xff\xff\xff') + self.assertDecoded(-0x2a, b'\x04\xff\xff\xff\xd6') + self.assertDecoded(0xfffffff, b'\x04\xbf\xff\xff\xff') + self.assertDecoded(-0x10000000, b'\x04\xc0\x80\x80\x00') def test_infinites(self): - x = self.decode('\x05\xff\xf8\x00\x00\x00\x00\x00\x00') + x = self.decode(b'\x05\xff\xf8\x00\x00\x00\x00\x00\x00') self.assertTrue(python.isNaN(x)) - x = self.decode('\x05\xff\xf0\x00\x00\x00\x00\x00\x00') + x = self.decode(b'\x05\xff\xf0\x00\x00\x00\x00\x00\x00') self.assertTrue(python.isNegInf(x)) - x = self.decode('\x05\x7f\xf0\x00\x00\x00\x00\x00\x00') + x = self.decode(b'\x05\x7f\xf0\x00\x00\x00\x00\x00\x00') self.assertTrue(python.isPosInf(x)) def test_boolean(self): - self.assertDecoded(True, '\x03') - self.assertDecoded(False, '\x02') + self.assertDecoded(True, b'\x03') + self.assertDecoded(False, b'\x02') def test_null(self): - self.assertDecoded(None, '\x01') + self.assertDecoded(None, b'\x01') def test_string(self): - self.assertDecoded('', '\x06\x01') - self.assertDecoded('hello', '\x06\x0bhello') + self.assertDecoded('', b'\x06\x01') + self.assertDecoded('hello', b'\x06\x0bhello') self.assertDecoded( u'ღმერთსი შემვედრე, ნუთუ კვლა დამხსნას სოფლისა შრომასა, ცეცხლს', - '\x06\x82\x45\xe1\x83\xa6\xe1\x83\x9b\xe1\x83\x94\xe1\x83\xa0' - '\xe1\x83\x97\xe1\x83\xa1\xe1\x83\x98\x20\xe1\x83\xa8\xe1\x83' - '\x94\xe1\x83\x9b\xe1\x83\x95\xe1\x83\x94\xe1\x83\x93\xe1\x83' - '\xa0\xe1\x83\x94\x2c\x20\xe1\x83\x9c\xe1\x83\xa3\xe1\x83\x97' - '\xe1\x83\xa3\x20\xe1\x83\x99\xe1\x83\x95\xe1\x83\x9a\xe1\x83' - '\x90\x20\xe1\x83\x93\xe1\x83\x90\xe1\x83\x9b\xe1\x83\xae\xe1' - '\x83\xa1\xe1\x83\x9c\xe1\x83\x90\xe1\x83\xa1\x20\xe1\x83\xa1' - '\xe1\x83\x9d\xe1\x83\xa4\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' - '\xe1\x83\x90\x20\xe1\x83\xa8\xe1\x83\xa0\xe1\x83\x9d\xe1\x83' - '\x9b\xe1\x83\x90\xe1\x83\xa1\xe1\x83\x90\x2c\x20\xe1\x83\xaa' - '\xe1\x83\x94\xe1\x83\xaa\xe1\x83\xae\xe1\x83\x9a\xe1\x83\xa1') + b'\x06\x82\x45\xe1\x83\xa6\xe1\x83\x9b\xe1\x83\x94\xe1\x83\xa0' + b'\xe1\x83\x97\xe1\x83\xa1\xe1\x83\x98\x20\xe1\x83\xa8\xe1\x83' + b'\x94\xe1\x83\x9b\xe1\x83\x95\xe1\x83\x94\xe1\x83\x93\xe1\x83' + b'\xa0\xe1\x83\x94\x2c\x20\xe1\x83\x9c\xe1\x83\xa3\xe1\x83\x97' + b'\xe1\x83\xa3\x20\xe1\x83\x99\xe1\x83\x95\xe1\x83\x9a\xe1\x83' + b'\x90\x20\xe1\x83\x93\xe1\x83\x90\xe1\x83\x9b\xe1\x83\xae\xe1' + b'\x83\xa1\xe1\x83\x9c\xe1\x83\x90\xe1\x83\xa1\x20\xe1\x83\xa1' + b'\xe1\x83\x9d\xe1\x83\xa4\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' + b'\xe1\x83\x90\x20\xe1\x83\xa8\xe1\x83\xa0\xe1\x83\x9d\xe1\x83' + b'\x9b\xe1\x83\x90\xe1\x83\xa1\xe1\x83\x90\x2c\x20\xe1\x83\xaa' + b'\xe1\x83\x94\xe1\x83\xaa\xe1\x83\xae\xe1\x83\x9a\xe1\x83\xa1') def test_mixed_array(self): y = self.decode( - '\x09\x09\x03\x62\x06\x00\x03\x64\x06\x02\x03\x61' - '\x06\x04\x03\x63\x06\x06\x01\x04\x00\x04\x01\x04\x02\x04\x03' + b'\x09\x09\x03\x62\x06\x00\x03\x64\x06\x02\x03\x61' + b'\x06\x04\x03\x63\x06\x06\x01\x04\x00\x04\x01\x04\x02\x04\x03' ) self.assertTrue(isinstance(y, pyamf.MixedArray)) @@ -684,26 +685,26 @@ def test_mixed_array(self): }) def test_string_references(self): - self.assertDecoded('hello', '\x06\x0bhello') - self.assertDecoded('hello', '\x06\x00', clear=False) - self.assertDecoded('hello', '\x06\x00', clear=False) + self.assertDecoded('hello', b'\x06\x0bhello') + self.assertDecoded('hello', b'\x06\x00', clear=False) + self.assertDecoded('hello', b'\x06\x00', clear=False) def test_xmlstring(self): - self.buf.write('\x0b\x33hello world') + self.buf.write(b'\x0b\x33hello world') self.buf.seek(0, 0) x = self.decoder.readElement() - self.assertEqual(xml.tostring(x), 'hello world') + self.assertEqual(xml.tostring(x), b'hello world') self.buf.truncate() - self.buf.write('\x0b\x00') + self.buf.write(b'\x0b\x00') self.buf.seek(0, 0) y = self.decoder.readElement() self.assertEqual(x, y) def test_xmlstring_references(self): - self.buf.write('\x0b\x33hello world\x0b\x00') + self.buf.write(b'\x0b\x33hello world\x0b\x00') self.buf.seek(0, 0) x = self.decoder.readElement() y = self.decoder.readElement() @@ -711,46 +712,46 @@ def test_xmlstring_references(self): self.assertEqual(id(x), id(y)) def test_list(self): - self.assertDecoded([], '\x09\x01\x01') + self.assertDecoded([], b'\x09\x01\x01') self.assertDecoded( [0, 1, 2, 3], - '\x09\x09\x01\x04\x00\x04\x01\x04\x02\x04\x03' + b'\x09\x09\x01\x04\x00\x04\x01\x04\x02\x04\x03' ) self.assertDecoded( ["Hello", 2, 3, 4, 5], - '\x09\x0b\x01\x06\x0b\x48\x65\x6c\x6c\x6f\x04\x02\x04\x03\x04\x04' - '\x04\x05' + b'\x09\x0b\x01\x06\x0b\x48\x65\x6c\x6c\x6f\x04\x02\x04\x03\x04\x04' + b'\x04\x05' ) def test_list_references(self): y = [0, 1, 2, 3] z = [0, 1, 2] - self.assertDecoded(y, '\x09\x09\x01\x04\x00\x04\x01\x04\x02\x04\x03') - self.assertDecoded(y, '\x09\x00', clear=False) + self.assertDecoded(y, b'\x09\x09\x01\x04\x00\x04\x01\x04\x02\x04\x03') + self.assertDecoded(y, b'\x09\x00', clear=False) self.assertDecoded( z, - '\x09\x07\x01\x04\x00\x04\x01\x04\x02', + b'\x09\x07\x01\x04\x00\x04\x01\x04\x02', clear=False ) - self.assertDecoded(z, '\x09\x02', clear=False) + self.assertDecoded(z, b'\x09\x02', clear=False) def test_dict(self): self.assertDecoded( {'a': u'a', 'b': u'b', 'c': u'c', 'd': u'd'}, - '\n\x0b\x01\x03a\x06\x00\x03c\x06\x02\x03b\x06\x04\x03d\x06\x06' - '\x01' + b'\n\x0b\x01\x03a\x06\x00\x03c\x06\x02\x03b\x06\x04\x03d\x06\x06' + b'\x01' ) self.assertDecoded( {0: u'hello', 'foo': u'bar'}, - '\x09\x03\x07\x66\x6f\x6f\x06\x07\x62\x61\x72\x01\x06\x0b\x68\x65' - '\x6c\x6c\x6f' + b'\x09\x03\x07\x66\x6f\x6f\x06\x07\x62\x61\x72\x01\x06\x0b\x68\x65' + b'\x6c\x6c\x6f' ) self.assertDecoded( {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 'a': 'a'}, - '\x09\x0d\x03\x61\x06\x00\x01\x04\x00\x04\x01\x04\x02\x04\x03\x04' - '\x04\x04\x05' + b'\x09\x0d\x03\x61\x06\x00\x01\x04\x00\x04\x01\x04\x02\x04\x03\x04' + b'\x04\x04\x05' ) self.assertDecoded( { @@ -763,23 +764,23 @@ def test_dict(self): 2: 2, 3: 3 }, - '\x09\x09\x03\x62\x06\x00\x03\x64\x06\x02\x03\x61\x06\x04\x03\x63' - '\x06\x06\x01\x04\x00\x04\x01\x04\x02\x04\x03' + b'\x09\x09\x03\x62\x06\x00\x03\x64\x06\x02\x03\x61\x06\x04\x03\x63' + b'\x06\x06\x01\x04\x00\x04\x01\x04\x02\x04\x03' ) self.assertDecoded( {'a': 1, 'b': 2}, - '\x0a\x0b\x01\x03\x62\x04\x02\x03\x61\x04\x01\x01' + b'\x0a\x0b\x01\x03\x62\x04\x02\x03\x61\x04\x01\x01' ) self.assertDecoded( {'baz': u'hello'}, - '\x0a\x0b\x01\x07\x62\x61\x7a\x06\x0b\x68\x65\x6c\x6c\x6f\x01' + b'\x0a\x0b\x01\x07\x62\x61\x7a\x06\x0b\x68\x65\x6c\x6c\x6f\x01' ) self.assertDecoded( {'baz': u'hello'}, - '\x0a\x13\x01\x07\x62\x61\x7a\x06\x0b\x68\x65\x6c\x6c\x6f' + b'\x0a\x13\x01\x07\x62\x61\x7a\x06\x0b\x68\x65\x6c\x6c\x6f' ) - bytes = '\x0a\x0b\x01\x07\x62\x61\x7a\x06\x0b\x68\x65\x6c\x6c\x6f\x01' + bytes = b'\x0a\x0b\x01\x07\x62\x61\x7a\x06\x0b\x68\x65\x6c\x6c\x6f\x01' self.buf.write(bytes) self.buf.seek(0) @@ -790,7 +791,7 @@ def test_object(self): self.buf.truncate(0) self.buf.write( - '\x0a\x13\x1dorg.pyamf.spam\x07baz\x06\x0b\x68\x65\x6c\x6c\x6f') + b'\x0a\x13\x1dorg.pyamf.spam\x07baz\x06\x0b\x68\x65\x6c\x6c\x6f') self.buf.seek(0) obj = self.decoder.readElement() @@ -801,21 +802,21 @@ def test_object(self): self.assertEqual(obj.baz, 'hello') def test_byte_array(self): - self.assertDecoded(amf3.ByteArray('hello'), '\x0c\x0bhello') + self.assertDecoded(amf3.ByteArray(b'hello'), b'\x0c\x0bhello') def test_date(self): import datetime self.assertDecoded( datetime.datetime(2005, 3, 18, 1, 58, 31), - '\x08\x01Bp+6!\x15\x80\x00' + b'\x08\x01Bp+6!\x15\x80\x00' ) def test_not_strict(self): self.assertFalse(self.decoder.strict) # write a typed object to the stream - self.buf.write('\n\x0b\x13spam.eggs\x07foo\x06\x07bar\x01') + self.buf.write(b'\n\x0b\x13spam.eggs\x07foo\x06\x07bar\x01') self.buf.seek(0) self.assertFalse('spam.eggs' in pyamf.CLASS_CACHE) @@ -832,7 +833,7 @@ def test_strict(self): self.assertTrue(self.decoder.strict) # write a typed object to the stream - self.buf.write('\n\x0b\x13spam.eggs\x07foo\x06\x07bar\x01') + self.buf.write(b'\n\x0b\x13spam.eggs\x07foo\x06\x07bar\x01') self.buf.seek(0) self.assertFalse('spam.eggs' in pyamf.CLASS_CACHE) @@ -846,8 +847,8 @@ class Person(object): pyamf.register_class(Person, 'spam.eggs.Person') self.buf.write( - '\n+!spam.eggs.Person\x17family_name\x15given_name\x06' - '\x07Doe\x06\tJane\x02\x06\x06\x04\x06\x08\x01' + b'\n+!spam.eggs.Person\x17family_name\x15given_name\x06' + b'\x07Doe\x06\tJane\x02\x06\x06\x04\x06\x08\x01' ) self.buf.seek(0) @@ -885,7 +886,7 @@ def test_ioerror_buffer_position(self): def test_timezone(self): self.decoder.timezone_offset = datetime.timedelta(hours=-5) - self.buf.write('\x08\x01Br>\xc6\xf5w\x80\x00') + self.buf.write(b'\x08\x01Br>\xc6\xf5w\x80\x00') self.buf.seek(0) f = self.decoder.readElement() @@ -895,9 +896,9 @@ def test_timezone(self): def test_iterate(self): self.assertRaises(StopIteration, self.decoder.next) - self.decoder.send('\x01') - self.decoder.send('\x03') - self.decoder.send('\x02') + self.decoder.send(b'\x01') + self.decoder.send(b'\x03') + self.decoder.send(b'\x02') self.assertEqual(self.decoder.next(), None) self.assertEqual(self.decoder.next(), True) @@ -908,7 +909,7 @@ def test_iterate(self): self.assertIdentical(iter(self.decoder), self.decoder) def test_bad_type(self): - self.assertRaises(pyamf.DecodeError, self.decode, '\xff') + self.assertRaises(pyamf.DecodeError, self.decode, b'\xff') def test_kwargs(self): """ @@ -917,7 +918,7 @@ def test_kwargs(self): def f(**kwargs): self.assertEqual(kwargs, {'spam': 'eggs'}) - kwargs = self.decode('\n\x0b\x01\tspam\x06\teggs\x01') + kwargs = self.decode(b'\n\x0b\x01\tspam\x06\teggs\x01') f(**kwargs) @@ -938,11 +939,11 @@ def test_object_references(self): self.encoder.writeElement(obj) pos = self.buf.tell() self.encoder.writeElement(obj) - self.assertEqual(self.buf.getvalue()[pos:], '\x0a\x00') + self.assertEqual(self.buf.getvalue()[pos:], b'\x0a\x00') self.buf.truncate() self.encoder.writeElement(obj) - self.assertEqual(self.buf.getvalue(), '\x0a\x00') + self.assertEqual(self.buf.getvalue(), b'\x0a\x00') self.buf.truncate() def test_class_references(self): @@ -959,14 +960,14 @@ def test_class_references(self): self.assertEqual( self.buf.getvalue(), - '\n\x0b\x0fabc.xyz\tspam\x06\teggs\x01' + b'\n\x0b\x0fabc.xyz\tspam\x06\teggs\x01' ) pos = self.buf.tell() self.encoder.writeElement(y) self.assertEqual( self.buf.getvalue()[pos:], - '\n\x01\x07foo\x06\x07bar\x01' + b'\n\x01\x07foo\x06\x07bar\x01' ) def test_static(self): @@ -976,7 +977,7 @@ def test_static(self): x = Spam({'spam': 'eggs'}) self.encoder.writeElement(x) - self.assertEqual(self.buf.getvalue(), '\n\x03\x0fabc.xyz') + self.assertEqual(self.buf.getvalue(), b'\n\x03\x0fabc.xyz') pyamf.unregister_class(Spam) self.buf.truncate() self.encoder.context.clear() @@ -989,7 +990,7 @@ def test_static(self): self.encoder.writeElement(x) self.assertEqual( self.buf.getvalue(), - '\n\x13\x0fabc.xyz\tspam\x06\teggs' + b'\n\x13\x0fabc.xyz\tspam\x06\teggs' ) def test_dynamic(self): @@ -1000,7 +1001,7 @@ def test_dynamic(self): self.assertEqual( self.buf.getvalue(), - '\n\x0b\x0fabc.xyz\tspam\x06\teggs\x01' + b'\n\x0b\x0fabc.xyz\tspam\x06\teggs\x01' ) def test_combined(self): @@ -1015,7 +1016,7 @@ def test_combined(self): self.assertEqual( buf, - '\n\x1b\x0fabc.xyz\tspam\x06\x07foo\teggs\x06\x07bar\x01' + b'\n\x1b\x0fabc.xyz\tspam\x06\x07foo\teggs\x06\x07bar\x01' ) def test_external(self): @@ -1030,9 +1031,9 @@ def test_external(self): # an inline object with and inline class-def, encoding = 0x01, 1 attr - self.assertEqual(buf[:2], '\x0a\x07') + self.assertEqual(buf[:2], b'\x0a\x07') # class alias name - self.assertEqual(buf[2:10], '\x0fabc.xyz') + self.assertEqual(buf[2:10], b'\x0fabc.xyz') self.assertEqual(len(buf), 10) @@ -1059,8 +1060,8 @@ class __amf__: self.assertEqual( self.buf.getvalue(), - '\t\x05\x01\n;\x01\tname\x05id\x17description\x06\x07foo\x04\x01' - '\x01\x01\n\x01\x06\x07bar\x04\x02\x01\x01' + b'\t\x05\x01\n;\x01\x17description\x05id\tname\x01\x04\x01\x06\x07f' + b'oo\x01\n\x01\x01\x04\x02\x06\x07bar\x01' ) @@ -1075,13 +1076,13 @@ def setUp(self): DecoderMixIn.setUp(self) def test_object_references(self): - self.buf.write('\x0a\x23\x01\x03a\x03b\x06\x09spam\x04\x05') + self.buf.write(b'\x0a\x23\x01\x03a\x03b\x06\x09spam\x04\x05') self.buf.seek(0, 0) obj1 = self.decoder.readElement() self.buf.truncate() - self.buf.write('\n\x00') + self.buf.write(b'\n\x00') self.buf.seek(0, 0) obj2 = self.decoder.readElement() @@ -1091,7 +1092,7 @@ def test_object_references(self): def test_static(self): pyamf.register_class(Spam, 'abc.xyz') - self.buf.write('\x0a\x13\x0fabc.xyz\x09spam\x06\x09eggs') + self.buf.write(b'\x0a\x13\x0fabc.xyz\x09spam\x06\x09eggs') self.buf.seek(0, 0) obj = self.decoder.readElement() @@ -1106,7 +1107,7 @@ def test_static(self): def test_dynamic(self): pyamf.register_class(Spam, 'abc.xyz') - self.buf.write('\x0a\x0b\x0fabc.xyz\x09spam\x06\x09eggs\x01') + self.buf.write(b'\x0a\x0b\x0fabc.xyz\x09spam\x06\x09eggs\x01') self.buf.seek(0, 0) obj = self.decoder.readElement() @@ -1126,7 +1127,7 @@ def test_combined(self): pyamf.register_class(Spam, 'abc.xyz') self.buf.write( - '\x0a\x1b\x0fabc.xyz\x09spam\x06\x09eggs\x07baz\x06\x07nat\x01') + b'\x0a\x1b\x0fabc.xyz\x09spam\x06\x09eggs\x07baz\x06\x07nat\x01') self.buf.seek(0, 0) obj = self.decoder.readElement() @@ -1142,7 +1143,7 @@ def test_external(self): alias = pyamf.register_class(Spam, 'abc.xyz') alias.external = True - self.buf.write('\x0a\x07\x0fabc.xyz') + self.buf.write(b'\x0a\x07\x0fabc.xyz') self.buf.seek(0) x = self.decoder.readElement() @@ -1167,11 +1168,11 @@ def test_create(self): def test_boolean(self): self.x.writeBoolean(True) - self.assertEqual(self.buf.getvalue(), '\x01') + self.assertEqual(self.buf.getvalue(), b'\x01') self.buf.truncate() self.x.writeBoolean(False) - self.assertEqual(self.buf.getvalue(), '\x00') + self.assertEqual(self.buf.getvalue(), b'\x00') def test_byte(self): for y in xrange(10): @@ -1179,59 +1180,59 @@ def test_byte(self): self.assertEqual( self.buf.getvalue(), - '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09' + b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09' ) def test_double(self): self.x.writeDouble(0.0) - self.assertEqual(self.buf.getvalue(), '\x00' * 8) + self.assertEqual(self.buf.getvalue(), b'\x00' * 8) self.buf.truncate() self.x.writeDouble(1234.5678) - self.assertEqual(self.buf.getvalue(), '@\x93JEm\\\xfa\xad') + self.assertEqual(self.buf.getvalue(), b'@\x93JEm\\\xfa\xad') def test_float(self): self.x.writeFloat(0.0) - self.assertEqual(self.buf.getvalue(), '\x00' * 4) + self.assertEqual(self.buf.getvalue(), b'\x00' * 4) self.buf.truncate() self.x.writeFloat(1234.5678) - self.assertEqual(self.buf.getvalue(), 'D\x9aR+') + self.assertEqual(self.buf.getvalue(), b'D\x9aR+') def test_int(self): self.x.writeInt(0) - self.assertEqual(self.buf.getvalue(), '\x00\x00\x00\x00') + self.assertEqual(self.buf.getvalue(), b'\x00\x00\x00\x00') self.buf.truncate() self.x.writeInt(-12345) - self.assertEqual(self.buf.getvalue(), '\xff\xff\xcf\xc7') + self.assertEqual(self.buf.getvalue(), b'\xff\xff\xcf\xc7') self.buf.truncate() self.x.writeInt(98) - self.assertEqual(self.buf.getvalue(), '\x00\x00\x00b') + self.assertEqual(self.buf.getvalue(), b'\x00\x00\x00b') def test_multi_byte(self): # TODO nick: test multiple charsets self.x.writeMultiByte('this is a test', 'utf-8') - self.assertEqual(self.buf.getvalue(), u'this is a test') + self.assertEqual(self.buf.getvalue(), 'this is a test'.encode('utf-8')) self.buf.truncate() self.x.writeMultiByte(u'ἔδωσαν', 'utf-8') self.assertEqual( self.buf.getvalue(), - '\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd' + b'\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd' ) def test_object(self): obj = pyamf.MixedArray(spam='eggs') self.x.writeObject(obj) - self.assertEqual(self.buf.getvalue(), '\t\x01\tspam\x06\teggs\x01') + self.assertEqual(self.buf.getvalue(), b'\t\x01\tspam\x06\teggs\x01') self.buf.truncate() # check references self.x.writeObject(obj) - self.assertEqual(self.buf.getvalue(), '\t\x00') + self.assertEqual(self.buf.getvalue(), b'\t\x00') self.buf.truncate() def test_object_proxy(self): @@ -1241,14 +1242,14 @@ def test_object_proxy(self): self.x.writeObject(obj) self.assertEqual( self.buf.getvalue(), - '\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01\tspam\x06\teggs' - '\x01' + b'\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01\tspam\x06\teggs' + b'\x01' ) self.buf.truncate() # check references self.x.writeObject(obj) - self.assertEqual(self.buf.getvalue(), '\n\x00') + self.assertEqual(self.buf.getvalue(), b'\n\x00') self.buf.truncate() def test_object_proxy_mixed_array(self): @@ -1258,14 +1259,14 @@ def test_object_proxy_mixed_array(self): self.x.writeObject(obj) self.assertEqual( self.buf.getvalue(), - '\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01\tspam\x06\teggs' - '\x01' + b'\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01\tspam\x06\teggs' + b'\x01' ) self.buf.truncate() # check references self.x.writeObject(obj) - self.assertEqual(self.buf.getvalue(), '\n\x00') + self.assertEqual(self.buf.getvalue(), b'\n\x00') self.buf.truncate() def test_object_proxy_inside_list(self): @@ -1275,21 +1276,21 @@ def test_object_proxy_inside_list(self): self.x.writeObject(obj) self.assertEqual( self.buf.getvalue(), - '\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\n\x07;' - 'flex.messaging.io.ObjectProxy\n\x0b\x01\tspam\x06\teggs\x01' + b'\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\n\x07;' + b'flex.messaging.io.ObjectProxy\n\x0b\x01\tspam\x06\teggs\x01' ) def test_short(self): self.x.writeShort(55) - self.assertEqual(self.buf.getvalue(), '\x007') + self.assertEqual(self.buf.getvalue(), b'\x007') self.buf.truncate() self.x.writeShort(-55) - self.assertEqual(self.buf.getvalue(), '\xff\xc9') + self.assertEqual(self.buf.getvalue(), b'\xff\xc9') def test_uint(self): self.x.writeUnsignedInt(55) - self.assertEqual(self.buf.getvalue(), '\x00\x00\x007') + self.assertEqual(self.buf.getvalue(), b'\x00\x00\x007') self.buf.truncate() self.assertRaises(OverflowError, self.x.writeUnsignedInt, -55) @@ -1299,7 +1300,7 @@ def test_utf(self): self.assertEqual( self.buf.getvalue(), - '\x00\r\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd' + b'\x00\r\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd' ) def test_utf_bytes(self): @@ -1307,7 +1308,7 @@ def test_utf_bytes(self): self.assertEqual( self.buf.getvalue(), - '\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd' + b'\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd' ) @@ -1333,18 +1334,18 @@ def _test(self, bytes, value, func, *params): def test_boolean(self): x = amf3.DataInput(self.decoder) - self.buf.write('\x01') + self.buf.write(b'\x01') self.buf.seek(-1, 2) self.assertEqual(x.readBoolean(), True) - self.buf.write('\x00') + self.buf.write(b'\x00') self.buf.seek(-1, 2) self.assertEqual(x.readBoolean(), False) def test_byte(self): x = amf3.DataInput(self.decoder) - self.buf.write('\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09') + self.buf.write(b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09') self.buf.seek(0) for y in xrange(10): @@ -1353,34 +1354,34 @@ def test_byte(self): def test_double(self): x = amf3.DataInput(self.decoder) - self._test('\x00' * 8, 0.0, x.readDouble) - self._test('@\x93JEm\\\xfa\xad', 1234.5678, x.readDouble) + self._test(b'\x00' * 8, 0.0, x.readDouble) + self._test(b'@\x93JEm\\\xfa\xad', 1234.5678, x.readDouble) def test_float(self): x = amf3.DataInput(self.decoder) - self._test('\x00' * 4, 0.0, x.readFloat) - self._test('?\x00\x00\x00', 0.5, x.readFloat) + self._test(b'\x00' * 4, 0.0, x.readFloat) + self._test(b'?\x00\x00\x00', 0.5, x.readFloat) def test_int(self): x = amf3.DataInput(self.decoder) - self._test('\x00\x00\x00\x00', 0, x.readInt) - self._test('\xff\xff\xcf\xc7', -12345, x.readInt) - self._test('\x00\x00\x00b', 98, x.readInt) + self._test(b'\x00\x00\x00\x00', 0, x.readInt) + self._test(b'\xff\xff\xcf\xc7', -12345, x.readInt) + self._test(b'\x00\x00\x00b', 98, x.readInt) def test_multi_byte(self): # TODO nick: test multiple charsets x = amf3.DataInput(self.decoder) self._test( - 'this is a test', + b'this is a test', 'this is a test', x.readMultiByte, 14, 'utf-8' ) self._test( - '\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd', + b'\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd', u'ἔδωσαν', x.readMultiByte, 13, @@ -1391,30 +1392,30 @@ def test_object(self): x = amf3.DataInput(self.decoder) self._test( - '\t\x01\x09spam\x06\x09eggs\x01', + b'\t\x01\x09spam\x06\x09eggs\x01', {'spam': 'eggs'}, x.readObject ) # check references - self._test('\t\x00', {'spam': 'eggs'}, x.readObject) + self._test(b'\t\x00', {'spam': 'eggs'}, x.readObject) def test_short(self): x = amf3.DataInput(self.decoder) - self._test('\x007', 55, x.readShort) - self._test('\xff\xc9', -55, x.readShort) + self._test(b'\x007', 55, x.readShort) + self._test(b'\xff\xc9', -55, x.readShort) def test_uint(self): x = amf3.DataInput(self.decoder) - self._test('\x00\x00\x007', 55, x.readUnsignedInt) + self._test(b'\x00\x00\x007', 55, x.readUnsignedInt) def test_utf(self): x = amf3.DataInput(self.decoder) - self._test('\x00\x0bhello world', u'hello world', x.readUTF) + self._test(b'\x00\x0bhello world', u'hello world', x.readUTF) self._test( - '\x00\r\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd', + b'\x00\r\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd', u'ἔδωσαν', x.readUTF ) @@ -1423,7 +1424,7 @@ def test_utf_bytes(self): x = amf3.DataInput(self.decoder) self._test( - '\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd', + b'\xe1\xbc\x94\xce\xb4\xcf\x89\xcf\x83\xce\xb1\xce\xbd', u'ἔδωσαν', x.readUTFBytes, 13 @@ -1459,7 +1460,7 @@ class B(A): self.assertEncoded( x, - '\n+\x03B\x03a\x03b\x06\tspam\x06\teggs\x01' + b'\n+\x03B\x03a\x03b\x06\tspam\x06\teggs\x01' ) def test_deep(self): @@ -1488,7 +1489,7 @@ class C(B): self.assertEncoded( x, - '\n;\x03C\x03b\x03a\x03c\x06\teggs\x06\tspam\x06\x07foo\x01' + b'\n;\x03C\x03a\x03b\x03c\x06\tspam\x06\teggs\x06\x07foo\x01' ) @@ -1622,13 +1623,13 @@ def setUp(self): def test_exception(self): try: raise Exception('foo bar') - except Exception, e: + except Exception as e: self.encoder.writeElement(e) self.assertEqual( self.buf.getvalue(), - '\n\x0b\x01\x0fmessage\x06' - '\x0ffoo bar\tname\x06\x13Exception\x01' + b'\n\x0b\x01\x0fmessage\x06' + b'\x0ffoo bar\tname\x06\x13Exception\x01' ) def test_user_defined(self): @@ -1637,13 +1638,13 @@ class FooBar(Exception): try: raise FooBar('foo bar') - except Exception, e: + except Exception as e: self.encoder.writeElement(e) self.assertEqual( self.buf.getvalue(), - '\n\x0b\x01\x0fmessage\x06' - '\x0ffoo bar\tname\x06\rFooBar\x01' + b'\n\x0b\x01\x0fmessage\x06' + b'\x0ffoo bar\tname\x06\rFooBar\x01' ) def test_typed(self): @@ -1654,13 +1655,13 @@ class XYZ(Exception): try: raise XYZ('blarg') - except Exception, e: + except Exception as e: self.encoder.writeElement(e) self.assertEqual( self.buf.getvalue(), - '\n\x0b\x0ffoo.bar\x0f' - 'message\x06\x0bblarg\tname\x06\x07XYZ\x01' + b'\n\x0b\x0ffoo.bar\x0f' + b'message\x06\x0bblarg\tname\x06\x07XYZ\x01' ) @@ -1694,7 +1695,7 @@ def test_context(self): b.writeObject(obj) - self.assertEqual(b.getvalue(), '\n\x0b\x01\x07foo\x06\x07bar\x01') + self.assertEqual(b.getvalue(), b'\n\x0b\x01\x07foo\x06\x07bar\x01') def test_read_context(self): """ @@ -1703,7 +1704,7 @@ def test_read_context(self): obj = {'foo': 'bar'} b = amf3.ByteArray() - b.stream.write('\n\x0b\x01\x07foo\x06\x07bar\x01\n\x00') + b.stream.write(b'\n\x0b\x01\x07foo\x06\x07bar\x01\n\x00') b.stream.seek(0) self.assertEqual(obj, b.readObject()) @@ -1723,12 +1724,12 @@ def test_compressed(self): self.assertFalse(ba.compressed) - z = zlib.compress('b' * 100) + z = zlib.compress(b'b' * 100) ba = amf3.ByteArray(z) self.assertTrue(ba.compressed) - z = zlib.compress('\x00' * 100) + z = zlib.compress(b'\x00' * 100) ba = amf3.ByteArray(z) self.assertTrue(ba.compressed) diff --git a/pyamf/tests/test_basic.py b/pyamf/tests/test_basic.py index 2735dbc9..886f8f03 100644 --- a/pyamf/tests/test_basic.py +++ b/pyamf/tests/test_basic.py @@ -8,7 +8,8 @@ """ import unittest -import new +from types import ModuleType +from six import iteritems import pyamf from pyamf.tests.util import ClassCacheClearingTestCase, replace_dict, Spam @@ -66,7 +67,7 @@ def test_iter(self): x = [] - for k, v in bag.iteritems(): + for k, v in iteritems(bag): x.append((k, v)) self.assertEqual(x, [('spam', 'eggs')]) @@ -91,24 +92,24 @@ def tearDown(self): def test_get_decoder(self): self.assertRaises(ValueError, pyamf.get_decoder, 'spam') - decoder = pyamf.get_decoder(pyamf.AMF0, stream='123', strict=True) - self.assertEqual(decoder.stream.getvalue(), '123') + decoder = pyamf.get_decoder(pyamf.AMF0, stream=b'123', strict=True) + self.assertEqual(decoder.stream.getvalue(), b'123') self.assertTrue(decoder.strict) - decoder = pyamf.get_decoder(pyamf.AMF3, stream='456', strict=True) - self.assertEqual(decoder.stream.getvalue(), '456') + decoder = pyamf.get_decoder(pyamf.AMF3, stream=b'456', strict=True) + self.assertEqual(decoder.stream.getvalue(), b'456') self.assertTrue(decoder.strict) def test_get_encoder(self): pyamf.get_encoder(pyamf.AMF0) pyamf.get_encoder(pyamf.AMF3) - self.assertRaises(ValueError, pyamf.get_encoder, 'spam') + self.assertRaises(ValueError, pyamf.get_encoder, b'spam') - encoder = pyamf.get_encoder(pyamf.AMF0, stream='spam') - self.assertEqual(encoder.stream.getvalue(), 'spam') + encoder = pyamf.get_encoder(pyamf.AMF0, stream=b'spam') + self.assertEqual(encoder.stream.getvalue(), b'spam') self.assertFalse(encoder.strict) - encoder = pyamf.get_encoder(pyamf.AMF3, stream='eggs') + encoder = pyamf.get_encoder(pyamf.AMF3, stream=b'eggs') self.assertFalse(encoder.strict) encoder = pyamf.get_encoder(pyamf.AMF0, strict=True) @@ -119,13 +120,13 @@ def test_get_encoder(self): def test_encode(self): self.assertEqual( - '\x06\x0fconnect\x05?\xf0\x00\x00\x00\x00\x00\x00', + b'\x06\x0fconnect\x05?\xf0\x00\x00\x00\x00\x00\x00', pyamf.encode(u'connect', 1.0).getvalue() ) def test_decode(self): expected = [u'connect', 1.0] - bytes = '\x06\x0fconnect\x05?\xf0\x00\x00\x00\x00\x00\x00' + bytes = b'\x06\x0fconnect\x05?\xf0\x00\x00\x00\x00\x00\x00' returned = [x for x in pyamf.decode(bytes)] @@ -136,13 +137,13 @@ def test_default_encoding(self): x = pyamf.encode('foo').getvalue() - self.assertEqual(x, '\x06\x07foo') + self.assertEqual(x, b'\x06\x07foo') pyamf.DEFAULT_ENCODING = pyamf.AMF0 x = pyamf.encode('foo').getvalue() - self.assertEqual(x, '\x02\x00\x03foo') + self.assertEqual(x, b'\x02\x00\x03foo') class UnregisterClassTestCase(ClassCacheClearingTestCase): @@ -223,11 +224,11 @@ def class_loader(x): self.assertRaises(TypeError, pyamf.load_class, 'spam.eggs') def test_load_class_by_module(self): - pyamf.load_class('__builtin__.tuple') + pyamf.load_class('unittest.TestCase') def test_load_class_by_module_bad(self): with self.assertRaises(pyamf.UnknownClassAlias): - pyamf.load_class('__builtin__.tuple.') + pyamf.load_class('unittest.TestCase.') class TypeMapTestCase(unittest.TestCase): @@ -237,13 +238,13 @@ def setUp(self): self.addCleanup(replace_dict, self.tm, pyamf.TYPE_MAP) def test_add_invalid(self): - mod = new.module('spam') + mod = ModuleType('spam') self.assertRaises(TypeError, pyamf.add_type, mod) self.assertRaises(TypeError, pyamf.add_type, {}) self.assertRaises(TypeError, pyamf.add_type, 'spam') self.assertRaises(TypeError, pyamf.add_type, u'eggs') self.assertRaises(TypeError, pyamf.add_type, 1) - self.assertRaises(TypeError, pyamf.add_type, 234234L) + self.assertRaises(TypeError, pyamf.add_type, 234234) self.assertRaises(TypeError, pyamf.add_type, 34.23) self.assertRaises(TypeError, pyamf.add_type, None) self.assertRaises(TypeError, pyamf.add_type, object()) @@ -469,7 +470,7 @@ class ClassicType: def setUp(self): ClassCacheClearingTestCase.setUp(self) - self.module = new.module('foo') + self.module = ModuleType('foo') self.module.Classic = self.ClassicType self.module.New = self.NewType @@ -562,7 +563,7 @@ def test_odd(self): self.assertRaises(TypeError, pyamf.register_package, object()) self.assertRaises(TypeError, pyamf.register_package, 1) self.assertRaises(TypeError, pyamf.register_package, 1.2) - self.assertRaises(TypeError, pyamf.register_package, 23897492834L) + self.assertRaises(TypeError, pyamf.register_package, 23897492834) self.assertRaises(TypeError, pyamf.register_package, []) self.assertRaises(TypeError, pyamf.register_package, '') self.assertRaises(TypeError, pyamf.register_package, u'') diff --git a/pyamf/tests/test_codec.py b/pyamf/tests/test_codec.py index 35eac9ba..9d2ae52c 100644 --- a/pyamf/tests/test_codec.py +++ b/pyamf/tests/test_codec.py @@ -8,17 +8,11 @@ """ import unittest +from six import binary_type, text_type import pyamf from pyamf import codec -try: - unicode -except NameError: - # py3k - unicode = str - str = bytes - class TestObject(object): def __init__(self): @@ -240,7 +234,7 @@ def test_string(self): s = 'foo'.encode('ascii') u = self.context.getStringForBytes(s) - self.assertTrue(type(u) is unicode) + self.assertTrue(isinstance(u, text_type)) self.assertEqual(u, s.decode('ascii')) i = self.context.getStringForBytes(s) @@ -254,11 +248,11 @@ def test_string(self): self.assertFalse(u is i) def test_bytes(self): - s = 'foo'.decode('ascii') + s = u'foo' b = self.context.getBytesForString(s) - self.assertTrue(type(b) is str) + self.assertTrue(type(b) is binary_type) self.assertEqual(b, s.encode('ascii')) i = self.context.getBytesForString(s) diff --git a/pyamf/tests/test_flex.py b/pyamf/tests/test_flex.py index 327363ac..422a9f1d 100644 --- a/pyamf/tests/test_flex.py +++ b/pyamf/tests/test_flex.py @@ -50,7 +50,7 @@ def test_encode_amf3(self): self.assertEncoded( x, - '\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs' + b'\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs' ) def test_encode_amf0(self): @@ -62,12 +62,12 @@ def test_encode_amf0(self): self.assertEncoded( x, - '\x11\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs' + b'\x11\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs' ) def test_decode_amf3(self): stream = util.BufferedByteStream( - '\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs' + b'\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs' ) decoder = amf3.Decoder(stream) x = decoder.readElement() @@ -77,8 +77,8 @@ def test_decode_amf3(self): def test_decode_proxy(self): stream = util.BufferedByteStream( - '\x0a\x07;flex.messaging.io.ObjectProxy\x09\x01\x03a\x06\x09spam' - '\x03b\x04\x05\x01') + b'\x0a\x07;flex.messaging.io.ObjectProxy\x09\x01\x03a\x06\x09spam' + b'\x03b\x04\x05\x01') decoder = amf3.Decoder(stream) decoder.use_proxies = True @@ -89,7 +89,7 @@ def test_decode_proxy(self): def test_decode_amf0(self): stream = util.BufferedByteStream( - '\x11\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs') + b'\x11\n\x07Cflex.messaging.io.ArrayCollection\t\x03\x01\x06\teggs') decoder = amf0.Decoder(stream) x = decoder.readElement() @@ -98,8 +98,8 @@ def test_decode_amf0(self): def test_source_attr(self): s = ( - '\n\x07Cflex.messaging.io.ArrayCollection\n\x0b\x01\rsource' - '\t\x05\x01\x06\x07foo\x06\x07bar\x01' + b'\n\x07Cflex.messaging.io.ArrayCollection\n\x0b\x01\rsource' + b'\t\x05\x01\x06\x07foo\x06\x07bar\x01' ) x = pyamf.decode(s, encoding=pyamf.AMF3).next() @@ -200,14 +200,14 @@ def test_encode(self): self.assertEncoded( x, - '\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01', - ('\x03a\x06\tspam', '\x03b\x04\x05', '\x01') + b'\n\x07;flex.messaging.io.ObjectProxy\n\x0b\x01', + (b'\x03a\x06\tspam', b'\x03b\x04\x05', b'\x01') ) def test_decode(self): stream = util.BufferedByteStream( - '\x0a\x07;flex.messaging.io.ObjectProxy\x09\x01\x03a\x06\x09spam' - '\x03b\x04\x05\x01') + b'\x0a\x07;flex.messaging.io.ObjectProxy\x09\x01\x03a\x06\x09spam' + b'\x03b\x04\x05\x01') decoder = amf3.Decoder(stream) x = decoder.readElement() @@ -217,8 +217,8 @@ def test_decode(self): def test_decode_proxy(self): stream = util.BufferedByteStream( - '\x0a\x07;flex.messaging.io.ObjectProxy\x09\x01\x03a\x06\x09spam' - '\x03b\x04\x05\x01') + b'\x0a\x07;flex.messaging.io.ObjectProxy\x09\x01\x03a\x06\x09spam' + b'\x03b\x04\x05\x01') decoder = amf3.Decoder(stream) decoder.use_proxies = True @@ -242,7 +242,9 @@ def test_repr(self): x = flex.ObjectProxy(u'ƒøø') - self.assertEqual( - repr(x), - "" + self.assertIn( + repr(x), ( + "", + "" + ) ) diff --git a/pyamf/tests/test_flex_messaging.py b/pyamf/tests/test_flex_messaging.py index db0977b2..359ec007 100644 --- a/pyamf/tests/test_flex_messaging.py +++ b/pyamf/tests/test_flex_messaging.py @@ -40,10 +40,10 @@ def test_AcknowledgeMessage(self): self.assertEqual( pyamf.encode(m).getvalue(), - '\n\x81\x0bUflex.messaging.messages.AcknowledgeMessage\tbody' - '\x11clientId\x17destination\x0fheaders\x13messageId\x13timestamp' - '\x15timeToLive\x1bcorrelationId\x01\x01\x01\n\x0b\x01\x01\x01\x01' - '\x01\x06\t1234\x01' + b'\n\x81\x0bUflex.messaging.messages.AcknowledgeMessage\tbody\x11cl' + b'ientId\x1bcorrelationId\x17destination\x0fheaders\x13messageId' + b'\x15timeToLive\x13timestamp\x01\x01\x06\t1234\x01\n\x0b\x01\x01' + b'\x01\x01\x01\x01' ) def test_CommandMessage(self): @@ -51,10 +51,10 @@ def test_CommandMessage(self): self.assertEqual( pyamf.encode(m).getvalue(), - '\n\x81\x1bMflex.messaging.messages.CommandMessage\x1bcorrelationI' - 'd\tbody\x11clientId\x17destination\x0fheaders\x13messageId\x13' - 'timestamp\x15timeToLive\x13operation\x01\x01\x01\x01\n\x0b\x01' - '\x01\x01\x01\x01\x06\x0ffoo.bar\x01' + b'\n\x81\x1bMflex.messaging.messages.CommandMessage\tbody\x11client' + b'Id\x1bcorrelationId\x17destination\x0fheaders\x13messageId\x13ope' + b'ration\x15timeToLive\x13timestamp\x01\x01\x01\x01\n\x0b\x01\x01' + b'\x01\x06\x0ffoo.bar\x01\x01\x01' ) def test_ErrorMessage(self): @@ -62,11 +62,11 @@ def test_ErrorMessage(self): self.assertEqual( pyamf.encode(m).getvalue(), - '\n\x81[Iflex.messaging.messages.ErrorMessage\x1bcorrelationId\x15' - 'timeToLive\x13timestamp\x13messageId\x0fheaders\x17destination' - '\x11clientId\tbody\x19extendedData\x13faultCode\x17faultDetail' - '\x17faultString\x13rootCause\x01\x01\x01\x01\n\x0b\x01\x01\x01' - '\x01\x01\n\x05\x01\x01\x01\x06\x15ValueError\n\x05\x01\x01' + b'\n\x81[Iflex.messaging.messages.ErrorMessage\tbody\x11clientId' + b'\x1bcorrelationId\x17destination\x19extendedData\x13faultCode\x17' + b'faultDetail\x17faultString\x0fheaders\x13messageId\x13rootCause' + b'\x15timeToLive\x13timestamp\x01\x01\x01\x01\n\x0b\x01\x01\x01\x01' + b'\x06\x15ValueError\n\x05\x01\x01\n\x05\x01\x01\x01\x01' ) def test_RemotingMessage(self): @@ -74,10 +74,10 @@ def test_RemotingMessage(self): self.assertEqual( pyamf.encode(m).getvalue(), - '\n\x81\x1bOflex.messaging.messages.RemotingMessage\x15timeToLive' - '\x13timestamp\x13messageId\x0fheaders\x17destination\x11clientId' - '\tbody\x13operation\rsource\x01\x01\x01\n\x0b\x01\x01\x01\x01\x01' - '\x01\x06\x0ffoo.bar\x01' + b'\n\x81\x1bOflex.messaging.messages.RemotingMessage\tbody\x11clien' + b'tId\x17destination\x0fheaders\x13messageId\x13operation\rsource' + b'\x15timeToLive\x13timestamp\x01\x01\x01\n\x0b\x01\x01\x01\x01\x06' + b'\x0ffoo.bar\x01\x01\x01' ) @@ -92,12 +92,11 @@ def setUp(self): def test_acknowledge(self): bytes = ( - '\n\x07\x07DSK\xa8\x03\n\x0b\x01%DSMessagingVersion\x05?\xf0' - '\x00\x00\x00\x00\x00\x00\tDSId\x06IEE0D161D-C11D-25CB-8DBE-3B77B' - '54B55D9\x01\x05Br3&m\x85\x10\x00\x0c!\xee\r\x16\x1d\xc1(&[\xc9' - '\x80RK\x9bE\xc6\xc4\x0c!\xee\r\x16\x1d\xc1=\x8e\xa3\xe0\x10\xef' - '\xad;\xe5\xc5j\x02\x0c!S\x84\x83\xdb\xa9\xc8\xcaM`\x952f\xdbQ' - '\xc9<\x00' + b'\n\x07\x07DSK\xa8\x03\n\x0b\x01\tDSId\x06IEE0D161D-C11D-25CB-8DBE' + b'-3B77B54B55D9%DSMessagingVersion\x05?\xf0\x00\x00\x00\x00\x00\x00' + b'\x01\x05Br3&m\x85\x10\x00\x0c!\xee\r\x16\x1d\xc1(&[\xc9\x80RK\x9b' + b'E\xc6\xc4\x0c!\xee\r\x16\x1d\xc1=\x8e\xa3\xe0\x10\xef\xad;\xe5' + b'\xc5j\x02\x0c!S\x84\x83\xdb\xa9\xc8\xcaM`\x952f\xdbQ\xc9<\x00' ) self.buffer.write(bytes) self.buffer.seek(0) @@ -138,9 +137,9 @@ def test_acknowledge(self): def test_command(self): bytes = ( - '\n\x07\x07DSC\x88\x02\n\x0b\x01\tDSId\x06IEE0D161D-C11D-' - '25CB-8DBE-3B77B54B55D9\x01\x0c!\xc0\xdf\xb7|\xd6\xee$1s\x152f' - '\xe11\xa8f\x01\x06\x01\x01\x04\x02' + b'\n\x07\x07DSC\x88\x02\n\x0b\x01\tDSId\x06IEE0D161D-C11D-' + b'25CB-8DBE-3B77B54B55D9\x01\x0c!\xc0\xdf\xb7|\xd6\xee$1s\x152f' + b'\xe11\xa8f\x01\x06\x01\x01\x04\x02' ) self.buffer.write(bytes) diff --git a/pyamf/tests/test_gateway.py b/pyamf/tests/test_gateway.py index cafb32c6..a62574e6 100644 --- a/pyamf/tests/test_gateway.py +++ b/pyamf/tests/test_gateway.py @@ -75,13 +75,14 @@ def test_encode(self): try: raise TypeError("Unknown type") except TypeError: - encoder.writeElement(amf0.build_fault(*sys.exc_info())) + exc_info = sys.exc_info() + encoder.writeElement(amf0.build_fault(*exc_info)) buffer = encoder.stream buffer.seek(0, 0) fault = decoder.readElement() - old_fault = amf0.build_fault(*sys.exc_info()) + old_fault = amf0.build_fault(*exc_info) self.assertEqual(fault.level, old_fault.level) self.assertEqual(fault.type, old_fault.type) @@ -241,9 +242,9 @@ def __call__(*args, **kwargs): self.assertRaises(TypeError, gw.addService, 1) - import new + import types - temp = new.module('temp') + temp = types.ModuleType('temp') gw.addService(temp) self.assertTrue(temp in gw.services) diff --git a/pyamf/tests/test_imports.py b/pyamf/tests/test_imports.py index daa5a6e8..07a5dbcb 100644 --- a/pyamf/tests/test_imports.py +++ b/pyamf/tests/test_imports.py @@ -10,6 +10,7 @@ import unittest import sys import os.path +from six import iteritems from pyamf.util import imports @@ -43,7 +44,7 @@ def tearDown(self): def _clearModules(self, *args): for mod in args: - for k, v in sys.modules.copy().iteritems(): + for k, v in iteritems(sys.modules.copy()): if k.startswith(mod) or k == 'pyamf.tests.%s' % (mod,): del sys.modules[k] @@ -95,8 +96,8 @@ def h(mod): try: import spam # noqa - except Exception, e: - pass + except Exception as e_: + e = e_ else: self.fail('expected exception') diff --git a/pyamf/tests/test_remoting.py b/pyamf/tests/test_remoting.py index d77978ab..bccb29f1 100644 --- a/pyamf/tests/test_remoting.py +++ b/pyamf/tests/test_remoting.py @@ -24,14 +24,14 @@ def test_client_version(self): """ Tests the AMF client version. """ - for x in ('\x00', '\x01', '\x03'): + for x in (b'\x00', b'\x01', b'\x03'): try: - remoting.decode('\x00' + x) + remoting.decode(b'\x00' + x) except IOError: pass def test_null_msg(self): - msg = remoting.decode('\x00\x00\x00\x00\x00\x00') + msg = remoting.decode(b'\x00\x00\x00\x00\x00\x00') self.assertEqual(msg.amfVersion, 0) self.assertEqual(msg.headers, {}) @@ -46,8 +46,8 @@ def test_simple_header(self): Test header decoder. """ msg = remoting.decode( - '\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00' - '\x05\x0a\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00' + b'\x05\x0a\x00\x00\x00\x00\x00\x00' ) self.assertEqual(msg.amfVersion, 0) @@ -63,31 +63,31 @@ def test_simple_header(self): def test_required_header(self): msg = remoting.decode( - '\x00\x00\x00\x01\x00\x04name\x01\x00\x00\x00' - '\x05\x0a\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x01\x00\x04name\x01\x00\x00\x00' + b'\x05\x0a\x00\x00\x00\x00\x00\x00' ) self.assertTrue(msg.headers.is_required('name')) def test_invalid_header_data_length(self): remoting.decode( - '\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00\x06\x0a' - '\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00\x06\x0a' + b'\x00\x00\x00\x00\x00\x00' ) self.failUnlessRaises( pyamf.DecodeError, remoting.decode, - '\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00\x06\x0a\x00\x00\x00' - '\x00\x00\x00', + b'\x00\x00\x00\x01\x00\x04name\x00\x00\x00\x00\x06\x0a\x00\x00\x00' + b'\x00\x00\x00', strict=True ) def test_multiple_headers(self): msg = remoting.decode( - '\x00\x00\x00\x02\x00\x04name\x00\x00\x00\x00' - '\x05\x0a\x00\x00\x00\x00\x00\x04spam\x01\x00\x00\x00\x01\x05\x00' - '\x00' + b'\x00\x00\x00\x02\x00\x04name\x00\x00\x00\x00' + b'\x05\x0a\x00\x00\x00\x00\x00\x04spam\x01\x00\x00\x00\x01\x05\x00' + b'\x00' ) self.assertEqual(msg.amfVersion, 0) @@ -108,13 +108,13 @@ def test_simple_body(self): self.failUnlessRaises( IOError, remoting.decode, - '\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x01' ) msg = remoting.decode( - '\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00' - '\x02/1\x00\x00\x00\x14\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00' - '\x00\x01\x61\x02\x00\x01\x61\x00\x00\x09' + b'\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00' + b'\x02/1\x00\x00\x00\x14\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00' + b'\x00\x01\x61\x02\x00\x01\x61\x00\x00\x09' ) self.assertEqual(msg.amfVersion, 0) @@ -136,47 +136,48 @@ def test_simple_body(self): def test_invalid_body_data_length(self): remoting.decode( - '\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00\x02/1' - '\x00\x00\x00\x13\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01' - '\x61\x02\x00\x01\x61\x00\x00\x09' + b'\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00\x02/1' + b'\x00\x00\x00\x13\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01' + b'\x61\x02\x00\x01\x61\x00\x00\x09' ) self.failUnlessRaises( pyamf.DecodeError, remoting.decode, - '\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00\x02/1\x00\x00\x00' - '\x13\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x61\x02\x00' - '\x01\x61\x00\x00\x09', + b'\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00\x02/1\x00\x00\x00' + b'\x13\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x61\x02\x00' + b'\x01\x61\x00\x00\x09', strict=True ) def test_message_order(self): request = util.BufferedByteStream() request.write( - '\x00\x00\x00\x00\x00\x02\x00\x08get_spam\x00\x02/2\x00' - '\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x04echo\x00\x02/1\x00\x00' - '\x00\x00\x0a\x00\x00\x00\x01\x02\x00\x0bhello world' + b'\x00\x00\x00\x00\x00\x02\x00\x08get_spam\x00\x02/2\x00' + b'\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x04echo\x00\x02/1\x00\x00' + b'\x00\x00\x0a\x00\x00\x00\x01\x02\x00\x0bhello world' ) request.seek(0, 0) request_envelope = remoting.decode(request) it = iter(request_envelope) - self.assertEqual(it.next()[0], '/2') - self.assertEqual(it.next()[0], '/1') + self.assertEqual(next(it)[0], '/2') + self.assertEqual(next(it)[0], '/1') - self.assertRaises(StopIteration, it.next) + with self.assertRaises(StopIteration): + next(it) def test_multiple_request_header_references(self): msg = remoting.decode( - '\x00\x00\x00\x01\x00\x0b\x43\x72\x65\x64\x65\x6e\x74\x69\x61\x6c' - '\x73\x00\x00\x00\x00\x2c\x11\x0a\x0b\x01\x0d\x75\x73\x65\x72\x69' - '\x64\x06\x1f\x67\x65\x6e\x6f\x70\x72\x6f\x5c\x40\x67\x65\x72\x61' - '\x72\x64\x11\x70\x61\x73\x73\x77\x6f\x72\x64\x06\x09\x67\x67\x67' - '\x67\x01\x00\x01\x00\x0b\x63\x72\x65\x61\x74\x65\x47\x72\x6f\x75' - '\x70\x00\x02\x2f\x31\x00\x00\x00\x1c\x0a\x00\x00\x00\x01\x11\x0a' - '\x0b\x01\x09\x73\x74\x72\x41\x06\x09\x74\x65\x73\x74\x09\x73\x74' - '\x72\x42\x06\x02\x01' + b'\x00\x00\x00\x01\x00\x0b\x43\x72\x65\x64\x65\x6e\x74\x69\x61\x6c' + b'\x73\x00\x00\x00\x00\x2c\x11\x0a\x0b\x01\x0d\x75\x73\x65\x72\x69' + b'\x64\x06\x1f\x67\x65\x6e\x6f\x70\x72\x6f\x5c\x40\x67\x65\x72\x61' + b'\x72\x64\x11\x70\x61\x73\x73\x77\x6f\x72\x64\x06\x09\x67\x67\x67' + b'\x67\x01\x00\x01\x00\x0b\x63\x72\x65\x61\x74\x65\x47\x72\x6f\x75' + b'\x70\x00\x02\x2f\x31\x00\x00\x00\x1c\x0a\x00\x00\x00\x01\x11\x0a' + b'\x0b\x01\x09\x73\x74\x72\x41\x06\x09\x74\x65\x73\x74\x09\x73\x74' + b'\x72\x42\x06\x02\x01' ) self.assertEqual(msg.amfVersion, 0) @@ -202,8 +203,8 @@ def test_timezone(self): td = datetime.timedelta(hours=-5) msg = remoting.decode( - '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00' - '\x00\x00\n\x00\x00\x00\x01\x0bBr>\xcc\n~\x00\x00\x00\x00', + b'\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00' + b'\x00\x00\n\x00\x00\x00\x01\x0bBr>\xcc\n~\x00\x00\x00\x00', timezone_offset=td) self.assertEqual( @@ -220,12 +221,12 @@ def test_basic(self): """ """ msg = remoting.Envelope(pyamf.AMF0) - self.assertEqual(remoting.encode(msg).getvalue(), '\x00' * 6) + self.assertEqual(remoting.encode(msg).getvalue(), b'\x00' * 6) msg = remoting.Envelope(pyamf.AMF3) self.assertEqual( remoting.encode(msg).getvalue(), - '\x00\x03' + '\x00' * 4 + b'\x00\x03' + b'\x00' * 4 ) def test_header(self): @@ -237,8 +238,8 @@ def test_header(self): msg.headers['spam'] = (False, 'eggs') self.assertEqual( remoting.encode(msg).getvalue(), - '\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00' - '\x02\x01\x00\x02\x00\x04eggs\x00\x00' + b'\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00' + b'\x02\x01\x00\x02\x00\x04eggs\x00\x00' ) msg = remoting.Envelope(pyamf.AMF0) @@ -246,9 +247,9 @@ def test_header(self): msg.headers['spam'] = (True, ['a', 'b', 'c']) self.assertEqual( remoting.encode(msg).getvalue(), - '\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00' - '\x02\x01\x01\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b\x02\x00' - '\x01c\x00\x00' + b'\x00\x00\x00\x01\x00\x04spam\x00\x00\x00\x00\x00\n\x00\x00\x00' + b'\x02\x01\x01\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b\x02\x00' + b'\x01c\x00\x00' ) def test_request(self): @@ -271,8 +272,8 @@ def test_request(self): self.assertEqual( remoting.encode(msg).getvalue(), - '\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00' - '\x00\n\x00\x00\x00\x01\x02\x00\x05hello' + b'\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00' + b'\x00\n\x00\x00\x00\x01\x02\x00\x05hello' ) def test_response(self): @@ -295,10 +296,10 @@ def test_response(self): self.assertEqual( remoting.encode(msg).getvalue(), - '\x00\x00\x00\x00' - '\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00\x00\x00\n\x00\x00' - '\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00' - '\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00' + b'\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00\x00\x00\n\x00\x00' + b'\x00\x03\x00?\xf0\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00' + b'\x00\x00\x00\x00@\x08\x00\x00\x00\x00\x00\x00' ) def test_message_order(self): @@ -310,11 +311,12 @@ def test_message_order(self): it = iter(msg) - self.assertEqual(it.next()[0], '/3') - self.assertEqual(it.next()[0], '/1') - self.assertEqual(it.next()[0], '/2') + self.assertEqual(next(it)[0], '/3') + self.assertEqual(next(it)[0], '/1') + self.assertEqual(next(it)[0], '/2') - self.assertRaises(StopIteration, it.next) + with self.assertRaises(StopIteration): + next(it) def test_stream_pos(self): """ @@ -343,9 +345,9 @@ def test_timezone(self): self.assertEqual( stream, - '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult' - '\x00\x04null\x00\x00\x00\x00\n\x00\x00\x00\x01\x0bBr>\xdd5\x06' - '\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult' + b'\x00\x04null\x00\x00\x00\x00\n\x00\x00\x00\x01\x0bBr>\xdd5\x06' + b'\x00\x00\x00\x00' ) @@ -357,8 +359,8 @@ def test_request(self): self.assertEqual( remoting.encode(msg, strict=True).getvalue(), - '\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00' - '\r\n\x00\x00\x00\x01\x02\x00\x05hello' + b'\x00\x00\x00\x00\x00\x01\x00\ttest.test\x00\x02/1\x00\x00\x00' + b'\r\n\x00\x00\x00\x01\x02\x00\x05hello' ) def test_response(self): @@ -368,8 +370,8 @@ def test_response(self): self.assertEqual( remoting.encode(msg, strict=True).getvalue(), - '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00' - '\x00\x0c\n\x00\x00\x00\x01\x02\x00\x04spam' + b'\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null\x00\x00' + b'\x00\x0c\n\x00\x00\x00\x01\x02\x00\x04spam' ) @@ -399,11 +401,11 @@ def test_body_references(self): s = remoting.encode(msg).getvalue() self.assertEqual( s, - '\x00\x00\x00\x00\x00\x02\x00\x03foo\x00\x02/1' - '\x00\x00\x00\x00\n\x00\x00\x00\x01\n\x00\x00\x00\x03\x02\x00\x01' - 'a\x02\x00\x01b\x02\x00\x01c\x00\x03bar\x00\x02/2\x00\x00\x00\x00' - '\n\x00\x00\x00\x01\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b' - '\x02\x00\x01c' + b'\x00\x00\x00\x00\x00\x02\x00\x03foo\x00\x02/1' + b'\x00\x00\x00\x00\n\x00\x00\x00\x01\n\x00\x00\x00\x03\x02\x00\x01' + b'a\x02\x00\x01b\x02\x00\x01c\x00\x03bar\x00\x02/2\x00\x00\x00\x00' + b'\n\x00\x00\x00\x01\n\x00\x00\x00\x03\x02\x00\x01a\x02\x00\x01b' + b'\x02\x00\x01c' ) @@ -413,15 +415,15 @@ def test_encode_bytearray(self): stream = ByteArray() - stream.write('12345678') + stream.write(b'12345678') msg = remoting.Envelope(pyamf.AMF0) msg['/1'] = remoting.Response([stream]) self.assertEqual( remoting.encode(msg).getvalue(), - '\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null' - '\x00\x00\x00\x00\n\x00\x00\x00\x01\x11\x0c\x1112345678' + b'\x00\x00\x00\x00\x00\x01\x00\x0b/1/onResult\x00\x04null' + b'\x00\x00\x00\x00\n\x00\x00\x00\x01\x11\x0c\x1112345678' ) @@ -429,17 +431,22 @@ class ReprTestCase(unittest.TestCase): def test_response(self): r = remoting.Response(u'€±') - self.assertEqual( - repr(r), - "u'\\u20ac\\xb1'" + self.assertIn( + repr(r), ( + "u'\\u20ac\\xb1'", + "'\u20ac\xb1'", + ) ) def test_request(self): r = remoting.Request(u'€±', [u'å∫ç']) - self.assertEqual( - repr(r), - "[u'\\xe5\\u222b\\xe7']" + self.assertIn( + repr(r), ( + "[u'\\xe5\\u222b\\xe7']", + "['\xe5\u222b\xe7']", + ) ) def test_base_fault(self): @@ -450,8 +457,11 @@ def test_base_fault(self): details=u'å' ) - self.assertEqual( - repr(r), - "BaseFault level=None code=u'\\xe5' type=u'\\xe5' description=" - "u'\\xe5'\nTraceback:\nu'\\xe5'" + self.assertIn( + repr(r), ( + "BaseFault level=None code=u'\\xe5' type=u'\\xe5' description=" + "u'\\xe5'\nTraceback:\nu'\\xe5'", + "BaseFault level=None code='\xe5' type='\xe5' description=" + "'\xe5'\nTraceback:\n'\xe5'", + ) ) diff --git a/pyamf/tests/test_sol.py b/pyamf/tests/test_sol.py index fae4bbea..b33ae091 100644 --- a/pyamf/tests/test_sol.py +++ b/pyamf/tests/test_sol.py @@ -14,7 +14,7 @@ import warnings import tempfile -from StringIO import StringIO +from six import BytesIO import pyamf from pyamf import sol @@ -26,8 +26,8 @@ class DecoderTestCase(unittest.TestCase): def test_header(self): bytes = ( - '\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x00' + b'\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x00' ) try: @@ -37,22 +37,22 @@ def test_header(self): def test_invalid_header(self): bytes = ( - '\x00\x00\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x00' ) self.assertRaises(pyamf.DecodeError, sol.decode, bytes) def test_invalid_header_length(self): bytes = ( - '\x00\xbf\x00\x00\x00\x05TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x00' + b'\x00\xbf\x00\x00\x00\x05TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x00' ) self.assertRaises(pyamf.DecodeError, sol.decode, bytes) def test_strict_header_length(self): bytes = ( - '\x00\xbf\x00\x00\x00\x00TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x00' + b'\x00\xbf\x00\x00\x00\x00TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x00' ) try: @@ -62,37 +62,37 @@ def test_strict_header_length(self): def test_invalid_signature(self): bytes = ( - '\x00\xbf\x00\x00\x00\x15ABCD\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x00' + b'\x00\xbf\x00\x00\x00\x15ABCD\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x00' ) self.assertRaises(pyamf.DecodeError, sol.decode, bytes) def test_invalid_header_name_length(self): bytes = ( - '\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x01hello' - '\x00\x00\x00\x00' + b'\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x01hello' + b'\x00\x00\x00\x00' ) self.assertRaises(pyamf.DecodeError, sol.decode, bytes) def test_invalid_header_padding(self): bytes = ( - '\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x01\x00' + b'\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x01\x00' ) self.assertRaises(pyamf.DecodeError, sol.decode, bytes) def test_unknown_encoding(self): bytes = ( - '\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x01' + b'\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x01' ) self.assertRaises(ValueError, sol.decode, bytes) def test_amf3(self): bytes = ( - '\x00\xbf\x00\x00\x00aTCSO\x00\x04\x00\x00\x00\x00\x00\x08' - 'EchoTest\x00\x00\x00\x03\x0fhttpUri\x06=http://localhost:8000' - '/gateway/\x00\x0frtmpUri\x06+rtmp://localhost/echo\x00' + b'\x00\xbf\x00\x00\x00aTCSO\x00\x04\x00\x00\x00\x00\x00\x08' + b'EchoTest\x00\x00\x00\x03\x0fhttpUri\x06=http://localhost:8000' + b'/gateway/\x00\x0frtmpUri\x06+rtmp://localhost/echo\x00' ) self.assertEqual( @@ -112,8 +112,8 @@ def test_encode_header(self): self.assertEqual( stream.getvalue(), - '\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x00' + b'\x00\xbf\x00\x00\x00\x15TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x00' ) def test_multiple_values(self): @@ -125,10 +125,10 @@ def test_multiple_values(self): def test_amf3(self): bytes = ( - '\x00\xbf\x00\x00\x00aTCSO\x00\x04\x00\x00\x00\x00\x00\x08' - 'EchoTest\x00\x00\x00\x03', ( - '\x0fhttpUri\x06=http://localhost:8000/gateway/\x00', - '\x0frtmpUri\x06+rtmp://localhost/echo\x00' + b'\x00\xbf\x00\x00\x00aTCSO\x00\x04\x00\x00\x00\x00\x00\x08' + b'EchoTest\x00\x00\x00\x03', ( + b'\x0fhttpUri\x06=http://localhost:8000/gateway/\x00', + b'\x0frtmpUri\x06+rtmp://localhost/echo\x00' ) ) @@ -145,17 +145,17 @@ def test_amf3(self): class HelperTestCase(unittest.TestCase): contents = ( - '\x00\xbf\x00\x00\x002TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' - '\x00\x00\x00\x00', ( - '\x00\x04name\x02\x00\x05value\x00', - '\x00\x04spam\x02\x00\x04eggs\x00' + b'\x00\xbf\x00\x00\x002TCSO\x00\x04\x00\x00\x00\x00\x00\x05hello' + b'\x00\x00\x00\x00', ( + b'\x00\x04name\x02\x00\x05value\x00', + b'\x00\x04spam\x02\x00\x04eggs\x00' ) ) contents_str = ( - '\x00\xbf\x00\x00\x002TCSO\x00\x04\x00\x00\x00\x00\x00' - '\x05hello\x00\x00\x00\x00\x00\x04name\x02\x00\x05value\x00\x00' - '\x04spam\x02\x00\x04eggs\x00') + b'\x00\xbf\x00\x00\x002TCSO\x00\x04\x00\x00\x00\x00\x00' + b'\x05hello\x00\x00\x00\x00\x00\x04name\x02\x00\x05value\x00\x00' + b'\x04spam\x02\x00\x04eggs\x00') def setUp(self): try: @@ -241,7 +241,7 @@ def test_save(self): s = sol.SOL('hello') s.update({'name': 'value', 'spam': 'eggs'}) - x = StringIO() + x = BytesIO() s.save(x) diff --git a/pyamf/tests/test_util.py b/pyamf/tests/test_util.py index a13220a0..53d1f6f6 100644 --- a/pyamf/tests/test_util.py +++ b/pyamf/tests/test_util.py @@ -12,7 +12,7 @@ import unittest from datetime import datetime -from StringIO import StringIO +from six import BytesIO import pyamf from pyamf import util @@ -58,37 +58,37 @@ def test_preserved_microseconds(self): self.assertEqual(util.get_datetime(ts), dt) -class StringIOTestCase(unittest.TestCase): +class BytesIOTestCase(unittest.TestCase): def test_create(self): sp = util.BufferedByteStream() self.assertEqual(sp.tell(), 0) - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(len(sp), 0) - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') sp = util.BufferedByteStream(None) self.assertEqual(sp.tell(), 0) - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(len(sp), 0) - sp = util.BufferedByteStream('') + sp = util.BufferedByteStream(b'') self.assertEqual(sp.tell(), 0) - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(len(sp), 0) - sp = util.BufferedByteStream('spam') + sp = util.BufferedByteStream(b'spam') self.assertEqual(sp.tell(), 0) - self.assertEqual(sp.getvalue(), 'spam') + self.assertEqual(sp.getvalue(), b'spam') self.assertEqual(len(sp), 4) - sp = util.BufferedByteStream(StringIO('this is a test')) + sp = util.BufferedByteStream(BytesIO(b'this is a test')) self.assertEqual(sp.tell(), 0) - self.assertEqual(sp.getvalue(), 'this is a test') + self.assertEqual(sp.getvalue(), b'this is a test') self.assertEqual(len(sp), 14) self.assertRaises(TypeError, util.BufferedByteStream, self) @@ -96,145 +96,145 @@ def test_create(self): def test_getvalue(self): sp = util.BufferedByteStream() - sp.write('asdfasdf') - self.assertEqual(sp.getvalue(), 'asdfasdf') - sp.write('spam') - self.assertEqual(sp.getvalue(), 'asdfasdfspam') + sp.write(b'asdfasdf') + self.assertEqual(sp.getvalue(), b'asdfasdf') + sp.write(b'spam') + self.assertEqual(sp.getvalue(), b'asdfasdfspam') def test_read(self): - sp = util.BufferedByteStream('this is a test') + sp = util.BufferedByteStream(b'this is a test') self.assertEqual(len(sp), 14) - self.assertEqual(sp.read(1), 't') - self.assertEqual(sp.getvalue(), 'this is a test') + self.assertEqual(sp.read(1), b't') + self.assertEqual(sp.getvalue(), b'this is a test') self.assertEqual(len(sp), 14) - self.assertEqual(sp.read(10), 'his is a t') - self.assertEqual(sp.read(), 'est') + self.assertEqual(sp.read(10), b'his is a t') + self.assertEqual(sp.read(), b'est') def test_seek(self): - sp = util.BufferedByteStream('abcdefghijklmnopqrstuvwxyz') + sp = util.BufferedByteStream(b'abcdefghijklmnopqrstuvwxyz') - self.assertEqual(sp.getvalue(), 'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(sp.getvalue(), b'abcdefghijklmnopqrstuvwxyz') self.assertEqual(sp.tell(), 0) # Relative to the beginning of the stream sp.seek(0, 0) self.assertEqual(sp.tell(), 0) - self.assertEqual(sp.getvalue(), 'abcdefghijklmnopqrstuvwxyz') - self.assertEqual(sp.read(1), 'a') + self.assertEqual(sp.getvalue(), b'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(sp.read(1), b'a') self.assertEqual(len(sp), 26) sp.seek(10, 0) self.assertEqual(sp.tell(), 10) - self.assertEqual(sp.getvalue(), 'abcdefghijklmnopqrstuvwxyz') - self.assertEqual(sp.read(1), 'k') + self.assertEqual(sp.getvalue(), b'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(sp.read(1), b'k') self.assertEqual(len(sp), 26) sp.seek(-5, 1) self.assertEqual(sp.tell(), 6) - self.assertEqual(sp.getvalue(), 'abcdefghijklmnopqrstuvwxyz') - self.assertEqual(sp.read(1), 'g') + self.assertEqual(sp.getvalue(), b'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(sp.read(1), b'g') self.assertEqual(len(sp), 26) sp.seek(-3, 2) self.assertEqual(sp.tell(), 23) - self.assertEqual(sp.getvalue(), 'abcdefghijklmnopqrstuvwxyz') - self.assertEqual(sp.read(1), 'x') + self.assertEqual(sp.getvalue(), b'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(sp.read(1), b'x') self.assertEqual(len(sp), 26) def test_tell(self): - sp = util.BufferedByteStream('abcdefghijklmnopqrstuvwxyz') + sp = util.BufferedByteStream(b'abcdefghijklmnopqrstuvwxyz') - self.assertEqual(sp.getvalue(), 'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(sp.getvalue(), b'abcdefghijklmnopqrstuvwxyz') self.assertEqual(len(sp), 26) self.assertEqual(sp.tell(), 0) sp.read(1) self.assertEqual(sp.tell(), 1) - self.assertEqual(sp.getvalue(), 'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(sp.getvalue(), b'abcdefghijklmnopqrstuvwxyz') self.assertEqual(len(sp), 26) sp.read(5) self.assertEqual(sp.tell(), 6) def test_truncate(self): - sp = util.BufferedByteStream('abcdef') + sp = util.BufferedByteStream(b'abcdef') - self.assertEqual(sp.getvalue(), 'abcdef') + self.assertEqual(sp.getvalue(), b'abcdef') self.assertEqual(len(sp), 6) sp.truncate() - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(len(sp), 0) - sp = util.BufferedByteStream('hello') + sp = util.BufferedByteStream(b'hello') - self.assertEqual(sp.getvalue(), 'hello') + self.assertEqual(sp.getvalue(), b'hello') self.assertEqual(len(sp), 5) sp.truncate(3) - self.assertEqual(sp.getvalue(), 'hel') + self.assertEqual(sp.getvalue(), b'hel') self.assertEqual(len(sp), 3) def test_write(self): sp = util.BufferedByteStream() - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(len(sp), 0) self.assertEqual(sp.tell(), 0) - sp.write('hello') - self.assertEqual(sp.getvalue(), 'hello') + sp.write(b'hello') + self.assertEqual(sp.getvalue(), b'hello') self.assertEqual(len(sp), 5) self.assertEqual(sp.tell(), 5) - sp = util.BufferedByteStream('xyz') + sp = util.BufferedByteStream(b'xyz') - self.assertEqual(sp.getvalue(), 'xyz') + self.assertEqual(sp.getvalue(), b'xyz') self.assertEqual(len(sp), 3) self.assertEqual(sp.tell(), 0) - sp.write('abc') - self.assertEqual(sp.getvalue(), 'abc') + sp.write(b'abc') + self.assertEqual(sp.getvalue(), b'abc') self.assertEqual(len(sp), 3) self.assertEqual(sp.tell(), 3) def test_len(self): sp = util.BufferedByteStream() - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(len(sp), 0) self.assertEqual(sp.tell(), 0) - sp.write('xyz') + sp.write(b'xyz') self.assertEqual(len(sp), 3) - sp = util.BufferedByteStream('foo') + sp = util.BufferedByteStream(b'foo') self.assertEqual(len(sp), 3) sp.seek(0, 2) - sp.write('xyz') + sp.write(b'xyz') self.assertEqual(len(sp), 6) def test_consume(self): sp = util.BufferedByteStream() - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(sp.tell(), 0) sp.consume() - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') self.assertEqual(sp.tell(), 0) - sp = util.BufferedByteStream('foobar') + sp = util.BufferedByteStream(b'foobar') - self.assertEqual(sp.getvalue(), 'foobar') + self.assertEqual(sp.getvalue(), b'foobar') self.assertEqual(sp.tell(), 0) sp.seek(3) @@ -242,11 +242,11 @@ def test_consume(self): self.assertEqual(sp.tell(), 3) sp.consume() - self.assertEqual(sp.getvalue(), 'bar') + self.assertEqual(sp.getvalue(), b'bar') self.assertEqual(sp.tell(), 0) # from ticket 451 - http://pyamf.org/ticket/451 - sp = util.BufferedByteStream('abcdef') + sp = util.BufferedByteStream(b'abcdef') # move the stream pos to the end sp.read() @@ -254,10 +254,10 @@ def test_consume(self): sp.consume() self.assertEqual(len(sp), 0) - sp = util.BufferedByteStream('abcdef') + sp = util.BufferedByteStream(b'abcdef') sp.seek(6) sp.consume() - self.assertEqual(sp.getvalue(), '') + self.assertEqual(sp.getvalue(), b'') class DataTypeMixInTestCase(unittest.TestCase): @@ -286,7 +286,7 @@ def _read_endian(self, data, func, args, expected): self.assertEqual(result, expected) def test_read_uchar(self): - x = util.BufferedByteStream('\x00\xff') + x = util.BufferedByteStream(b'\x00\xff') self.assertEqual(x.read_uchar(), 0) self.assertEqual(x.read_uchar(), 255) @@ -295,16 +295,16 @@ def test_write_uchar(self): x = util.BufferedByteStream() x.write_uchar(0) - self.assertEqual(x.getvalue(), '\x00') + self.assertEqual(x.getvalue(), b'\x00') x.write_uchar(255) - self.assertEqual(x.getvalue(), '\x00\xff') + self.assertEqual(x.getvalue(), b'\x00\xff') self.assertRaises(OverflowError, x.write_uchar, 256) self.assertRaises(OverflowError, x.write_uchar, -1) self.assertRaises(TypeError, x.write_uchar, 'f') def test_read_char(self): - x = util.BufferedByteStream('\x00\x7f\xff\x80') + x = util.BufferedByteStream(b'\x00\x7f\xff\x80') self.assertEqual(x.read_char(), 0) self.assertEqual(x.read_char(), 127) @@ -318,7 +318,7 @@ def test_write_char(self): x.write_char(-128) x.write_char(127) - self.assertEqual(x.getvalue(), '\x00\x80\x7f') + self.assertEqual(x.getvalue(), b'\x00\x80\x7f') self.assertRaises(OverflowError, x.write_char, 128) self.assertRaises(OverflowError, x.write_char, -129) @@ -327,13 +327,13 @@ def test_write_char(self): def test_write_ushort(self): x = util.BufferedByteStream() - self._write_endian(x, x.write_ushort, (0,), ('\x00\x00', '\x00\x00')) - self._write_endian(x, x.write_ushort, (12345,), ('09', '90')) + self._write_endian(x, x.write_ushort, (0,), (b'\x00\x00', b'\x00\x00')) + self._write_endian(x, x.write_ushort, (12345,), (b'09', b'90')) self._write_endian( x, x.write_ushort, (65535,), - ('\xff\xff', '\xff\xff') + (b'\xff\xff', b'\xff\xff') ) self.assertRaises(OverflowError, x.write_ushort, 65536) @@ -341,9 +341,9 @@ def test_write_ushort(self): self.assertRaises(TypeError, x.write_ushort, 'aa') def test_read_ushort(self): - self._read_endian(['\x00\x00', '\x00\x00'], 'read_ushort', (), 0) - self._read_endian(['09', '90'], 'read_ushort', (), 12345) - self._read_endian(['\xff\xff', '\xff\xff'], 'read_ushort', (), 65535) + self._read_endian([b'\x00\x00', b'\x00\x00'], 'read_ushort', (), 0) + self._read_endian([b'09', b'90'], 'read_ushort', (), 12345) + self._read_endian([b'\xff\xff', b'\xff\xff'], 'read_ushort', (), 65535) def test_write_short(self): x = util.BufferedByteStream() @@ -352,21 +352,21 @@ def test_write_short(self): x, x.write_short, (-5673,), - ('\xe9\xd7', '\xd7\xe9') + (b'\xe9\xd7', b'\xd7\xe9') ) self._write_endian( x, x.write_short, (32767,), - ('\x7f\xff', '\xff\x7f') + (b'\x7f\xff', b'\xff\x7f') ) self.assertRaises(OverflowError, x.write_ushort, 65537) self.assertRaises(OverflowError, x.write_ushort, -1) - self.assertRaises(TypeError, x.write_short, '\x00\x00') + self.assertRaises(TypeError, x.write_short, b'\x00\x00') def test_read_short(self): - self._read_endian(['\xe9\xd7', '\xd7\xe9'], 'read_short', (), -5673) - self._read_endian(['\x7f\xff', '\xff\x7f'], 'read_short', (), 32767) + self._read_endian([b'\xe9\xd7', b'\xd7\xe9'], 'read_short', (), -5673) + self._read_endian([b'\x7f\xff', b'\xff\x7f'], 'read_short', (), 32767) def test_write_ulong(self): x = util.BufferedByteStream() @@ -375,43 +375,43 @@ def test_write_ulong(self): x, x.write_ulong, (0,), - ('\x00\x00\x00\x00', '\x00\x00\x00\x00') + (b'\x00\x00\x00\x00', b'\x00\x00\x00\x00') ) self._write_endian( x, x.write_ulong, (16810049,), - ('\x01\x00\x80A', 'A\x80\x00\x01') + (b'\x01\x00\x80A', b'A\x80\x00\x01') ) self._write_endian( x, x.write_ulong, - (4294967295L,), - ('\xff\xff\xff\xff', '\xff\xff\xff\xff') + (4294967295,), + (b'\xff\xff\xff\xff', b'\xff\xff\xff\xff') ) - self.assertRaises(OverflowError, x.write_ulong, 4294967296L) + self.assertRaises(OverflowError, x.write_ulong, 4294967296) self.assertRaises(OverflowError, x.write_ulong, -1) - self.assertRaises(TypeError, x.write_ulong, '\x00\x00\x00\x00') + self.assertRaises(TypeError, x.write_ulong, b'\x00\x00\x00\x00') def test_read_ulong(self): self._read_endian( - ['\x00\x00\x00\x00', '\x00\x00\x00\x00'], + [b'\x00\x00\x00\x00', b'\x00\x00\x00\x00'], 'read_ulong', (), 0 ) self._read_endian( - ['\x01\x00\x80A', 'A\x80\x00\x01'], + [b'\x01\x00\x80A', b'A\x80\x00\x01'], 'read_ulong', (), 16810049 ) self._read_endian( - ['\xff\xff\xff\xff', '\xff\xff\xff\xff'], + [b'\xff\xff\xff\xff', b'\xff\xff\xff\xff'], 'read_ulong', (), - 4294967295L + 4294967295 ) def test_write_long(self): @@ -421,55 +421,55 @@ def test_write_long(self): x, x.write_long, (0,), - ('\x00\x00\x00\x00', '\x00\x00\x00\x00') + (b'\x00\x00\x00\x00', b'\x00\x00\x00\x00') ) self._write_endian( x, x.write_long, (16810049,), - ('\x01\x00\x80A', 'A\x80\x00\x01') + (b'\x01\x00\x80A', b'A\x80\x00\x01') ) self._write_endian( x, x.write_long, - (2147483647L,), - ('\x7f\xff\xff\xff', '\xff\xff\xff\x7f') + (2147483647,), + (b'\x7f\xff\xff\xff', b'\xff\xff\xff\x7f') ) self._write_endian( x, x.write_long, (-2147483648,), - ('\x80\x00\x00\x00', '\x00\x00\x00\x80') + (b'\x80\x00\x00\x00', b'\x00\x00\x00\x80') ) self.assertRaises(OverflowError, x.write_long, 2147483648) self.assertRaises(OverflowError, x.write_long, -2147483649) - self.assertRaises(TypeError, x.write_long, '\x00\x00\x00\x00') + self.assertRaises(TypeError, x.write_long, b'\x00\x00\x00\x00') def test_read_long(self): self._read_endian( - ['\xff\xff\xcf\xc7', '\xc7\xcf\xff\xff'], + [b'\xff\xff\xcf\xc7', b'\xc7\xcf\xff\xff'], 'read_long', (), -12345 ) self._read_endian( - ['\x00\x00\x00\x00', '\x00\x00\x00\x00'], + [b'\x00\x00\x00\x00', b'\x00\x00\x00\x00'], 'read_long', (), 0 ) self._read_endian( - ['\x01\x00\x80A', 'A\x80\x00\x01'], + [b'\x01\x00\x80A', b'A\x80\x00\x01'], 'read_long', (), 16810049 ) self._read_endian( - ['\x7f\xff\xff\xff', '\xff\xff\xff\x7f'], + [b'\x7f\xff\xff\xff', b'\xff\xff\xff\x7f'], 'read_long', (), - 2147483647L + 2147483647 ) def test_write_u24bit(self): @@ -479,93 +479,93 @@ def test_write_u24bit(self): x, x.write_24bit_uint, (0,), - ('\x00\x00\x00', '\x00\x00\x00') + (b'\x00\x00\x00', b'\x00\x00\x00') ) self._write_endian( x, x.write_24bit_uint, (4292609,), - ('A\x80\x01', '\x01\x80A') + (b'A\x80\x01', b'\x01\x80A') ) self._write_endian( x, x.write_24bit_uint, (16777215,), - ('\xff\xff\xff', '\xff\xff\xff') + (b'\xff\xff\xff', b'\xff\xff\xff') ) self.assertRaises(OverflowError, x.write_24bit_uint, 16777216) self.assertRaises(OverflowError, x.write_24bit_uint, -1) - self.assertRaises(TypeError, x.write_24bit_uint, '\x00\x00\x00') + self.assertRaises(TypeError, x.write_24bit_uint, b'\x00\x00\x00') def test_read_u24bit(self): self._read_endian( - ['\x00\x00\x00', '\x00\x00\x00'], 'read_24bit_uint', (), 0 + [b'\x00\x00\x00', b'\x00\x00\x00'], 'read_24bit_uint', (), 0 ) self._read_endian( - ['\x00\x00\x80', '\x80\x00\x00'], 'read_24bit_uint', (), 128 + [b'\x00\x00\x80', b'\x80\x00\x00'], 'read_24bit_uint', (), 128 ) self._read_endian( - ['\x80\x00\x00', '\x00\x00\x80'], 'read_24bit_uint', (), 8388608 + [b'\x80\x00\x00', b'\x00\x00\x80'], 'read_24bit_uint', (), 8388608 ) self._read_endian( - ['\xff\xff\x7f', '\x7f\xff\xff'], 'read_24bit_uint', (), 16777087 + [b'\xff\xff\x7f', b'\x7f\xff\xff'], 'read_24bit_uint', (), 16777087 ) self._read_endian( - ['\x7f\xff\xff', '\xff\xff\x7f'], 'read_24bit_uint', (), 8388607 + [b'\x7f\xff\xff', b'\xff\xff\x7f'], 'read_24bit_uint', (), 8388607 ) def test_write_24bit(self): x = util.BufferedByteStream() self._write_endian( - x, x.write_24bit_int, (0,), ('\x00\x00\x00', '\x00\x00\x00') + x, x.write_24bit_int, (0,), (b'\x00\x00\x00', b'\x00\x00\x00') ) self._write_endian( - x, x.write_24bit_int, (128,), ('\x00\x00\x80', '\x80\x00\x00') + x, x.write_24bit_int, (128,), (b'\x00\x00\x80', b'\x80\x00\x00') ) self._write_endian( - x, x.write_24bit_int, (8388607,), ('\x7f\xff\xff', '\xff\xff\x7f') + x, x.write_24bit_int, (8388607,), (b'\x7f\xff\xff', b'\xff\xff\x7f') ) self._write_endian( - x, x.write_24bit_int, (-1,), ('\xff\xff\xff', '\xff\xff\xff') + x, x.write_24bit_int, (-1,), (b'\xff\xff\xff', b'\xff\xff\xff') ) self._write_endian( - x, x.write_24bit_int, (-8388608,), ('\x80\x00\x00', '\x00\x00\x80') + x, x.write_24bit_int, (-8388608,), (b'\x80\x00\x00', b'\x00\x00\x80') ) self.assertRaises(OverflowError, x.write_24bit_int, 8388608) self.assertRaises(OverflowError, x.write_24bit_int, -8388609) - self.assertRaises(TypeError, x.write_24bit_int, '\x00\x00\x00') + self.assertRaises(TypeError, x.write_24bit_int, b'\x00\x00\x00') def test_read_24bit(self): self._read_endian( - ['\x00\x00\x00', '\x00\x00\x00'], 'read_24bit_int', (), 0 + [b'\x00\x00\x00', b'\x00\x00\x00'], 'read_24bit_int', (), 0 ) self._read_endian( - ['\x00\x00\x80', '\x80\x00\x00'], 'read_24bit_int', (), 128 + [b'\x00\x00\x80', b'\x80\x00\x00'], 'read_24bit_int', (), 128 ) self._read_endian( - ['\x80\x00\x00', '\x00\x00\x80'], 'read_24bit_int', (), -8388608 + [b'\x80\x00\x00', b'\x00\x00\x80'], 'read_24bit_int', (), -8388608 ) self._read_endian( - ['\xff\xff\x7f', '\x7f\xff\xff'], 'read_24bit_int', (), -129 + [b'\xff\xff\x7f', b'\x7f\xff\xff'], 'read_24bit_int', (), -129 ) self._read_endian( - ['\x7f\xff\xff', '\xff\xff\x7f'], 'read_24bit_int', (), 8388607 + [b'\x7f\xff\xff', b'\xff\xff\x7f'], 'read_24bit_int', (), 8388607 ) def test_write_float(self): x = util.BufferedByteStream() self._write_endian( - x, x.write_float, (0.2,), ('>L\xcc\xcd', '\xcd\xccL>') + x, x.write_float, (0.2,), (b'>L\xcc\xcd', b'\xcd\xccL>') ) self.assertRaises(TypeError, x.write_float, 'foo') def test_read_float(self): self._read_endian( - ['?\x00\x00\x00', '\x00\x00\x00?'], 'read_float', (), 0.5 + [b'?\x00\x00\x00', b'\x00\x00\x00?'], 'read_float', (), 0.5 ) def test_write_double(self): @@ -575,13 +575,13 @@ def test_write_double(self): x, x.write_double, (0.2,), - ('?\xc9\x99\x99\x99\x99\x99\x9a', '\x9a\x99\x99\x99\x99\x99\xc9?') + (b'?\xc9\x99\x99\x99\x99\x99\x9a', b'\x9a\x99\x99\x99\x99\x99\xc9?') ) self.assertRaises(TypeError, x.write_double, 'foo') def test_read_double(self): self._read_endian( - ['?\xc9\x99\x99\x99\x99\x99\x9a', '\x9a\x99\x99\x99\x99\x99\xc9?'], + [b'?\xc9\x99\x99\x99\x99\x99\x9a', b'\x9a\x99\x99\x99\x99\x99\xc9?'], 'read_double', (), 0.2 @@ -594,7 +594,7 @@ def test_write_utf8_string(self): x, x.write_utf8_string, (u'ᚠᛇᚻ',), - ['\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb'] * 2 + [b'\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb'] * 2 ) self.assertRaises(TypeError, x.write_utf8_string, 1) self.assertRaises(TypeError, x.write_utf8_string, 1.0) @@ -603,32 +603,32 @@ def test_write_utf8_string(self): def test_read_utf8_string(self): self._read_endian( - ['\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb'] * 2, + [b'\xe1\x9a\xa0\xe1\x9b\x87\xe1\x9a\xbb'] * 2, 'read_utf8_string', (9,), u'ᚠᛇᚻ' ) def test_nan(self): - x = util.BufferedByteStream('\xff\xf8\x00\x00\x00\x00\x00\x00') + x = util.BufferedByteStream(b'\xff\xf8\x00\x00\x00\x00\x00\x00') self.assertTrue(isNaN(x.read_double())) - x = util.BufferedByteStream('\xff\xf0\x00\x00\x00\x00\x00\x00') + x = util.BufferedByteStream(b'\xff\xf0\x00\x00\x00\x00\x00\x00') self.assertTrue(isNegInf(x.read_double())) - x = util.BufferedByteStream('\x7f\xf0\x00\x00\x00\x00\x00\x00') + x = util.BufferedByteStream(b'\x7f\xf0\x00\x00\x00\x00\x00\x00') self.assertTrue(isPosInf(x.read_double())) # now test little endian - x = util.BufferedByteStream('\x00\x00\x00\x00\x00\x00\xf8\xff') + x = util.BufferedByteStream(b'\x00\x00\x00\x00\x00\x00\xf8\xff') x.endian = '<' self.assertTrue(isNaN(x.read_double())) - x = util.BufferedByteStream('\x00\x00\x00\x00\x00\x00\xf0\xff') + x = util.BufferedByteStream(b'\x00\x00\x00\x00\x00\x00\xf0\xff') x.endian = '<' self.assertTrue(isNegInf(x.read_double())) - x = util.BufferedByteStream('\x00\x00\x00\x00\x00\x00\xf0\x7f') + x = util.BufferedByteStream(b'\x00\x00\x00\x00\x00\x00\xf0\x7f') x.endian = '<' self.assertTrue(isPosInf(x.read_double())) @@ -636,18 +636,18 @@ def test_write_infinites(self): x = util.BufferedByteStream() self._write_endian(x, x.write_double, (NaN,), ( - '\xff\xf8\x00\x00\x00\x00\x00\x00', - '\x00\x00\x00\x00\x00\x00\xf8\xff' + b'\xff\xf8\x00\x00\x00\x00\x00\x00', + b'\x00\x00\x00\x00\x00\x00\xf8\xff' )) self._write_endian(x, x.write_double, (PosInf,), ( - '\x7f\xf0\x00\x00\x00\x00\x00\x00', - '\x00\x00\x00\x00\x00\x00\xf0\x7f' + b'\x7f\xf0\x00\x00\x00\x00\x00\x00', + b'\x00\x00\x00\x00\x00\x00\xf0\x7f' )) self._write_endian(x, x.write_double, (NegInf,), ( - '\xff\xf0\x00\x00\x00\x00\x00\x00', - '\x00\x00\x00\x00\x00\x00\xf0\xff' + b'\xff\xf0\x00\x00\x00\x00\x00\x00', + b'\x00\x00\x00\x00\x00\x00\xf0\xff' )) @@ -659,12 +659,12 @@ class BufferedByteStreamTestCase(unittest.TestCase): def test_create(self): x = util.BufferedByteStream() - self.assertEqual(x.getvalue(), '') + self.assertEqual(x.getvalue(), b'') self.assertEqual(x.tell(), 0) - x = util.BufferedByteStream('abc') + x = util.BufferedByteStream(b'abc') - self.assertEqual(x.getvalue(), 'abc') + self.assertEqual(x.getvalue(), b'abc') self.assertEqual(x.tell(), 0) def test_read(self): @@ -676,10 +676,10 @@ def test_read(self): self.assertRaises(IOError, x.read, 10) - x.write('hello') + x.write(b'hello') x.seek(0) self.assertRaises(IOError, x.read, 10) - self.assertEqual(x.read(), 'hello') + self.assertEqual(x.read(), b'hello') def test_read_negative(self): """ @@ -687,34 +687,34 @@ def test_read_negative(self): """ x = util.BufferedByteStream() - x.write('*' * 6000) + x.write(b'*' * 6000) x.seek(100) self.assertRaises(IOError, x.read, -345) def test_peek(self): - x = util.BufferedByteStream('abcdefghijklmnopqrstuvwxyz') + x = util.BufferedByteStream(b'abcdefghijklmnopqrstuvwxyz') self.assertEqual(x.tell(), 0) - self.assertEqual(x.peek(), 'a') - self.assertEqual(x.peek(5), 'abcde') - self.assertEqual(x.peek(-1), 'abcdefghijklmnopqrstuvwxyz') + self.assertEqual(x.peek(), b'a') + self.assertEqual(x.peek(5), b'abcde') + self.assertEqual(x.peek(-1), b'abcdefghijklmnopqrstuvwxyz') x.seek(10) - self.assertEqual(x.peek(50), 'klmnopqrstuvwxyz') + self.assertEqual(x.peek(50), b'klmnopqrstuvwxyz') def test_eof(self): x = util.BufferedByteStream() self.assertTrue(x.at_eof()) - x.write('hello') + x.write(b'hello') x.seek(0) self.assertFalse(x.at_eof()) x.seek(0, 2) self.assertTrue(x.at_eof()) def test_remaining(self): - x = util.BufferedByteStream('spameggs') + x = util.BufferedByteStream(b'spameggs') self.assertEqual(x.tell(), 0) self.assertEqual(x.remaining(), 8) @@ -724,18 +724,18 @@ def test_remaining(self): self.assertEqual(x.remaining(), 6) def test_add(self): - a = util.BufferedByteStream('a') - b = util.BufferedByteStream('b') + a = util.BufferedByteStream(b'a') + b = util.BufferedByteStream(b'b') c = a + b self.assertTrue(isinstance(c, util.BufferedByteStream)) - self.assertEqual(c.getvalue(), 'ab') + self.assertEqual(c.getvalue(), b'ab') self.assertEqual(c.tell(), 0) def test_add_pos(self): - a = util.BufferedByteStream('abc') - b = util.BufferedByteStream('def') + a = util.BufferedByteStream(b'abc') + b = util.BufferedByteStream(b'def') a.seek(1) b.seek(0, 2) @@ -752,7 +752,7 @@ def test_append_types(self): self.assertRaises(TypeError, a.append, 234234) self.assertRaises(TypeError, a.append, 234.0) - self.assertRaises(TypeError, a.append, 234234L) + self.assertRaises(TypeError, a.append, 234234) self.assertRaises(TypeError, a.append, []) self.assertRaises(TypeError, a.append, {}) self.assertRaises(TypeError, a.append, lambda _: None) @@ -766,57 +766,57 @@ def test_append_string(self): # test empty a = util.BufferedByteStream() - self.assertEqual(a.getvalue(), '') + self.assertEqual(a.getvalue(), b'') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 0) - a.append('foo') + a.append(b'foo') - self.assertEqual(a.getvalue(), 'foo') + self.assertEqual(a.getvalue(), b'foo') self.assertEqual(a.tell(), 0) # <-- pointer hasn't moved self.assertEqual(len(a), 3) # test pointer beginning, some data - a = util.BufferedByteStream('bar') + a = util.BufferedByteStream(b'bar') - self.assertEqual(a.getvalue(), 'bar') + self.assertEqual(a.getvalue(), b'bar') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 3) - a.append('gak') + a.append(b'gak') - self.assertEqual(a.getvalue(), 'bargak') + self.assertEqual(a.getvalue(), b'bargak') self.assertEqual(a.tell(), 0) # <-- pointer hasn't moved self.assertEqual(len(a), 6) # test pointer middle, some data - a = util.BufferedByteStream('bar') + a = util.BufferedByteStream(b'bar') a.seek(2) - self.assertEqual(a.getvalue(), 'bar') + self.assertEqual(a.getvalue(), b'bar') self.assertEqual(a.tell(), 2) self.assertEqual(len(a), 3) - a.append('gak') + a.append(b'gak') - self.assertEqual(a.getvalue(), 'bargak') + self.assertEqual(a.getvalue(), b'bargak') self.assertEqual(a.tell(), 2) # <-- pointer hasn't moved self.assertEqual(len(a), 6) # test pointer end, some data - a = util.BufferedByteStream('bar') + a = util.BufferedByteStream(b'bar') a.seek(0, 2) - self.assertEqual(a.getvalue(), 'bar') + self.assertEqual(a.getvalue(), b'bar') self.assertEqual(a.tell(), 3) self.assertEqual(len(a), 3) - a.append('gak') + a.append(b'gak') - self.assertEqual(a.getvalue(), 'bargak') + self.assertEqual(a.getvalue(), b'bargak') self.assertEqual(a.tell(), 3) # <-- pointer hasn't moved self.assertEqual(len(a), 6) @@ -829,13 +829,13 @@ def __str__(self): a = util.BufferedByteStream() - self.assertEqual(a.getvalue(), '') + self.assertEqual(a.getvalue(), b'') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 0) a.append(Foo()) - self.assertEqual(a.getvalue(), 'foo') + self.assertEqual(a.getvalue(), b'foo') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 3) @@ -846,57 +846,57 @@ def test_append_unicode(self): # test empty a = util.BufferedByteStream() - self.assertEqual(a.getvalue(), '') + self.assertEqual(a.getvalue(), b'') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 0) a.append(u'foo') - self.assertEqual(a.getvalue(), 'foo') + self.assertEqual(a.getvalue(), b'foo') self.assertEqual(a.tell(), 0) # <-- pointer hasn't moved self.assertEqual(len(a), 3) # test pointer beginning, some data - a = util.BufferedByteStream('bar') + a = util.BufferedByteStream(b'bar') - self.assertEqual(a.getvalue(), 'bar') + self.assertEqual(a.getvalue(), b'bar') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 3) a.append(u'gak') - self.assertEqual(a.getvalue(), 'bargak') + self.assertEqual(a.getvalue(), b'bargak') self.assertEqual(a.tell(), 0) # <-- pointer hasn't moved self.assertEqual(len(a), 6) # test pointer middle, some data - a = util.BufferedByteStream('bar') + a = util.BufferedByteStream(b'bar') a.seek(2) - self.assertEqual(a.getvalue(), 'bar') + self.assertEqual(a.getvalue(), b'bar') self.assertEqual(a.tell(), 2) self.assertEqual(len(a), 3) a.append(u'gak') - self.assertEqual(a.getvalue(), 'bargak') + self.assertEqual(a.getvalue(), b'bargak') self.assertEqual(a.tell(), 2) # <-- pointer hasn't moved self.assertEqual(len(a), 6) # test pointer end, some data - a = util.BufferedByteStream('bar') + a = util.BufferedByteStream(b'bar') a.seek(0, 2) - self.assertEqual(a.getvalue(), 'bar') + self.assertEqual(a.getvalue(), b'bar') self.assertEqual(a.tell(), 3) self.assertEqual(len(a), 3) a.append(u'gak') - self.assertEqual(a.getvalue(), 'bargak') + self.assertEqual(a.getvalue(), b'bargak') self.assertEqual(a.tell(), 3) # <-- pointer hasn't moved self.assertEqual(len(a), 6) @@ -909,13 +909,13 @@ def __str__(self): a = util.BufferedByteStream() - self.assertEqual(a.getvalue(), '') + self.assertEqual(a.getvalue(), b'') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 0) a.append(Foo()) - self.assertEqual(a.getvalue(), 'foo') + self.assertEqual(a.getvalue(), b'foo') self.assertEqual(a.tell(), 0) self.assertEqual(len(a), 3) @@ -1040,7 +1040,7 @@ class A: class B(object): pass - for t in ['', u'', 1, 1.0, 1L, [], {}, object, object(), A(), B()]: + for t in ['', u'', 1, 1.0, 1, [], {}, object, object(), A(), B()]: self.assertRaises(TypeError, util.get_class_meta, t) def test_no_meta(self): @@ -1059,7 +1059,6 @@ class B(object): 'alias': None, 'amf3': None, 'exclude_attrs': None, - 'proxy_attrs': None, 'external': None } @@ -1083,7 +1082,6 @@ class __amf__: 'dynamic': None, 'alias': 'foo.bar.Spam', 'amf3': None, - 'proxy_attrs': None, 'exclude_attrs': None, 'external': None } @@ -1133,7 +1131,6 @@ class __amf__: 'alias': None, 'amf3': None, 'static_attrs': None, - 'proxy_attrs': None, 'external': None } @@ -1159,7 +1156,6 @@ class __amf__: 'amf3': None, 'static_attrs': None, 'external': None, - 'proxy_attrs': None, } self.assertEqual(util.get_class_meta(A), meta) @@ -1179,7 +1175,6 @@ class __amf__: 'proxy_attrs': None, 'synonym_attrs': None, 'readonly_attrs': None, - 'proxy_attrs': None, 'dynamic': None, 'alias': None, 'amf3': True, @@ -1204,7 +1199,6 @@ class __amf__: 'proxy_attrs': None, 'synonym_attrs': None, 'readonly_attrs': None, - 'proxy_attrs': None, 'dynamic': False, 'alias': None, 'amf3': None, @@ -1229,7 +1223,6 @@ class __amf__: 'proxy_attrs': None, 'synonym_attrs': None, 'readonly_attrs': None, - 'proxy_attrs': None, 'dynamic': None, 'alias': None, 'amf3': None, @@ -1268,7 +1261,6 @@ class B(object): 'amf3': True, 'exclude_attrs': ['foo'], 'synonym_attrs': None, - 'proxy_attrs': None, 'external': True } diff --git a/pyamf/tests/util.py b/pyamf/tests/util.py index aedbad18..c61ca8c9 100644 --- a/pyamf/tests/util.py +++ b/pyamf/tests/util.py @@ -9,6 +9,7 @@ import unittest import copy +from six import integer_types, string_types import pyamf from pyamf import python @@ -86,7 +87,7 @@ def tearDown(self): pass def decode(self, bytes, raw=False): - if not isinstance(bytes, basestring): + if not isinstance(bytes, string_types): bytes = _join(bytes) self.buf.seek(0, 0) @@ -137,7 +138,7 @@ def assertBuffer(self, first, second, msg=None): def assertEncodes(self, obj, buffer, encoding=pyamf.AMF3): bytes = pyamf.encode(obj, encoding=encoding).getvalue() - if isinstance(buffer, basestring): + if isinstance(buffer, string_types): self.assertEqual(bytes, buffer) return @@ -145,7 +146,7 @@ def assertEncodes(self, obj, buffer, encoding=pyamf.AMF3): self.assertBuffer(bytes, buffer) def assertDecodes(self, bytes, cb, encoding=pyamf.AMF3, raw=False): - if not isinstance(bytes, basestring): + if not isinstance(bytes, string_types): bytes = _join(bytes) ret = list(pyamf.decode(bytes, encoding=encoding)) @@ -244,14 +245,14 @@ def expectedFailureIfAppengine(func): def _join(parts): - ret = '' + ret = bytearray() for p in parts: - if not isinstance(p, basestring): - ret += _join(p) - - continue - - ret += p + if isinstance(p, integer_types): + ret.append(p) + elif not isinstance(p, string_types): + ret.extend(_join(p)) + else: + ret.extend(p) - return ret + return bytes(ret) diff --git a/pyamf/util/__init__.py b/pyamf/util/__init__.py index 3cb2efb0..6f1605d9 100644 --- a/pyamf/util/__init__.py +++ b/pyamf/util/__init__.py @@ -10,6 +10,8 @@ import calendar import datetime import inspect +import math +from six import iteritems import pyamf from pyamf import python @@ -35,7 +37,8 @@ #: On some Python versions retrieving a negative timestamp, like #: C{datetime.datetime.utcfromtimestamp(-31536000.0)} is broken. -negative_timestamp_broken = False +#: On python 3 timestamps are always rounded down. +fromtimestamp_broken = False def get_timestamp(d): @@ -65,9 +68,8 @@ def get_datetime(secs): @return: UTC timestamp. @rtype: C{datetime.datetime} """ - if negative_timestamp_broken and secs < 0: + if fromtimestamp_broken: return datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=secs) - return datetime.datetime.utcfromtimestamp(secs) @@ -99,14 +101,14 @@ def set_attrs(obj, attrs): if hasattr(obj, '__setitem__'): o = type(obj).__setitem__ - [o(obj, k, v) for k, v in attrs.iteritems()] + [o(obj, k, v) for k, v in iteritems(attrs)] def get_class_alias(klass): """ Tries to find a suitable L{pyamf.ClassAlias} subclass for C{klass}. """ - for k, v in pyamf.ALIAS_TYPES.iteritems(): + for k, v in iteritems(pyamf.ALIAS_TYPES): for kl in v: try: if issubclass(klass, kl): @@ -208,4 +210,6 @@ def get_module(mod_name): try: datetime.datetime.utcfromtimestamp(-31536000.0) except ValueError: - negative_timestamp_broken = True + fromtimestamp_broken = True +if datetime.datetime.utcfromtimestamp(100000000.0005).microsecond != 5000: + fromtimestamp_broken = True diff --git a/pyamf/util/pure.py b/pyamf/util/pure.py index 07161a52..bde9bbf5 100644 --- a/pyamf/util/pure.py +++ b/pyamf/util/pure.py @@ -12,11 +12,7 @@ """ import struct - -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO +from six import BytesIO, binary_type, text_type from pyamf import python @@ -24,9 +20,9 @@ SYSTEM_ENDIAN = None -class StringIOProxy(object): +class BytesIOProxy(object): """ - I am a C{StringIO} type object containing byte data from the AMF stream. + I am a C{BytesIO} type object containing byte data from the AMF stream. @see: U{ByteArray on OSFlash } @@ -36,11 +32,11 @@ class StringIOProxy(object): def __init__(self, buf=None): """ - @raise TypeError: Unable to coerce C{buf} to C{StringIO}. + @raise TypeError: Unable to coerce C{buf} to C{BytesIO}. """ - self._buffer = StringIO() + self._buffer = BytesIO() - if isinstance(buf, python.str_types): + if isinstance(buf, binary_type): self._buffer.write(buf) elif hasattr(buf, 'getvalue'): self._buffer.write(buf.getvalue()) @@ -53,7 +49,7 @@ def __init__(self, buf=None): self._buffer.write(buf.read()) buf.seek(old_pos) elif buf is not None: - raise TypeError("Unable to coerce buf->StringIO got %r" % (buf,)) + raise TypeError("Unable to coerce buf->BytesIO got %r" % (buf,)) self._get_len() self._len_changed = False @@ -102,7 +98,7 @@ def truncate(self, size=0): @type size: C{int} """ if size == 0: - self._buffer = StringIO() + self._buffer = BytesIO() self._len_changed = True return @@ -110,7 +106,7 @@ def truncate(self, size=0): cur_pos = self.tell() self.seek(0) buf = self.read(size) - self._buffer = StringIO() + self._buffer = BytesIO() self._buffer.write(buf) self.seek(cur_pos) @@ -508,15 +504,15 @@ def write_utf8_string(self, u): bytes = u - if isinstance(bytes, unicode): + if isinstance(bytes, text_type): bytes = u.encode("utf8") self.write(struct.pack("%s%ds" % (self.endian, len(bytes)), bytes)) -class BufferedByteStream(StringIOProxy, DataTypeMixIn): +class BufferedByteStream(BytesIOProxy, DataTypeMixIn): """ - An extension of C{StringIO}. + An extension of C{BytesIO}. Features: - Raises L{IOError} if reading past end. @@ -526,10 +522,10 @@ class BufferedByteStream(StringIOProxy, DataTypeMixIn): def __init__(self, buf=None, min_buf_size=None): """ @param buf: Initial byte stream. - @type buf: C{str} or C{StringIO} instance + @type buf: C{str} or C{BytesIO} instance @param min_buf_size: Ignored in the pure Python version. """ - StringIOProxy.__init__(self, buf=buf) + BytesIOProxy.__init__(self, buf=buf) def read(self, length=-1): """ @@ -547,7 +543,7 @@ def read(self, length=-1): 'remain' % (length, len(self) - self.tell()) ) - return StringIOProxy.read(self, length) + return BytesIOProxy.read(self, length) def peek(self, size=1): """ @@ -566,7 +562,7 @@ def peek(self, size=1): if size < -1: raise ValueError("Cannot peek backwards") - bytes = '' + bytes = b'' pos = self.tell() while not self.at_eof() and len(bytes) != size: @@ -608,9 +604,12 @@ def append(self, data): self.seek(0, 2) if hasattr(data, 'getvalue'): - self.write_utf8_string(data.getvalue()) - else: - self.write_utf8_string(data) + data = data.getvalue() + if isinstance(data, text_type): + data = data.encode('utf-8') + if not isinstance(data, binary_type): + raise TypeError + self.write(data) self.seek(t) @@ -642,7 +641,7 @@ def is_float_broken(): @return: Boolean indicating whether floats are broken on this platform. """ return str(python.NaN) != str( - struct.unpack("!d", '\xff\xf8\x00\x00\x00\x00\x00\x00')[0]) + struct.unpack("!d", b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]) # init the module from here .. @@ -656,22 +655,22 @@ def read_double_workaround(self): bytes = self.read(8) if self._is_big_endian(): - if bytes == '\xff\xf8\x00\x00\x00\x00\x00\x00': + if bytes == b'\xff\xf8\x00\x00\x00\x00\x00\x00': return python.NaN - if bytes == '\xff\xf0\x00\x00\x00\x00\x00\x00': + if bytes == b'\xff\xf0\x00\x00\x00\x00\x00\x00': return python.NegInf - if bytes == '\x7f\xf0\x00\x00\x00\x00\x00\x00': + if bytes == b'\x7f\xf0\x00\x00\x00\x00\x00\x00': return python.PosInf else: - if bytes == '\x00\x00\x00\x00\x00\x00\xf8\xff': + if bytes == b'\x00\x00\x00\x00\x00\x00\xf8\xff': return python.NaN - if bytes == '\x00\x00\x00\x00\x00\x00\xf0\xff': + if bytes == b'\x00\x00\x00\x00\x00\x00\xf0\xff': return python.NegInf - if bytes == '\x00\x00\x00\x00\x00\x00\xf0\x7f': + if bytes == b'\x00\x00\x00\x00\x00\x00\xf0\x7f': return python.PosInf return struct.unpack("%sd" % self.endian, bytes)[0] diff --git a/pyamf/xml.py b/pyamf/xml.py index f59a48ac..3f7f46cf 100644 --- a/pyamf/xml.py +++ b/pyamf/xml.py @@ -7,6 +7,8 @@ @since: 0.6 """ +from six import binary_type + #: list of supported third party packages that support the C{etree} #: interface. At least enough for our needs anyway. ETREE_MODULES = [