7 key_pattern = re.compile("^[A-Za-z0-9_-]+$")
9 class MoeStatusInvalid(Exception):
13 """Moe status file."""
18 def __getitem__(self, k):
19 if not self.stat.has_key(k): return None
21 if type(v) == types.ListType:
22 if len(v) > 0: return v[0]
26 def __setitem__(self, k, v):
30 return self.stat.keys()
32 def get_list(self, k):
36 elif type(m[k]) != types.ListType:
40 def dump(self, prefix=""):
42 Dump status in metafile format.
43 Return a list of lines, `prefix` is indent prefix.
46 for k,v in self.stat.items():
47 if type(v) == types.ListType: vals = v
50 if isinstance(w, Status):
51 l.append(prefix + k + "(\n")
52 l.extend(self.str_lines(prefix+" "))
53 l.append(prefix + ")\n")
55 l.append(prefix + k + ":" + str(w) + "\n")
58 def write(self, f=None, name=None):
60 Write status (as a metafile) to `f` or file `name` or `stdout`
62 if not f and name is not None:
63 with open(name, "w") as f:
72 def read(self, file=None, name=None):
75 file = open(name, "r")
81 def read_val(self, k, v):
82 if not key_pattern.match(k):
83 raise MoeStatusInvalid, "Parse error: invalid key syntax"
88 self.get_list(k).append(v)
90 def do_read(self, file):
93 for x in file.readlines():
94 x = x.rstrip("\n").lstrip(" \t")
95 if x=="" or x.startswith("#"):
103 elif x.endswith("("):
106 this.read_val(k, new)
111 raise MoeStatusInvalid, "Parse error: incorrect nesting"
115 raise MoeStatusInvalid, "Parse error: malformed line"