X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2Fmisc.py;h=d43a7e24cac61f70722aa29336627eafad8b947e;hp=b0b729089a00b7896a738217860c05a9ad6b8ac5;hb=182e0d2f5d588b71c57272686255a1f6684a2adf;hpb=06d1068372f462904a718ffbbe38d9603e71873a diff --git a/mudpy/misc.py b/mudpy/misc.py index b0b7290..d43a7e2 100644 --- a/mudpy/misc.py +++ b/mudpy/misc.py @@ -23,7 +23,7 @@ class Element: """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 @@ -62,21 +62,16 @@ class Element: 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: @@ -88,8 +83,7 @@ class Element: 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): @@ -351,11 +345,10 @@ class Universe: """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() @@ -404,11 +397,20 @@ class Universe: 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]) @@ -505,6 +507,19 @@ class Universe: """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: @@ -917,7 +932,7 @@ 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( @@ -1375,10 +1390,8 @@ def on_pulse(): 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"): @@ -1704,7 +1717,7 @@ def handler_entering_account_name(user): 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" @@ -2163,7 +2176,7 @@ def command_show(actor, parameters): 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): @@ -2298,7 +2311,7 @@ def command_set(actor, parameters): 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".' %