diff options
Diffstat (limited to 'example/example.py')
-rw-r--r-- | example/example.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/example/example.py b/example/example.py new file mode 100644 index 0000000..8d46943 --- /dev/null +++ b/example/example.py @@ -0,0 +1,76 @@ +import os +from functools import partial +from pluginbase import PluginBase + + +# For easier usage calculate the path relative to here. +here = os.path.abspath(os.path.dirname(__file__)) +get_path = partial(os.path.join, here) + + +# Setup a plugin base for "example.modules" and make sure to load +# all the default built-in plugins from the builtin_plugins folder. +plugin_base = PluginBase(package='example.plugins', + searchpath=[get_path('./builtin_plugins')]) + + +class Application(object): + """Represents a simple example application.""" + + def __init__(self, name): + # Each application has a name + self.name = name + + # And a dictionary where it stores "formatters". These will be + # functions provided by plugins which format strings. + self.formatters = {} + + # and a source which loads the plugins from the "app_name/plugins" + # folder. + self.source = plugin_base.make_plugin_source( + searchpath=[get_path('./%s/plugins' % name)]) + + # Here we list all the plugins the source knows about, load them + # and the use the "setup" function provided by the plugin to + # initialize the plugin. + for plugin_name in self.source.list_plugins(): + plugin = self.source.load_plugin(plugin_name) + plugin.setup(self) + + def register_formatter(self, name, formatter): + """A function a plugin can use to register a formatter.""" + self.formatters[name] = formatter + + +def run_demo(app, source): + """Shows all formatters in demo mode of an application.""" + print('Formatters for %s:' % app.name) + print(' input: %s' % source) + for name, fmt in sorted(app.formatters.items()): + print(' %10s: %s' % (name, fmt(source))) + print('') + + +def main(): + # This is the demo string we want to format. + source = 'This is a cool demo text to show this functionality.' + + # Set up two applications. One loads plugins from ./app1/plugins + # and the second one from ./app2/plugins. Both will also load + # the default ./builtin_plugins. + app1 = Application('app1') + app2 = Application('app2') + + # Run the demo for both + run_demo(app1, source) + run_demo(app2, source) + + # And just to show how the import system works, we also showcase + # importing plugins regularly: + with app1.source: + from example.plugins import secret + print('Plugin module: %s' % secret) + + +if __name__ == '__main__': + main() |