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