* looking for nirs@freeshell.org--2005/moin--fix--1.3--patch-59 to compare with
* comparing to nirs@freeshell.org--2005/moin--fix--1.3--patch-59
M  MoinMoin/wikirpc.py
M  MoinMoin/Page.py
M  MoinMoin/parser/wiki.py
M  MoinMoin/request.py
M  MoinMoin/wikiaction.py
M  MoinMoin/wikimacro.py
M  MoinMoin/wikiutil.py
M  MoinMoin/formatter/text_python.py

* modified files

--- orig/MoinMoin/Page.py
+++ mod/MoinMoin/Page.py
@@ -1157,7 +1157,7 @@
         try:
             Parser = wikiutil.importPlugin(self.request.cfg, "parser", 
                                            self.pi_format, "Parser")
-        except ImportError:
+        except wikiutil.PluginMissingError:
             from MoinMoin.parser.plain import Parser
 
         # start wiki content div
@@ -1242,7 +1242,7 @@
                 try:
                     parser = wikiutil.importPlugin(self.request.cfg, "parser",
                                                    self.pi_format, "Parser")
-                except ImportError:
+                except wikiutil.PluginMissingError:
                     pass
             return getattr(parser, 'caching', False)
         return False


--- orig/MoinMoin/formatter/text_python.py
+++ mod/MoinMoin/formatter/text_python.py
@@ -185,7 +185,7 @@
             Dependencies = wikiutil.importPlugin(self.request.cfg, type,
                                                  processor_name,
                                                  "Dependencies")
-        except AttributeError:
+        except wikiutil.PluginAttributeError:
             Dependencies = self.defaultDependencies
         if self.__is_static(Dependencies):
             return self.formatter.processor(processor_name, lines, is_parser)


--- orig/MoinMoin/parser/wiki.py
+++ mod/MoinMoin/parser/wiki.py
@@ -1129,10 +1129,10 @@
             self.processor = wikiutil.importPlugin(cfg, "processor", name,
                                                    "process")
             self.processor_is_parser = 0
-        except ImportError:
+        except wikiutil.PluginMissingError:
             try:
                 self.processor = wikiutil.importPlugin(cfg, "parser", name,
                                                    "Parser")
                 self.processor_is_parser = 1
-            except ImportError:
+            except wikiutil.PluginMissingError:
                 self.processor = None


--- orig/MoinMoin/request.py
+++ mod/MoinMoin/request.py
@@ -493,12 +493,12 @@
         try:
             Theme = wikiutil.importPlugin(self.cfg, 'theme', 
                                           theme_name, 'Theme')
-        except ImportError:
+        except wikiutil.PluginMissingError:
             fallback = 1
             try:
                 Theme = wikiutil.importPlugin(self.cfg, 'theme',
                                               self.cfg.theme_default, 'Theme')
-            except ImportError:
+            except wikiutil.PluginMissingError:
                 fallback = 2
                 from MoinMoin.theme.modern import Theme
         self.theme = Theme(self)


--- orig/MoinMoin/wikiaction.py
+++ mod/MoinMoin/wikiaction.py
@@ -778,7 +778,7 @@
     try:
         Formatter = wikiutil.importPlugin(request.cfg, "formatter", 
                                           formatterName, "Formatter")
-    except ImportError:
+    except wikiutil.PluginMissingError:
         # default to plain text formatter
         mimetype = "text/plain"
         from MoinMoin.formatter.text_plain import Formatter
@@ -895,7 +895,7 @@
     try:
         handler = wikiutil.importPlugin(request.cfg, "action", action,
                                         identifier)
-    except ImportError:
+    except wikiutil.PluginMissingError:
         handler = globals().get('do_' + action)
         
     return handler


--- orig/MoinMoin/wikimacro.py
+++ mod/MoinMoin/wikimacro.py
@@ -108,7 +108,7 @@
         self.name = macro_name
         try:
             execute = wikiutil.importPlugin(self.cfg, 'macro', macro_name)
-        except ImportError:
+        except wikiutil.PluginMissingError:
             try:
                 builtins = self.__class__
                 execute = getattr(builtins, '_macro_' + macro_name)
@@ -116,7 +116,7 @@
                 if macro_name in i18n.languages:
                     execute = builtins._m_lang
                 else:
-                    raise ImportError("Cannot load macro %s" % macro_name)        
+                    raise ImportError("Cannot load macro %s" % macro_name)
         return execute(self, args)
 
     def _m_lang(self, text):
@@ -140,7 +140,7 @@
         try:
             return wikiutil.importPlugin(self.request.cfg, 'macro',
                                          macro_name, 'Dependencies')
-        except (ImportError, AttributeError):
+        except wikiutil.PluginError:
             return self.defaultDependency
 
     def _macro_TitleSearch(self, args):


--- orig/MoinMoin/wikirpc.py
+++ mod/MoinMoin/wikirpc.py
@@ -411,7 +411,7 @@
                 try:
                     fn = wikiutil.importPlugin(self.request.cfg, 'xmlrpc',
                                                method, 'execute')
