1""" 2Display return data in DSON format 3================================== 4 5This outputter is intended for demonstration purposes. Information on the DSON 6spec can be found `here`__. 7 8.. __: http://vpzomtrrfrt.github.io/DSON/ 9 10This outputter requires `Dogeon`__ (installable via pip) 11 12.. __: https://github.com/soasme/dogeon 13""" 14 15import logging 16 17try: 18 import dson 19except ImportError: 20 dson = None 21 22 23log = logging.getLogger(__name__) 24 25 26def __virtual__(): 27 if dson is None: 28 return (False, "The dogeon Python package is not installed") 29 return True 30 31 32def output(data, **kwargs): # pylint: disable=unused-argument 33 """ 34 Print the output data in JSON 35 """ 36 try: 37 dump_opts = {"indent": 4, "default": repr} 38 39 if "output_indent" in __opts__: 40 41 indent = __opts__.get("output_indent") 42 sort_keys = False 43 44 if indent == "pretty": 45 indent = 4 46 sort_keys = True 47 48 elif isinstance(indent, int): 49 if indent < 0: 50 indent = None 51 52 dump_opts["indent"] = indent 53 dump_opts["sort_keys"] = sort_keys 54 55 return dson.dumps(data, **dump_opts) 56 57 except UnicodeDecodeError as exc: 58 log.error("Unable to serialize output to dson") 59 return dson.dumps( 60 {"error": "Unable to serialize output to DSON", "message": str(exc)} 61 ) 62 63 except TypeError: 64 log.debug("An error occurred while outputting DSON", exc_info=True) 65 # Return valid JSON for unserializable objects 66 return dson.dumps({}) 67