[Zope-Checkins] CVS: Products/ZCatalog - Catalog.py:1.111.2.7.2.1 CatalogAwareness.py:1.17.68.1.38.1 CatalogPathAwareness.py:1.11.16.1.38.1 ZCatalog.py:1.126.2.6.24.1 ZCatalogIndexes.py:1.8.136.1

Tres Seaver tseaver at palladion.com
Sat May 28 20:42:15 EDT 2005


Update of /cvs-repository/Products/ZCatalog
In directory cvs.zope.org:/tmp/cvs-serv32028/lib/python/Products/ZCatalog

Modified Files:
      Tag: tseaver-hasattr_geddon-branch
	Catalog.py CatalogAwareness.py CatalogPathAwareness.py 
	ZCatalog.py ZCatalogIndexes.py 
Log Message:

  - Removed all uses of the 'hasattr' builtin from the core, where
    the object being tested derives (or might) from Persistent.
    XXX:  currently, this branch imports a 'safe_hasattr' from ZODB.utils,
    which adds a dependency on ZODB for some packages;  we probably
    need a better location, and perhas a C implementation?


=== Products/ZCatalog/Catalog.py 1.111.2.7 => 1.111.2.7.2.1 ===
--- Products/ZCatalog/Catalog.py:1.111.2.7	Fri Mar 11 11:24:51 2005
+++ Products/ZCatalog/Catalog.py	Sat May 28 20:41:34 2005
@@ -25,6 +25,7 @@
 from BTrees.OIBTree import OIBTree
 from BTrees.IOBTree import IOBTree
 import BTrees.Length
+from ZODB.utils import safe_hasattr
 
 import time, sys, types
 from bisect import bisect
@@ -36,8 +37,9 @@
     # Fallback to python implementation to avoid dependancy on DocumentTemplate
     def safe_callable(ob):
         # Works with ExtensionClasses and Acquisition.
-        if hasattr(ob, '__class__'):
-            return hasattr(ob, '__call__') or isinstance(ob, types.ClassType)
+        if safe_hasattr(ob, '__class__'):
+            return safe_hasattr(ob, '__call__') or isinstance(ob,
+                                                              types.ClassType)
         else:
             return callable(ob)
 
@@ -119,7 +121,7 @@
 
 
         for index in self.indexes.values():
-            if hasattr(index, '__of__'): index=index.__of__(self)
+            if safe_hasattr(index, '__of__'): index=index.__of__(self)
             index._convertBTrees(threshold)
 
     def __len__(self):
@@ -377,7 +379,7 @@
 
         for name in use_indexes:
             x = self.getIndex(name)
-            if hasattr(x, 'index_object'):
+            if safe_hasattr(x, 'index_object'):
                 blah = x.index_object(index, object, threshold)
                 total = total + blah
             else:
@@ -407,7 +409,7 @@
         if rid is not None:
             for name in indexes:
                 x = self.getIndex(name)
-                if hasattr(x, 'unindex_object'):
+                if safe_hasattr(x, 'unindex_object'):
                     x.unindex_object(rid)
             del data[rid]
             del paths[rid]
@@ -511,7 +513,7 @@
         elif rs:
             # We got some results from the indexes.
             # Sort and convert to sequences.
-            if sort_index is None and hasattr(rs, 'values'):
+            if sort_index is None and safe_hasattr(rs, 'values'):
                 # having a 'values' means we have a data structure with
                 # scores.  Build a new result set, sort it by score, reverse
                 # it, compute the normalized score, and Lazify it.
@@ -546,9 +548,9 @@
                 
                 return LazyMap(getScoredResult, rs, len(rs))
 
-            elif sort_index is None and not hasattr(rs, 'values'):
+            elif sort_index is None and not safe_hasattr(rs, 'values'):
                 # no scores
-                if hasattr(rs, 'keys'):
+                if safe_hasattr(rs, 'keys'):
                     rs = rs.keys()
                 return LazyMap(self.__getitem__, rs, len(rs))
             else:
@@ -579,7 +581,7 @@
         _keyerror = KeyError
         result = []
         append = result.append
-        if hasattr(rs, 'keys'):
+        if safe_hasattr(rs, 'keys'):
             rs = rs.keys()
         rlen = len(rs)
         
@@ -724,12 +726,13 @@
             # self.indexes is always a dict, so get() w/ 1 arg works
             sort_index = self.indexes.get(sort_index_name)
             if sort_index is None:
-                raise CatalogError, 'Unknown sort_on index (%s)' % sort_index_name
+                raise (CatalogError,
+                        'Unknown sort_on index (%s)' % sort_index_name)
             else:
-                if not hasattr(sort_index, 'keyForDocument'):
+                if not safe_hasattr(sort_index, 'keyForDocument'):
                     raise CatalogError(
-                        'The index chosen for sort_on (%s) is not capable of being'
-                        ' used as a sort index.' % sort_index_name
+                        'The index chosen for sort_on (%s) is not capable of '
+                        'being used as a sort index.' % sort_index_name
                         )
             return sort_index
         else:


