1 # Copyright (c) 2005 mudpy, Jeremy Stanley <fungi@yuggoth.org>, all rights reserved.
2 # Licensed per terms in the LICENSE file distributed with this software.
4 # persistent variables are stored in ini-style files supported by ConfigParser
7 # need to know the directory separator
10 # hack to load all modules in the muff package
12 for module in muff.__all__:
13 exec("import " + module)
16 """An element of the universe."""
17 def __init__(self, key, origin, universe):
18 """Default values for the in-memory element variables."""
21 universe.contents[key] = self
22 if not universe.files[origin].data.has_section(key):
23 universe.files[origin].data.add_section(key)
25 """Return a list of facets for this element."""
26 return universe.files[self.origin].data.options(self.key)
28 """Retrieve values."""
29 if facet in dir(self): return self.facet
32 return universe.files[self.origin].data.get(self.key, facet)
35 def set(self, facet, value):
37 if facet in universe.files[self.origin].data.options(self.key):
38 universe.files[self.origin].data.set(self.key, facet, value)
39 else: self.facet = value
40 def rec(self, facet, value):
41 """Add initial values to the record."""
42 universe.files[self.origin].data.set(self.key, facet, value)
45 """A file containing universe elements."""
46 def __init__(self, filename, universe):
47 filedir = os.sep.join(filename.split(os.sep)[:-1])
48 data = ConfigParser.SafeConfigParser()
50 self.filename = filename
52 universe.files[filename] = self
53 for section in data.sections():
54 if section == "include":
55 for option in data.options(section):
56 includefile = data.get(section, option)
57 if not includefile.startswith(os.sep):
58 includefile = filedir + os.sep + includefile
59 DataFile(includefile, universe)
61 Element(section, filename, universe)
63 basedir = os.sep.join(self.filename.split(os.sep)[:-1])
64 if not os.access(basedir, os.F_OK): os.makedirs(basedir)
65 file_descriptor = file(self.filename, "w")
66 self.data.write(file_descriptor)
67 file_descriptor.flush()
68 file_descriptor.close()
73 filename = muffconf.get("files", "data")
74 if not filename.startswith(os.sep): filename = os.getcwd() + os.sep + filename
77 DataFile(filename, self)
79 for key in self.files.keys(): self.files[key].save()
81 def element_exists(key): return key in universe.contents.keys()
83 # reload the muffconf module if the files:data setting does not exist
85 if muffconf.get("files", "data"): pass
86 except AttributeError:
89 # if there is no universe, create an empty one
90 if not "universe" in dir(): universe = Universe()