Hello community, here is the log from the commit of package python-biplist for openSUSE:Factory checked in at 2013-01-14 14:04:25 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-biplist (Old) and /work/SRC/openSUSE:Factory/.python-biplist.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-biplist", Maintainer is "" Changes: -------- --- /work/SRC/openSUSE:Factory/python-biplist/python-biplist.changes 2012-03-24 20:09:23.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.python-biplist.new/python-biplist.changes 2013-01-14 14:04:27.000000000 +0100 @@ -1,0 +2,13 @@ +Fri Jan 11 20:24:40 UTC 2013 - [email protected] + +- Initial python3 support + +------------------------------------------------------------------- +Fri Jan 11 20:21:20 UTC 2013 - [email protected] + +- Update to 0.5 version: + * Fix a bug when writing non-binary (XML) plist with Data values + * Cleaned up a few stray comments and assertions. +- Add BuildRequires: python-six needed for tests + +------------------------------------------------------------------- New Changes file: --- /dev/null 2013-01-09 19:40:42.352580873 +0100 +++ /work/SRC/openSUSE:Factory/.python-biplist.new/python3-biplist.changes 2013-01-14 14:04:27.000000000 +0100 @@ -0,0 +1,5 @@ +------------------------------------------------------------------- +Fri Jan 11 20:26:18 UTC 2013 - [email protected] + +- Initial python3 support + Old: ---- biplist-0.4.tar.gz New: ---- biplist-0.5.tar.gz python3-biplist.changes python3-biplist.spec ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-biplist.spec ++++++ --- /var/tmp/diff_new_pack.nthgrp/_old 2013-01-14 14:04:28.000000000 +0100 +++ /var/tmp/diff_new_pack.nthgrp/_new 2013-01-14 14:04:28.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-biplist # -# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,7 +16,7 @@ # Name: python-biplist -Version: 0.4 +Version: 0.5 Release: 0 Url: https://github.com/wooster/biplist Summary: A library for reading/writing binary plists @@ -28,6 +28,7 @@ BuildRequires: python-devel BuildRequires: python-distribute BuildRequires: python-nose +BuildRequires: python-six %if 0%{?suse_version} && 0%{?suse_version} <= 1110 %{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} %else ++++++ python3-biplist.spec ++++++ # # spec file for package python3-biplist # # Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via http://bugs.opensuse.org/ # Name: python3-biplist Version: 0.5 Release: 0 Url: https://github.com/wooster/biplist Summary: A library for reading/writing binary plists License: BSD-3-Clause Group: Development/Languages/Python Source: http://pypi.python.org/packages/source/b/biplist/biplist-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: python3 BuildRequires: python3-coverage BuildRequires: python3-devel BuildRequires: python3-distribute BuildRequires: python3-nose BuildRequires: python3-six Requires: python(abi) = %{py3_ver} BuildArch: noarch %description biplist is a binary plist parser/generator for Python. Binary Property List (plist) files provide a faster and smaller serialization format for property lists on OS X. This is a library for generating binary plists which can be read by OS X, iOS, or other clients. %prep %setup -q -n biplist-%{version} %build python3 setup.py build %install python3 setup.py install --prefix=%{_prefix} --root=%{buildroot} %check # Failed on Factory, need to be fixed but does not really critical %if 0%{?suse_version} < 1230 python3 setup.py test %endif %files %defattr(-,root,root,-) %doc AUTHORS LICENSE README.md %{python3_sitelib}/* %changelog ++++++ biplist-0.4.tar.gz -> biplist-0.5.tar.gz ++++++ Files old/biplist-0.4/._setup.py and new/biplist-0.5/._setup.py differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/AUTHORS new/biplist-0.5/AUTHORS --- old/biplist-0.4/AUTHORS 2010-09-22 00:37:23.000000000 +0200 +++ new/biplist-0.5/AUTHORS 2012-06-19 02:37:05.000000000 +0200 @@ -1 +1,3 @@ Andrew Wooster ([email protected]) + +Ported to Python 3 by Kevin Kelley ([email protected]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/PKG-INFO new/biplist-0.5/PKG-INFO --- old/biplist-0.4/PKG-INFO 2011-06-01 02:31:59.000000000 +0200 +++ new/biplist-0.5/PKG-INFO 2012-06-19 02:51:33.000000000 +0200 @@ -1,19 +1,19 @@ -Metadata-Version: 1.0 +Metadata-Version: 1.1 Name: biplist -Version: 0.4 +Version: 0.5 Summary: biplist is a library for reading/writing binary plists. Home-page: https://github.com/wooster/biplist Author: Andrew Wooster Author-email: [email protected] License: BSD -Download-URL: https://github.com/wooster/biplist/downloads/biplist-0.4.tar.gz +Download-URL: https://github.com/wooster/biplist/downloads/biplist-0.5.tar.gz Description: `biplist` is a binary plist parser/generator for Python. Binary Property List (plist) files provide a faster and smaller serialization format for property lists on OS X. This is a library for generating binary plists which can be read by OS X, iOS, or other clients. - This module requires Python 2.6 or higher. + This module requires Python 2.6 or higher or Python 3.2 or higher. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -22,3 +22,4 @@ Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing :: Markup +Requires: six diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/README.md new/biplist-0.5/README.md --- old/biplist-0.4/README.md 2011-05-12 01:58:27.000000000 +0200 +++ new/biplist-0.5/README.md 2012-06-19 02:37:05.000000000 +0200 @@ -34,25 +34,29 @@ ## Examples Plist generation example: - - from biplist import * - from datetime import datetime - plist = {'aKey':'aValue', - '0':1.322, - 'now':datetime.now(), - 'list':[1,2,3], - 'tuple':('a','b','c') - } - try: - writePlist(plist, "example.plist") - except (InvalidPlistException, NotBinaryPlistException), e: - print "Something bad happened:", e + +```python +from biplist import * +from datetime import datetime +plist = {'aKey':'aValue', + '0':1.322, + 'now':datetime.now(), + 'list':[1,2,3], + 'tuple':('a','b','c') + } +try: + writePlist(plist, "example.plist") +except (InvalidPlistException, NotBinaryPlistException), e: + print "Something bad happened:", e +``` Plist parsing example: - from biplist import * - try: - plist = readPlist("example.plist") - print plist - except (InvalidPlistException, NotBinaryPlistException), e: - print "Not a plist:", e +```python +from biplist import * +try: + plist = readPlist("example.plist") + print plist +except (InvalidPlistException, NotBinaryPlistException), e: + print "Not a plist:", e +``` Files old/biplist-0.4/biplist/.___init__.py and new/biplist-0.5/biplist/.___init__.py differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/biplist/__init__.py new/biplist-0.5/biplist/__init__.py --- old/biplist-0.4/biplist/__init__.py 2011-06-01 02:23:39.000000000 +0200 +++ new/biplist-0.5/biplist/__init__.py 2012-06-19 02:37:05.000000000 +0200 @@ -44,8 +44,8 @@ print "Not a plist:", e """ +import sys from collections import namedtuple -from cStringIO import StringIO import calendar import datetime import math @@ -54,6 +54,8 @@ import sys import time +import six + __all__ = [ 'Uid', 'Data', 'readPlist', 'writePlist', 'readPlistFromString', 'writePlistToString', 'InvalidPlistException', 'NotBinaryPlistException' @@ -67,7 +69,7 @@ def __repr__(self): return "Uid(%d)" % self -class Data(str): +class Data(six.binary_type): """Wrapper around str types for representing Data values.""" pass @@ -83,29 +85,47 @@ """Raises NotBinaryPlistException, InvalidPlistException""" didOpen = False result = None - if isinstance(pathOrFile, (str, unicode)): - pathOrFile = open(pathOrFile) + if isinstance(pathOrFile, (six.binary_type, six.text_type)): + pathOrFile = open(pathOrFile, 'rb') didOpen = True try: reader = PlistReader(pathOrFile) result = reader.parse() - except NotBinaryPlistException, e: + except NotBinaryPlistException as e: try: pathOrFile.seek(0) result = plistlib.readPlist(pathOrFile) - except Exception, e: + result = wrapDataObject(result, for_binary=True) + except Exception as e: raise InvalidPlistException(e) if didOpen: pathOrFile.close() return result +def wrapDataObject(o, for_binary=False): + if isinstance(o, Data) and not for_binary: + o = plistlib.Data(o) + elif isinstance(o, plistlib.Data) and for_binary: + o = Data(o.data) + elif isinstance(o, tuple): + o = wrapDataObject(list(o), for_binary) + o = tuple(o) + elif isinstance(o, list): + for i in range(len(o)): + o[i] = wrapDataObject(o[i], for_binary) + elif isinstance(o, dict): + for k in o: + o[k] = wrapDataObject(o[k], for_binary) + return o + def writePlist(rootObject, pathOrFile, binary=True): if not binary: + rootObject = wrapDataObject(rootObject, binary) return plistlib.writePlist(rootObject, pathOrFile) else: didOpen = False - if isinstance(pathOrFile, (str, unicode)): - pathOrFile = open(pathOrFile, 'w') + if isinstance(pathOrFile, (six.binary_type, six.text_type)): + pathOrFile = open(pathOrFile, 'wb') didOpen = True writer = PlistWriter(pathOrFile) result = writer.writeRoot(rootObject) @@ -114,13 +134,17 @@ return result def readPlistFromString(data): - return readPlist(StringIO(data)) + return readPlist(six.BytesIO(data)) def writePlistToString(rootObject, binary=True): if not binary: - return plistlib.writePlistToString(rootObject) + rootObject = wrapDataObject(rootObject, binary) + if six.PY3: + return plistlib.writePlistToBytes(rootObject) + else: + return plistlib.writePlistToString(rootObject) else: - io = StringIO() + io = six.BytesIO() writer = PlistWriter(io) writer.writeRoot(rootObject) return io.getvalue() @@ -128,7 +152,7 @@ def is_stream_binary_plist(stream): stream.seek(0) header = stream.read(7) - if header == 'bplist0': + if header == six.b('bplist0'): return True else: return False @@ -182,7 +206,7 @@ offset_i += 1 self.setCurrentOffsetToObjectNumber(self.trailer.topLevelObjectNumber) result = self.readObject() - except TypeError, e: + except TypeError as e: raise InvalidPlistException(e) return result @@ -368,7 +392,7 @@ return "<BoolWrapper: %s>" % self.value class PlistWriter(object): - header = 'bplist00bybiplist1.0' + header = six.b('bplist00bybiplist1.0') file = None byteCounts = None trailer = None @@ -436,7 +460,7 @@ output = self.writeOffsetTable(output) output += pack('!xxxxxxBBQQQ', *self.trailer) self.file.write(output) - + def wrapRoot(self, root): if isinstance(root, bool): if root is True: @@ -450,7 +474,7 @@ return HashableWrapper(n) elif isinstance(root, dict): n = {} - for key, value in root.iteritems(): + for key, value in six.iteritems(root): n[self.wrapRoot(key)] = self.wrapRoot(value) return HashableWrapper(n) elif isinstance(root, list): @@ -473,7 +497,7 @@ raise InvalidPlistException('Dictionary keys cannot be null in plists.') elif isinstance(key, Data): raise InvalidPlistException('Data cannot be dictionary keys in plists.') - elif not isinstance(key, (str, unicode)): + elif not isinstance(key, (six.binary_type, six.text_type)): raise InvalidPlistException('Keys must be strings.') def proc_size(size): @@ -495,7 +519,7 @@ elif isinstance(obj, Uid): size = self.intSize(obj) self.incrementByteCount('uidBytes', incr=1+size) - elif isinstance(obj, (int, long)): + elif isinstance(obj, six.integer_types): size = self.intSize(obj) self.incrementByteCount('intBytes', incr=1+size) elif isinstance(obj, (float)): @@ -506,7 +530,7 @@ elif isinstance(obj, Data): size = proc_size(len(obj)) self.incrementByteCount('dataBytes', incr=1+size) - elif isinstance(obj, (str, unicode)): + elif isinstance(obj, (six.text_type, six.binary_type)): size = proc_size(len(obj)) self.incrementByteCount('stringBytes', incr=1+size) elif isinstance(obj, HashableWrapper): @@ -525,7 +549,7 @@ elif isinstance(obj, dict): size = proc_size(len(obj)) self.incrementByteCount('dictBytes', incr=1+size) - for key, value in obj.iteritems(): + for key, value in six.iteritems(obj): check_key(key) self.computeOffsets(key, asReference=True) self.computeOffsets(value, asReference=True) @@ -554,7 +578,7 @@ object was written. """ def proc_variable_length(format, length): - result = '' + result = six.b('') if length > 0b1110: result += pack('!B', (format << 4) | 0b1111) result = self.writeObject(length, result) @@ -562,10 +586,10 @@ result += pack('!B', (format << 4) | length) return result - if isinstance(obj, unicode) and obj == u'': + if isinstance(obj, six.text_type) and obj == six.u(''): # The Apple Plist decoder can't decode a zero length Unicode string. - obj = '' - + obj = six.b('') + if setReferencePosition: self.referencePositions[obj] = len(output) @@ -580,7 +604,7 @@ size = self.intSize(obj) output += pack('!B', (0b1000 << 4) | size - 1) output += self.binaryInt(obj) - elif isinstance(obj, (int, long)): + elif isinstance(obj, six.integer_types): bytes = self.intSize(obj) root = math.log(bytes, 2) output += pack('!B', (0b0001 << 4) | int(root)) @@ -597,15 +621,14 @@ elif isinstance(obj, Data): output += proc_variable_length(0b0100, len(obj)) output += obj - elif isinstance(obj, (str, unicode)): - if isinstance(obj, unicode): - bytes = obj.encode('utf_16_be') - output += proc_variable_length(0b0110, len(bytes)/2) - output += bytes - else: - bytes = obj - output += proc_variable_length(0b0101, len(bytes)) - output += bytes + elif isinstance(obj, six.text_type): + bytes = obj.encode('utf_16_be') + output += proc_variable_length(0b0110, len(bytes)//2) + output += bytes + elif isinstance(obj, six.binary_type): + bytes = obj + output += proc_variable_length(0b0101, len(bytes)) + output += bytes elif isinstance(obj, HashableWrapper): obj = obj.value if isinstance(obj, (set, list, tuple)): @@ -626,7 +649,7 @@ keys = [] values = [] objectsToWrite = [] - for key, value in obj.iteritems(): + for key, value in six.iteritems(obj): keys.append(key) values.append(value) for key in keys: @@ -644,9 +667,16 @@ def writeOffsetTable(self, output): """Writes all of the object reference offsets.""" all_positions = [] - writtenReferences = self.writtenReferences.items() - writtenReferences.sort(lambda x,y: cmp(x[1], y[1])) + writtenReferences = list(self.writtenReferences.items()) + writtenReferences.sort(key=lambda x: x[1]) for obj,order in writtenReferences: + # Porting note: Elsewhere we deliberately replace empty unicdoe strings + # with empty binary strings, but the empty unicode string + # goes into writtenReferences. This isn't an issue in Py2 + # because u'' and b'' have the same hash; but it is in + # Py3, where they don't. + if six.PY3 and obj == six.u(''): + obj = six.b('') position = self.referencePositions.get(obj) if position is None: raise InvalidPlistException("Error while writing offsets table. Object not found. %s" % obj) @@ -660,7 +690,7 @@ return result def binaryInt(self, obj, bytes=None): - result = '' + result = six.b('') if bytes is None: bytes = self.intSize(obj) if bytes == 1: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/biplist.egg-info/PKG-INFO new/biplist-0.5/biplist.egg-info/PKG-INFO --- old/biplist-0.4/biplist.egg-info/PKG-INFO 2011-06-01 02:31:59.000000000 +0200 +++ new/biplist-0.5/biplist.egg-info/PKG-INFO 2012-06-19 02:51:33.000000000 +0200 @@ -1,19 +1,19 @@ -Metadata-Version: 1.0 +Metadata-Version: 1.1 Name: biplist -Version: 0.4 +Version: 0.5 Summary: biplist is a library for reading/writing binary plists. Home-page: https://github.com/wooster/biplist Author: Andrew Wooster Author-email: [email protected] License: BSD -Download-URL: https://github.com/wooster/biplist/downloads/biplist-0.4.tar.gz +Download-URL: https://github.com/wooster/biplist/downloads/biplist-0.5.tar.gz Description: `biplist` is a binary plist parser/generator for Python. Binary Property List (plist) files provide a faster and smaller serialization format for property lists on OS X. This is a library for generating binary plists which can be read by OS X, iOS, or other clients. - This module requires Python 2.6 or higher. + This module requires Python 2.6 or higher or Python 3.2 or higher. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -22,3 +22,4 @@ Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing :: Markup +Requires: six diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/biplist.egg-info/SOURCES.txt new/biplist-0.5/biplist.egg-info/SOURCES.txt --- old/biplist-0.4/biplist.egg-info/SOURCES.txt 2011-06-01 02:31:59.000000000 +0200 +++ new/biplist-0.5/biplist.egg-info/SOURCES.txt 2012-06-19 02:51:33.000000000 +0200 @@ -8,6 +8,7 @@ biplist.egg-info/SOURCES.txt biplist.egg-info/dependency_links.txt biplist.egg-info/not-zip-safe +biplist.egg-info/requires.txt biplist.egg-info/top_level.txt tests/test_invalid.py tests/test_utils.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/biplist.egg-info/requires.txt new/biplist-0.5/biplist.egg-info/requires.txt --- old/biplist-0.4/biplist.egg-info/requires.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/biplist-0.5/biplist.egg-info/requires.txt 2012-06-19 02:51:33.000000000 +0200 @@ -0,0 +1 @@ +six \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/setup.py new/biplist-0.5/setup.py --- old/biplist-0.4/setup.py 2011-06-01 01:23:17.000000000 +0200 +++ new/biplist-0.5/setup.py 2012-06-19 02:50:08.000000000 +0200 @@ -12,23 +12,21 @@ major, minor, micro, releaselevel, serial = sys.version_info -if major == 2 and minor < 6: - print("Python >= 2.6 is required to use this module.") - sys.exit(1) -elif major >= 3: - print("There is no support for Python 3 yet in this module.") +if major <= 1 or (major == 2 and minor < 6) or (major == 3 and minor < 2): + # N.B.: Haven't tested with older py3k versions. + print('This module supports Python 2 >= 2.6 and Python 3 >= 3.2.') sys.exit(1) author = 'Andrew Wooster' email = '[email protected]' -version = '0.4' +version = '0.5' desc = 'biplist is a library for reading/writing binary plists.' setup( name = 'biplist', version = version, url = 'https://github.com/wooster/biplist', - download_url = 'https://github.com/wooster/biplist/downloads/biplist-0.4.tar.gz', + download_url = 'https://github.com/wooster/biplist/downloads/biplist-0.5.tar.gz', license = 'BSD', description = desc, long_description = @@ -38,7 +36,7 @@ format for property lists on OS X. This is a library for generating binary plists which can be read by OS X, iOS, or other clients. -This module requires Python 2.6 or higher.""", +This module requires Python 2.6 or higher or Python 3.2 or higher.""", author = author, author_email = email, packages = find_packages(), @@ -55,6 +53,6 @@ ], setup_requires = ['nose', 'coverage'], test_suite = 'nose.collector', - install_requires = [ - ], + install_requires = ['six'], + requires = ['six'], ) Files old/biplist-0.4/tests/._test_write.py and new/biplist-0.5/tests/._test_write.py differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/tests/test_invalid.py new/biplist-0.5/tests/test_invalid.py --- old/biplist-0.4/tests/test_invalid.py 2011-05-12 01:58:27.000000000 +0200 +++ new/biplist-0.5/tests/test_invalid.py 2012-06-19 02:37:05.000000000 +0200 @@ -17,14 +17,14 @@ def testTooShort(self): try: - readPlistFromString("bplist0") + readPlistFromString(six.b("bplist0")) self.fail("Should not successfully read plist which is too short.") except InvalidPlistException as e: pass def testInvalid(self): try: - readPlistFromString("bplist0-------------------------------------") + readPlistFromString(six.b("bplist0-------------------------------------")) self.fail("Should not successfully read invalid plist.") except InvalidPlistException as e: pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/tests/test_utils.py new/biplist-0.5/tests/test_utils.py --- old/biplist-0.4/tests/test_utils.py 2010-09-22 00:37:23.000000000 +0200 +++ new/biplist-0.5/tests/test_utils.py 2012-06-19 02:37:05.000000000 +0200 @@ -1,6 +1,7 @@ import os import subprocess import sys +import six def data_path(path): return os.path.join(os.path.dirname(globals()["__file__"]), 'data', path) @@ -12,7 +13,7 @@ p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE) stdin, stdout = (p.stdin, p.stdout) output = stdout.read() - output = output.strip("\n") + output = output.strip(six.b("\n")) status = stdin.close() p.wait() return p.returncode, output diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/tests/test_valid.py new/biplist-0.5/tests/test_valid.py --- old/biplist-0.4/tests/test_valid.py 2011-05-12 01:58:27.000000000 +0200 +++ new/biplist-0.5/tests/test_valid.py 2012-06-19 02:37:05.000000000 +0200 @@ -3,6 +3,7 @@ import os from test_utils import * import unittest +import six class TestValidPlistFile(unittest.TestCase): def setUp(self): @@ -10,14 +11,14 @@ def validateSimpleBinaryRoot(self, root): self.assertTrue(type(root) == dict, "Root should be dictionary.") - self.assertTrue(type(root['dateItem']) == datetime.datetime, "date should be datetime") - self.assertEquals(root['dateItem'], datetime.datetime(2010, 8, 19, 22, 27, 30, 385449), "dates not equal" ) - self.assertEquals(root['numberItem'], -10000000000000000L, "number not of expected value") - self.assertEquals(root['unicodeItem'], u'abc\u212cdef\u2133') - self.assertEquals(root['stringItem'], 'Hi there') - self.assertEquals(root['realItem'], 0.47) - self.assertEquals(root['boolItem'], True) - self.assertEquals(root['arrayItem'], ['item0']) + self.assertTrue(type(root[six.b('dateItem')]) == datetime.datetime, "date should be datetime") + self.assertEquals(root[six.b('dateItem')], datetime.datetime(2010, 8, 19, 22, 27, 30, 385449), "dates not equal" ) + self.assertEquals(root[six.b('numberItem')], -10000000000000000, "number not of expected value") + self.assertEquals(root[six.b('unicodeItem')], six.u('abc\u212cdef\u2133')) + self.assertEquals(root[six.b('stringItem')], six.b('Hi there')) + self.assertEquals(root[six.b('realItem')], 0.47) + self.assertEquals(root[six.b('boolItem')], True) + self.assertEquals(root[six.b('arrayItem')], [six.b('item0')]) def testFileRead(self): try: @@ -30,15 +31,22 @@ def testUnicodeRoot(self): result = readPlist(data_path('unicode_root.plist')) - self.assertEquals(result, u"Mirror's Edge\u2122 for iPad") + self.assertEquals(result, six.u("Mirror's Edge\u2122 for iPad")) def testEmptyUnicodeRoot(self): + # Porting note: this test was tricky; it was only passing in + # Python 2 because the empty byte-string returned by + # readPlist() is considered equal to the empty unicode-string + # in the assertion. Confusingly enough, given the name of the + # test, the value in unicode_empty.plist has the format byte + # 0b0101 (ASCII string), so the value being asserted against + # appears to be what is wrong. result = readPlist(data_path('unicode_empty.plist')) - self.assertEquals(result, u"") + self.assertEquals(result, six.b("")) def testSmallReal(self): result = readPlist(data_path('small_real.plist')) - self.assertEquals(result, {'4 byte real':0.5}) + self.assertEquals(result, {six.b('4 byte real'):0.5}) def testKeyedArchiverPlist(self): """ @@ -55,14 +63,14 @@ ... """ result = readPlist(data_path('nskeyedarchiver_example.plist')) - self.assertEquals(result, {'$version': 100000, - '$objects': - ['$null', - {'$class': Uid(3), 'somekey': Uid(2)}, - 'object value as string', - {'$classes': ['Archived', 'NSObject'], '$classname': 'Archived'} + self.assertEquals(result, {six.b('$version'): 100000, + six.b('$objects'): + [six.b('$null'), + {six.b('$class'): Uid(3), six.b('somekey'): Uid(2)}, + six.b('object value as string'), + {six.b('$classes'): [six.b('Archived'), six.b('NSObject')], six.b('$classname'): six.b('Archived')} ], - '$top': {'root': Uid(1)}, '$archiver': 'NSKeyedArchiver'}) + six.b('$top'): {six.b('root'): Uid(1)}, six.b('$archiver'): six.b('NSKeyedArchiver')}) self.assertEquals("Uid(1)", repr(Uid(1))) if __name__ == '__main__': diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/biplist-0.4/tests/test_write.py new/biplist-0.5/tests/test_write.py --- old/biplist-0.4/tests/test_write.py 2011-06-01 02:24:27.000000000 +0200 +++ new/biplist-0.5/tests/test_write.py 2012-06-19 02:37:05.000000000 +0200 @@ -2,21 +2,24 @@ from biplist import PlistWriter import datetime import os -from cStringIO import StringIO +#from cStringIO import StringIO import subprocess import tempfile from test_utils import * import unittest +import six class TestWritePlist(unittest.TestCase): def setUp(self): pass - def roundTrip(self, root, xml=False): + def roundTrip(self, root, xml=False, expected=None): + # 'expected' is more fallout from the + # don't-write-empty-unicode-strings issue. plist = writePlistToString(root, binary=(not xml)) self.assertTrue(len(plist) > 0) readResult = readPlistFromString(plist) - self.assertEquals(readResult, root) + self.assertEquals(readResult, (expected if expected is not None else root)) self.lintPlist(plist) def lintPlist(self, plistString): @@ -31,13 +34,26 @@ def testXMLPlist(self): self.roundTrip({'hello':'world'}, xml=True) + + def testXMLPlistWithData(self): + for binmode in (True, False): + binplist = writePlistToString({'data': Data(six.b('\x01\xac\xf0\xff'))}, binary=binmode) + plist = readPlistFromString(binplist) + self.assertTrue(isinstance(plist['data'], Data), \ + "unable to encode then decode Data into %s plist" % ("binary" if binmode else "XML")) + + def testConvertToXMLPlistWithData(self): + binplist = writePlistToString({'data': Data(six.b('\x01\xac\xf0\xff'))}) + plist = readPlistFromString(binplist) + xmlplist = writePlistToString(plist, binary=False) + self.assertTrue(len(xmlplist) > 0, "unable to convert plist with Data from binary to XML") def testBoolRoot(self): self.roundTrip(True) self.roundTrip(False) def testDuplicate(self): - l = ["foo" for i in xrange(0, 100)] + l = ["foo" for i in range(0, 100)] self.roundTrip(l) def testListRoot(self): @@ -86,13 +102,13 @@ self.roundTrip(root) def testString(self): - self.roundTrip('0') - self.roundTrip('') - self.roundTrip({'a':''}) + self.roundTrip(six.b('0')) + self.roundTrip(six.b('')) + self.roundTrip({six.b('a'):six.b('')}) def testLargeDict(self): d = {} - for i in xrange(0, 1000): + for i in range(0, 1000): d['%d' % i] = '%d' % i self.roundTrip(d) @@ -108,7 +124,7 @@ path = '/var/tmp/test.plist' writePlist([1, 2, 3], path, binary=is_binary) self.assertTrue(os.path.exists(path)) - self.lintPlist(open(path).read()) + self.lintPlist(open(path, 'rb').read()) def testNone(self): self.roundTrip(None) @@ -122,7 +138,7 @@ except InvalidPlistException as e: pass try: - self.roundTrip({Data("hello world"):1}) + self.roundTrip({Data(six.b("hello world")):1}) self.fail("Data is not a valid key in Cocoa.") except InvalidPlistException as e: pass @@ -140,7 +156,7 @@ edges = [-pow(2, 7), pow(2, 7) - 1, -pow(2, 15), pow(2, 15) - 1, -pow(2, 31), pow(2, 31) - 1] self.roundTrip(edges) - io = StringIO() + io = six.BytesIO() writer = PlistWriter(io) bytes = [(1, [pow(2, 7) - 1]), (2, [pow(2, 15) - 1]), @@ -162,16 +178,16 @@ pass def testWriteData(self): - self.roundTrip(Data("woohoo")) + self.roundTrip(Data(six.b("woohoo"))) def testUnicode(self): - unicodeRoot = u"Mirror's Edge\u2122 for iPad" + unicodeRoot = six.u("Mirror's Edge\u2122 for iPad") writePlist(unicodeRoot, "/tmp/odd.plist") self.roundTrip(unicodeRoot) - unicodeStrings = [u"Mirror's Edge\u2122 for iPad", u'Weightbot \u2014 Track your Weight in Style'] + unicodeStrings = [six.u("Mirror's Edge\u2122 for iPad"), six.u('Weightbot \u2014 Track your Weight in Style')] self.roundTrip(unicodeStrings) - self.roundTrip({u"":u""}) - self.roundTrip(u"") + self.roundTrip({six.u(""):six.u("")}, expected={six.b(''):six.b('')}) + self.roundTrip(six.u(""), expected=six.b('')) def testUidWrite(self): self.roundTrip({'$version': 100000, -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
