1- from typing import List , Generator , Any
21import difflib
3- from enum import Enum
42from dataclasses import dataclass
3+ from enum import Enum
4+ from typing import Iterator , List
55
66from difflib_parser .diff_line import DiffLine , DiffLineCode
77
@@ -38,10 +38,13 @@ def __init__(self, left_text: List[str], right_text: List[str]):
3838 self .__diff = list (difflib .ndiff (self .__left_text , self .__right_text ))
3939 self .__line_no = 0
4040
41- def iter_diffs (self ) -> Generator [Diff , Any , Any ]:
41+ def iter_diffs (self ) -> Iterator [Diff ]:
42+ current_line = self .__diff [self .__line_no ]
4243 while self .__line_no < len (self .__diff ):
43- current_line = self .__diff [self .__line_no ]
4444 diff_line = DiffLine .parse (current_line )
45+ if diff_line .line is None :
46+ self .__line_no += 1
47+ continue
4548 code = diff_line .code
4649 diff = Diff (code = DiffCode .SAME , line = diff_line .line )
4750
@@ -78,11 +81,13 @@ def __get_incremental_change(self, line_no: int) -> DiffChange | None:
7881 DiffLineCode .ADDED ,
7982 DiffLineCode .MISSING ,
8083 ]
84+ # We can ignore all of these lines because we know that a None line would have
85+ # been skipped
8186 if self .__match_pattern (lines , pattern_a ):
8287 return DiffChange (
83- left = [i for (i , c ) in enumerate (b .line ) if c in ["-" , "^" ]],
84- right = [i for (i , c ) in enumerate (d .line ) if c in ["+" , "^" ]],
85- newline = c .line ,
88+ left = [i for (i , c ) in enumerate (b .line ) if c in ["-" , "^" ]], # type: ignore
89+ right = [i for (i , c ) in enumerate (d .line ) if c in ["+" , "^" ]], # type: ignore
90+ newline = c .line , # type: ignore
8691 skip_lines = 3 ,
8792 )
8893
@@ -91,18 +96,18 @@ def __get_incremental_change(self, line_no: int) -> DiffChange | None:
9196 if self .__match_pattern (lines , pattern_b ):
9297 return DiffChange (
9398 left = [],
94- right = [i for (i , c ) in enumerate (c .line ) if c in ["+" , "^" ]],
95- newline = b .line ,
99+ right = [i for (i , c ) in enumerate (c .line ) if c in ["+" , "^" ]], # type: ignore
100+ newline = b .line , # type: ignore
96101 skip_lines = 2 ,
97102 )
98103
99104 # This represents the case where only removals are present in the edit
100105 pattern_c = [DiffLineCode .REMOVED , DiffLineCode .MISSING , DiffLineCode .ADDED ]
101106 if self .__match_pattern (lines , pattern_c ):
102107 return DiffChange (
103- left = [i for (i , c ) in enumerate (b .line ) if c in ["-" , "^" ]],
108+ left = [i for (i , c ) in enumerate (b .line ) if c in ["-" , "^" ]], # type: ignore
104109 right = [],
105- newline = c .line ,
110+ newline = c .line , # type: ignore
106111 skip_lines = 2 ,
107112 )
108113
0 commit comments