[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