From 9fafb49af210e956d43d6a00106558d1a00d13df Mon Sep 17 00:00:00 2001 From: Simon Poirier Date: Thu, 02 Jul 2009 05:27:27 +0000 Subject: * Modularized actions and event filters through add-on components * Working serialization * Working editor with addons * began refactoring actions and events ** fixed some tests to work with addons ** filters and actions tests won't pass until refactoring is done --- (limited to 'src/sugar/tutorius/addon.py') diff --git a/src/sugar/tutorius/addon.py b/src/sugar/tutorius/addon.py new file mode 100644 index 0000000..51791d1 --- /dev/null +++ b/src/sugar/tutorius/addon.py @@ -0,0 +1,76 @@ +# Copyright (C) 2009, Tutorius.org +# Copyright (C) 2009, Simon Poirier +# +# +# 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" + +_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__ + continue + if hasattr(mod, "__event__"): + _cache[mod.__event__['name']] = mod.__event__ + +def create(name, *args, **kwargs): + global _cache + if not _cache: + _reload_addons() + try: + return _cache[name]['class'](*args, **kwargs) + 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] + +# vim:set ts=4 sts=4 sw=4 et: -- cgit v0.9.1