def _prep_object(self, obj): obj = self._normalize_keys(obj) schema = self.schema if not schema: # build schema off normalized key version _obj = self._normalize_keys(obj) # cache a key map from old key->normalized keys self._key_map = {k: self._normalize_key(k) for k in obj.iterkeys()} # in the case we don't have a schema already defined, we need to # build on now; all objects are assumed to have the SAME SCHEMA! schema = autoschema([_obj], exclude_keys=self.RESTRICTED_KEYS) self.config['schema'] = schema # optimization; lookup in local scope kmap = self._key_map or {} for key, value in obj.items(): # map original key to normalized key, if normal map exists _key = kmap.get(key) or key _schema = schema.get(_key) or {} try: value = self._prep_value(value, schema=_schema) except Exception as e: # make sure the value contents are loggable _value = to_encoding(value) obj.setdefault('_e', {}) msg = 'prep(key=%s, value=%s) failed: %s' % (_key, _value, e) logger.error(msg) # set error field with original values obj['_e'].update({_key: value}) # FIXME: should we leave original as-is? if not of correct # type, etc, this might cause problems # normalize invalid value to None value = None obj[key] = value variants = self._add_variants(_key, value, _schema) obj.update(variants) obj['_v'] = self.version obj = self._object_cls(**obj) return obj
def autoschema(self, objects, **kwargs): ''' wrapper around utils.autoschema function ''' return autoschema(objects=objects, exclude_keys=self.RESTRICTED_KEYS, **kwargs)