91a4ca57d08cd19c6df39d35ea995d1d5fe5f41d
[mudpy.git] / lib / muff / muffuniv.py
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.
3
4 # persistent variables are stored in ini-style files supported by ConfigParser
5 import ConfigParser
6
7 # need to know the directory separator
8 import os
9
10 # hack to load all modules in the muff package
11 import muff
12 for module in muff.__all__:
13         exec("import " + module)
14
15 class Element:
16         """An element of the universe."""
17         def __init__(self, key, origin, universe):
18                 """Default values for the in-memory element variables."""
19                 self.key = key
20                 self.origin = origin
21                 universe.contents[key] = self
22                 if not universe.files[origin].data.has_section(key):
23                         universe.files[origin].data.add_section(key)
24         def facets(self):
25                 """Return a list of facets for this element."""
26                 return universe.files[self.origin].data.options(self.key)
27         def get(self, facet):
28                 """Retrieve values."""
29                 if facet in dir(self): return self.facet
30                 else:
31                         try:
32                                 return universe.files[self.origin].data.get(self.key, facet)
33                         except:
34                                 return None
35         def set(self, facet, value):
36                 """Set values."""
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)
43
44 class DataFile:
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()
49                 data.read(filename)
50                 self.filename = filename
51                 self.data = data
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)
60                         else:
61                                 Element(section, filename, universe)
62         def save(self):
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()
69
70 class Universe:
71         """The universe."""
72         def __init__(self):
73                 filename = muffconf.get("files", "data")
74                 if not filename.startswith(os.sep): filename = os.getcwd() + os.sep + filename
75                 self.contents = {}
76                 self.files = {}
77                 DataFile(filename, self)
78         def save(self):
79                 for key in self.files.keys(): self.files[key].save()
80
81 def element_exists(key): return key in universe.contents.keys()
82
83 # reload the muffconf module if the files:data setting does not exist
84 try:
85         if muffconf.get("files", "data"): pass
86 except AttributeError:
87         reload(muffconf)
88
89 # if there is no universe, create an empty one
90 if not "universe" in dir(): universe = Universe()
91