diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index 7ec7182d..51e5e334 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -24,6 +24,7 @@ import koji from koji.util import base64encode, md5_constructor, to_list from koji_cli.lib import ( TimeOption, + DatetimeJSONEncoder, _, _list_tasks, _progress_callback, @@ -1045,7 +1046,7 @@ def handle_call(goptions, session, args): non_kw.append(arg_filter(arg)) response = getattr(session, name).__call__(*non_kw, **kw) if options.json_output: - print(json.dumps(response, indent=2, separators=(',', ': '))) + print(json.dumps(response, indent=2, separators=(',', ': '), cls=DatetimeJSONEncoder)) else: pprint.pprint(response) diff --git a/cli/koji_cli/lib.py b/cli/koji_cli/lib.py index bb80ca7f..4ba7dd6c 100644 --- a/cli/koji_cli/lib.py +++ b/cli/koji_cli/lib.py @@ -9,6 +9,7 @@ import socket import string import sys import time +import json from contextlib import closing from copy import copy @@ -21,6 +22,7 @@ import koji # import parse_arches to current namespace for backward compatibility from koji import parse_arches from koji.util import md5_constructor, to_list +from koji.xmlrpcplus import xmlrpc_client # for compatibility with plugins based on older version of lib @@ -848,3 +850,10 @@ def truncate_string(s, length=47): return s else: return '' + + +class DatetimeJSONEncoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, xmlrpc_client.DateTime): + return str(o) + return json.JSONEncoder.default(self, o)