-                except ImportError:
+                except wikiutil.PluginMissingError:
                     response = xmlrpclib.Fault(1, "No such method: %s." %
                                                method)
                 else:


--- orig/MoinMoin/wikiutil.py
+++ mod/MoinMoin/wikiutil.py
@@ -538,74 +538,76 @@
 ### Plugins
 #############################################################################
 
+class PluginError(Exception):
+    """ Base class for plugin errors """
+
+class PluginMissingError(PluginError):
+    """ Raised when a plugin is not found """
+
+class PluginAttributeError(PluginError):
+    """ Raised when plugin does not contain an attribtue """
+
+
 def importPlugin(cfg, kind, name, function="execute"):
     """ Import wiki or builtin plugin
     
-    Returns function from a plugin module. If the module can not be
-    imported, raise ImportError. If function is not there, raise
-    AttributeError.
+    Returns function from a plugin module name. If name can not be
+    imported, raise PluginMissingError. If function is missing, raise
+    PluginAttributeError.
 
     kind may be one of 'action', 'formatter', 'macro', 'processor',
     'parser' or any other directory that exist in MoinMoin or
     data/plugin
 
     Wiki plugins will always override builtin plugins. If you want
-    specific plugin, use either importWikiPlugin or importName directly.
+    specific plugin, use either importWikiPlugin or importBuiltinPlugin
+    directly.
     
     @param cfg: wiki config instance
     @param kind: what kind of module we want to import
     @param name: the name of the module
     @param function: the function name
-    @rtype: callable
+    @rtype: any object
     @return: "function" of module "name" of kind "kind", or None
     """
     try:
-        plugin = importWikiPlugin(cfg, kind, name, function)
-    except ImportError:
-        modulename = 'MoinMoin.%s.%s' % (kind, name)
-        plugin = pysupport.importName(modulename, function)
-    return plugin
+        return importWikiPlugin(cfg, kind, name, function)
+    except PluginMissingError:
+        return importBuiltinPlugin(kind, name, function)
+
 
 def importWikiPlugin(cfg, kind, name, function):
-    """ Import and cache plugin from the wiki data directory
+    """ Import plugin from the wiki data directory
     
-    Returns function from a plugin module. If the module can not be
-    imported, raise ImportError. If function is not there, raise
-    AttributeError.
-
-    We try to import only ONCE - then cache the plugin, even if we got
-    None. This way we prevent expensive import of existing plugins for
-    each call to a plugin.
+    See importPlugin docstring.
+    """
+    if not name in wikiPlugins(kind, cfg):
+        raise PluginMissingError
+    moduleName = '%s.plugin.%s.%s' % (cfg.siteid, kind, name)
+    return importNameFromPlugin(moduleName, function)
 
-    @param cfg: wiki config instance
-    @param kind: what kind of module we want to import
-    @param name: the name of the module
-    @param function: the function name
-    @rtype: callable
-    @return: "function" of module "name" of kind "kind"
+
+def importBuiltinPlugin(kind, name, function):
+    """ Import builtin plugin from MoinMoin package 
+    
+    See importPlugin docstring.
+    """
+    if not name in builtinPlugins(kind):
+        raise PluginMissingError
+    moduleName = 'MoinMoin.%s.%s' % (kind, name)
+    return importNameFromPlugin(moduleName, function)
+
+
+def importNameFromPlugin(moduleName, name):
+    """ Return name from plugin module 
+    
+    Raise PluginAttributeError if name does not exists.
     """
+    module = __import__(moduleName, globals(), {}, [name])
     try:
-        wikiPlugins = cfg._wiki_plugins
+        return getattr(module, name)
     except AttributeError:
-        wikiPlugins = cfg._wiki_plugins = {}
-        
-    # Wiki plugins are located under 'wikiconfigname.plugin' module.
-    modulename = '%s.plugin.%s.%s' % (cfg.siteid, kind, name)
-    # Try cache or import once from disk
-    try:
-        module = wikiPlugins[modulename]
-    except KeyError:
-        try:
-            module = __import__(modulename, globals(), {}, ['dummy'])
-        except ImportError:
-            module = wikiPlugins[modulename] = None
-    if module is None:
-        raise ImportError
-    return getattr(module, function)
-
-# If we use threads, make this function thread safe
-if config.use_threads:
-    importWikiPlugin = pysupport.makeThreadSafe(importWikiPlugin)
+        raise PluginAttributeError
 
 
 def builtinPlugins(kind):
@@ -675,7 +677,7 @@
         for pname in getPlugins('parser', cfg):
             try:
                 Parser = importPlugin(cfg, 'parser', pname, 'Parser')
-            except ImportError:
+            except wikiutil.PluginMissingError:
                 continue
             if hasattr(Parser, 'extensions'):
                 exts = Parser.extensions



