- Make it possible to use `colander.null as a missing` argument
				
					
				
			to ``colander.SchemaNode`` for roundtripping purposes. - Make it possible to pickle ``colander.null``.
This commit is contained in:
		
							
								
								
									
										11
									
								
								CHANGES.txt
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								CHANGES.txt
									
									
									
									
									
								
							@@ -1,6 +1,17 @@
 | 
			
		||||
Changes
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
Next Release
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
Bug Fixes
 | 
			
		||||
~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
- Make it possible to use ``colander.null`` as a ``missing`` argument
 | 
			
		||||
  to ``colander.SchemaNode`` for roundtripping purposes.
 | 
			
		||||
 | 
			
		||||
- Make it possible to pickle ``colander.null``.
 | 
			
		||||
 | 
			
		||||
0.7.0
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,14 +8,16 @@ import translationstring
 | 
			
		||||
 | 
			
		||||
_ = translationstring.TranslationStringFactory('colander')
 | 
			
		||||
 | 
			
		||||
class null(object):
 | 
			
		||||
_marker = object()
 | 
			
		||||
 | 
			
		||||
class _null(object):
 | 
			
		||||
    def __nonzero__(self):
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return '<colander.null>'
 | 
			
		||||
 | 
			
		||||
null = null()
 | 
			
		||||
null = _null()
 | 
			
		||||
 | 
			
		||||
def interpolate(msgs):
 | 
			
		||||
    for s in msgs:
 | 
			
		||||
@@ -1169,7 +1171,7 @@ class SchemaNode(object):
 | 
			
		||||
        self.typ = typ
 | 
			
		||||
        self.validator = kw.pop('validator', None)
 | 
			
		||||
        self.default = kw.pop('default', null)
 | 
			
		||||
        self.missing = kw.pop('missing', null)
 | 
			
		||||
        self.missing = kw.pop('missing', _marker)
 | 
			
		||||
        self.name = kw.pop('name', '')
 | 
			
		||||
        self.title = kw.pop('title', self.name.capitalize())
 | 
			
		||||
        self.description = kw.pop('description', '')
 | 
			
		||||
@@ -1194,7 +1196,7 @@ class SchemaNode(object):
 | 
			
		||||
        A return value of ``True`` implies that a ``missing`` value
 | 
			
		||||
        wasn't specified for this node.  A return value of ``False``
 | 
			
		||||
        implies that a ``missing`` value was specified for this node."""
 | 
			
		||||
        return self.missing is null
 | 
			
		||||
        return self.missing is _marker
 | 
			
		||||
 | 
			
		||||
    def serialize(self, appstruct=null):
 | 
			
		||||
        """ Serialize the :term:`appstruct` to a :term:`cstruct` based
 | 
			
		||||
@@ -1208,7 +1210,6 @@ class SchemaNode(object):
 | 
			
		||||
        If an ``appstruct`` argument is not explicitly provided, it
 | 
			
		||||
        defaults to :attr:`colander.null`.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        if appstruct is null:
 | 
			
		||||
            appstruct = self.default
 | 
			
		||||
        cstruct = self.typ.serialize(self, appstruct)
 | 
			
		||||
@@ -1235,7 +1236,7 @@ class SchemaNode(object):
 | 
			
		||||
        """
 | 
			
		||||
        if cstruct is null:
 | 
			
		||||
            appstruct = self.missing
 | 
			
		||||
            if appstruct is null:
 | 
			
		||||
            if appstruct is _marker:
 | 
			
		||||
                raise Invalid(self, _('Required'))
 | 
			
		||||
            # We never deserialize or validate the missing value
 | 
			
		||||
            return appstruct
 | 
			
		||||
 
 | 
			
		||||
@@ -1340,6 +1340,13 @@ class TestSchemaNode(unittest.TestCase):
 | 
			
		||||
        node.missing = 'abc'
 | 
			
		||||
        self.assertEqual(node.deserialize(), 'abc')
 | 
			
		||||
 | 
			
		||||
    def test_deserialize_null_can_be_used_as_missing(self):
 | 
			
		||||
        from colander import null
 | 
			
		||||
        typ = DummyType()
 | 
			
		||||
        node = self._makeOne(typ)
 | 
			
		||||
        node.missing = null
 | 
			
		||||
        self.assertEqual(node.deserialize(null), null)
 | 
			
		||||
 | 
			
		||||
    def test_serialize(self):
 | 
			
		||||
        typ = DummyType()
 | 
			
		||||
        node = self._makeOne(typ)
 | 
			
		||||
 
 | 
			
		||||
@@ -255,7 +255,8 @@ an ``age`` key of :attr:`colander.null`, the ``missing`` value of
 | 
			
		||||
 | 
			
		||||
.. note:: Note that ``None`` can be used for the ``missing`` schema
 | 
			
		||||
   node value as required, as in the above example.  It's no different
 | 
			
		||||
   than any other value used as ``missing``.
 | 
			
		||||
   than any other value used as ``missing``.  or ``colander.nuil`` can
 | 
			
		||||
   also be used as the ``missing`` value if that is helpful.
 | 
			
		||||
 | 
			
		||||
The :attr:`colander.null` value is also the default, so it needn't be
 | 
			
		||||
specified in the cstruct.  Therefore, the ``deserialized`` value of
 | 
			
		||||
@@ -287,12 +288,12 @@ Value                 Missing               Result
 | 
			
		||||
===================== ===================== ===========================
 | 
			
		||||
colander.null         <missing>             Invalid exception raised
 | 
			
		||||
<missing>             <missing>             Invalid exception raised
 | 
			
		||||
colander.null         colander.null         Invalid exception raised
 | 
			
		||||
colander.null         value                 value deserialized
 | 
			
		||||
<missing>             value                 value deserialized
 | 
			
		||||
value                 <missing>             value deserialized
 | 
			
		||||
value                 colander.null         value deserialized
 | 
			
		||||
value_a               value_b               value_a deserialized
 | 
			
		||||
colander.null         value                 value used
 | 
			
		||||
<missing>             value                 value used
 | 
			
		||||
<missing>             colander.null         colander.null used
 | 
			
		||||
value                 <missing>             value used
 | 
			
		||||
value                 colander.null         value used
 | 
			
		||||
value_a               value_b               value_a used
 | 
			
		||||
===================== ===================== ===========================
 | 
			
		||||
 | 
			
		||||
.. note:: ``<missing>`` in the above table represents the circumstance
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user