From 300564b43edae9ecd33764b4117f28a68e1ce000 Mon Sep 17 00:00:00 2001 From: Max Goodman Date: Mon, 23 Jan 2012 22:04:21 -0800 Subject: [PATCH] Add basic plugin support. --- r2/r2/config/environment.py | 8 +++++--- r2/r2/config/routing.py | 6 +++++- r2/r2/controllers/__init__.py | 4 ++++ r2/r2/lib/app_globals.py | 1 + r2/r2/lib/plugin.py | 37 +++++++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 r2/r2/lib/plugin.py diff --git a/r2/r2/config/environment.py b/r2/r2/config/environment.py index 3a1d08c0c..073dc3593 100644 --- a/r2/r2/config/environment.py +++ b/r2/r2/config/environment.py @@ -29,16 +29,16 @@ mimetypes.init() import webhelpers -from r2.config.routing import make_map +from r2.config import routing import r2.lib.app_globals as app_globals from r2.lib import rpc import r2.lib.helpers +from r2.lib.plugin import load_plugins import r2.config as reddit_config from r2.templates import tmpl_dirs def load_environment(global_conf={}, app_conf={}, setup_globals=True): - map = make_map(global_conf, app_conf) # Setup our paths root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -57,7 +57,9 @@ def load_environment(global_conf={}, app_conf={}, setup_globals=True): reddit_config.cache = g.cache config['pylons.h'] = r2.lib.helpers - config['routes.map'] = map + + config['r2.plugins'] = load_plugins(getattr(g, 'plugins', [])) + config['routes.map'] = routing.make_map() #override the default response options config['pylons.response_options']['headers'] = {} diff --git a/r2/r2/config/routing.py b/r2/r2/config/routing.py index 6ceff67e5..36f5be2ca 100644 --- a/r2/r2/config/routing.py +++ b/r2/r2/config/routing.py @@ -24,12 +24,16 @@ Setup your Routes options here """ import os from routes import Mapper +from pylons import config import admin_routes -def make_map(global_conf={}, app_conf={}): +def make_map(): map = Mapper() mc = map.connect + for plugin in config['r2.plugins'].itervalues(): + plugin.add_routes(mc) + admin_routes.add(mc) mc('/login', controller='forms', action='login') diff --git a/r2/r2/controllers/__init__.py b/r2/r2/controllers/__init__.py index 7b78af3fc..641256619 100644 --- a/r2/r2/controllers/__init__.py +++ b/r2/r2/controllers/__init__.py @@ -66,3 +66,7 @@ from oauth2 import OAuth2AccessController as Oauth2accessController from admin import AdminController from redirect import RedirectController from ipn import IpnController + +from pylons import config +for plugin in config['r2.plugins'].itervalues(): + locals().update(plugin.load_controllers()) diff --git a/r2/r2/lib/app_globals.py b/r2/r2/lib/app_globals.py index 4778342e4..bc650ab41 100755 --- a/r2/r2/lib/app_globals.py +++ b/r2/r2/lib/app_globals.py @@ -170,6 +170,7 @@ class Globals(object): ], ConfigValue.tuple: [ + 'plugins', 'stalecaches', 'memcaches', 'lockcaches', diff --git a/r2/r2/lib/plugin.py b/r2/r2/lib/plugin.py new file mode 100644 index 000000000..4de55cdc1 --- /dev/null +++ b/r2/r2/lib/plugin.py @@ -0,0 +1,37 @@ +import sys +import os.path +import pkg_resources +from pylons import config + + +class Plugin(object): + @property + def path(self): + module = sys.modules[type(self).__module__] + return os.path.dirname(module.__file__) + + @property + def template_dirs(self): + """Add module/templates/ as a template directory.""" + return [os.path.join(self.path, 'templates')] + + @property + def static_dir(self): + return os.path.join(self.path, 'public') + + def add_routes(self, mc): + pass + + +def load_plugins(plugin_names): + plugins = {} + for name in plugin_names: + try: + entry_point = pkg_resources.iter_entry_points('r2.plugin', name).next() + except StopIteration: + config['pylons.g'].log.warning('Unable to locate plugin "%s". Skipping.' % name) + continue + plugin_cls = entry_point.load() + plugin = plugins[name] = plugin_cls() + config['pylons.paths']['templates'].extend(plugin.template_dirs) + return plugins