[Checkins] SVN: Products.GenericSetup/trunk/Products/GenericSetup/ Made PropertyManagerHelpers class work for non-PropertyManager objects

Tres Seaver tseaver at palladion.com
Tue May 27 11:57:47 EDT 2008


Log message for revision 86990:
  Made PropertyManagerHelpers class work for non-PropertyManager objects
      
  o Derived classes can supply a '_PROPERTIES' scehma, which is then used
    to mock up a temporary propertysheet for the object.  The adapter's 
    methods ('_extractProperties', '_purgeProperties', '_initProperties')
    then run against that propertysheet.
  

Changed:
  U   Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt
  U   Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py
  U   Products.GenericSetup/trunk/Products/GenericSetup/utils.py

-=-
Modified: Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt	2008-05-27 15:46:20 UTC (rev 86989)
+++ Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt	2008-05-27 15:57:47 UTC (rev 86990)
@@ -2,6 +2,13 @@
 
   GenericSetup 1.5.0 (unreleased)
 
+    - Made PropertyManagerHelpers class work for non-PropertyManager objects
+    
+      o Derived classes can supply a '_PROPERTIES' scehma, which is then used
+        to mock up a temporary propertysheet for the object.  The adapter's 
+        methods ('_extractProperties', '_purgeProperties', '_initProperties')
+        then run against that propertysheet.
+
     - Added logic to respect the destination of upgrade steps when determining
       their applicability. 
 

Modified: Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py	2008-05-27 15:46:20 UTC (rev 86989)
+++ Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py	2008-05-27 15:57:47 UTC (rev 86990)
@@ -284,6 +284,9 @@
         obj._properties[-1]['mode'] = 'w' # Not deletable
         return obj
 
+    def _getReal(self, obj):
+        return obj
+
     def _populate(self, obj):
         obj._updateProperty('foo_boolean', 'True')
         obj._updateProperty('foo_date', '2000/01/01')
@@ -315,7 +318,8 @@
     def test__extractProperties_normal(self):
         from Products.GenericSetup.utils import PrettyDocument
         helpers = self._makeOne()
-        self._populate(helpers.context)
+        obj = self._getReal(helpers.context)
+        self._populate(obj)
         doc = helpers._doc = PrettyDocument()
         node = doc.createElement('dummy')
         node.appendChild(helpers._extractProperties())
@@ -325,7 +329,7 @@
 
     def test__purgeProperties(self):
         helpers = self._makeOne()
-        obj = helpers.context
+        obj = self._getReal(helpers.context)
         self._populate(obj)
         helpers._purgeProperties()
 
@@ -346,12 +350,13 @@
     def test__initProperties_normal(self):
         from Products.GenericSetup.utils import PrettyDocument
         helpers = self._makeOne()
+        obj = self._getReal(helpers.context)
         node = _getDocumentElement(_NORMAL_PROPERTY_EXPORT)
         helpers._initProperties(node)
-        self.assertEqual(type(helpers.context.foo_int), int)
-        self.assertEqual(type(helpers.context.foo_string), str)
-        self.assertEqual(type(helpers.context.foo_tokens), tuple)
-        self.assertEqual(type(helpers.context.foo_tokens[0]), str)
+        self.assertEqual(type(obj.foo_int), int)
+        self.assertEqual(type(obj.foo_string), str)
+        self.assertEqual(type(obj.foo_tokens), tuple)
+        self.assertEqual(type(obj.foo_tokens[0]), str)
 
         doc = helpers._doc = PrettyDocument()
         node = doc.createElement('dummy')
@@ -392,7 +397,8 @@
         node = _getDocumentElement(_I18N_IMPORT)
         helpers._initProperties(node)
 
-        self.assertEqual(helpers.context.i18n_domain, 'dummy_domain')
+        self.assertEqual(helpers.context.getProperty('i18n_domain'),
+                        'dummy_domain')
 
     def test__initProperties_nopurge_base(self):
         helpers = self._makeOne()
@@ -405,9 +411,9 @@
         obj.manage_addProperty('lines3', ('Foo', 'Gee'), 'lines')
         helpers._initProperties(node)
 
-        self.assertEquals(obj.lines1, ('Foo', 'Bar'))
-        self.assertEquals(obj.lines2, ('Foo', 'Bar'))
-        self.assertEquals(obj.lines3, ('Gee', 'Foo', 'Bar'))
+        self.assertEquals(obj.getProperty('lines1'), ('Foo', 'Bar'))
+        self.assertEquals(obj.getProperty('lines2'), ('Foo', 'Bar'))
+        self.assertEquals(obj.getProperty('lines3'), ('Gee', 'Foo', 'Bar'))
 
     def test__initProperties_nopurge_extension(self):
         helpers = self._makeOne()
@@ -420,11 +426,93 @@
         obj.manage_addProperty('lines3', ('Foo', 'Gee'), 'lines')
         helpers._initProperties(node)
 
