def process_simple_type_list(self, s, name=None): item_type = s.list.item_type if item_type is None: self.debug1( "skipping simple type: %s because its list itemType " "could not be found", name) return base = self.get_type(item_type) if base is None: self.pending_simple_types[self.get_name(item_type)].add((s, name)) self.debug1( "pending simple type list: %s " "because of unseen base %s", name, item_type) return self.debug1("adding simple type list: %s", name) retval = Array(base, serialize_as='sd-list') # FIXME: to be implemented retval.__type_name__ = name retval.__namespace__ = self.tns assert not retval.get_type_name() is retval.Empty return retval
def process_simple_type_list(self, s, name=None): item_type = s.list.item_type if item_type is None: self.debug1("skipping simple type: %s because its list itemType " "could not be found", name) return base = self.get_type(item_type) if base is None: self.pending_simple_types[self.get_name(item_type)].add((s, name)) self.debug1("pending simple type list: %s " "because of unseen base %s", name, item_type) return self.debug1("adding simple type list: %s", name) retval = Array(base, serialize_as='sd-list') # FIXME: to be implemented retval.__type_name__ = name retval.__namespace__ = self.tns assert not retval.get_type_name() is retval.Empty return retval
def log_repr(obj, cls=None, given_len=None, parent=None, from_array=False, tags=None): """Use this function if you want to serialize a ComplexModelBase instance to logs. It will: * Limit size of the String types * Limit size of Array types * Not try to iterate on iterators, push data, etc. """ if tags is None: tags = set() if obj is None: return 'None' if cls is None: cls = obj.__class__ if cls in (list, tuple): cls = Array(Any) if cls is dict: cls = AnyDict if cls in NATIVE_MAP: cls = NATIVE_MAP[cls] if hasattr(obj, '__class__') and issubclass(obj.__class__, cls): cls = obj.__class__ if hasattr(cls, 'Attributes') and not cls.Attributes.logged: return "%s(...)" % cls.get_type_name() if issubclass(cls, File) and isinstance(obj, File.Value): cls = obj.__class__ if cls.Attributes.logged == 'len': l = '?' try: if isinstance(obj, (list, tuple)): l = str(sum([len(o) for o in obj])) else: l = str(len(obj)) except TypeError: if given_len is not None: l = str(given_len) return "<len=%s>" % l if (issubclass(cls, Array) or cls.Attributes.max_occurs > 1) and not \ from_array: if id(obj) in tags: return "%s(...)" % obj.__class__.__name__ tags.add(id(obj)) retval = [] subcls = cls if issubclass(cls, Array): subcls, = cls._type_info.values() if isinstance(obj, PushBase): retval = '[<PushData>]' else: for i, o in enumerate(obj): if i >= MAX_ARRAY_ELEMENT_NUM: retval.append("(...)") break retval.append(log_repr(o, subcls, from_array=True, tags=tags)) retval = "[%s]" % (', '.join(retval)) elif issubclass(cls, ComplexModelBase): if id(obj) in tags: return "%s(...)" % obj.__class__.__name__ tags.add(id(obj)) retval = [] i = 0 for k, t in cls.get_flat_type_info(cls).items(): if i >= MAX_FIELD_NUM: retval.append("(...)") break if not t.Attributes.logged: continue try: v = getattr(obj, k, None) except (AttributeError, KeyError): v = None # HACK!: sometimes non-db attributes restored from database don't # get properly reinitialized. if isclass(v) and issubclass(v, ModelBase): continue polymap = t.Attributes.polymap if polymap is not None: t = polymap.get(v.__class__, t) if v is not None: retval.append("%s=%s" % (k, log_repr(v, t, parent=k, tags=tags))) i += 1 return "%s(%s)" % (cls.get_type_name(), ', '.join(retval)) elif issubclass(cls, Unicode) and isinstance(obj, six.string_types): if len(obj) > MAX_STRING_FIELD_LENGTH: return '%r(...)' % obj[:MAX_STRING_FIELD_LENGTH] else: return repr(obj) elif issubclass(cls, File) and isinstance(obj, PGFileJson.FileData): retval = log_repr(obj, PGFileJson.FileData, tags=tags) else: retval = repr(obj) if len(retval) > MAX_STRING_FIELD_LENGTH: retval = retval[:MAX_STRING_FIELD_LENGTH] + "(...)" return retval
def log_repr(obj, cls=None, given_len=None, parent=None, from_array=False, tags=None): """Use this function if you want to serialize a ComplexModelBase instance to logs. It will: * Limit size of the String types * Limit size of Array types * Not try to iterate on iterators, push data, etc. """ if tags is None: tags = set() if obj is None: return 'None' if cls is None: cls = obj.__class__ if cls in (list, tuple): cls = Array(Any) if cls is dict: cls = AnyDict if cls in NATIVE_MAP: cls = NATIVE_MAP[cls] if hasattr(obj, '__class__') and issubclass(obj.__class__, cls): cls = obj.__class__ if hasattr(cls, 'Attributes') and not cls.Attributes.logged: return "%s(...)" % cls.get_type_name() if issubclass(cls, File) and isinstance(obj, File.Value): cls = obj.__class__ if cls.Attributes.logged == 'len': l = '?' try: if isinstance(obj, (list, tuple)): l = str(sum([len(o) for o in obj])) else: l = str(len(obj)) except TypeError: if given_len is not None: l = str(given_len) return "<len=%s>" % l if issubclass(cls, Array): cls, = cls._type_info.values() if (cls.Attributes.max_occurs > 1) and not from_array: if id(obj) in tags: return "%s(...)" % obj.__class__.__name__ tags.add(id(obj)) retval = [] subcls = cls if issubclass(cls, Array): subcls, = cls._type_info.values() if isinstance(obj, PushBase): retval = '[<PushData>]' else: for i, o in enumerate(obj): if i >= MAX_ARRAY_ELEMENT_NUM: retval.append("(...)") break retval.append(log_repr(o, subcls, from_array=True, tags=tags)) retval = "[%s]" % (', '.join(retval)) elif issubclass(cls, ComplexModelBase): if id(obj) in tags: return "%s(...)" % obj.__class__.__name__ tags.add(id(obj)) retval = [] i = 0 for k, t in cls.get_flat_type_info(cls).items(): if i >= MAX_FIELD_NUM: retval.append("(...)") break if not t.Attributes.logged: continue try: v = getattr(obj, k, None) except (AttributeError, KeyError): v = None # HACK!: sometimes non-db attributes restored from database don't # get properly reinitialized. if isclass(v) and issubclass(v, ModelBase): continue polymap = t.Attributes.polymap if polymap is not None: t = polymap.get(v.__class__, t) if v is not None: retval.append("%s=%s" % (k, log_repr(v, t, parent=k, tags=tags))) i += 1 return "%s(%s)" % (cls.get_type_name(), ', '.join(retval)) elif issubclass(cls, Unicode) and isinstance(obj, six.string_types): if len(obj) > MAX_STRING_FIELD_LENGTH: return '%r(...)' % obj[:MAX_STRING_FIELD_LENGTH] else: return repr(obj) elif issubclass(cls, File) and isinstance(obj, PGFileJson.FileData): retval = log_repr(obj, PGFileJson.FileData, tags=tags) else: retval = repr(obj) if len(retval) > MAX_STRING_FIELD_LENGTH: retval = retval[:MAX_STRING_FIELD_LENGTH] + "(...)" return retval