1 import re
2 import copy
3
4 import Parser
5 import Warning
6 import Exception
7 import Table
8 import Helper
9
11 - def __init__(self, parser_function, default_key = None, default_parser_dict = None, name = None):
12 self.parser_function = parser_function
13 self.default_key = default_key
14 self.name = name
15 self.parser_dict = default_parser_dict or {}
16 self.attributes = {}
17
18 - def parse(self, string, part = None):
19 if part:
20 self.changeParserDict(part)
21 dictionary = {"str" : string}
22 dictionary.update(self.parser_dict)
23 return self.parser_function(dictionary)
24
26 if not value:
27 if not self.default_key:
28 return
29 key = self.default_key
30 value = key_or_value
31 else:
32 key = key_or_value
33 self.parser_dict[key] = value
34
36 return self.attributes.get(name)
37
39 self.attributes[name] = value
40
62
68
71
81
83 self.column = column
84 self.column.changeParserDict(self.parsing_value)
85 if self.column.name in ["ID", "ReactionID", "ReactionFormula", "Name"]:
86 try:
87 if self.parsing_value not in table.getDocument().knownValues(Table.ResourceTable, "ResourceName"):
88 Warning.warn(Warning.FirstLineWarning(table.filename, "The identifier value for %s is not known (%s)." % (self.column.name, self.parsing_value)))
89 else:
90 if self.column.name in ["ID", "ReactionID"]:
91
92 resource_tables = table.getDocument().getTables(Table.ResourceTable)
93 for resource_table in resource_tables:
94 for resource in resource_table:
95 if resource.getResource() == self.parsing_value:
96 self.column.changeParserDict("re", re.compile(resource.getIDPattern()))
97 except Exception.NoDocumentError:
98 Warning.warn(Warning.FirstLineWarning(table.filename, "The identifier value for %s could not be validated (%s). For this Table, a Document with a ResourceTable should be present" % (self.column.name, self.parsing_value)))
99
101 format_string = "%(name)s"
102 if self.parsing_value:
103 format_string = format_string + ":%(parsing_value)s"
104 if self.unit:
105 format_string = format_string + " [%(unit)s]"
106 return format_string % self.__dict__
107
110
112 copied = copy.deepcopy(self)
113 copied.name = self.name[begin:end]
114 return copied
115
117 return other + self.name
118
121
163
192