From e0fae30f46a75338de96beb46c8c0424f6e902b3 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Wed, 10 Sep 2003 06:05:58 +0000 Subject: [PATCH] Now allow multiple plugin directories, RFE #802614. --- scripts/plugin-documentation.py | 20 ++++++++++---------- scripts/setup.py | 9 ++++----- src/OwnerCommands.py | 4 ++-- src/conf.py | 4 ++-- src/template.py | 2 -- test/test.py | 23 +++++++++++++++-------- test/test_Alias.py | 2 +- 7 files changed, 34 insertions(+), 30 deletions(-) diff --git a/scripts/plugin-documentation.py b/scripts/plugin-documentation.py index d7dd374ee..9eb727f79 100755 --- a/scripts/plugin-documentation.py +++ b/scripts/plugin-documentation.py @@ -45,14 +45,12 @@ from fix import * import conf import callbacks -if conf.pluginDir not in sys.path: - sys.path.insert(0, conf.pluginDir) def makePluginDocumentation(filename): trClasses = { 'lightyellow':'lightgreen', 'lightgreen':'lightyellow' } trClass = 'lightyellow' pluginName = filename.split('.')[0] - moduleInfo = imp.find_module(pluginName) + moduleInfo = imp.find_module(pluginName, conf.pluginDirs) module = imp.load_module(pluginName, *moduleInfo) directory = os.path.join('docs', 'plugins') if not os.path.exists(directory): @@ -62,17 +60,18 @@ def makePluginDocumentation(filename): isinstance(plugin, callbacks.PrivmsgRegexp): fd = file(os.path.join(directory,'%s.html' % pluginName), 'w') fd.write(textwrap.dedent(""" - + Documentation for the %s plugin for Supybot
- %s

+

%s