-        self.assertEquals(obj.lines1, ('Foo', 'Bar'))
-        self.assertEquals(obj.lines2, ('Foo', 'Bar'))
-        self.assertEquals(obj.lines3, ('Gee', 'Foo', 'Bar'))
+        self.assertEquals(obj.getProperty('lines1'), ('Foo', 'Bar'))
+        self.assertEquals(obj.getProperty('lines2'), ('Foo', 'Bar'))
+        self.assertEquals(obj.getProperty('lines3'), ('Gee', 'Foo', 'Bar'))
 
 
+class PropertyManagerHelpersNonPMContextTests(PropertyManagerHelpersTests):
+
+    def _makeOne(self, context=None, environ=None):
+        from Products.GenericSetup.utils import NodeAdapterBase
+        from Products.GenericSetup.testing import DummySetupEnviron
+
+        class Foo(self._getTargetClass(), NodeAdapterBase):
+            _PROPERTIES = (
+                {'id': 'foo_boolean', 'type': 'boolean', 'mode': 'wd'},
+                {'id': 'foo_date', 'type': 'date', 'mode': 'wd'},
+                {'id': 'foo_float', 'type': 'float', 'mode': 'wd'},
+                {'id': 'foo_int', 'type': 'int', 'mode': 'wd'},
+                {'id': 'foo_lines', 'type': 'lines', 'mode': 'wd'},
+                {'id': 'foo_long', 'type': 'long', 'mode': 'wd'},
+                {'id': 'foo_string', 'type': 'string', 'mode': 'wd'},
+                {'id': 'foo_text', 'type': 'text', 'mode': 'wd'},
+                {'id': 'foo_tokens', 'type': 'tokens', 'mode': 'wd'},
+                {'id': 'foo_selection', 'type': 'selection',
+                       'select_variable': 'foobarbaz', 'mode': 'wd'},
+                {'id': 'foo_mselection', 'type': 'multiple selection',
+                       'select_variable': 'foobarbaz', 'mode': 'wd'},
+                {'id': 'foo_boolean0', 'type': 'boolean', 'mode': 'wd'},
+                {'id': 'foo_ro', 'type': 'string', 'mode': ''},
+                {'id': 'foo_int_nodel', 'type': 'int', 'mode': 'w'},
+                {'id': 'foo_float_nodel', 'type': 'float', 'mode': 'w'},
+                {'id': 'foo_boolean_nodel', 'type': 'boolean', 'mode': 'w'},
+            )
+
+        if context is None:
+            context = self._makeContext()
+
+        if environ is None:
+            environ = DummySetupEnviron()
+
+        return Foo(context, environ)
+
+    def _makeContext(self):
+        from DateTime.DateTime import DateTime
+        class NonPropertyManager:
+            pass
+        obj = NonPropertyManager()
+        obj.foobarbaz = ('Foo', 'Bar', 'Baz')
+        obj.foo_boolean = False
+        obj.foo_date = DateTime('1970/01/01')
+        obj.foo_float = 0.0
+        obj.foo_int = 0
+        obj.foo_lines = []
+        obj.foo_long = 0
+        obj.foo_string = ''
+        obj.foo_text = ''
+        obj.foo_tokens = ()
+        obj.foo_selection = ''
+        obj.foo_mselection = ()
+        obj.foo_boolean0 = 0
+        obj.foo_ro = ''
+        obj.foo_int_nodel = 0
+        obj.foo_float_nodel = 0.0
+        obj.foo_boolean_nodel = False
+        return obj
+
+    def _getReal(self, obj):
+        return obj._real
+
+    def _populate(self, obj):
+        from DateTime.DateTime import DateTime
+        obj.foo_boolean = True
+        obj.foo_date = DateTime('2000/01/01')
+        obj.foo_float = 1.1
+        obj.foo_int = 1
+        obj.foo_lines = ['Foo', 'Lines']
+        obj.foo_long = 1
+        obj.foo_string = 'Foo String'
+        obj.foo_text = 'Foo\nText'
+        obj.foo_tokens = ('Foo', 'Tokens')
+        obj.foo_selection = 'Foo'
+        obj.foo_mselection = ('Foo', 'Baz')
+        obj.foo_boolean0 = 0
+        obj.foo_ro = 'RO'
+        obj.foo_int_nodel = 1789
+        obj.foo_float_nodel = 3.1415
+        obj.foo_boolean_nodel = True
+
 class MarkerInterfaceHelpersTests(unittest.TestCase):
 
     def _getTargetClass(self):
@@ -595,6 +683,7 @@
     return unittest.TestSuite((
         unittest.makeSuite(UtilsTests),
         unittest.makeSuite(PropertyManagerHelpersTests),
+        unittest.makeSuite(PropertyManagerHelpersNonPMContextTests),
         unittest.makeSuite(MarkerInterfaceHelpersTests),
         unittest.makeSuite(ObjectManagerHelpersTests),
         unittest.makeSuite(PrettyDocumentTests),

Modified: Products.GenericSetup/trunk/Products/GenericSetup/utils.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/utils.py	2008-05-27 15:46:20 UTC (rev 86989)
+++ Products.GenericSetup/trunk/Products/GenericSetup/utils.py	2008-05-27 15:57:47 UTC (rev 86990)
@@ -635,12 +635,41 @@
 
 
 class PropertyManagerHelpers(object):
-
     """PropertyManager im- and export helpers.
+    
+      o Derived classes can supply a '_PROPERTIES' scehma, which is then used
+        to mock up a temporary propertysheet for the object.  The adapter's 
+        methods ('_extractProperties', '_purgeProperties', '_initProperties')
+        then run against that propertysheet.
     """
+    _PROPERTIES = ()
 
     _encoding = default_encoding
 
+    def __init__(self, context, environ):
+        from OFS.PropertyManager import PropertyManager
+        if not isinstance(context, PropertyManager):
+            context = self._fauxAdapt(context)
+            
+        super(PropertyManagerHelpers, self).__init__(context, environ)
+
+    def _fauxAdapt(self, context):
+        from OFS.PropertySheets import PropertySheet
+        helper_self = self
+        class Adapted(PropertySheet):
+            def __init__(self, real, properties):
+                self._real = real
+                self._properties = properties
+            def p_self(self):
+                return self
+            def v_self(self):
+                return self._real
+            def propdict(self):
+                # PropertyManager method used by _initProperties
+                return dict([(p['id'], p) for p in self._properties])
+
+        return Adapted(context, self._PROPERTIES)
+
     def _extractProperties(self):
         fragment = self._doc.createDocumentFragment()
 



More information about the Checkins mailing list