def present(message, options, file=sys.stdout): """Write a message payload to the output, pretty printing and/or coloring it as configured in the options.""" if not message.payload: return payload = None mime = media_types.get(message.opt.content_format, 'application/octet-stream') if options.pretty_print: from aiocoap.util.prettyprint import pretty_print prettyprinted = pretty_print(message) if prettyprinted is not None: (infos, mime, payload) = prettyprinted if not options.quiet: for i in infos: print(colored(i, options, 'grey', attrs=['bold']), file=sys.stderr) color = options.color if color: from aiocoap.util.prettyprint import lexer_for_mime import pygments try: lexer = lexer_for_mime(mime) except pygments.util.ClassNotFound: color = False if color and payload is None: # Coloring requires a unicode-string style payload, either from the # mime type or from the pretty printer. try: payload = message.payload.decode('utf8') except UnicodeDecodeError: color = False if color: from pygments.formatters import TerminalFormatter from pygments import highlight highlit = highlight( payload, lexer, TerminalFormatter(), ) # The TerminalFormatter already adds an end-of-line character, not # trying to add one for any missing trailing newlines. print(highlit, file=file, end="") file.flush() else: if payload is None: file.buffer.write(message.payload) if file.isatty() and message.payload[-1:] != b'\n': file.write("\n") else: file.write(payload) if file.isatty() and payload[-1] != '\n': file.write("\n")
def present(message, options, file=sys.stdout): """Write a message payload to the output, pretty printing and/or coloring it as configured in the options.""" if not options.quiet and (message.opt.location_path or message.opt.location_query): # FIXME: Percent encoding is completely missing; this would be done # most easily with a CRI library location_ref = "/" + "/".join(message.opt.location_path) if message.opt.location_query: location_ref += "?" + "&".join(message.opt.location_query) print(colored( f"Location options indicate new resource: {location_ref}", options, 'green'), file=sys.stderr) if not message.payload: return payload = None cf = message.opt.content_format or message.request.opt.content_format if cf is not None and cf.is_known(): mime = cf.media_type else: mime = 'application/octet-stream' if options.pretty_print: from aiocoap.util.prettyprint import pretty_print prettyprinted = pretty_print(message) if prettyprinted is not None: (infos, mime, payload) = prettyprinted if not options.quiet: for i in infos: print(colored(i, options, 'grey', attrs=['bold']), file=sys.stderr) color = options.color if color: from aiocoap.util.prettyprint import lexer_for_mime import pygments try: lexer = lexer_for_mime(mime) except pygments.util.ClassNotFound: color = False if color and payload is None: # Coloring requires a unicode-string style payload, either from the # mime type or from the pretty printer. try: payload = message.payload.decode('utf8') except UnicodeDecodeError: color = False if color: from pygments.formatters import TerminalFormatter from pygments import highlight highlit = highlight( payload, lexer, TerminalFormatter(), ) # The TerminalFormatter already adds an end-of-line character, not # trying to add one for any missing trailing newlines. print(highlit, file=file, end="") file.flush() else: if payload is None: file.buffer.write(message.payload) if file.isatty() and message.payload[-1:] != b'\n': file.write("\n") else: file.write(payload) if file.isatty() and payload[-1] != '\n': file.write("\n")