2
# Copyright (c) 2008 Canonical
4
# Written by Marc Tardif <marc@interunion.ca>
6
# This file is part of Checkbox.
8
# Checkbox is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# Checkbox is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
27
class Template(object):
29
def __init__(self, filename_field=None, unique_fields=[]):
30
self._filename_field = filename_field
31
self._unique_fields = unique_fields
33
def _reader(self, file, size=4096, delimiter="\n\n"):
36
buffer_new = file.read(size)
40
lines = (buffer_old + buffer_new).split(delimiter)
41
buffer_old = lines.pop(-1)
48
def load_file(self, file, filename="<stream>"):
50
for string in self._reader(file):
56
def _save(field, value, extended):
57
extended = extended.rstrip("\n")
59
if element.has_key(field):
61
"Template %s has a duplicate field '%s'" \
62
" with a new value '%s'." \
63
% (filename, field, value)
64
element[field] = value
66
element["%s_extended" % field] = extended
68
string = string.strip("\n")
69
field = value = extended = ""
70
for line in string.split("\n"):
72
match = re.search(r"^([-_.A-Za-z0-9]*):\s?(.*)", line)
74
_save(field, value, extended)
75
field = match.groups()[0].lower()
76
value = match.groups()[1].rstrip()
80
if re.search(r"^\s\.$", line):
84
match = re.search(r"^\s(\s+.*)", line)
86
bit = match.groups()[0].rstrip()
87
if len(extended) and not re.search(r"[\n ]$", extended):
90
extended += bit + "\n"
93
match = re.search(r"^\s(.*)", line)
95
bit = match.groups()[0].rstrip()
96
if len(extended) and not re.search(r"[\n ]$", extended):
102
raise Exception, "Template %s parse error at: %s" \
105
_save(field, value, extended)
108
if self._filename_field:
109
if self._filename_field in element:
111
"Template %s already contains filename field: %s" \
112
% (filename, self._filename_field)
113
element[self._filename_field] = posixpath.basename(filename)
115
for unique_field in self._unique_fields:
116
if [e for e in elements \
117
if e[unique_field] == element[unique_field]]:
119
"Template %s contains duplicate fields: %s" \
120
% (filename, unique_field)
122
elements.append(element)
126
def load_filename(self, filename):
127
logging.info("Loading elements from filename: %s", filename)
129
file = open(filename, "r")
130
return self.load_file(file, filename)
132
def load_directory(self, directory, blacklist=[], whitelist=[]):
133
logging.info("Loading filenames from directory: %s", directory)
139
names = [n for n in os.listdir(directory) if n not in blacklist]
142
if name.startswith(".") or name.endswith("~"):
143
logging.info("Ignoring filename: %s", name)
146
filename = posixpath.join(directory, name)
147
elements.extend(self.load_filename(filename))
151
def load_directories(self, directories, blacklist=[], whitelist=[]):
153
for directory in directories:
154
elements.extend(self.load_directory(directory, blacklist, whitelist))