diff options
author | Simon Poirier <simpoir@gmail.com> | 2009-11-05 13:13:43 (GMT) |
---|---|---|
committer | Simon Poirier <simpoir@gmail.com> | 2009-11-05 13:13:43 (GMT) |
commit | 52c83b1aab72721a42134a19e5db3acc6c235a39 (patch) | |
tree | 499376fbda5fdc9e42ee5666a784d3ae64e1c8bd /src/tutorius/addon.py | |
parent | c55fc5a967ece118184840503d211cca9b8834a1 (diff) |
half overlayer/half creatoroverlayer_windowed
Diffstat (limited to 'src/tutorius/addon.py')
-rw-r--r-- | src/tutorius/addon.py | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/tutorius/addon.py b/src/tutorius/addon.py new file mode 100644 index 0000000..7ac68f7 --- /dev/null +++ b/src/tutorius/addon.py @@ -0,0 +1,95 @@ +# Copyright (C) 2009, Tutorius.org +# Copyright (C) 2009, Simon Poirier <simpoir@gmail.com> +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +""" +This module manages the loading and listing of tutorius addons. +Addons are modular actions and events that are package in such a way that they +can be autodetected and can integrate with Tutorius components (the editor) +without any configuration or explicit dependencies (python import). + +An action addon is expected to have a metadata dict such as this one: +__action__ = { + "name" : "HelloWorld", + "display_name" : "Hello World!", + "icon" : "hello", + "class" : HelloAction, + "mandatory_props" : ["text"], +} +""" + +import os +import re +import logging + +PREFIX = __name__+"s" +PATH = re.sub("addon\\.py[c]$", "", __file__)+"addons" + +TYPE_ACTION = 'action' +TYPE_EVENT = 'event' + +_cache = None + +def _reload_addons(): + global _cache + _cache = {} + for addon in filter(lambda x: x.endswith("py"), os.listdir(PATH)): + mod = __import__(PREFIX+'.'+re.sub("\\.py$", "", addon), {}, {}, [""]) + if hasattr(mod, "__action__"): + _cache[mod.__action__['name']] = mod.__action__ + mod.__action__['type'] = TYPE_ACTION + continue + if hasattr(mod, "__event__"): + _cache[mod.__event__['name']] = mod.__event__ + mod.__event__['type'] = TYPE_EVENT + +def create(name, *args, **kwargs): + global _cache + if not _cache: + _reload_addons() + try: + comp_metadata = _cache[name] + try: + return comp_metadata['class'](*args, **kwargs) + except: + logging.error("Could not instantiate %s with parameters %s, %s"%(comp_metadata['name'],str(args), str(kwargs))) + return None + except KeyError: + logging.error("Addon not found for class '%s'", name) + return None + +def list_addons(): + global _cache + if not _cache: + _reload_addons() + return _cache.keys() + +def get_addon_meta(name): + global _cache + if not _cache: + _reload_addons() + return _cache[name] + +def get_name_from_type(typ): + global _cache + if not _cache: + _reload_addons() + for addon in _cache.keys(): + if typ == _cache[addon]['class']: + return addon + return None + +# vim:set ts=4 sts=4 sw=4 et: |