- """) % (pluginName, cgi.escape(module.__doc__))) + """) % (pluginName, cgi.escape(module.__doc__ or ""))) for attr in dir(plugin): trClass = trClasses[trClass] if plugin.isCommand(attr): @@ -97,7 +96,7 @@ def makePluginDocumentation(filename): s = s.replace('\\n', '\n') s = s.replace("\\'", "'") fd.write(textwrap.dedent(""" -

Here's an example session with this plugin:

+

Here's an example session with this plugin:

             %s
             
@@ -110,9 +109,10 @@ def makePluginDocumentation(filename): fd.close() if __name__ == '__main__': - for filename in os.listdir(conf.pluginDir): - if filename.endswith('.py') and filename.lower() != filename: - makePluginDocumentation(filename) + for directory in conf.pluginDirs: + for filename in os.listdir(directory): + if filename.endswith('.py') and filename.lower() != filename: + makePluginDocumentation(filename) diff --git a/scripts/setup.py b/scripts/setup.py index 07e78adff..2e0c28356 100644 --- a/scripts/setup.py +++ b/scripts/setup.py @@ -53,9 +53,6 @@ import conf import ircdb import ircutils -if conf.pluginDir not in sys.path: - sys.path.insert(0, conf.pluginDir) - if __name__ == '__main__': fd = file('src/template.py') template = fd.read() @@ -128,7 +125,9 @@ if __name__ == '__main__': ### # Modules. ### - filenames = os.listdir(conf.pluginDir) + filenames = [] + for dir in conf.pluginDirs: + filenames.extend(os.listdir(dir)) plugins = [] for filename in filenames: if filename.endswith('.py') and \ @@ -139,7 +138,7 @@ if __name__ == '__main__': print 'The available plugins are:\n %s' % '\n '.join(plugins) while yn('Would you like to add a plugin?') == 'y': plugin = expect('What plugin?', plugins) - moduleInfo = imp.find_module(plugin) + moduleInfo = imp.find_module(plugin, conf.pluginDirs) try: module = imp.load_module(plugin, *moduleInfo) except ImportError, e: diff --git a/src/OwnerCommands.py b/src/OwnerCommands.py index e3b4db0fc..70b9a7901 100644 --- a/src/OwnerCommands.py +++ b/src/OwnerCommands.py @@ -205,7 +205,7 @@ class OwnerCommands(privmsgs.CapabilityCheckingPrivmsg): irc.error(msg, 'That module is already loaded.') return try: - moduleInfo = imp.find_module(name) + moduleInfo = imp.find_module(name, conf.pluginDirs) except ImportError: irc.error(msg, 'No plugin %s exists.' % name) return @@ -240,7 +240,7 @@ class OwnerCommands(privmsgs.CapabilityCheckingPrivmsg): if callbacks: try: - moduleInfo = imp.find_module(name) + moduleInfo = imp.find_module(name, conf.pluginDirs) module = imp.load_module(name, *moduleInfo) linecache.checkcache() for callback in callbacks: diff --git a/src/conf.py b/src/conf.py index b7c586437..fda0c0147 100644 --- a/src/conf.py +++ b/src/conf.py @@ -46,7 +46,7 @@ import os.path logDir = 'logs' confDir = 'conf' dataDir = 'data' -pluginDir = 'plugins' +pluginDirs = ['src', 'plugins'] ### # Files. @@ -197,7 +197,7 @@ driverModule = 'socketDrivers' ############################### ############################### ############################### -version ='0.70.0' +version ='0.72.0' commandsOnStart = [] diff --git a/src/template.py b/src/template.py index 47d61015a..bc80ee360 100755 --- a/src/template.py +++ b/src/template.py @@ -151,8 +151,6 @@ if __name__ == '__main__': valueString) sys.exit(-1) - sys.path.append(conf.pluginDir) - nick = options.nick user = options.user ident = options.ident diff --git a/test/test.py b/test/test.py index 06a80e645..79eabf39c 100755 --- a/test/test.py +++ b/test/test.py @@ -38,13 +38,11 @@ if 'test' not in sys.path: import conf conf.dataDir = 'test-data' -if conf.pluginDir not in sys.path: - sys.path.insert(0, conf.pluginDir) - from fix import * import gc import re +import imp import glob import time import os.path @@ -99,9 +97,10 @@ nicks = ['fatjim','scn','moshez','LordVan','MetaCosm','pythong','fishfart', nicks += [msg.nick for msg in msgs if msg.nick] -def getMsgs(command): - return [msg for msg in msgs if msg.command == command] - +def loadPlugin(name): + moduleInfo = imp.find_module(name, conf.pluginDirs) + module = imp.load_module(name, *moduleInfo) + return module class PluginTestCase(unittest.TestCase): """Subclass this to write a test case for a plugin. See test_FunCommands @@ -120,12 +119,13 @@ class PluginTestCase(unittest.TestCase): while self.irc.takeMsg(): pass if isinstance(self.plugins, str): - module = __import__(name) + moduleInfo = imp.find_module(name, conf.pluginDirs) + module = imp.load_module(name, *moduleInfo) plugin = module.Class() self.irc.addCallback(plugin) else: for name in self.plugins: - module = __import__(name) + module = loadPlugin(name) plugin = module.Class() self.irc.addCallback(plugin) @@ -259,6 +259,13 @@ class PluginDocumentation: self.failUnless(helps and len(helps.splitlines()) >= 3, '%s has no morehelp' % attr) + def testPluginHasDocumentation(self): + for cb in self.irc.callbacks: + m = sys.modules[cb.__class__.__module__] + self.failIf(m.__doc__ is None, + '%s has no module documentation'%cb.__class__.__name__) + + if __name__ == '__main__': diff --git a/test/test_Alias.py b/test/test_Alias.py index 238a3381c..3c5eb0a64 100644 --- a/test/test_Alias.py +++ b/test/test_Alias.py @@ -31,7 +31,7 @@ from test import * -import Alias +Alias = loadPlugin('Alias') class FunctionsTest(unittest.TestCase):
CommandArgs Detailed Help