From 4045e0ec16a085117ac1b864ad57552042a5beab Mon Sep 17 00:00:00 2001 From: Griatch Date: Mon, 9 Feb 2015 22:02:44 +0100 Subject: [PATCH] Fixed batchprocessor readin. --- evennia/utils/batchprocessors.py | 31 +++++++++++-------------- evennia/utils/utils.py | 39 +++++++++++++++++++------------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/evennia/utils/batchprocessors.py b/evennia/utils/batchprocessors.py index ca832707a..d07fb0553 100644 --- a/evennia/utils/batchprocessors.py +++ b/evennia/utils/batchprocessors.py @@ -199,35 +199,30 @@ def read_batchfile(pythonpath, file_ending='.py'): """ # open the file - if pythonpath and not (pythonpath.startswith('evennia.') or pythonpath.startswith('game.') - or pythonpath.startswith('contrib.')): - abspaths = [] - for basepath in settings.BASE_BATCHPROCESS_PATHS: - abspaths.append(utils.pypath_to_realpath("%s.%s" % (basepath, pythonpath), file_ending)) - else: - abspaths = [utils.pypath_to_realpath(pythonpath, file_ending)] - text, fobj = None, None - fileerr, decoderr = [], [] + abspaths = [] + for basepath in settings.BASE_BATCHPROCESS_PATHS: + # note that pypath_to_realpath has already checked the file for existence + if basepath.startswith("evennia"): + basepath = basepath.split("evennia", 1)[-1] + abspaths.extend(utils.pypath_to_realpath("%s.%s" % (basepath, pythonpath), file_ending)) + if not abspaths: + raise IOError + text = None + decoderr = [] for abspath in abspaths: # try different paths, until we get a match # we read the file directly into unicode. for file_encoding in ENCODINGS: # try different encodings, in order try: - fobj = codecs.open(abspath, 'r', encoding=file_encoding) - text = fobj.read() - except IOError, e: - # could not find the file - fileerr.append(str(e)) - break + with codecs.open(abspath, 'r', encoding=file_encoding) as fobj: + text = fobj.read() except (ValueError, UnicodeDecodeError), e: # this means an encoding error; try another encoding decoderr.append(str(e)) continue break - if not fobj: - raise IOError("\n".join(fileerr)) - if not text: + if not text and decoderr: raise UnicodeDecodeError("\n".join(decoderr)) return text diff --git a/evennia/utils/utils.py b/evennia/utils/utils.py index b1f65e212..a7931abfc 100644 --- a/evennia/utils/utils.py +++ b/evennia/utils/utils.py @@ -312,26 +312,33 @@ def get_evennia_version(): def pypath_to_realpath(python_path, file_ending='.py'): """ - Converts a path on dot python form (e.g. 'evennia.objects.models') to - a system path ($ROOT_DIR/evennia/objects/models.py). Calculates all - paths as absoulte paths starting from the evennia main directory. + Converts a dotted Python path to an absolute path under the + Evennia library directory or under the current game directory. + + Args: + python_path (str): a dot-python path + file_ending (str): a file ending, including the period. + + Returns: + abspaths (list of str): The two absolute paths created by prepending + EVENNIA_DIR and GAME_DIR respectively. These are checked for + existence before being returned, so this may be an empty list. - Since it seems to be a common mistake to include the file ending - when entering filename for things like batchprocess, we handle the - case of erroneously adding the file ending too. """ + print "settings.EVENNIA_DIR:", settings.EVENNIA_DIR + print "settings.GAME_DIR:", settings.GAME_DIR + print python_path pathsplit = python_path.strip().split('.') - if python_path.endswith(file_ending): - # this is actually a malformed path ... - pathsplit = pathsplit[:-1] - if not pathsplit: - return python_path - path = settings.EVENNIA_DIR - for directory in pathsplit: - path = os.path.join(path, directory) + paths = [os.path.join(settings.EVENNIA_DIR, *pathsplit), + os.path.join(settings.GAME_DIR, *pathsplit)] if file_ending: - return "%s%s" % (path, file_ending) - return path + # attach file ending to the paths if not already set (a common mistake) + file_ending = ".%s" % file_ending if not file_ending.startswith(".") else file_ending + paths = ["%s%s" % (p, file_ending) if not p.endswith(file_ending) else p + for p in paths] + # check so the paths actually exists before returning + print "py to path:", paths + return [p for p in paths if os.path.isfile(p)] def dbref(dbref, reqhash=True):