~pieq/checkbox/fix-1576570-stress-test-progress-log

« back to all changes in this revision

Viewing changes to checkbox-support/checkbox_support/lib/template.py

  • Committer: Sylvain Pineau
  • Date: 2014-01-07 13:39:38 UTC
  • mto: This revision was merged to the branch mainline in revision 2588.
  • Revision ID: sylvain.pineau@canonical.com-20140107133938-46v5ehofwa9whl1e
checkbox-support: Copy required modules from checkbox-old/checkbox

and their corresponding tests

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# This file is part of Checkbox.
 
3
#
 
4
# Copyright 2008 Canonical Ltd.
 
5
#
 
6
# Checkbox is free software: you can redistribute it and/or modify
 
7
# it under the terms of the GNU General Public License version 3,
 
8
# as published by the Free Software Foundation.
 
9
 
 
10
#
 
11
# Checkbox is distributed in the hope that it will be useful,
 
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
# GNU General Public License for more details.
 
15
#
 
16
# You should have received a copy of the GNU General Public License
 
17
# along with Checkbox.  If not, see <http://www.gnu.org/licenses/>.
 
18
#
 
19
import re
 
20
import logging
 
21
 
 
22
 
 
23
EXTENDED_STRING = "_extended"
 
24
 
 
25
 
 
26
class Template:
 
27
 
 
28
    def _reader(self, file, size=4096, delimiter=r"\n{2,}"):
 
29
        buffer_old = ""
 
30
        while True:
 
31
            buffer_new = file.read(size)
 
32
            if not buffer_new:
 
33
                break
 
34
 
 
35
            lines = re.split(delimiter, buffer_old + buffer_new)
 
36
            buffer_old = lines.pop(-1)
 
37
 
 
38
            for line in lines:
 
39
                yield line
 
40
 
 
41
        yield buffer_old
 
42
 
 
43
    def dump_file(self, elements, file, filename="<stream>"):
 
44
        for element in elements:
 
45
            for long_key in list(element.keys()):
 
46
                if long_key.endswith(EXTENDED_STRING):
 
47
                    short_key = long_key.replace(EXTENDED_STRING, "")
 
48
                    del element[short_key]
 
49
 
 
50
            for key, value in element.items():
 
51
                if key.endswith(EXTENDED_STRING):
 
52
                    key = key.replace(EXTENDED_STRING, "")
 
53
                    file.write("%s:\n" % key)
 
54
                    for line in value.split("\n"):
 
55
                        file.write(" %s\n" % line)
 
56
                elif isinstance(value, (list, tuple)):
 
57
                    file.write("%s:\n" % key)
 
58
                    for v in value:
 
59
                        file.write(" %s\n" % v)
 
60
                else:
 
61
                    file.write("%s: %s\n" % (key, value))
 
62
 
 
63
            file.write("\n")
 
64
 
 
65
    def dump_filename(self, elements, filename):
 
66
        logging.info("Dumping elements to filename: %s", filename)
 
67
 
 
68
        with open(filename, "w") as stream:
 
69
            return self.dump_file(elements, stream, filename)
 
70
 
 
71
    def load_file(self, file, filename="<stream>"):
 
72
        elements = []
 
73
        for string in self._reader(file):
 
74
            if not string:
 
75
                break
 
76
 
 
77
            element = {}
 
78
 
 
79
            def _save(field, value, extended):
 
80
                extended = extended.rstrip("\n")
 
81
                if field:
 
82
                    if field in element:
 
83
                        raise Exception("Template %s has a duplicate "
 
84
                            "field '%s' with a new value '%s'." 
 
85
                                % (filename, field, value))
 
86
                    element[field] = value
 
87
                    if extended:
 
88
                        element["%s%s" % (field, EXTENDED_STRING)] = extended
 
89
 
 
90
            string = string.strip("\n")
 
91
            field = value = extended = ""
 
92
            for line in string.split("\n"):
 
93
                line.strip()
 
94
                if line.startswith("#"):
 
95
                    continue
 
96
 
 
97
                match = re.search(r"^([-_.A-Za-z0-9@]*):\s?(.*)", line)
 
98
                if match:
 
99
                    _save(field, value, extended)
 
100
                    field = match.groups()[0]
 
101
                    value = match.groups()[1].rstrip()
 
102
                    extended = ""
 
103
                    continue
 
104
 
 
105
                if re.search(r"^\s\.$", line):
 
106
                    extended += "\n\n"
 
107
                    continue
 
108
 
 
109
                match = re.search(r"^\s(\s+.*)", line)
 
110
                if match:
 
111
                    bit = match.groups()[0].rstrip()
 
112
                    if len(extended) and not re.search(r"[\n ]$", extended):
 
113
                        extended += "\n"
 
114
 
 
115
                    extended += bit + "\n"
 
116
                    continue
 
117
 
 
118
                match = re.search(r"^\s(.*)", line)
 
119
                if match:
 
120
                    bit = match.groups()[0].rstrip()
 
121
                    if len(extended) and not re.search(r"[\n ]$", extended):
 
122
                        if extended.endswith("\\"):
 
123
                            extended = extended[:-1].rstrip() + " "
 
124
                        else:
 
125
                            extended += "\n"
 
126
 
 
127
                    extended += bit
 
128
                    continue
 
129
 
 
130
                raise Exception("Template %s parse error at: %s" \
 
131
                    % (filename, line))
 
132
 
 
133
            _save(field, value, extended)
 
134
 
 
135
            elements.append(element)
 
136
 
 
137
        return elements
 
138
 
 
139
    def load_filename(self, filename):
 
140
        logging.info("Loading elements from filename: %s", filename)
 
141
 
 
142
        with open(filename, "r", encoding="utf-8") as stream:
 
143
            return self.load_file(stream, filename)