1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/cf8da540f4ed/ Changeset: cf8da540f4ed Branch: better-diff User: bubenkoff Date: 2014-09-23 21:22:57+00:00 Summary: simpler and more verbose assertions Affected #: 2 files
diff -r fcfcf15459f0e4ab43e8784befcd83ded913c8b2 -r cf8da540f4ed1c305e128cd627933afa2034e710 _pytest/assertion/util.py --- a/_pytest/assertion/util.py +++ b/_pytest/assertion/util.py @@ -1,4 +1,5 @@ """Utilities for assertion debugging""" +import difflib import pprint import py @@ -129,11 +130,14 @@ right_repr = py.io.saferepr(right, maxsize=width-len(left_repr)) summary = u('%s %s %s') % (left_repr, op, right_repr) - issequence = lambda x: (isinstance(x, (list, tuple, Sequence)) - and not isinstance(x, basestring)) istext = lambda x: isinstance(x, basestring) - isdict = lambda x: isinstance(x, dict) - isset = lambda x: isinstance(x, (set, frozenset)) + + def issequence(obj): + try: + iter(obj) + return not istext(obj) + except TypeError: + return False verbose = config.getoption('verbose') explanation = None @@ -142,11 +146,7 @@ if istext(left) and istext(right): explanation = _diff_text(left, right, verbose) elif issequence(left) and issequence(right): - explanation = _compare_eq_sequence(left, right, verbose) - elif isset(left) and isset(right): - explanation = _compare_eq_set(left, right, verbose) - elif isdict(left) and isdict(right): - explanation = _compare_eq_dict(left, right, verbose) + explanation = _compare_eq(left, right, verbose) elif op == 'not in': if istext(left) and istext(right): explanation = _notin_text(left, right, verbose) @@ -203,68 +203,6 @@ return explanation -def _compare_eq_sequence(left, right, verbose=False): - explanation = [] - for i in range(min(len(left), len(right))): - if left[i] != right[i]: - explanation += [u('At index %s diff: %r != %r') - % (i, left[i], right[i])] - break - if len(left) > len(right): - explanation += [u('Left contains more items, first extra item: %s') - % py.io.saferepr(left[len(right)],)] - elif len(left) < len(right): - explanation += [ - u('Right contains more items, first extra item: %s') % - py.io.saferepr(right[len(left)],)] - return explanation # + _diff_text(pprint.pformat(left), - # pprint.pformat(right)) - - -def _compare_eq_set(left, right, verbose=False): - explanation = [] - diff_left = left - right - diff_right = right - left - if diff_left: - explanation.append(u('Extra items in the left set:')) - for item in diff_left: - explanation.append(py.io.saferepr(item)) - if diff_right: - explanation.append(u('Extra items in the right set:')) - for item in diff_right: - explanation.append(py.io.saferepr(item)) - return explanation - - -def _compare_eq_dict(left, right, verbose=False): - explanation = [] - common = set(left).intersection(set(right)) - same = dict((k, left[k]) for k in common if left[k] == right[k]) - if same and not verbose: - explanation += [u('Omitting %s identical items, use -v to show') % - len(same)] - elif same: - explanation += [u('Common items:')] - explanation += pprint.pformat(same).splitlines() - diff = set(k for k in common if left[k] != right[k]) - if diff: - explanation += [u('Differing items:')] - for k in diff: - explanation += [py.io.saferepr({k: left[k]}) + ' != ' + - py.io.saferepr({k: right[k]})] - extra_left = set(left) - set(right) - if extra_left: - explanation.append(u('Left contains more items:')) - explanation.extend(pprint.pformat( - dict((k, left[k]) for k in extra_left)).splitlines()) - extra_right = set(right) - set(left) - if extra_right: - explanation.append(u('Right contains more items:')) - explanation.extend(pprint.pformat( - dict((k, right[k]) for k in extra_right)).splitlines()) - return explanation - - def _notin_text(term, text, verbose=False): index = text.find(term) head = text[:index] @@ -282,3 +220,10 @@ else: newdiff.append(line) return newdiff + + +def _compare_eq(left, right, verbose=False): + left = pprint.pformat(left).splitlines() + right = pprint.pformat(right).splitlines() + return list(line.strip() for line in difflib.ndiff(left, right)) + diff -r fcfcf15459f0e4ab43e8784befcd83ded913c8b2 -r cf8da540f4ed1c305e128cd627933afa2034e710 testing/test_assertion.py --- a/testing/test_assertion.py +++ b/testing/test_assertion.py @@ -96,19 +96,6 @@ expl = callequal({'a': 0}, {'a': 1}) assert len(expl) > 1 - def test_dict_omitting(self): - lines = callequal({'a': 0, 'b': 1}, {'a': 1, 'b': 1}) - assert lines[1].startswith('Omitting 1 identical item') - assert 'Common items' not in lines - for line in lines[1:]: - assert 'b' not in line - - def test_dict_omitting_verbose(self): - lines = callequal({'a': 0, 'b': 1}, {'a': 1, 'b': 1}, verbose=True) - assert lines[1].startswith('Common items:') - assert 'Omitting' not in lines[1] - assert lines[2] == "{'b': 1}" - def test_set(self): expl = callequal(set([0, 1]), set([0, 2])) assert len(expl) > 1 @@ -370,7 +357,6 @@ "*truncated*use*-vv*", ]) - result = testdir.runpytest('-vv') result.stdout.fnmatch_lines([ "*- 197", Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. _______________________________________________ pytest-commit mailing list pytest-commit@python.org https://mail.python.org/mailman/listinfo/pytest-commit