[Zope-Checkins] SVN: Zope/branches/Zope-2_8-branch/ Collector #556: <dtml-sqlvar> now returns 'null' instead of 'None'

Tres Seaver tseaver at palladion.com
Fri Sep 2 19:12:47 EDT 2005


Log message for revision 38274:
  Collector #556:  <dtml-sqlvar> now returns 'null' instead of 'None'
  
  Patch from Dieter Maurer, with tests sponsored by a bounty from Logicalware.
  
  

Changed:
  U   Zope/branches/Zope-2_8-branch/doc/CHANGES.txt
  U   Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/sqlvar.py
  A   Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/tests/test_sqlvar.py

-=-
Modified: Zope/branches/Zope-2_8-branch/doc/CHANGES.txt
===================================================================
--- Zope/branches/Zope-2_8-branch/doc/CHANGES.txt	2005-09-02 23:12:37 UTC (rev 38273)
+++ Zope/branches/Zope-2_8-branch/doc/CHANGES.txt	2005-09-02 23:12:46 UTC (rev 38274)
@@ -26,6 +26,10 @@
 
     Bugs Fixed
 
+      - Collector #556:  <dtml-sqlvar> now returns 'null' instead of 'None'
+        for values which are None in Python (sponsored by a bounty from
+        Logicalware).
+
       - Collector #1182: BBB Forward port fix from 2.7 branch (19 months
         ago!), reverting 'guarded_getitem' to pass the 'index' argument as
         the name to 'validate'.  This change is *not* propagated to the

Modified: Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/sqlvar.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/sqlvar.py	2005-09-02 23:12:37 UTC (rev 38273)
+++ Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/sqlvar.py	2005-09-02 23:12:46 UTC (rev 38274)
@@ -98,6 +98,9 @@
                 raise
             raise ValueError, 'Missing input variable, <em>%s</em>' % name
 
+        if v is None:
+            return 'null'
+
         if t=='int':
             try:
                 if type(v) is StringType:

Added: Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/tests/test_sqlvar.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/tests/test_sqlvar.py	2005-09-02 23:12:37 UTC (rev 38273)
+++ Zope/branches/Zope-2_8-branch/lib/python/Shared/DC/ZRDB/tests/test_sqlvar.py	2005-09-02 23:12:46 UTC (rev 38274)
@@ -0,0 +1,136 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (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
+#
+##############################################################################
+import unittest
+
+from UserDict import UserDict
+
+def _sql_quote(v):
+    return '"%s"' % v
+
+class FauxMultiDict(UserDict):
+
+    def getitem(self, key, call):
+        if key == 'sql_quote__':
+            return _sql_quote
+
+        v = self[key]
+        if v is not None:
+            if call and callable(v):
+                v = v()
+        return v
+
+class SQLVarTests(unittest.TestCase):
+
+    def _getTargetClass(self):
+        from Shared.DC.ZRDB.sqlvar import SQLVar
+        return SQLVar
+
+    def _makeOne(self, *args, **kw):
+        return self._getTargetClass()(*args, **kw)
+
+    def test_constructor_no_type(self):
+        from DocumentTemplate.DT_Util import ParseError
+        self.assertRaises(ParseError, self._makeOne, 'foo')
+
+    def test_constructor_invalid_type(self):
+        from DocumentTemplate.DT_Util import ParseError
+        self.assertRaises(ParseError, self._makeOne, 'foo type="nonesuch"')
+
+    def test_constructor_valid_type(self):
+        from DocumentTemplate.DT_Util import ParseError
+        v = self._makeOne('foo type="string"')
+        self.assertEqual(v.__name__, 'foo')
+        self.assertEqual(v.expr, 'foo')
+        self.assertEqual(v.args['type'], 'string')
+
+    def test_render_name_returns_value(self):
+        v = self._makeOne('foo type="string"')
+        self.assertEqual(v.render(FauxMultiDict(foo='FOO')), '"FOO"')
+
+    def test_render_name_missing_required_raises_ValueError(self):
+        v = self._makeOne('foo type="string"')
+        self.assertRaises(ValueError, v.render, FauxMultiDict())
+
+    def test_render_name_missing_optional_returns_null(self):
+        v = self._makeOne('foo type="string" optional')
+        self.assertEqual(v.render(FauxMultiDict()), 'null')
+
+    def test_render_expr_returns_value(self):
+        v = self._makeOne('expr="foo" type="string"')
+        self.assertEqual(v.render(FauxMultiDict(foo='FOO')), '"FOO"')
+
+    def test_render_expr_missing_required_raises_NameError(self):
+        v = self._makeOne('expr="foo" type="string"')
+        self.assertRaises(NameError, v.render, FauxMultiDict())
+
+    def test_render_expr_missing_optional_returns_null(self):
+        v = self._makeOne('expr="foo" type="string" optional')
+        self.assertEqual(v.render(FauxMultiDict()), 'null')
+
+    def test_render_int_returns_int_without_quoting(self):
+        v = self._makeOne('expr="foo" type="int"')
+        self.assertEqual(v.render(FauxMultiDict(foo=42)), '42')
+
+    def test_render_int_with_long_returns_value_without_L(self):
+        v = self._makeOne('expr="foo" type="int"')
+        self.assertEqual(v.render(FauxMultiDict(foo='42L')), '42')
+
+    def test_render_int_required_invalid_raises_ValueError(self):
+        v = self._makeOne('expr="foo" type="int"')
+        self.assertRaises(ValueError, v.render, FauxMultiDict(foo=''))
+
+    def test_render_int_optional_invalid_returns_null(self):
+        v = self._makeOne('expr="foo" type="int" optional')
+        self.assertEqual(v.render(FauxMultiDict(foo='')), 'null')
+
+    def test_render_float_returns_float_without_quoting(self):
+        v = self._makeOne('expr="foo" type="float"')
+        self.assertEqual(v.render(FauxMultiDict(foo=3.1415)), '3.1415')
+
+    def test_render_float_with_long_returns_value_without_L(self):
+        v = self._makeOne('expr="foo" type="float"')
+        self.assertEqual(v.render(FauxMultiDict(foo='42L')), '42')
+
+    def test_render_float_required_invalid_raises_ValueError(self):
+        v = self._makeOne('expr="foo" type="float"')
+        self.assertRaises(ValueError, v.render, FauxMultiDict(foo=''))
+
+    def test_render_float_optional_invalid_returns_null(self):
+        v = self._makeOne('expr="foo" type="float" optional')
+        self.assertEqual(v.render(FauxMultiDict(foo='')), 'null')
+
+    def test_render_nb_required_with_blank_raises_ValueError(self):
+        v = self._makeOne('expr="foo" type="nb"')
+        self.assertRaises(ValueError, v.render, FauxMultiDict(foo=''))
+
+    def test_render_nb_optional_with_blank_returns_null(self):
+        v = self._makeOne('expr="foo" type="nb" optional')
+        self.assertEqual(v.render(FauxMultiDict(foo='')), 'null')
+
+    def test_render_name_with_none_returns_null(self):
+        # Collector #556, patch from Dieter Maurer
+        v = self._makeOne('foo type="string"')
+        self.assertEqual(v.render(FauxMultiDict(foo=None)), 'null')
+
+    def test_render_expr_with_none_returns_null(self):
+        # Collector #556, patch from Dieter Maurer
+        v = self._makeOne('expr="foo" type="string"')
+        self.assertEqual(v.render(FauxMultiDict(foo=None)), 'null')
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(SQLVarTests))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')



More information about the Zope-Checkins mailing list