+# Copyright (c) 2005 mudpy, Jeremy Stanley <fungi@yuggoth.org>, all rights reserved.
+# Licensed per terms in the LICENSE file distributed with this software.
+
+# persistent variables are stored in ini-style files supported by ConfigParser
+import ConfigParser
+
+# need to know the directory separator
+import os
+
+# hack to load all modules in the muff package
+import muff
+for module in muff.__all__:
+ exec("import " + module)
+
+class Element:
+ """An element of the universe."""
+ def __init__(self, key, origin, universe):
+ """Default values for the in-memory element variables."""
+ self.key = key
+ self.origin = origin
+ universe.contents[key] = self
+ if not universe.files[origin].data.has_section(key):
+ universe.files[origin].data.add_section(key)
+ def facets(self):
+ """Return a list of facets for this element."""
+ return universe.files[self.origin].data.options(self.key)
+ def get(self, facet):
+ """Retrieve values."""
+ if facet in dir(self): return self.facet
+ else:
+ try:
+ return universe.files[self.origin].data.get(self.key, facet)
+ except:
+ return None
+ def set(self, facet, value):
+ """Set values."""
+ if facet in universe.files[self.origin].data.options(self.key):
+ universe.files[self.origin].data.set(self.key, facet, value)
+ else: self.facet = value
+ def rec(self, facet, value):
+ """Add initial values to the record."""
+ universe.files[self.origin].data.set(self.key, facet, value)
+
+class DataFile:
+ """A file containing universe elements."""
+ def __init__(self, filename, universe):
+ filedir = os.sep.join(filename.split(os.sep)[:-1])
+ data = ConfigParser.SafeConfigParser()
+ data.read(filename)
+ self.filename = filename
+ self.data = data
+ universe.files[filename] = self
+ for section in data.sections():
+ if section == "include":
+ for option in data.options(section):
+ includefile = data.get(section, option)
+ if not includefile.startswith(os.sep):
+ includefile = filedir + os.sep + includefile
+ DataFile(includefile, universe)
+ else:
+ Element(section, filename, universe)
+ def save(self):
+ basedir = os.sep.join(self.filename.split(os.sep)[:-1])
+ if not os.access(basedir, os.F_OK): os.makedirs(basedir)
+ file_descriptor = file(self.filename, "w")
+ self.data.write(file_descriptor)
+ file_descriptor.flush()
+ file_descriptor.close()
+
+class Universe:
+ """The universe."""
+ def __init__(self):
+ filename = muffconf.get("files", "data")
+ if not filename.startswith(os.sep): filename = os.getcwd() + os.sep + filename
+ self.contents = {}
+ self.files = {}
+ DataFile(filename, self)
+ def save(self):
+ for key in self.files.keys(): self.files[key].save()
+
+def element_exists(key): return key in universe.contents.keys()
+
+# reload the muffconf module if the files:data setting does not exist
+try:
+ if muffconf.get("files", "data"): pass
+except AttributeError:
+ reload(muffconf)
+
+# if there is no universe, create an empty one
+if not "universe" in dir(): universe = Universe()
+