@@ -64,6 +64,11 @@ def _apply_default_optional(self, dct):
6464 dct .setdefault (self .key , self .default )
6565
6666
67+ def _remove_default_optional (self , dct ):
68+ if dct .get (self .key , MISSING ) == self .default :
69+ del dct [self .key ]
70+
71+
6772def _require_key (self , dct ):
6873 if self .key not in dct :
6974 raise ValidationError ('Missing required key: {}' .format (self .key ))
@@ -85,6 +90,10 @@ def _apply_default_required_recurse(self, dct):
8590 dct [self .key ] = apply_defaults (dct [self .key ], self .schema )
8691
8792
93+ def _remove_default_required_recurse (self , dct ):
94+ dct [self .key ] = remove_defaults (dct [self .key ], self .schema )
95+
96+
8897def _check_conditional (self , dct ):
8998 if dct .get (self .condition_key , MISSING ) == self .condition_value :
9099 _check_required (self , dct )
@@ -110,25 +119,30 @@ def _check_conditional(self, dct):
110119Required = collections .namedtuple ('Required' , ('key' , 'check_fn' ))
111120Required .check = _check_required
112121Required .apply_default = _dct_noop
122+ Required .remove_default = _dct_noop
113123RequiredRecurse = collections .namedtuple ('RequiredRecurse' , ('key' , 'schema' ))
114124RequiredRecurse .check = _check_required
115125RequiredRecurse .check_fn = _check_fn_required_recurse
116126RequiredRecurse .apply_default = _apply_default_required_recurse
127+ RequiredRecurse .remove_default = _remove_default_required_recurse
117128Optional = collections .namedtuple ('Optional' , ('key' , 'check_fn' , 'default' ))
118129Optional .check = _check_optional
119130Optional .apply_default = _apply_default_optional
131+ Optional .remove_default = _remove_default_optional
120132OptionalNoDefault = collections .namedtuple (
121133 'OptionalNoDefault' , ('key' , 'check_fn' ),
122134)
123135OptionalNoDefault .check = _check_optional
124136OptionalNoDefault .apply_default = _dct_noop
137+ OptionalNoDefault .remove_default = _dct_noop
125138Conditional = collections .namedtuple (
126139 'Conditional' ,
127140 ('key' , 'check_fn' , 'condition_key' , 'condition_value' , 'ensure_absent' ),
128141)
129142Conditional .__new__ .__defaults__ = (False ,)
130143Conditional .check = _check_conditional
131144Conditional .apply_default = _dct_noop
145+ Conditional .remove_default = _dct_noop
132146
133147
134148class Map (collections .namedtuple ('Map' , ('object_name' , 'id_key' , 'items' ))):
@@ -158,6 +172,12 @@ def apply_defaults(self, v):
158172 item .apply_default (ret )
159173 return ret
160174
175+ def remove_defaults (self , v ):
176+ ret = v .copy ()
177+ for item in self .items :
178+ item .remove_default (ret )
179+ return ret
180+
161181
162182class Array (collections .namedtuple ('Array' , ('of' ,))):
163183 __slots__ = ()
@@ -174,6 +194,9 @@ def check(self, v):
174194 def apply_defaults (self , v ):
175195 return [apply_defaults (val , self .of ) for val in v ]
176196
197+ def remove_defaults (self , v ):
198+ return [remove_defaults (val , self .of ) for val in v ]
199+
177200
178201class Not (object ):
179202 def __init__ (self , val ):
@@ -238,6 +261,10 @@ def apply_defaults(v, schema):
238261 return schema .apply_defaults (v )
239262
240263
264+ def remove_defaults (v , schema ):
265+ return schema .remove_defaults (v )
266+
267+
241268def load_from_filename (filename , schema , load_strategy , exc_tp ):
242269 with reraise_as (exc_tp ):
243270 if not os .path .exists (filename ):
0 commit comments