[Checkins] SVN: zope.component/branches/tlotze-hooks/ Moved the zope.site.hooks functionality to zope.component.hooks as it isn't

Thomas Lotze tl at gocept.com
Tue Oct 20 02:05:18 EDT 2009


Log message for revision 105163:
  Moved the zope.site.hooks functionality to zope.component.hooks as it isn't
  actually dealing with zope.site's concept of a site.
  

Changed:
  U   zope.component/branches/tlotze-hooks/CHANGES.txt
  A   zope.component/branches/tlotze-hooks/src/zope/component/hooks.py

-=-
Modified: zope.component/branches/tlotze-hooks/CHANGES.txt
===================================================================
--- zope.component/branches/tlotze-hooks/CHANGES.txt	2009-10-20 06:00:02 UTC (rev 105162)
+++ zope.component/branches/tlotze-hooks/CHANGES.txt	2009-10-20 06:05:18 UTC (rev 105163)
@@ -4,7 +4,8 @@
 3.8.0 (unreleased)
 ==================
 
-- ...
+- Moved the zope.site.hooks functionality to zope.component.hooks as it isn't
+  actually dealing with zope.site's concept of a site.
 
 3.7.1 (2009-07-24)
 ==================

Copied: zope.component/branches/tlotze-hooks/src/zope/component/hooks.py (from rev 105162, zope.site/trunk/src/zope/site/hooks.py)
===================================================================
--- zope.component/branches/tlotze-hooks/src/zope/component/hooks.py	                        (rev 0)
+++ zope.component/branches/tlotze-hooks/src/zope/component/hooks.py	2009-10-20 06:05:18 UTC (rev 105163)
@@ -0,0 +1,116 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Hooks for getting and setting a site in the thread global namespace.
+
+$Id$
+"""
+__docformat__ = 'restructuredtext'
+
+import threading
+import zope.component
+import zope.security
+
+class read_property(object):
+    def __init__(self, func):
+        self.func = func
+
+    def __get__(self, inst, cls):
+        if inst is None:
+            return self
+
+        return self.func(inst)
+
+class SiteInfo(threading.local):
+    site = None
+    sm = zope.component.getGlobalSiteManager()
+
+    def adapter_hook(self):
+        adapter_hook = self.sm.adapters.adapter_hook
+        self.adapter_hook = adapter_hook
+        return adapter_hook
+
+    adapter_hook = read_property(adapter_hook)
+
+siteinfo = SiteInfo()
+
+def setSite(site=None):
+    if site is None:
+        sm = zope.component.getGlobalSiteManager()
+    else:
+
+        # We remove the security proxy because there's no way for
+        # untrusted code to get at it without it being proxied again.
+
+        # We should really look look at this again though, especially
+        # once site managers do less.  There's probably no good reason why
+        # they can't be proxied.  Well, except maybe for performance.
+
+        site = zope.security.proxy.removeSecurityProxy(site)
+        sm = site.getSiteManager()
+
+    siteinfo.site = site
+    siteinfo.sm = sm
+    try:
+        del siteinfo.adapter_hook
+    except AttributeError:
+        pass
+
+def getSite():
+    return siteinfo.site
+
+
+def getSiteManager(context=None):
+    """A special hook for getting the site manager.
+
+    Here we take the currently set site into account to find the appropriate
+    site manager.
+    """
+    if context is None:
+        return siteinfo.sm
+
+    # We remove the security proxy because there's no way for
+    # untrusted code to get at it without it being proxied again.
+
+    # We should really look look at this again though, especially
+    # once site managers do less.  There's probably no good reason why
+    # they can't be proxied.  Well, except maybe for performance.
+    sm = zope.component.interfaces.IComponentLookup(
+        context, zope.component.getGlobalSiteManager())
+    return zope.security.proxy.removeSecurityProxy(sm)
+
+
+def adapter_hook(interface, object, name='', default=None):
+    try:
+        return siteinfo.adapter_hook(interface, object, name, default)
+    except zope.component.interfaces.ComponentLookupError:
+        return default
+
+
+def setHooks():
+    zope.component.adapter_hook.sethook(adapter_hook)
+    zope.component.getSiteManager.sethook(getSiteManager)
+
+def resetHooks():
+    # Reset hookable functions to original implementation.
+    zope.component.adapter_hook.reset()
+    zope.component.getSiteManager.reset()
+
+# Clear the site thread global
+clearSite = setSite
+try:
+    from zope.testing.cleanup import addCleanUp
+except ImportError:
+    pass
+else:
+    addCleanUp(resetHooks)



More information about the checkins mailing list