"""An element of the universe."""
- def __init__(self, key, universe, filename=None, old_style=False):
+ def __init__(self, key, universe, origin=None, old_style=False):
"""Set up a new element."""
# TODO(fungi): This can be removed after the transition is complete
self.category = "other"
self.subkey = self.key
if self.category not in self.universe.categories:
- self.category = "other"
- self.subkey = self.key
+ self.universe.categories[self.category] = {}
- # get an appropriate filename for the origin
- if not filename:
- filename = self.universe.default_origins[self.category]
- if not os.path.isabs(filename):
- filename = os.path.abspath(filename)
-
- # add the file if it doesn't exist yet
- if filename not in self.universe.files:
- mudpy.data.DataFile(filename, self.universe)
+ # get an appropriate origin
+ if not origin:
+ self.universe.add_category(self.category)
+ origin = self.universe.files[
+ self.universe.origins[self.category]["fallback"]]
# record or reset a pointer to the origin file
- self.origin = self.universe.files[filename]
+ self.origin = self.universe.files[origin.source]
# add a data section to the origin if necessary
if self.key not in self.origin.data:
def reload(self):
"""Create a new element and replace this one."""
- Element(self.key, self.universe, self.origin.filename,
- old_style=self.old_style)
+ Element(self.key, self.universe, self.origin, old_style=self.old_style)
del(self)
def destroy(self):
"""Initialize the universe."""
self.categories = {}
self.contents = {}
- self.default_origins = {}
self.directions = set()
self.loading = False
self.loglines = []
- self.private_files = []
+ self.origins = {}
self.reload_flag = False
self.setup_loglines = []
self.startdir = os.getcwd()
del self.files[data_filename]
# start loading from the initial file
- mudpy.data.DataFile(self.filename, self)
+ mudpy.data.Data(self.filename, self)
+
+ # load default storage locations for categories
+ if hasattr(self, "contents") and "mudpy.filing" in self.contents:
+ self.origins.update(self.contents["mudpy.filing"].get(
+ "categories", {}))
+
+ # add some builtin categories we know we'll need
+ for category in ("account", "actor", "internal"):
+ self.add_category(category)
# make a list of inactive avatars
inactive_avatars = []
- for account in self.categories["account"].values():
+ for account in self.categories.get("account", {}).values():
for avatar in account.get("avatars"):
try:
inactive_avatars.append(self.contents[avatar])
"""Convenience method to get the elapsed time counter."""
return self.categories["internal"]["counters"].get("elapsed")
+ def add_category(self, category, fallback=None):
+ """Set up category tracking/metadata."""
+ if category not in self.origins:
+ self.origins[category] = {}
+ if not fallback:
+ fallback = mudpy.data.find_file(
+ ".".join((category, "yaml")), universe=self)
+ if "fallback" not in self.origins[category]:
+ self.origins[category]["fallback"] = fallback
+ flags = self.origins[category].get("flags", None)
+ if fallback not in self.files:
+ mudpy.data.Data(fallback, self, flags=flags)
+
class User:
counter = 0
while "avatar:" + self.account.get("name") + ":" + str(
counter
- ) in universe.categories["actor"].keys():
+ ) in universe.categories.get("actor", {}).keys():
counter += 1
self.avatar = Element(
"actor:avatar:" + self.account.get("name") + ":" + str(
user.pulse()
# add an element for counters if it doesn't exist
- if "counters" not in universe.categories["internal"]:
- universe.categories["internal"]["counters"] = Element(
- "internal:counters", universe, old_style=True
- )
+ if "counters" not in universe.categories.get("internal", {}):
+ Element("internal:counters", universe, old_style=True)
# update the log every now and then
if not universe.categories["internal"]["counters"].get("mark"):
user.error = "bad_name"
# if that account exists, time to request a password
- elif name in universe.categories["account"]:
+ elif name in universe.categories.get("account", {}):
user.account = universe.categories["account"][name]
user.state = "checking_password"
elif arguments[1].strip(".") in universe.contents:
element = universe.contents[arguments[1].strip(".")]
message = ('These are the properties of the "' + arguments[1]
- + '" element (in "' + element.origin.filename
+ + '" element (in "' + element.origin.source
+ '"):$(eol)')
facets = element.facets()
for facet in sorted(facets):
message = ('The "%s" element is kept in read-only file '
'"%s" and cannot be altered.' %
(element, universe.contents[
- element].origin.filename))
+ element].origin.source))
except ValueError:
message = ('Value "%s" of type "%s" cannot be coerced '
'to the correct datatype for facet "%s".' %