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

coalib.output.ConfWriter   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 85
Duplicated Lines 0 %
Metric Value
dl 0
loc 85
rs 10
wmc 25

3 Methods

Rating   Name   Duplication   Size   Complexity  
A coalib.output.format_lines() 0 3 2
A coalib.output.print_section_beginning() 0 10 1
A coalib.output.nothing_done() 0 8 1
1
from pyprint.ClosableObject import ClosableObject
2
3
from coalib.settings.Section import Section
4
5
6
class ConfWriter(ClosableObject):
7
    def __init__(self,
8
                 file_name,
9
                 key_value_delimiter='=',
10
                 key_delimiter=',',
11
                 section_name_surrounding_beg='[',
12
                 section_name_surrounding_end="]",
13
                 unsavable_keys=("save",)):
14
        ClosableObject.__init__(self)
15
        self.__file_name = file_name
16
        self.__file = open(self.__file_name, "w")
17
        self.__key_value_delimiter = key_value_delimiter
18
        self.__key_delimiter = key_delimiter
19
        self.__section_name_surrounding_beg = section_name_surrounding_beg
20
        self.__section_name_surrounding_end = section_name_surrounding_end
21
        self.__unsavable_keys = unsavable_keys
22
        self.__wrote_newline = True
23
        self.__closed = False
24
25
    def _close(self):
26
        self.__file.close()
27
28
    def write_sections(self, sections):
29
        assert not self.__closed
30
31
        self.__wrote_newline = True
32
        for section in sections:
33
            self.write_section(sections[section])
34
35
    def write_section(self, section):
36
        assert not self.__closed
37
38
        if not isinstance(section, Section):
39
            raise TypeError
40
41
        self.__write_section_name(section.name)
42
43
        keys = []
44
        val = None
45
        section_iter = section.__iter__(ignore_defaults=True)
46
        try:
47
            while True:
48
                setting = section[next(section_iter)]
49
                if (str(setting) == val and
50
                    not self.is_comment(setting.key) and
51
                   (
52
                        (setting.key not in self.__unsavable_keys) or
53
                        (not setting.from_cli))):
54
                    keys.append(setting.key)
55
                elif ((setting.key not in self.__unsavable_keys) or
56
                      (not setting.from_cli)):
57
                    self.__write_key_val(keys, val)
58
                    keys = [setting.key]
59
                    val = str(setting)
60
        except StopIteration:
61
            self.__write_key_val(keys, val)
62
63
    def __write_section_name(self, name):
64
        assert not self.__closed
65
66
        if not self.__wrote_newline:
67
            self.__file.write("\n")
68
69
        self.__file.write(self.__section_name_surrounding_beg + name +
70
                          self.__section_name_surrounding_end + '\n')
71
        self.__wrote_newline = False
72
73
    def __write_key_val(self, keys, val):
74
        assert not self.__closed
75
76
        if keys == []:
77
            return
78
79
        if all(self.is_comment(key) for key in keys):
80
            self.__file.write(val + "\n")
81
            self.__wrote_newline = val == ""
82
            return
83
84
        self.__file.write((self.__key_delimiter + " ").join(keys) + " " +
85
                          self.__key_value_delimiter + " " + val + "\n")
86
        self.__wrote_newline = False
87
88
    @staticmethod
89
    def is_comment(key):
90
        return key.lower().startswith("comment")
91