Improve full diff output for lists
Massage text input for difflib when comparing pformat output of
different line lengths.
Also do not strip ndiff output on the left, which currently already
removes indenting for lines with no differences.
Before:
    E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...]
    E     Right contains 3 more items, first extra item: ' '
    E     Full diff:
    E     - ['version', 'version_info', 'sys.version', 'sys.version_info']
    E     + ['version',
    E     +  'version_info',
    E     +  'sys.version',
    E     +  'sys.version_info',
    E     +  ' ',
    E     +  'sys.version',
    E     +  'sys.version_info']
After:
    E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...]
    E     Right contains 3 more items, first extra item: ' '
    E     Full diff:
    E       [
    E        'version',
    E        'version_info',
    E        'sys.version',
    E        'sys.version_info',
    E     +  ' ',
    E     +  'sys.version',
    E     +  'sys.version_info',
    E       ]
			
			
This commit is contained in:
		
							parent
							
								
									5186635387
								
							
						
					
					
						commit
						946434c610
					
				|  | @ -0,0 +1,34 @@ | ||||||
|  | Improve verbose diff output with sequences. | ||||||
|  | 
 | ||||||
|  | Before: | ||||||
|  | 
 | ||||||
|  | .. code-block:: | ||||||
|  | 
 | ||||||
|  |     E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...] | ||||||
|  |     E     Right contains 3 more items, first extra item: ' ' | ||||||
|  |     E     Full diff: | ||||||
|  |     E     - ['version', 'version_info', 'sys.version', 'sys.version_info'] | ||||||
|  |     E     + ['version', | ||||||
|  |     E     +  'version_info', | ||||||
|  |     E     +  'sys.version', | ||||||
|  |     E     +  'sys.version_info', | ||||||
|  |     E     +  ' ', | ||||||
|  |     E     +  'sys.version', | ||||||
|  |     E     +  'sys.version_info'] | ||||||
|  | 
 | ||||||
|  | After: | ||||||
|  | 
 | ||||||
|  | .. code-block:: | ||||||
|  | 
 | ||||||
|  |     E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...] | ||||||
|  |     E     Right contains 3 more items, first extra item: ' ' | ||||||
|  |     E     Full diff: | ||||||
|  |     E       [ | ||||||
|  |     E        'version', | ||||||
|  |     E        'version_info', | ||||||
|  |     E        'sys.version', | ||||||
|  |     E        'sys.version_info', | ||||||
|  |     E     +  ' ', | ||||||
|  |     E     +  'sys.version', | ||||||
|  |     E     +  'sys.version_info', | ||||||
|  |     E       ] | ||||||
|  | @ -246,6 +246,18 @@ def _compare_eq_verbose(left, right): | ||||||
|     return explanation |     return explanation | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def _surrounding_parens_on_own_lines(lines):  # type: (List) -> None | ||||||
|  |     """Move opening/closing parenthesis/bracket to own lines.""" | ||||||
|  |     opening = lines[0][:1] | ||||||
|  |     if opening in ["(", "[", "{"]: | ||||||
|  |         lines[0] = " " + lines[0][1:] | ||||||
|  |         lines[:] = [opening] + lines | ||||||
|  |     closing = lines[-1][-1:] | ||||||
|  |     if closing in [")", "]", "}"]: | ||||||
|  |         lines[-1] = lines[-1][:-1] + "," | ||||||
|  |         lines[:] = lines + [closing] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def _compare_eq_iterable(left, right, verbose=0): | def _compare_eq_iterable(left, right, verbose=0): | ||||||
|     if not verbose: |     if not verbose: | ||||||
|         return ["Use -v to get the full diff"] |         return ["Use -v to get the full diff"] | ||||||
|  | @ -254,9 +266,27 @@ def _compare_eq_iterable(left, right, verbose=0): | ||||||
| 
 | 
 | ||||||
|     left_formatting = pprint.pformat(left).splitlines() |     left_formatting = pprint.pformat(left).splitlines() | ||||||
|     right_formatting = pprint.pformat(right).splitlines() |     right_formatting = pprint.pformat(right).splitlines() | ||||||
|  | 
 | ||||||
