X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2F__init__.py;fp=mudpy%2F__init__.py;h=3a8cf43aa9e8096f6164b2f9c12bce6bafcddfe1;hp=59128e8d7dd5e63e31931df547e143725ccc0f91;hb=64dcfbed1d763781934f7d968318bf15a12d6844;hpb=353796668cb2088076014fd0f4a9466552bcb3bd diff --git a/mudpy/__init__.py b/mudpy/__init__.py index 59128e8..3a8cf43 100644 --- a/mudpy/__init__.py +++ b/mudpy/__init__.py @@ -1,33 +1,62 @@ """Core modules package for the mudpy engine.""" -# Copyright (c) 2004-2018 mudpy authors. Permission to use, copy, +# Copyright (c) 2004-2019 mudpy authors. Permission to use, copy, # modify, and distribute this software is granted under terms # provided in the LICENSE file distributed with this software. -import importlib # noqa (referenced via exec of string literal below) +import importlib -import mudpy # noqa (referenced via exec of string literal below) +import mudpy def load(): """Import/reload some modules (be careful, as this can result in loops).""" - # pick up the modules list from this package - global modules - - # iterate over the list of modules provided + # hard-coded fallback list of modules expected in this package + # TODO(fungi) remove this once Python 3.6 is no longer supported + fallback_modules = [ + "command", + "daemon", + "data", + "misc", + "password", + "telnet", + "version", + ] + try: + # dynamically build module list from package contents (this only works + # in Python 3.7 and later, hence the try/except) + modules = [] + for module in mudpy.__loader__.contents(): + + if ( + # make sure it's a module file, not a directory + module.endswith('.py') + + # don't include this file, we're inside it + and module != '__init__.py'): + + # trim off the .py file extension + modules.append(module[:-3]) + + # make sure the fallback list is kept up to date with package contents + if fallback_modules != sorted(modules): + raise Exception("Fallback module list is incomplete") + + except AttributeError: + modules = fallback_modules + + # iterate over the list of module files included in the package for module in modules: # attempt to reload the module, assuming it was probably imported # earlier try: - exec("importlib.reload(%s)" % module) + importlib.reload(getattr(mudpy, module)) # must not have been, so import it now - except NameError: - exec("import mudpy.%s" % module) + except AttributeError: + importlib.import_module("mudpy.%s" % module) -# load the modules contained in this package -modules = ["command", "data", "misc", "password", "telnet", "version"] load()