[Zope-dev] BugFix to enable other products to register Splitters

Chris Withers chrisw@nipltd.com
Thu, 16 Aug 2001 12:08:27 +0100


This is a multi-part message in MIME format.
--------------BFDAC512C34B98A17FD31D5F
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi,

Given the Collector is broken again, here's a mail report of a bug and fix:

The way splitters are currently implemented in PluginIndexes makes it
practically impossible to register new types of splitter.

These patches provide a registerSplitter method for the
PluginIndexes.TextIndex.Splitter module.

All the tests pass and the registerSplitter function is implicitly tested by
this ;-)

cheers,

Chris & Harry
--------------BFDAC512C34B98A17FD31D5F
Content-Type: text/plain; charset=us-ascii;
 name="__init__.py.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="__init__.py.patch"

--- e:\refcvs\zope\lib\python\products\pluginindexes\textindex\splitter\__init__.py	Fri Jun 01 14:47:34 2001
+++ E:\localcvs\AlexCons\Products\PluginIndexes\TextIndex\Splitter\__init__.py	Thu Aug 16 11:43:39 2001
@@ -1,22 +1,32 @@
-import os,sys,exceptions
+from ZopeSplitter import Splitter as ZopeSplitter
+from ISO_8859_1_Splitter import Splitter as ISO_8859_1_Splitter
 
-availableSplitters = (
-  ("ZopeSplitter" , "Zope Default Splitter"),
-  ("ISO_8859_1_Splitter" , "Werner Strobles ISO-8859-1 Splitter")
-)
+splitterNames = []
+splitterMapping = {}
 
-splitterNames = map(lambda x: x[0],availableSplitters)
+def availableSplitters():
+    list = []
+    for name in splitterMapping.keys():
+        list.append((name,splitterMapping[name][0]))
+    return tuple(list)
 
 def getSplitter(name=None):
 
-    if not name in splitterNames and name:
-        raise exceptions.RuntimeError, "No such splitter '%s'" % name
-
-    if not name: name = splitterNames[0] 
-    if not vars().has_key(name):
-        exec( "from %s import Splitter as %s" % (name,name))
-
-    return vars()[name]
+    if name is None:
+        name = splitterNames[0]
+        
+    try:
+        return splitterMapping[name][1]
+    except KeyError:
+        raise RuntimeError, "No such splitter '%s'" % name
     
+def registerSplitter(name,description,module,default=0):
+    global splitterNames
+    splitterMapping[name]=(description,module)
+    if default:
+        splitterNames.insert(0,name)
+    else:
+        splitterNames.append(name)
 
-
+registerSplitter("ZopeSplitter",       "Zope Default Splitter",               ZopeSplitter)
+registerSplitter("ISO_8859_1_Splitter","Werner Strobles ISO-8859-1 Splitter", ISO_8859_1_Splitter)

--------------BFDAC512C34B98A17FD31D5F
Content-Type: text/plain; charset=us-ascii;
 name="testSplitter.py.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="testSplitter.py.patch"

--- e:\refcvs\zope\lib\python\products\pluginindexes\textindex\tests\testSplitter.py	Mon Aug 06 20:23:04 2001
+++ E:\localcvs\AlexCons\Products\PluginIndexes\TextIndex\tests\testSplitter.py	Thu Aug 16 11:49:56 2001
@@ -119,9 +119,9 @@
     def testAvailableSplitters( self ):
         "Test available splitters"
 
-        assert len(Splitter.availableSplitters) >0 
+        assert len(Splitter.availableSplitters()) >0 
         assert len(Splitter.splitterNames)>0 
-        assert len(Splitter.availableSplitters)==len(Splitter.splitterNames)
+        assert len(Splitter.availableSplitters())==len(Splitter.splitterNames)
 
 
 
@@ -133,21 +133,11 @@
         assert result==splitted, "%s: %s vs %s" % (sp_name,result,splitted) 
 
 
-    def testZopeSplitter(self):
-        """test ZopeSplitter (this test is known to fail because it does not support ISO stuff) """
-
-        for text,splitted in self.testdata:
-            self._test("ZopeSplitter",text,splitted)
-    
     def testISOSplitter(self):
         """test ISOSplitter"""
 
         for text,splitted in self.testdata:
             self._test("ISO_8859_1_Splitter",text,splitted)
-
-#        for loc in ["","ru_RU.KOI8-R"]:
-#           locale.setlocale(locale.LC_ALL , loc)
-
 
 
 def test_suite():

--------------BFDAC512C34B98A17FD31D5F--