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