1 # Copyright (c) 2005 MUDpy, The Fungi <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, universe, origin=""):
18 """Default values for the in-memory element variables."""
20 if self.key.find(":") > 0:
21 self.category, self.subkey = self.key.split(":", 1)
23 self.category = "other"
24 self.subkey = self.key
25 if not self.category in universe.categories: self.category = "other"
26 universe.categories[self.category][self.subkey] = self
28 if not self.origin: self.origin = universe.default_origins[self.category]
29 if not self.origin.startswith(os.sep):
30 self.origin = os.getcwd() + os.sep + self.origin
31 universe.contents[self.key] = self
32 if not self.origin in universe.files:
33 DataFile(self.origin, universe)
34 if not universe.files[self.origin].data.has_section(self.key):
35 universe.files[self.origin].data.add_section(self.key)
37 muffmisc.log("Deleting: " + self.key + ".")
38 universe.files[self.origin].data.remove_section(self.key)
39 del universe.categories[self.category][self.subkey]
40 del universe.contents[self.key]
43 """Return a list of facets for this element."""
44 return universe.files[self.origin].data.options(self.key)
46 """Retrieve values."""
47 if universe.files[self.origin].data.has_option(self.key, facet):
48 return universe.files[self.origin].data.get(self.key, facet)
51 def getboolean(self, facet, default=False):
52 """Retrieve values as boolean type."""
53 if universe.files[self.origin].data.has_option(self.key, facet):
54 return universe.files[self.origin].data.getboolean(self.key, facet)
57 def getint(self, facet):
58 """Convenience method to coerce return values as type int."""
59 value = self.get(facet)
60 if not value: value = 0
61 elif type(value) is str: value = value.rstrip("L")
63 def getfloat(self, facet):
64 """Convenience method to coerce return values as type float."""
65 value = self.get(facet)
66 if not value: value = 0
67 elif type(value) is str: value = value.rstrip("L")
69 def set(self, facet, value):
71 if not type(value) is str: value = repr(value)
72 universe.files[self.origin].data.set(self.key, facet, value)
75 """A file containing universe elements."""
76 def __init__(self, filename, universe):
77 filedir = os.sep.join(filename.split(os.sep)[:-1])
78 self.data = ConfigParser.SafeConfigParser()
79 if os.access(filename, os.R_OK): self.data.read(filename)
80 self.filename = filename
81 universe.files[filename] = self
82 if "categories" in self.data.sections():
83 for option in self.data.options("categories"):
84 universe.default_origins[option] = self.data.get("categories", option)
85 if not option in universe.categories:
86 universe.categories[option] = {}
87 for section in self.data.sections():
88 if section == "categories" or section == "include":
89 for option in self.data.options(section):
90 includefile = self.data.get(section, option)
91 if not includefile.startswith(os.sep):
92 includefile = filedir + os.sep + includefile
93 DataFile(includefile, universe)
94 elif section != "control":
95 Element(section, universe, filename)
97 if self.data.sections() and not ( "control" in self.data.sections() and self.data.getboolean("control", "read_only") ):
98 basedir = os.sep.join(self.filename.split(os.sep)[:-1])
99 if not os.access(basedir, os.F_OK): os.makedirs(basedir)
100 file_descriptor = file(self.filename, "w")
101 self.data.write(file_descriptor)
102 file_descriptor.flush()
103 file_descriptor.close()
107 def __init__(self, filename=""):
108 """Initialize the universe."""
111 self.default_origins = {}
114 possible_filenames = [
120 "/usr/local/mudpy/mudpy.conf",
121 "/usr/local/mudpy/etc/mudpy.conf",
122 "/etc/mudpy/mudpy.conf",
125 for filename in possible_filenames:
126 if os.access(filename, os.R_OK): break
127 if not filename.startswith(os.sep):
128 filename = os.getcwd() + os.sep + filename
129 DataFile(filename, self)
131 """Save the universe to persistent storage."""
132 for key in self.files: self.files[key].save()
134 # if there is no universe, create an empty one
135 if not "universe" in locals(): universe = Universe()