def _test_move_detection(self, a, b, expected_i_moves, expected_r_moves): differ = MyersDiffer(a, b) opcode_generator = get_diff_opcode_generator(differ) r_moves = [] i_moves = [] for opcodes in opcode_generator: # Log the opcode so we can more easily debug unit test failures. print(opcodes) meta = opcodes[-1] try: r_moves.append(meta['moved-to']) except KeyError: pass try: i_moves.append(meta['moved-from']) except KeyError: pass self.assertEqual(i_moves, expected_i_moves) self.assertEqual(r_moves, expected_r_moves)
def _get_lines(self, a, b, filename): differ = MyersDiffer(a.splitlines(True), b.splitlines(True)) differ.add_interesting_lines_for_headers(filename) # Begin the scan. list(differ.get_opcodes()) return (differ.get_interesting_lines('header', False), differ.get_interesting_lines('header', True))
def Differ(a, b, ignore_space=False, compat_version=DEFAULT_DIFF_COMPAT_VERSION): """ Factory wrapper for returning a differ class based on the compat version and flags specified. """ if compat_version == 0: return SMDiffer(a, b) elif compat_version == 1: return MyersDiffer(a, b, ignore_space) else: raise DiffCompatError( "Invalid diff compatibility version (%s) passed to Differ" % (compat_version))
def _test_move_detection(self, a, b, expected_i_moves, expected_r_moves): differ = MyersDiffer(a, b) opcode_generator = get_diff_opcode_generator(differ) r_moves = [] i_moves = [] for opcodes in opcode_generator: meta = opcodes[-1] if 'moved-to' in meta: r_moves.append(meta['moved-to']) if 'moved-from' in meta: i_moves.append(meta['moved-from']) self.assertEqual(i_moves, expected_i_moves) self.assertEqual(r_moves, expected_r_moves)
def __get_lines(self, filename): with open(os.path.join(self.PREFIX, "orig_src", filename), "r") as f: a = f.readlines() with open(os.path.join(self.PREFIX, "new_src", filename), "r") as f: b = f.readlines() differ = MyersDiffer(a, b) differ.add_interesting_lines_for_headers(filename) # Begin the scan. list(differ.get_opcodes()) result = (differ.get_interesting_lines('header', False), differ.get_interesting_lines('header', True)) return result
def render_change_entry_html(self, info): old_value = '' new_value = '' if 'old' in info: old_value = info['old'][0] or '' if 'new' in info: new_value = info['new'][0] or '' old_value = render_markdown(old_value) new_value = render_markdown(new_value) old_lines = list(iter_markdown_lines(old_value)) new_lines = list(iter_markdown_lines(new_value)) differ = MyersDiffer(old_lines, new_lines) return ('<table class="diffed-text-area">%s</table>' % ''.join( self._render_all_change_lines(differ, old_lines, new_lines)))
def testMoveDetection(self): """Testing move detection""" # movetest1 has two blocks of code that would appear to be moves: # a function, and an empty comment block. Only the function should # be seen as a move, whereas the empty comment block is less useful # (since it's content-less) and shouldn't be seen as once. old = self._get_file('orig_src', 'movetest1.c') new = self._get_file('new_src', 'movetest1.c') differ = MyersDiffer(old.splitlines(), new.splitlines()) r_moves = [] i_moves = [] opcode_generator = get_diff_opcode_generator(differ) for opcodes in opcode_generator: tag = opcodes[0] meta = opcodes[-1] if tag == 'delete': if 'moved' in meta: r_moves.append(meta['moved']) elif tag == 'insert': if 'moved' in meta: i_moves.append(meta['moved']) self.assertEqual(len(r_moves), 1) self.assertEqual(len(i_moves), 1) moves = [ (15, 28), (16, 29), (17, 30), (18, 31), (19, 32) ] for i, j in moves: self.assertTrue(j in i_moves[0]) self.assertTrue(i in r_moves[0]) self.assertEqual(i_moves[0][j], i) self.assertEqual(r_moves[0][i], j)
def render_change_entry_html(self, info): """Render a change entry to HTML. This will render a diff of the changed text. This function is expected to return safe, valid HTML. Any values coming from a field or any other form of user input must be properly escaped. Args: info (dict): A dictionary describing how the field has changed. This is guaranteed to have ``new`` and ``old`` keys, but may also contain ``added`` and ``removed`` keys as well. Returns: unicode: The HTML representation of the change entry. """ old_value = '' new_value = '' if 'old' in info: old_value = info['old'][0] or '' if 'new' in info: new_value = info['new'][0] or '' old_value = render_markdown(old_value) new_value = render_markdown(new_value) old_lines = list(iter_markdown_lines(old_value)) new_lines = list(iter_markdown_lines(new_value)) differ = MyersDiffer(old_lines, new_lines) return ('<table class="diffed-text-area">%s</table>' % ''.join(self._render_all_change_lines(differ, old_lines, new_lines)))
def setUp(self): super(IndentationTests, self).setUp() self.generator = get_diff_opcode_generator(MyersDiffer('', ''))
def _test_diff(self, a, b, expected): opcodes = list(MyersDiffer(a, b).get_opcodes()) self.assertEqual(opcodes, expected)
def setUp(self): self.generator = get_diff_opcode_generator(MyersDiffer('', ''))