def create(self, initial=None, _subschema=None): """ Create a document from this schema by using the initial values from the schema, possibly overwriting them with the initial values from the `initial` parameter and leaving out any optional fields. :initial: A dictionary of initial values which overrule the initial values from the schema description. Default: empty. :return: A newly created dictionary matching the structure of the schema. """ schema = _subschema or self._schema initial = initial or {} doc = {} for key, field in schema.iteritems(): # Do not create default dictionary if key is a type, e.g. # unicode, since we don't know a key name if isinstance(key, types.TypeType): continue if not field.optional: if isinstance(field, DictField): doc[key] = self.create(initial.get(key, {}), _subschema=field._schema) elif hasattr(field.default, u'__call__'): doc[key] = field.default() else: doc[key] = field.default update_recursive(doc, initial) return doc
def test_update_recursive_skip_none(self): """ Test 'skip_none' parameter. """ self.assertEquals({u'a': {}}, update_recursive({}, {u'a': { u'b': None }}, skip_none=True)) self.assertEquals({u'a': {}}, update_recursive({u'a': 0}, {u'a': { u'b': None }}, skip_none=True)) self.assertEquals({u'a': 0}, update_recursive({u'a': 0}, {u'a': None}, skip_none=True))
def test_update_recursive_nested(self): self.assertEquals({u'a': { u'b': 1 }}, update_recursive({}, {u'a': { u'b': 1 }})) self.assertEquals({u'a': { u'b': 1 }}, update_recursive({u'a': 0}, {u'a': { u'b': 1 }})) self.assertEquals({u'a': { u'b': None }}, update_recursive({u'a': 0}, {u'a': { u'b': None }}))
def test_update_recursive_skip_none(self): """ Test 'skip_none' parameter. """ self.assertEquals({u'a': {}}, update_recursive({}, {u'a': {u'b': None}}, skip_none=True)) self.assertEquals({u'a': {}}, update_recursive({u'a': 0}, {u'a': {u'b': None}}, skip_none=True)) self.assertEquals({u'a': 0}, update_recursive({u'a': 0}, {u'a': None}, skip_none=True))
def test_update_recursive_nested(self): self.assertEquals({u'a': {u'b': 1}}, update_recursive({}, {u'a': {u'b': 1}})) self.assertEquals({u'a': {u'b': 1}}, update_recursive({u'a': 0}, {u'a': {u'b': 1}})) self.assertEquals({u'a': {u'b': None}}, update_recursive({u'a': 0}, {u'a': {u'b': None}}))
def test_update_recursive_simple(self): self.assertEquals({u'a': 1}, update_recursive({}, {u'a': 1})) self.assertEquals({u'a': 1}, update_recursive({u'a': 0}, {u'a': 1})) self.assertEquals({u'a': None}, update_recursive({u'a': 0}, {u'a': None}))