X-Git-Url: http://git.tremily.us/?p=hooke.git;a=blobdiff_plain;f=hooke%2Fplugin%2F__init__.py;h=d04f3740f3797fae36e731a0d01de3a43d56622f;hp=4249730e52ab9a3ecb0e88e455c8057991ea9d54;hb=b90995fb4b6d8151df862d40edc8c369d7052cfa;hpb=c46aaa51003a6722a28eea0e49f63ef1bb0e882d diff --git a/hooke/plugin/__init__.py b/hooke/plugin/__init__.py index 4249730..d04f374 100644 --- a/hooke/plugin/__init__.py +++ b/hooke/plugin/__init__.py @@ -2,15 +2,15 @@ # # This file is part of Hooke. # -# Hooke is free software: you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation, either -# version 3 of the License, or (at your option) any later version. +# Hooke is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. # -# Hooke 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 Lesser General Public License for more details. +# Hooke 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 Lesser General +# Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Hooke. If not, see @@ -23,6 +23,7 @@ All of the science happens in here. """ import ConfigParser as configparser +import logging from ..config import Setting from ..util.pluggable import IsSubclass, construct_graph @@ -33,21 +34,20 @@ PLUGIN_MODULES = [ ('convfilt', True), ('cut', True), # ('fclamp', True), -# ('fit', True), # ('flatfilts-rolf', True), ('flatfilt', True), # ('jumpstat', True), -# ('macro', True), # ('massanalysis', True), # ('multidistance', True), # ('multifit', True), # ('pcluster', True), + ('polymer_fit', True), # ('procplots', True), # ('review', True), # ('showconvoluted', True), # ('superimpose', True), # ('tccd', True), -# ('tutorial', True), + ('tutorial', True), ('vclamp', True), ] """List of plugin modules and whether they should be included by @@ -55,11 +55,15 @@ default. TODO: autodiscovery """ BUILTIN_MODULES = [ + 'command_stack', 'config', 'curve', 'debug', + 'engine', + 'license', 'note', 'playlist', + 'playlists', 'system', ] """List of builtin modules. TODO: autodiscovery @@ -76,7 +80,9 @@ class Plugin (object): """A pluggable collection of Hooke commands. Fulfills the same role for Hooke that a software package does for - an operating system. + an operating system: contains a chunk of related commands and + routines. Command configuration also happens on the `Plugin` + level, with per-plugin sections in the configuration file. """ def __init__(self, name): self.name = name @@ -103,6 +109,7 @@ class Plugin (object): """ return list(self._commands) + class Builtin (Plugin): """A required collection of Hooke commands. @@ -111,19 +118,25 @@ class Builtin (Plugin): """ pass + # Plugin utility functions def argument_to_setting(section_name, argument): """Convert an :class:`~hooke.command.Argument` to a `~hooke.conf.Setting`. - This is a lossy transition, because + This is useful if, for example, you want to define arguments with + configurable default values. + + Conversion is lossy transition, because :class:`~hooke.command.Argument`\s store more information than `~hooke.conf.Setting`\s. """ return Setting(section_name, option=argument.name, value=argument.default, + type=argument.type, count=argument.count, help=argument._help) + # Construct plugin dependency graph and load plugin instances. PLUGIN_GRAPH = construct_graph( @@ -156,6 +169,7 @@ def default_settings(): return settings def load_graph(graph, config, include_section): + enabled = {} items = [] for node in graph: item = node.data @@ -163,10 +177,15 @@ def load_graph(graph, config, include_section): include = config.getboolean(include_section, item.name) except configparser.NoOptionError: include = True # non-optional include (e.g. a Builtin) + enabled[item.name] = include if include == True: - try: - item.config = dict(config.items(item.setting_section)) - except configparser.NoSectionError: - pass + for dependency in node: + if enabled.get(dependency.data.name, None) != True: + log = logging.getLogger('hooke') + log.warn( + 'could not setup plugin %s. unsatisfied dependency on %s.' + % (item.name, dependency.data.name)) + enabled[item.name] = False + continue items.append(item) return items