Passed
Pull Request — master (#199)
by Jan
05:10 queued 30s
created

Client._get_rules()   A

Complexity

Conditions 2

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 5
nop 1
dl 0
loc 5
ccs 5
cts 5
cp 1
crap 2
rs 10
c 0
b 0
f 0
1 1
import argparse
2 1
import re
3 1
import sys
4 1
from datetime import datetime
5
6 1
from .. import __version__
7
8 1
IS_INQUIRER_INSTALLED = True
9 1
try:
10 1
    import inquirer
11 1
    from inquirer.questions import Checkbox as checkbox
12
except ImportError:
13
    IS_INQUIRER_INSTALLED = False
14
15
16 1
class Client():
17 1
    def __init__(self, args):
18 1
        self.arg = self.parse_arguments(args)
19
20 1
        self.source_filename = self.arg.source_filename
21 1
        self.rule_name = self.arg.rule_id
22
23 1
        self.isatty = sys.stdout.isatty()
24
25 1
        self.all_rules = self.arg.all
26 1
        self.show_failed_rules = False
27 1
        self.show_not_selected_rules = False
28 1
        self.show_not_tested_rules = False
29
30 1
    @staticmethod
31
    def _get_message():
32 1
        return {
33
            'description': '',
34
            'source_filename': '',
35
        }
36
37 1
    @staticmethod
38
    def _get_date():
39 1
        return str(datetime.now().strftime("-%d_%m_%Y-%H_%M_%S"))
40
41
    # Functions for selection of rules
42
43 1
    def search_rules_id(self):
44
        """
45
        Function retunes array of all matched IDs of rules in selected file.
46
        """
47 1
        raise NotImplementedError
48
49 1
    def get_only_fail_rule(self, rules):
50
        """
51
        Function processes array of matched IDs of rules in selected file.
52
        Function retunes array of failed matched IDs of rules in selected file.
53
        """
54 1
        raise NotImplementedError
55
56 1
    def _get_rows_of_unselected_rules(self):
57
        """
58
        Function retunes array of rows where is not selected IDs of rules in selected file.
59
        """
60 1
        raise NotImplementedError
61
62 1
    def _get_rows_not_visualizable_rules(self):
63
        """
64
        Function retunes array of rows where is not selected IDs of rules in selected file.
65
        """
66
        raise NotImplementedError
67
68 1
    def run_gui_and_return_answers(self):
69 1
        if self.isatty:
70 1
            if self.all_rules:
71 1
                return self._get_rules()
72
73 1
            if IS_INQUIRER_INSTALLED:
74 1
                return inquirer.prompt(self.get_questions())
75
76
            print(self.get_selection_rules())
77
            return None
78 1
        return self._get_rules()
79
80 1
    def _get_rules(self):
81 1
        rules = self.search_rules_id()
82 1
        if self.show_failed_rules:
83 1
            return {'rules': self.get_only_fail_rule(rules)}
84 1
        return {'rules': rules}
85
86 1
    def _get_list_of_matched_rules(self):
87 1
        rules = self.search_rules_id()
88 1
        if self.show_failed_rules:
89 1
            return self.get_only_fail_rule(rules)
90 1
        return rules
91
92 1
    def _get_list_of_lines(self):
93
        lines = ['== The Rule ID regular expressions ==']
94
        for rule in self._get_list_of_matched_rules():
95
            lines.append("^" + rule + "$")
96
        if self.show_not_selected_rules and not self.show_not_tested_rules:
97
            for line in self._get_rows_of_unselected_rules():
98
                lines.append(line)
99
        if not self.show_not_selected_rules and self.show_not_tested_rules:
100
            for line in self._get_rows_not_visualizable_rules():
101
                lines.append(line)
102
        lines.append(
103
            "Interactive rule selection is not available,"
104
            " because inquirer is not installed."
105
            " Copy id of the rule you want to visualize and"
106
            " paste it into a command with regular"
107
            " expression characters(^$).\n"
108
            "Alternatively, use the --all or --all-in-one arguments.")
109
        return lines
110
111 1
    def get_selection_rules(self):
112
        return "\n".join(self._get_list_of_lines())
113
114 1
    def _get_choices(self):
115 1
        if self.show_not_selected_rules and not self.show_not_tested_rules:
116 1
            print("\n".join(self._get_rows_of_unselected_rules()))
117 1
        if not self.show_not_selected_rules and self.show_not_tested_rules:
118
            print("\n".join(self._get_rows_not_visualizable_rules()))
119 1
        return self._get_list_of_matched_rules()
120
121 1
    def get_questions(self):
122 1
        choices = self._get_choices()
123 1
        questions = [
124
            checkbox(
125
                'rules',
126
                message=(
127
                    "= The Rules IDs = (move - UP and DOWN arrows,"
128
                    " select - SPACE or LEFT and RIGHT arrows, submit - ENTER)"),
129
                choices=choices,
130
            ),
131
        ]
132 1
        return questions
133
134 1
    def _get_wanted_rules(self, rules):
135 1
        return [
136
            x for x in rules if re.search(
137
                self.rule_name, x)]
138
139
    # Function for setting arguments
140
141 1
    def parse_arguments(self, args):
142 1
        parser = argparse.ArgumentParser(
143
            prog='oval-graph',
144
            description=self._get_message().get('description'))
145 1
        self.prepare_parser(parser)
146 1
        if args is None:
147
            return parser.parse_args()
148 1
        return parser.parse_args(args)
149
150 1
    @staticmethod
151
    def prepare_args_when_user_can_list_in_rules(parser):
152 1
        parser.add_argument(
153
            '--show-failed-rules',
154
            action="store_true",
155
            default=False,
156
            help="Show only FAILED rules")
157 1
        parser.add_argument(
158
            '--show-not-selected-rules',
159
            action="store_true",
160
            default=False,
161
            help="Show notselected rules. These rules will not be visualized.")
162 1
        parser.add_argument(
163
            '--show-not-tested-rules',
164
            action="store_true",
165
            default=False,
166
            help="Show not tested rules. These rules will not be visualized.")
167
168 1
    def prepare_parser(self, parser):
169 1
        parser.add_argument(
170
            '--version',
171
            action='version',
172
            version='%(prog)s ' + __version__)
173 1
        parser.add_argument(
174
            '-a',
175
            '--all',
176
            action="store_true",
177
            default=False,
178
            help="Process all matched rules.")
179 1
        parser.add_argument(
180
            '--hide-passing-tests',
181
            action="store_true",
182
            default=False,
183
            help=(
184
                "Do not display passing tests for better orientation in"
185
                " graphs that contain a large amount of nodes."))
186 1
        parser.add_argument(
187
            '-v',
188
            '--verbose',
189
            action="store_true",
190
            default=False,
191
            help="Displays details about the results of the running command.")
192 1
        parser.add_argument(
193
            '-o',
194
            '--output',
195
            action="store",
196
            default=None,
197
            help='The file where to save output.')
198 1
        parser.add_argument(
199
            "source_filename",
200
            help=self._get_message().get('source_filename'))
201 1
        parser.add_argument(
202
            "rule_id", help=(
203
                "Rule ID to be visualized. A part from the full rule ID"
204
                " a part of the ID or a regular expression can be used."
205
                " If brackets are used in the regular expression "
206
                "the regular expression must be quoted."))
207