From 35017770060bb50eca05a184f95e633bce71fd08 Mon Sep 17 00:00:00 2001
From: Anton Pershin <tony.pershin@gmail.com>
Date: Fri, 1 May 2020 19:06:46 +0300
Subject: [PATCH] Added support of serialization of objects into json files

---
 comsdk/comaux.py | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/comsdk/comaux.py b/comsdk/comaux.py
index fbdae7b..eba52e1 100644
--- a/comsdk/comaux.py
+++ b/comsdk/comaux.py
@@ -6,8 +6,10 @@ from copy import deepcopy
 import importlib
 from abc import ABC, abstractmethod
 from typing import Optional, List, Tuple, Type, Any
+import json
 
 import numpy as np
+from jsons import JsonSerializable
 
 ArrayItemGetter = collections.namedtuple('ArrayItemGetter', ['key_path_to_array', 'i'])
 
@@ -368,7 +370,7 @@ def parse_datafile(path, data_names, transform_funcs, cols_to_parse=[]):
         for i, data_name in enumerate(data_names):
             val = tmp[cols_to_parse[i]]
             data[data_name].append(transform_funcs[i](val))
-    return data
+    return {name: np.array(array_) for name, array_ in data.items()}
 
 def parse_timed_numdatafile(path):
     '''
@@ -391,7 +393,7 @@ def parse_timed_numdatafile(path):
         for i, val in enumerate(tmp[1:]):
             timed_data[i] = float(val)
         data.append(timed_data)
-    return time, data
+    return time, np.array(data)
 
 def write_datafile(path, data):
     keys = list(data.keys())
@@ -418,6 +420,7 @@ def print_pretty_dict(d):
     for k, v in d.items():
         print('{}: {}'.format(k ,v))
 
+
 def raise_exception_if_arguments_not_in_keywords_or_none(argument_names, kwargs) -> None:
     for arg in argument_names:
         if arg not in kwargs:
@@ -426,6 +429,7 @@ def raise_exception_if_arguments_not_in_keywords_or_none(argument_names, kwargs)
             if kwargs[arg] is None:
                 raise ValueError('Keywords "{}" must not be None'.format(arg))
 
+
 def take_value_if_not_none(value, default=None, transform=str) -> Any:
     if value is None:
         if default is None:
@@ -434,3 +438,19 @@ def take_value_if_not_none(value, default=None, transform=str) -> Any:
             return default
     else:
         return transform(value)
+
+
+def dump_to_json(obj: JsonSerializable, path_to_jsons: str = 'jsons') -> None:
+    filename = '{}.{}.json'.format(type(obj).__module__, type(obj).__name__)
+    filename = os.path.join(path_to_jsons, filename)
+    obj_as_dict = obj.json
+    with open(filename, 'w') as f:
+        json.dump(obj_as_dict, f, indent=4)
+
+
+def load_from_json(cls: Type[JsonSerializable], path_to_jsons: str = 'jsons') -> JsonSerializable:
+    filename = '{}.{}.json'.format(cls.__module__, cls.__name__)
+    filename = os.path.join(path_to_jsons, filename)
+    with open(filename, 'r') as f:
+        obj_as_dict = json.load(f)
+    return cls.from_json(obj_as_dict)
-- 
2.17.1