[Checkins] SVN: zope.component/tseaver-test_cleanup/ Coverage.

Tres Seaver cvs-admin at zope.org
Mon Jun 25 04:04:43 UTC 2012


Log message for revision 127062:
  Coverage.
  
  Add docstring for 'read_property' to explain why we don't use 'property'.
  
  Use 'read_property' as a decorator (its intended use).

Changed:
  _U  zope.component/tseaver-test_cleanup/
  U   zope.component/tseaver-test_cleanup/src/zope/component/hooks.py
  A   zope.component/tseaver-test_cleanup/src/zope/component/tests/test_hooks.py

-=-
Modified: zope.component/tseaver-test_cleanup/src/zope/component/hooks.py
===================================================================
--- zope.component/tseaver-test_cleanup/src/zope/component/hooks.py	2012-06-25 04:04:34 UTC (rev 127061)
+++ zope.component/tseaver-test_cleanup/src/zope/component/hooks.py	2012-06-25 04:04:39 UTC (rev 127062)
@@ -21,13 +21,18 @@
 
 try:
     import zope.security.proxy
-except ImportError:
+except ImportError: #pragma NO COVER
     SECURITY_SUPPORT = False
 else:
     SECURITY_SUPPORT = True
 
 
 class read_property(object):
+    """Descriptor for property-like computed attributes.
+
+    Unlike the standard 'property', this descriptor allows assigning a
+    value to the instance, shadowing the property getter function.
+    """
     def __init__(self, func):
         self.func = func
 
@@ -41,13 +46,12 @@
     site = None
     sm = zope.component.getGlobalSiteManager()
 
+    @read_property
     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):