|  |     # Re-format for different output lengths. | ||||||
|  |     lines_left = len(left_formatting) | ||||||
|  |     lines_right = len(right_formatting) | ||||||
|  |     if lines_left != lines_right: | ||||||
|  |         if lines_left > lines_right: | ||||||
|  |             max_width = min(len(x) for x in left_formatting) | ||||||
|  |             right_formatting = pprint.pformat(right, width=max_width).splitlines() | ||||||
|  |             lines_right = len(right_formatting) | ||||||
|  |         else: | ||||||
|  |             max_width = min(len(x) for x in right_formatting) | ||||||
|  |             left_formatting = pprint.pformat(left, width=max_width).splitlines() | ||||||
|  |             lines_left = len(left_formatting) | ||||||
|  | 
 | ||||||
|  |     if lines_left > 1 or lines_right > 1: | ||||||
|  |         _surrounding_parens_on_own_lines(left_formatting) | ||||||
|  |         _surrounding_parens_on_own_lines(right_formatting) | ||||||
|  | 
 | ||||||
|     explanation = ["Full diff:"] |     explanation = ["Full diff:"] | ||||||
|     explanation.extend( |     explanation.extend( | ||||||
|         line.strip() for line in difflib.ndiff(left_formatting, right_formatting) |         line.rstrip() for line in difflib.ndiff(left_formatting, right_formatting) | ||||||
|     ) |     ) | ||||||
|     return explanation |     return explanation | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -413,6 +413,55 @@ class TestAssert_reprcompare: | ||||||
|         expl = callequal([0, 1, 2], [0, 1]) |         expl = callequal([0, 1, 2], [0, 1]) | ||||||
|         assert len(expl) > 1 |         assert len(expl) > 1 | ||||||
| 
 | 
 | ||||||
|  |     def test_list_wrap_for_multiple_lines(self): | ||||||
|  |         long_d = "d" * 80 | ||||||
|  |         l1 = ["a", "b", "c"] | ||||||
|  |         l2 = ["a", "b", "c", long_d] | ||||||
|  |         diff = callequal(l1, l2, verbose=True) | ||||||
|  |         assert diff == [ | ||||||
|  |             "['a', 'b', 'c'] == ['a', 'b', 'c...dddddddddddd']", | ||||||
|  |             "Right contains one more item: '" + long_d + "'", | ||||||
|  |             "Full diff:", | ||||||
|  |             "  [", | ||||||
|  |             "   'a',", | ||||||
|  |             "   'b',", | ||||||
|  |             "   'c',", | ||||||
|  |             "+  '" + long_d + "',", | ||||||
|  |             "  ]", | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  |         diff = callequal(l2, l1, verbose=True) | ||||||
|  |         assert diff == [ | ||||||
|  |             "['a', 'b', 'c...dddddddddddd'] == ['a', 'b', 'c']", | ||||||
|  |             "Left contains one more item: '" + long_d + "'", | ||||||
|  |             "Full diff:", | ||||||
|  |             "  [", | ||||||
|  |             "   'a',", | ||||||
|  |             "   'b',", | ||||||
|  |             "   'c',", | ||||||
|  |             "-  '" + long_d + "',", | ||||||
|  |             "  ]", | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  |     def test_list_wrap_for_width_rewrap_same_length(self): | ||||||
|  |         long_a = "a" * 30 | ||||||
|  |         long_b = "b" * 30 | ||||||
|  |         long_c = "c" * 30 | ||||||
|  |         l1 = [long_a, long_b, long_c] | ||||||
|  |         l2 = [long_b, long_c, long_a] | ||||||
|  |         diff = callequal(l1, l2, verbose=True) | ||||||
|  |         assert diff == [ | ||||||
|  |             "['aaaaaaaaaaa...cccccccccccc'] == ['bbbbbbbbbbb...aaaaaaaaaaaa']", | ||||||
|  |             "At index 0 diff: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' != 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'", | ||||||
|  |             "Full diff:", | ||||||
|  |             "  [", | ||||||
|  |             "-  'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',", | ||||||
|  |             "   'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',", | ||||||
|  |             "   'cccccccccccccccccccccccccccccc',", | ||||||
|  |             "+  'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',", | ||||||
|  |             "  ]", | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|     def test_dict(self): |     def test_dict(self): | ||||||
|         expl = callequal({"a": 0}, {"a": 1}) |         expl = callequal({"a": 0}, {"a": 1}) | ||||||
|         assert len(expl) > 1 |         assert len(expl) > 1 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue