Skip to content

Commit 24f274d

Browse files
committed
Merge pull request #1 from BayanGroup/py3k
Add Python 3 support (along with Python 2 with six)
2 parents dacd6b3 + 7e4c532 commit 24f274d

8 files changed

Lines changed: 51 additions & 41 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*.pyc
2+
*~
3+
__pycache__/

.hgignore

Lines changed: 0 additions & 2 deletions
This file was deleted.

.hgtags

Lines changed: 0 additions & 2 deletions
This file was deleted.

deep/__init__.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ class O(object):
106106
import sys
107107
import traceback
108108

109+
from six import text_type as unicode
110+
from six.moves import range
111+
import six
112+
109113
__all__ = ['diff',
110114
'Equal',
111115
'Is',
@@ -151,7 +155,7 @@ def diff(i1, i2, debug=Unspec):
151155
class Comparator(object):
152156
"""Base class for all Comparator objects."""
153157
def render_value(self, value):
154-
return `value`
158+
return repr(value)
155159

156160
def expr(self, expr):
157161
return expr
@@ -215,7 +219,7 @@ def descend(self, i1, i2):
215219
# Comparators are not hashable so this will be just id()
216220
key = (id(i1), i2)
217221
cache = self.cache
218-
if cache.has_key(key):
222+
if key in cache:
219223
equals = cache[key]
220224
else:
221225
cache[key] = True # assume true to match circular structures
@@ -300,7 +304,7 @@ def render_full(self):
300304
(self.render_path(), self.render_expected(), self.render_actual())
301305

302306
def print_full(self):
303-
print self.render_full()
307+
print(self.render_full())
304308

305309
class DebugComparison(Comparison):
306310
"""This class is useful if you are debugging a comparison and would like
@@ -310,7 +314,7 @@ def __init__(self):
310314
Comparison.__init__(self)
311315

312316
def debug(self, msg):
313-
print "%s%s" % (" " * self.depth, msg)
317+
print("%s%s" % (" " * self.depth, msg))
314318

315319
def descend(self, i1, i2):
316320
self.debug("descend(%s, %s)" % (i1, i2))
@@ -322,7 +326,7 @@ def descend(self, i1, i2):
322326

323327
def wrap(self, item):
324328
wrapped = super(DebugComparison, self).wrap(item)
325-
self.debug("%s wrapped as %s" % (`item`, `wrapped`))
329+
self.debug("%s wrapped as %s" % (repr(item), repr(wrapped)))
326330
return wrapped
327331

328332
class ValueComparator(Comparator):
@@ -335,7 +339,7 @@ def render(self):
335339
return self.render_value(self.value)
336340

337341
def __repr__(self):
338-
return "%s(%s)" % (self.__class__.__name__, `self.value`)
342+
return "%s(%s)" % (self.__class__.__name__, repr(self.value))
339343

340344
class TransformComparator(ValueComparator):
341345
"""A base class for comparators that transform their inout and then
@@ -352,7 +356,7 @@ def trans_args(self):
352356
return ""
353357

354358
def __repr__(self):
355-
return "%s(%s)==%s" %(self.__class__.__name__, self.trans_args(), `self.value`)
359+
return "%s(%s)==%s" %(self.__class__.__name__, self.trans_args(), repr(self.value))
356360

357361
class Equal(ValueComparator):
358362
"""Compares using python's == ."""
@@ -402,7 +406,7 @@ def expr(self, expr):
402406
return "%s[%s]" % (expr, self.render_value(self.index))
403407

404408
def trans_args(self):
405-
return "%s" % `self.index`
409+
return "%s" % repr(self.index)
406410

407411
class Len(TransformComparator):
408412
"""Compares against len(item)."""
@@ -460,7 +464,7 @@ def equals(self, item, comp):
460464
if len(missing) or len(extra):
461465
self.matched = matched
462466
self.missing = missing
463-
self.extra = extra.keys()
467+
self.extra = list(six.iterkeys(extra))
464468
return False
465469
else:
466470
return True
@@ -493,7 +497,7 @@ def __init__(self, value):
493497
self.value = EqSet(value)
494498

495499
def transform(self, item):
496-
return item.keys()
500+
return list(six.iterkeys(item))
497501

498502
def expr(self, expr):
499503
return "%s.keys()" % expr
@@ -503,7 +507,7 @@ class Dict(ValueComparator):
503507
def equals(self, item, comp):
504508
v = self.value
505509

506-
for c in (InstanceOf(dict), HasKeys(v.keys())):
510+
for c in (InstanceOf(dict), HasKeys(list(six.iterkeys(v)))):
507511
if not comp.descend(item, c):
508512
return False
509513

@@ -532,10 +536,10 @@ def transform(self, item):
532536
return hasattr(item, self.attr)
533537

534538
def expr(self, expr):
535-
return "hasattr(%s, %s)" % (expr, `self.attr`)
539+
return "hasattr(%s, %s)" % (expr, repr(self.attr))
536540

537541
def trans_args(self):
538-
return `self.attr`
542+
return repr(self.attr)
539543

540544
class CmpAttr(TransformComparator):
541545
"""Compare item.some_attribute."""
@@ -550,7 +554,7 @@ def expr(self, expr):
550554
return "%s.%s" % (expr, self.attr)
551555

552556
def trans_args(self):
553-
return `self.attr`
557+
return repr(self.attr)
554558

555559
class Attr(Comparator):
556560
"""Check that item.some_attr exists and compare it to some value."""
@@ -583,7 +587,7 @@ def __init__(self, *args, **qargs):
583587
def equals(self, item, comp):
584588
v = self.value
585589
if isinstance(v, dict):
586-
items = v.items()
590+
items = six.iteritems(v)
587591
else:
588592
items = v
589593
for (attr, c) in items:
@@ -608,7 +612,7 @@ def expr(self, expr):
608612
if args_s:
609613
args.append(args_s)
610614
kwargs_a = [("%s=%s" % (x[0], self.render_value(x[1])))
611-
for x in self.kwargs.items()]
615+
for x in six.iteritems(self.kwargs)]
612616
if kwargs_a:
613617
args.append(", ".join(kwargs_a))
614618

@@ -631,7 +635,7 @@ def render(self):
631635
return self.render_value(self.value)
632636

633637
def __repr__(self):
634-
return "%s(%s)" % (self.__class__.__name__, `self.conds`)
638+
return "%s(%s)" % (self.__class__.__name__, repr(self.conds))
635639

636640
class And(AndA):
637641
"""As AndA but instead of passing in an array object, the argument list
@@ -651,12 +655,12 @@ class Re(Comparator):
651655
"""Check that item matches a regular expression (using re.search)."""
652656
def __init__(self, regex, flags=0):
653657
if type(regex) is str:
654-
self.orig = "%s" % `regex`
658+
self.orig = "%s" % repr(regex)
655659
if flags:
656660
self.orig += " (flags=%d)" % flags
657661
regex = re.compile(regex, flags)
658662
else:
659-
self.orig = `regex`
663+
self.orig = repr(regex)
660664
self.regex = regex
661665

662666
def equals(self, item, comp):
@@ -696,15 +700,15 @@ def render(self):
696700
return self.render_value(self.value)
697701

698702
def __repr__(self):
699-
return "%s(%s)" % (self.__class__.__name__, `self.value`)
703+
return "%s(%s)" % (self.__class__.__name__, repr(self.value))
700704

701705
class ArrayValues(ValueComparator):
702706
""" Compare each element of an array to the value """
703707
def equals(self, item, comp):
704-
return comp.descend(item, Slice(self.value, xrange(0, len(item))))
708+
return comp.descend(item, Slice(self.value, range(0, len(item))))
705709

710+
706711
class DictValues(ValueComparator):
707712
""" Compare each value in a dictionary to the value """
708713
def equals(self, item, comp):
709-
return comp.descend(item, Slice(self.value, item.keys()))
710-
714+
return comp.descend(item, Slice(self.value, list(six.iterkeys(item))))

deep/test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def DeepEq(self, first, second, msg=""):
2828
msg = "%s:\nExpected: %s\nActual : %s" % (msg, second, first)
2929
msg += "\nDiffered at " + res.render_full()
3030

31-
self.failUnless(not res, msg)
31+
self.assertTrue(not res, msg)
3232

3333
class TestCase(unittest.TestCase, TestCaseMix):
3434
""" A premixed TestCase class """

deep_test.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def test(self, case):
5151
if diff:
5252
msg += "\n" + diff.render_full()
5353

54-
case.failUnless(not diff, msg)
54+
case.assertTrue(not diff, msg)
5555

5656
class TestNotEqual(object):
5757
def __init__(self, i1, i2, path="", actual="", expected="", name=""):
@@ -82,6 +82,12 @@ def test(self, case):
8282

8383
class DeepTest(unittest.TestCase):
8484
def runTest(self):
85+
import sys
86+
if sys.version_info[0] == 2:
87+
type_str = 'type'
88+
else:
89+
type_str = 'class'
90+
8591
tests = [E(1, 1, "1 == 1"),
8692
N(1, 2, "x", "1", "2", "1 != 2"),
8793
E((1,2), (1,2), "tuple diff"),
@@ -93,16 +99,16 @@ def runTest(self):
9399
"[] ! Type int"),
94100
E(self, d.InstanceOf(unittest.TestCase), "self InstanceOf test"),
95101
N([], d.InstanceOf(int), "x",
96-
"instance of <type 'list'>",
97-
"instance of <type 'int'>",
102+
"instance of <%s 'list'>" % type_str,
103+
"instance of <%s 'int'>" % type_str,
98104
"[] ! InstanceOf int"),
99105
E([0,1], d.IndexedElem(1, 1), "List[1]"),
100106
N([0,1], d.IndexedElem(0, 1), "x[0]", "0", "1", "List[0]"),
101107
E([0,1], d.List([0, 1]), "list"),
102108
N([0,1], d.List([0, 0]), "x[1]", "1", "0", "not list"),
103109
E([0,1], [0, 1], "auto list"),
104110
N([0,1], d.List([0, 0, 0]), "len(x)", "2", "3", "not list len"),
105-
N(1, d.List([0, 0, 0]), "x", "instance of <type 'int'>", None, "not list type"),
111+
N(1, d.List([0, 0, 0]), "x", "instance of <%s 'int'>" % type_str, None, "not list type"),
106112
E([1,0], d.EqSet([0, 1]), "eqset"),
107113
N([0,1], d.EqSet([0, 2]), "x as a set (==)",
108114
"1 matching element(s), extra: [1], missing: [2]",
@@ -123,7 +129,7 @@ def runTest(self):
123129
N({"a" : 0, "c" : 1}, d.Dict({"a" : 1, "b" : 1}),
124130
'x.keys() as a set (==)', None, None, "! Dict keys"),
125131
N(1, d.Dict({"a" : 1, "b" : 1}),
126-
'x', "instance of <type 'int'>", None, "! Dict type"),
132+
'x', "instance of <%s 'int'>" % type_str, None, "! Dict type"),
127133
E({"a" : 0, "b" : 1}, {"a" : 0, "b" : 1}, "auto Dict"),
128134
E(o, d.HasAttr("an_attr"), "attr"),
129135
N(o, d.HasAttr("another_attr"), "hasattr(x, 'another_attr')", "False", "True", "! attr"),
@@ -150,7 +156,7 @@ def runTest(self):
150156
N(o, d.And(d.Attr("an_attr", 1), d.Attr("an_attr2", 3)), 'x.an_attr2', "2", "3", "! and 2"),
151157
E([1, 2], [d.Ignore(), 2], "ignore"),
152158
E("feRgal", d.Re("rga", re.IGNORECASE), "Re"),
153-
N("feRgal", d.Re("rga", re.MULTILINE), "x", `"feRgal"`, "something matching 'rga' (flags=8)", "Re"),
159+
N("feRgal", d.Re("rga", re.MULTILINE), "x", repr("feRgal"), "something matching 'rga' (flags=8)", "Re"),
154160
E(["abc", "ab", "a"], d.ArrayValues(d.Re("a")), "ArrayValues"),
155161
N(["abc", "ab", "a"], d.ArrayValues(d.Re("b")), "x[2]", "a".__repr__(), "something matching 'b'", "ArrayValues"),
156162
E(["abc", "ab", "a"],
@@ -187,8 +193,8 @@ def runTest(self):
187193
"2 matching element(s)",
188194
"not eqset"),
189195
N([0,1], set([0, 1]), "x as a set (==)",
190-
"instance of <type 'list'>",
191-
"instance of <type 'set'>")
196+
"instance of <%s 'list'>" % type_str,
197+
"instance of <%s 'set'>" % type_str)
192198
])
193199

194200
if hasattr(__builtins__, "frozenset"):
@@ -199,8 +205,8 @@ def runTest(self):
199205
"2 matching element(s)",
200206
"not eqfrozenset"),
201207
N([0,1], frozenset([0, 1]), "x as a set (==)",
202-
"instance of <type 'list'>",
203-
"instance of <type 'frozenset'>")
208+
"instance of <%s 'list'>" % type_str,
209+
"instance of <%s 'frozenset'>" % type_str)
204210
])
205211

206212
# for t in (tests[-1],):
@@ -215,7 +221,7 @@ def runTest(self):
215221
ex = None
216222
try:
217223
d.diff([0, 1], d.IndexedElem(2, None))
218-
except Exception, e:
224+
except Exception as e:
219225
ex = e
220226

221227
for pat in (r"examining x\[2\]", "IndexError"):

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
from distutils.core import setup
44

55
setup(name='deep',
6-
version='0.9',
6+
version='0.9.dev',
77
packages = ['deep'],
88
author="Fergal Daly",
99
author_email="[email protected]",
10+
install_requires=['six'],
1011
description="Easy, flexible deep comparison and testing of structured data",
1112
url="http://code.google.com/p/python-deep/",
1213
download_url="http://code.google.com/p/python-deep/downloads/list",

test_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
class DeepTest(deep.test.TestCase):
2323
def testTest(self):
24-
self.assertEquals(1, 1)
24+
self.assertEqual(1, 1)
2525
self.DeepEq([1], [1], "wibble")
2626

2727
if __name__ == '__main__':

0 commit comments

Comments
 (0)