Added: zope.component/tseaver-test_cleanup/src/zope/component/tests/test_hooks.py
===================================================================
--- zope.component/tseaver-test_cleanup/src/zope/component/tests/test_hooks.py	                        (rev 0)
+++ zope.component/tseaver-test_cleanup/src/zope/component/tests/test_hooks.py	2012-06-25 04:04:39 UTC (rev 127062)
@@ -0,0 +1,198 @@
+##############################################################################
+#
+# Copyright (c) 2012 Zope Foundation 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.
+#
+##############################################################################
+"""Tests for z.c.hooks
+"""
+import unittest
+
+
+class Test_read_property(unittest.TestCase):
+
+    def _getTargetClass(self):
+        from zope.component.hooks import read_property
+        return read_property
+
+    def test_via_instance(self):
+        class Foo(object):
+            @self._getTargetClass()
+            def bar(self):
+                return 'BAR'
+        foo = Foo()
+        self.assertEqual(foo.bar, 'BAR')
+        foo.bar = 'BAZ'
+        self.assertEqual(foo.bar, 'BAZ')
+        del foo.bar
+        self.assertEqual(foo.bar, 'BAR')
+
+    def test_via_class(self):
+        class Foo(object):
+            @self._getTargetClass()
+            def bar(self):
+                return 'BAR'
+        bar = Foo.bar
+        self.assertTrue(isinstance(bar, self._getTargetClass()))
+        self.assertEqual(bar.func(object()), 'BAR')
+
+
+class SiteInfoTests(unittest.TestCase):
+
+    def _getTargetClass(self):
+        from zope.component.hooks import SiteInfo
+        return SiteInfo
+
+    def _makeOne(self):
+        return self._getTargetClass()()
+
+    def test_initial(self):
+        from zope.component.globalregistry import getGlobalSiteManager
+        gsm = getGlobalSiteManager()
+        si = self._makeOne()
+        self.assertEqual(si.site, None)
+        self.assertTrue(si.sm is gsm)
+
+    def test_adapter_hook(self):
+        _hook = object()
+        class _Registry(object):
+            adapter_hook = _hook
+        class _SiteManager(object):
+            adapters = _Registry()
+        si = self._makeOne()
+        si.sm = _SiteManager()
+        self.assertFalse('adapter_hook' in si.__dict__)
+        self.assertTrue(si.adapter_hook is _hook)
+        self.assertTrue('adapter_hook' in si.__dict__)
+        del si.adapter_hook
+        self.assertFalse('adapter_hook' in si.__dict__)
+
+
+class Test_setSite(unittest.TestCase):
+
+    def _callFUT(self, site):
+        from zope.component.hooks import setSite
+        return setSite(site)
+
+    def test_w_None(self):
+        from zope.component import hooks
+        from zope.component.globalregistry import getGlobalSiteManager
+        gsm = getGlobalSiteManager()
+        _SM2 = object()
+        _SITE = object()
+        _HOOK = object()
+        siteinfo = _DummySiteInfo()
+        siteinfo.sm = _SM2
+        siteinfo.site = _SITE
+        siteinfo.adapterhook = _HOOK
+        with _Monkey(hooks, siteinfo=siteinfo):
+            self._callFUT(None)
+        self.assertTrue(siteinfo.sm is gsm)
+        self.assertTrue(siteinfo.site is None)
+        self.assertFalse('adapter_hook' in siteinfo.__dict__)
+
+    def test_w_site(self):
+        from zope.component import hooks
+        _SM2 = object()
+        class _Site(object):
+            def getSiteManager(self):
+                return _SM2
+        siteinfo = _DummySiteInfo()
+        _site = _Site()
+        with _Monkey(hooks, siteinfo=siteinfo):
+            self._callFUT(_site)
+        self.assertTrue(siteinfo.sm is _SM2)
+        self.assertTrue(siteinfo.site is _site)
+        self.assertFalse('adapter_hook' in siteinfo.__dict__)
+
+
+class Test_getSite(unittest.TestCase):
+
+    def _callFUT(self):
+        from zope.component.hooks import getSite
+        return getSite()
+
+    def test_w_None(self):
+        from zope.component import hooks
+        from zope.component.globalregistry import getGlobalSiteManager
+        gsm = getGlobalSiteManager()
+        siteinfo = _DummySiteInfo()
+        with _Monkey(hooks, siteinfo=siteinfo):
+            self.assertTrue(self._callFUT() is None)
+
+    def test_w_site(self):
+        from zope.component import hooks
+        from zope.component.globalregistry import getGlobalSiteManager
+        gsm = getGlobalSiteManager()
+        _SM2 = object()
+        _SITE = object()
+        siteinfo = _DummySiteInfo()
+        siteinfo.sm = _SM2
+        siteinfo.site = _SITE
+        with _Monkey(hooks, siteinfo=siteinfo):
+            self.assertTrue(self._callFUT() is _SITE)
+
+
+class Test_site(unittest.TestCase):
+
+    def _callFUT(self, new_site):
+        from zope.component.hooks import site
+        return site(new_site)
+
+    def test_it(self):
+        from zope.component import hooks
+        from zope.component.globalregistry import getGlobalSiteManager
+        gsm = getGlobalSiteManager()
+        _SM2 = object()
+        class _Site(object):
+            def getSiteManager(self):
+                return _SM2
+        _site = _Site()
+        siteinfo = _DummySiteInfo()
+        self.assertTrue(siteinfo.site is None)
+        self.assertTrue(siteinfo.sm is _SM)
+        with _Monkey(hooks, siteinfo=siteinfo):
+            with self._callFUT(_site):
+                self.assertTrue(siteinfo.site is _site)
+                self.assertTrue(siteinfo.sm is _SM2)
+            self.assertTrue(siteinfo.site is None)
+            self.assertTrue(siteinfo.sm is gsm)
+
+
+_SM = object()
+class _DummySiteInfo(object):
+    sm = _SM
+    site = None
+
+class _Monkey(object):
+    # context-manager for replacing module names in the scope of a test.
+    def __init__(self, module, **kw):
+        self.module = module
+        self.to_restore = dict([(key, getattr(module, key)) for key in kw])
+        for key, value in kw.items():
+            setattr(module, key, value)
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        for key, value in self.to_restore.items():
+            setattr(self.module, key, value)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(Test_read_property),
+        unittest.makeSuite(SiteInfoTests),
+        unittest.makeSuite(Test_setSite),
+        unittest.makeSuite(Test_getSite),
+        unittest.makeSuite(Test_site),
+    ))
+



More information about the checkins mailing list