=== Products/ZCatalog/CatalogAwareness.py 1.17.68.1 => 1.17.68.1.38.1 ===
--- Products/ZCatalog/CatalogAwareness.py:1.17.68.1	Mon Jul 21 12:36:25 2003
+++ Products/ZCatalog/CatalogAwareness.py	Sat May 28 20:41:34 2005
@@ -19,6 +19,7 @@
 
 import urllib
 from Globals import DTMLFile
+from ZODB.utils import safe_hasattr
 
 class CatalogAware:
     """ This is a Mix-In class to make objects automaticly catalog and
@@ -83,7 +84,7 @@
 
     def url(self, ftype=urllib.splittype, fhost=urllib.splithost):
         """Return a SCRIPT_NAME-based url for an object."""
-        if hasattr(self, 'DestinationURL') and \
+        if safe_hasattr(self, 'DestinationURL') and \
            callable(self.DestinationURL):
             url='%s/%s' % (self.DestinationURL(), self.id)
         else: url=self.absolute_url()
@@ -101,7 +102,7 @@
 
     def summary(self, num=200):
         """Return a summary of the text content of the object."""
-        if not hasattr(self, 'text_content'):
+        if not safe_hasattr(self, 'text_content'):
             return ''
         attr=getattr(self, 'text_content')
         if callable(attr):
@@ -112,12 +113,12 @@
 
     def index_object(self):
         """A common method to allow Findables to index themselves."""
-        if hasattr(self, self.default_catalog):
+        if safe_hasattr(self, self.default_catalog):
             getattr(self, self.default_catalog).catalog_object(self, self.url())
 
     def unindex_object(self):
         """A common method to allow Findables to unindex themselves."""
-        if hasattr(self, self.default_catalog):
+        if safe_hasattr(self, self.default_catalog):
             getattr(self, self.default_catalog).uncatalog_object(self.url())
 
     def reindex_object(self):
@@ -128,9 +129,9 @@
     def reindex_all(self, obj=None):
         """ """
         if obj is None: obj=self
-        if hasattr(aq_base(obj), 'index_object'):
+        if safe_hasattr(aq_base(obj), 'index_object'):
             obj.index_object()
-        if hasattr(aq_base(obj), 'objectValues'):
+        if safe_hasattr(aq_base(obj), 'objectValues'):
             sub=obj.objectValues()
             for item in obj.objectValues():
                 self.reindex_all(item)


=== Products/ZCatalog/CatalogPathAwareness.py 1.11.16.1 => 1.11.16.1.38.1 ===
--- Products/ZCatalog/CatalogPathAwareness.py:1.11.16.1	Mon Jul 21 12:36:25 2003
+++ Products/ZCatalog/CatalogPathAwareness.py	Sat May 28 20:41:34 2005
@@ -16,6 +16,7 @@
 import urllib
 from Globals import DTMLFile
 from Acquisition import aq_base
+from ZODB.utils import safe_hasattr
 
 class CatalogAware:
     """ This is a Mix-In class to make objects automaticly catalog and
@@ -84,7 +85,7 @@
 
     def summary(self, num=200):
         """Return a summary of the text content of the object."""
-        if not hasattr(self, 'text_content'):
+        if not safe_hasattr(self, 'text_content'):
             return ''
         attr=getattr(self, 'text_content')
         if callable(attr):
@@ -95,13 +96,13 @@
 
     def index_object(self):
         """A common method to allow Findables to index themselves."""
-        if hasattr(self, self.default_catalog):
+        if safe_hasattr(self, self.default_catalog):
             getattr(self,
                     self.default_catalog).catalog_object(self, self.getPath())
 
     def unindex_object(self):
         """A common method to allow Findables to unindex themselves."""
-        if hasattr(self, self.default_catalog):
+        if safe_hasattr(self, self.default_catalog):
             getattr(self,
                     self.default_catalog).uncatalog_object(self.getPath())
 
@@ -113,9 +114,9 @@
     def reindex_all(self, obj=None):
         """ """
         if obj is None: obj=self
-        if hasattr(aq_base(obj), 'index_object'):
+        if safe_hasattr(aq_base(obj), 'index_object'):
             obj.index_object()
-        if hasattr(aq_base(obj), 'objectValues'):
+        if safe_hasattr(aq_base(obj), 'objectValues'):
             sub=obj.objectValues()
             for item in obj.objectValues():
                 self.reindex_all(item)


=== Products/ZCatalog/ZCatalog.py 1.126.2.6 => 1.126.2.6.24.1 ===
--- Products/ZCatalog/ZCatalog.py:1.126.2.6	Wed May 26 02:47:07 2004
+++ Products/ZCatalog/ZCatalog.py	Sat May 28 20:41:34 2005
@@ -32,6 +32,7 @@
     manage_zcatalog_entries, manage_zcatalog_indexes, search_zcatalog
 from ZCatalogIndexes import ZCatalogIndexes
 from ZODB.POSException import ConflictError
