[Checkins] SVN: grok/branches/faassen-index/src/grok/ Oops, forgot to check in new files.

Martijn Faassen faassen at infrae.com
Tue Apr 17 13:35:22 EDT 2007


Log message for revision 74205:
  Oops, forgot to check in new files.
  

Changed:
  A   grok/branches/faassen-index/src/grok/ftests/catalog/indexes.py
  A   grok/branches/faassen-index/src/grok/index.py

-=-
Added: grok/branches/faassen-index/src/grok/ftests/catalog/indexes.py
===================================================================
--- grok/branches/faassen-index/src/grok/ftests/catalog/indexes.py	2007-04-17 17:29:01 UTC (rev 74204)
+++ grok/branches/faassen-index/src/grok/ftests/catalog/indexes.py	2007-04-17 17:35:22 UTC (rev 74205)
@@ -0,0 +1,90 @@
+"""
+Grok allows you to set up catalog indexes in your application with a
+special indexes declaration.
+
+  >>> import grok
+  >>> grok.grok('grok.ftests.catalog.indexes')
+
+Let's set up a site in which we manage a couple of objects::
+
+  >>> from grok.ftests.catalog.indexes import Herd, Mammoth
+  >>> herd = Herd()
+  >>> getRootFolder()['herd'] = herd
+  >>> from zope.app.component.hooks import setSite
+  >>> setSite(herd)
+
+Now we add some indexable objects to the site::
+
+  >>> herd['alpha'] = Mammoth('Alpha', 13, 'Hello world!')
+  >>> herd['beta'] = Mammoth('Beta', 14, 'Bye World!')
+
+We are able to query the catalog::
+
+  >>> from zope.app.catalog.interfaces import ICatalog
+  >>> from zope.component import getUtility
+  >>> catalog = getUtility(ICatalog)
+  >>> for obj in catalog.searchResults(name=('Beta', 'Beta')):
+  ...   print obj.name
+  Beta
+
+Let's query the text index, which incidentally also indexes a method::
+
+  >>> def sortedResults(catalog, **kw):
+  ...    result = list(catalog.searchResults(**kw))
+  ...    result.sort(key=lambda x:x.name)
+  ...    return [item.name for item in result]
+  >>> sortedResults(catalog, message='world')
+  ['Alpha', 'Beta']
+  >>> sortedResults(catalog, message='hello')
+  ['Alpha']
+  >>> sortedResults(catalog, message='bye')
+  ['Beta']
+  
+Nuke the catalog and initds in the end, so as not to confuse
+other tests::
+
+  >>> sm = herd.getSiteManager()
+  >>> from zope.app.catalog.interfaces import ICatalog
+  >>> sm.unregisterUtility(catalog, provided=ICatalog)
+  True
+  >>> from zope.app.intid.interfaces import IIntIds
+  >>> from zope import component
+  >>> intids = component.getUtility(IIntIds)
+  >>> sm.unregisterUtility(intids, provided=IIntIds)
+  True
+
+Unfortunately ftests don't have good isolation from each other yet.
+"""
+
+from zope.interface import Interface
+from zope import schema
+
+import grok
+from grok import index
+
+class IMammoth(Interface):
+    name = schema.TextLine(title=u'Name')
+    age = schema.Int(title=u'Age')
+    def message():
+        """Message the mammoth has for the world."""
+
+class MammothIndexes(grok.Indexes):
+    grok.context(IMammoth)
+
+    name = index.Field()
+    age = index.Field()
+    message = index.Text()
+
+class Mammoth(grok.Model):
+    grok.implements(IMammoth)
+
+    def __init__(self, name, age, message):
+        self.name = name
+        self.age = age
+        self._message = message
+
+    def message(self):
+        return self._message
+    
+class Herd(grok.Container, grok.Application):
+    pass

Added: grok/branches/faassen-index/src/grok/index.py
===================================================================
--- grok/branches/faassen-index/src/grok/index.py	2007-04-17 17:29:01 UTC (rev 74204)
+++ grok/branches/faassen-index/src/grok/index.py	2007-04-17 17:35:22 UTC (rev 74205)
@@ -0,0 +1,35 @@
+import sys
+
+from zope.interface import implements
+from zope.interface.interfaces import IMethod
+
+from zope.app.catalog.field import FieldIndex
+from zope.app.catalog.text import TextIndex
+
+from grok.error import GrokError
+from grok.directive import frame_is_class
+from grok.interfaces import IIndexDefinition
+
+class IndexDefinition(object):
+    implements(IIndexDefinition)
+    
+    def __init__(self, *args, **kw):
+        frame = sys._getframe(1)
+        if not frame_is_class(frame):
+            raise GrokError('Index definition can only be used on a class.')
+        # store any extra parameters to pass to index later
+        self._args = args
+        self._kw = kw
+
+    def setup(self, catalog, name, context):
+        raise NotImplementedError
+
+class Field(IndexDefinition):
+    def setup(self, catalog, name, context):
+        call = IMethod.providedBy(context[name])
+        catalog[name] = FieldIndex(name, context, *self._args, **self._kw)
+
+class Text(IndexDefinition):
+    def setup(self, catalog, name, context):
+        call = IMethod.providedBy(context[name]) 
+        catalog[name] = TextIndex(name, context, call, *self._args, **self._kw)



More information about the Checkins mailing list