[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