+from ZODB.utils import safe_hasattr
 from Products.PluginIndexes.common.PluggableIndex \
      import PluggableIndexInterface
 from Products.PluginIndexes.TextIndex import Splitter
@@ -687,12 +688,12 @@
         dup =dict.has_key
         x=0
         while x < 100:
-            if hasattr(obj, '__ac_roles__'):
+            if safe_hasattr(obj, '__ac_roles__'):
                 roles=obj.__ac_roles__
                 for role in roles:
                     if not dup(role):
                         dict[role]=1
-            if not hasattr(obj, 'aq_parent'):
+            if not safe_hasattr(obj, 'aq_parent'):
                 break
             obj=obj.aq_parent
             x=x+1
@@ -737,10 +738,10 @@
                 obj_expr=(Eval(obj_expr), md, md._push, md._pop)
 
         base=obj
-        if hasattr(obj, 'aq_base'):
+        if safe_hasattr(obj, 'aq_base'):
             base=obj.aq_base
 
-        if not hasattr(base, 'objectItems'):
+        if not safe_hasattr(base, 'objectItems'):
             return result
         try:    items=obj.objectItems()
         except: return result
@@ -754,21 +755,21 @@
             else:   p=id
 
             dflag=0
-            if hasattr(ob, '_p_changed') and (ob._p_changed == None):
+            if safe_hasattr(ob, '_p_changed') and (ob._p_changed == None):
                 dflag=1
 
-            if hasattr(ob, 'aq_base'):
+            if safe_hasattr(ob, 'aq_base'):
                 bs=ob.aq_base
             else: bs=ob
 
             if (
                 (not obj_ids or absattr(bs.id) in obj_ids)
                 and
-                (not obj_metatypes or (hasattr(bs, 'meta_type') and
+                (not obj_metatypes or (safe_hasattr(bs, 'meta_type') and
                  bs.meta_type in obj_metatypes))
                 and
                 (not obj_searchterm or
-                 (hasattr(ob, 'PrincipiaSearchSource') and
+                 (safe_hasattr(ob, 'PrincipiaSearchSource') and
                   ob.PrincipiaSearchSource().find(obj_searchterm) >= 0
                   ))
                 and
@@ -786,7 +787,7 @@
                     add_result((p, ob))
                     dflag=0
 
-            if search_sub and hasattr(bs, 'objectItems'):
+            if search_sub and safe_hasattr(bs, 'objectItems'):
                 self.ZopeFindAndApply(ob, obj_ids, obj_metatypes,
                                       obj_searchterm, obj_expr,
                                       obj_mtime, obj_mspec,
@@ -987,7 +988,7 @@
         pop()
         return r
 
-def mtime_match(ob, t, q, fn=hasattr):
+def mtime_match(ob, t, q, fn=safe_hasattr):
     if not fn(ob, '_p_mtime'):
         return 0
     return q=='<' and (ob._p_mtime < t) or (ob._p_mtime > t)
@@ -997,11 +998,11 @@
     fn=pr.append
 
     while 1:
-        if hasattr(ob, permission):
+        if safe_hasattr(ob, permission):
             p=getattr(ob, permission)
             if type(p) is lt:
                 map(fn, p)
-                if hasattr(ob, 'aq_parent'):
+                if safe_hasattr(ob, 'aq_parent'):
                     ob=ob.aq_parent
                     continue
                 break
@@ -1012,7 +1013,7 @@
                 map(fn, ('Manager', 'Anonymous'))
                 break
 
-        if hasattr(ob, 'aq_parent'):
+        if safe_hasattr(ob, 'aq_parent'):
             ob=ob.aq_parent
             continue
         break


=== Products/ZCatalog/ZCatalogIndexes.py 1.8 => 1.8.136.1 ===
--- Products/ZCatalog/ZCatalogIndexes.py:1.8	Wed Aug 14 18:25:15 2002
+++ Products/ZCatalog/ZCatalogIndexes.py	Sat May 28 20:41:34 2005
@@ -23,6 +23,7 @@
 from OFS.History import Historical
 from OFS.SimpleItem import SimpleItem
 from OFS.ObjectManager import ObjectManager, IFAwareObjectManager
+from ZODB.utils import safe_hasattr
 
 import os, sys, time
 
@@ -90,7 +91,8 @@
 
             for ob in indexes.keys():
                 o = indexes.get(ob)
-                if hasattr(o, 'meta_type') and getattr(o,'meta_type') in spec:
+                if (safe_hasattr(o, 'meta_type')
+                and getattr(o,'meta_type') in spec):
                     set.append(ob)
 
             return set



More information about the Zope-Checkins mailing list