From 5fefda82cc448de3ec0eb68e1b09d69afb497d1d Mon Sep 17 00:00:00 2001 From: Honza Mach <honza.mach.ml@gmail.com> Date: Thu, 16 Mar 2017 10:09:16 +0100 Subject: [PATCH] Fixed bug in json saving and dumping code. There were multiple values for keyword argument 'default', which caused the state_dump|save() methods to fails. Additionally, the ZenDaemon code was optimized to make better use of pyzenkit.jsonconf library. --- pyzenkit/baseapp.py | 7 ++----- pyzenkit/jsonconf.py | 13 +++++++++++++ pyzenkit/zendaemon.py | 14 +++++++------- setup.py | 2 +- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/pyzenkit/baseapp.py b/pyzenkit/baseapp.py index 9f54c4f..b3d0d42 100644 --- a/pyzenkit/baseapp.py +++ b/pyzenkit/baseapp.py @@ -1287,17 +1287,14 @@ class BaseApp: """ Dump given data structure into JSON string. """ - return json.dumps(data, sort_keys=True, indent=4, **kwargs) + return pyzenkit.jsonconf.json_dump(data, **kwargs) @staticmethod def json_save(json_file, data, **kwargs): """ Save given data structure into given JSON file. """ - mf = open(json_file, 'w') - json.dump(data, mf, sort_keys = True, **kwargs) - mf.close() - return True + return pyzenkit.jsonconf.json_save(json_file, data, **kwargs) @staticmethod def json_load(json_file, **kwargs): diff --git a/pyzenkit/jsonconf.py b/pyzenkit/jsonconf.py index 302d068..d138a4b 100644 --- a/pyzenkit/jsonconf.py +++ b/pyzenkit/jsonconf.py @@ -49,6 +49,18 @@ def json_default(o): #------------------------------------------------------------------------------- +def json_dump(data, **kwargs): + """ + Dump given data structure into JSON string. + """ + if not 'sort_keys' in kwargs: + kwargs['sort_keys'] = True + if not 'indent' in kwargs: + kwargs['indent'] = 4 + if not 'default' in kwargs: + kwargs['default'] = _json_default + return json.dumps(data, **kwargs) + def json_save(json_file, data, **kwargs): """ Save data structure into given JSON configuration file. @@ -61,6 +73,7 @@ def json_save(json_file, data, **kwargs): kwargs['default'] = json_default with open(json_file, "w") as f: json.dump(data, f, **kwargs) + return True def json_load(json_file): """ diff --git a/pyzenkit/zendaemon.py b/pyzenkit/zendaemon.py index 4b9cc8c..b31c70f 100644 --- a/pyzenkit/zendaemon.py +++ b/pyzenkit/zendaemon.py @@ -44,7 +44,7 @@ def _json_default(o): elif callable(o): return "CALLBACK({}:{})".format(o.__self__.__class__.__name__, o.__name__) else: - raise TypeError(o) + return repr(o) class QueueEmptyException(Exception): """ @@ -474,7 +474,7 @@ class ZenDaemon(pyzenkit.baseapp.BaseApp): if self.c(self.CONFIG_NODAEMON): self.state_dump(self._get_state()) else: - self.state_save(self._get_state(), indent=4, default=_json_default) + self.state_save(self._get_state()) return (self.FLAG_CONTINUE, None) def cbk_event_log_statistics(self, daemon, args): @@ -585,7 +585,7 @@ class ZenDaemon(pyzenkit.baseapp.BaseApp): statistics['components'][component.__class__.__name__] = component.get_statistics(self) return statistics - def state_dump(self, state, **kwargs): + def state_dump(self, state): """ Dump current daemon state. @@ -593,9 +593,9 @@ class ZenDaemon(pyzenkit.baseapp.BaseApp): """ # Dump current script state. #self.logger.debug("Current daemon state >>>\n{}".format(json.dumps(state, sort_keys=True, indent=4))) - print("Current daemon state >>>\n{}".format(self.json_dump(state, default=_json_default, **kwargs))) + print("Current daemon state >>>\n{}".format(self.json_dump(state, default=_json_default))) - def state_save(self, state, **kwargs): + def state_save(self, state): """ Save current daemon state. @@ -604,8 +604,8 @@ class ZenDaemon(pyzenkit.baseapp.BaseApp): sfn = self.get_fn_state() self.dbgout("[STATUS] Saving current daemon state to file '{}'".format(sfn)) pprint.pprint(state) - self.dbgout("[STATUS] Current daemon state:\n{}".format(self.json_dump(state, default=_json_default, **kwargs))) - self.json_save(sfn, state, default=_json_default, **kwargs) + self.dbgout("[STATUS] Current daemon state:\n{}".format(self.json_dump(state, default=_json_default))) + self.json_save(sfn, state, default=_json_default) self.logger.info("Current daemon state saved to file '{}'".format(sfn)) def pidfiles_list(self, **kwargs): diff --git a/setup.py b/setup.py index 0a4a8e3..33d82ce 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ with open(path.join(here, 'README.rst'), encoding='utf-8') as f: setup( name = 'pyzenkit', - version = '0.16', + version = '0.20', description = 'Python 3 script and daemon toolkit', long_description = long_description, classifiers = [ -- GitLab