From 65d7dbd043c227189d61e8961de9effbea495115 Mon Sep 17 00:00:00 2001 From: EKNr1 Date: Sat, 24 Feb 2024 20:51:58 +0100 Subject: [PATCH] Added a class that can save dataclasses to a json file. --- data_file.py | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ file_dict.py | 51 -------------------------- 2 files changed, 101 insertions(+), 51 deletions(-) create mode 100644 data_file.py delete mode 100644 file_dict.py diff --git a/data_file.py b/data_file.py new file mode 100644 index 0000000..29143c0 --- /dev/null +++ b/data_file.py @@ -0,0 +1,101 @@ +#!/usr/bin/python3 + +import json +from dataclasses import dataclass + + +class DictFile: + """ + This class is not safe to use! + Any code in the file will be executed! + """ + def __init__(self, path: str=None): + self.path = path + + if path is None: + self.settings = {} + + else: + self.load_from_file(path) + + def load_from_file(self, path): + file = open(path, "r") + self.settings = eval(file.read()) + file.close() + + def save(self, path: str=None): + if path is None: + path = self.path + + file = open(path, "w") + file.write(str(self)) + file.close() + + def __str__(self): + new_settings_str = "{\n" + for key in self.settings: + new_settings_str += "\t" + repr(key) + ": " + repr(self.settings[key]) + ",\n" + + new_settings_str = new_settings_str[:-2] + "\n}" + + return new_settings_str + + def __repr__(self): + return repr(self.settings) + + def __getitem__(self, key): + return self.settings[key] + + def __setitem__(self, key, value): + self.settings[key] = value + + def __delitem__(self, key): + self.settings.pop(key) + + def __iter__(self): + return self.settings + + def __len__(self): + return len(self.settings) + + +class DataclassJSONFile: + def __init__(self, file_path, dataclass, class_instance=None): + self.file_path = file_path + self.dataclass = dataclass + self.class_instance = class_instance + + if class_instance is None: + self.load_from_file(file_path) + + def load_from_file(self, file_path): + file = open(file_path, "r") + class_dict = json.load(file) + file.close() + + self.class_instance = self.dataclass(**class_dict) + + def save_to_file(self): + class_dict = self.class_instance.__dict__ + + file = open(self.file_path, "w") + json.dump(class_dict, file) + file.close() + + def __repr__(self): + return repr(self.class_instance) + + def __getitem__(self, key): + return getattr(self.class_instance, key) + + def __setitem__(self, key, value): + setattr(self.class_instance, key, value) + + def __delitem__(self, key): + delattr(self.class_instance, key) + + def __iter__(self): + return self.class_instance.__iter__() + + def __len__(self): + return len(self.class_instance.__dict__) diff --git a/file_dict.py b/file_dict.py deleted file mode 100644 index c2a6804..0000000 --- a/file_dict.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/python3 - -class FileDict: - def __init__(self, path: str=None): - self.path = path - - if path is None: - self.settings = {} - - else: - self.load_from_file(path) - - def load_from_file(self, path): - file = open(path, "r") - self.settings = eval(file.read()) - file.close() - - def save(self, path: str=None): - if path is None: - path = self.path - - file = open(path, "w") - file.write(str(self)) - file.close() - - def __str__(self): - new_settings_str = "{\n" - for key in self.settings: - new_settings_str += "\t" + repr(key) + ": " + repr(self.settings[key]) + ",\n" - - new_settings_str = new_settings_str[:-2] + "\n}" - - return new_settings_str - - def __repr__(self): - return repr(self.settings) - - def __getitem__(self, key): - return self.settings[key] - - def __setitem__(self, key, value): - self.settings[key] = value - - def __delitem__(self, key): - self.settings.pop(key) - - def __iter__(self): - return self.settings - - def __len__(self): - return len(self.settings)