def _check_frames(frames): if not inspect.isgenerator(frames): raise Exception("Invalid frames: not a generator") # ensure the frames are in a valid format; valid formats are # - <data> -- will be assumed to be plain text # - (<mime_type>, <data>) # - (<mime_type>, <data>, <metadata>) for (n, frame) in enumerate(frames): if frame is None: yield None elif not utils.is_iterable(frame): # default content type is plain text yield (MIME_TYPE.TEXT.value, unicode(frame), None) else: try: assert utils.is_iterable(frame), "Not an iterable" frame = list(frame) frame_length = len(frame) if frame_length == 2: (mime_type_, content_), metadata_ = frame, None elif frame_length == 3: (mime_type_, content_, metadata_) = frame else: raise Exception("Unexpected tuple length: %d" % frame_length) yield (_validate_mime_type(mime_type_), content_, metadata_) except Exception as e: raise Exception("Invalid frame #%d: %s" % (n + 1, e))
def register_renderer(renderer, mime_type): global _renderers if not utils.is_callable(renderer): raise ValueError("Invalid renderer: not a function") if not utils.is_iterable(mime_type): mime_types = (mime_type,) else: mime_types = mime_type for mime_type in mime_types: mime_type = _validate_mime_type(mime_type) _renderers.insert(0, (renderer, mime_type)) _logger.debug("added renderer for %s: %s" % (mime_type, renderer))