Failed Conditions
Pull Request — master (#1152)
by Lasse
03:36
created

coalib.results.result_actions.Result.__add__()   B

Complexity

Conditions 5

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 5
dl 0
loc 16
rs 8.5455
1
import difflib
2
from pyprint.ConsolePrinter import ConsolePrinter
3
4
from coalib.results.result_actions.ResultAction import ResultAction
5
from coalib.results.Result import Result
6
7
8
def format_line(line, real_nr="", sign="|", mod_nr="", symbol="", ):
9
    return "|{:>4}{}{:>4}|{:1}{}".format(real_nr,
10
                                         sign,
11
                                         mod_nr,
12
                                         symbol,
13
                                         line.rstrip("\n"))
14
15
16
def print_beautified_diff(difflines, printer):
17
    current_line_added = None
18
    current_line_subtracted = None
19
    for line in difflines:
20
        if line.startswith("@@"):
21
            values = line[line.find("-"):line.rfind(" ")]
22
            subtracted, added = tuple(values.split(" "))
23
            current_line_added = int(added.split(",")[0][1:])
24
            current_line_subtracted = int(subtracted.split(",")[0][1:])
25
        elif line.startswith("---"):
26
            printer.print(format_line(line[4:], real_nr="----"), color="red")
27
        elif line.startswith("+++"):
28
            printer.print(format_line(line[4:], mod_nr="++++"),
29
                          color="green")
30
        elif line.startswith("+"):
31
            printer.print(format_line(line[1:],
32
                                      mod_nr=current_line_added,
33
                                      symbol="+"),
34
                          color="green")
35
            current_line_added += 1
36
        elif line.startswith("-"):
37
            printer.print(format_line(line[1:],
38
                                      real_nr=current_line_subtracted,
39
                                      symbol="-"),
40
                          color="red")
41
            current_line_subtracted += 1
42
        else:
43
            printer.print(format_line(line[1:],
44
                                      real_nr=current_line_subtracted,
45
                                      mod_nr=current_line_added,
46
                                      symbol=" "))
47
            current_line_subtracted += 1
48
            current_line_added += 1
49
50
51
class ShowPatchAction(ResultAction):
52
    @classmethod
53
    def is_applicable(cls, result, original_file_dict, file_diff_dict):
54
        return isinstance(result, Result) and result.diffs is not None
55
56
    def apply(self,
57
              result,
58
              original_file_dict,
59
              file_diff_dict,
60
              colored: bool=True):
61
        '''
62
        Print a diff of the patch that would be applied.
63
64
        :param colored: Wether or not to use colored output.
65
        '''
66
        printer = ConsolePrinter(colored)
67
68
        for filename, this_diff in sorted(result.diffs.items()):
69
            original_file = original_file_dict[filename]
70
            try:
71
                current_file = file_diff_dict[filename].modified
72
                new_file = (file_diff_dict[filename] + this_diff).modified
73
            except KeyError:
74
                current_file = original_file
75
                new_file = this_diff.modified
76
77
            print_beautified_diff(difflib.unified_diff(current_file,
78
                                                       new_file,
79
                                                       fromfile=filename,
80
                                                       tofile=filename),
81
                                   printer)
82
83
        return file_diff_dict
84