Source code for coolest.template.classes.base

__author__ = 'aymgal'


import inspect
import json
from copy import deepcopy


[docs] def get_class_names(instance): class_names = [c.__name__ for c in inspect.getmro(instance.__class__)] return class_names[0], ' < '.join(class_names[:-1])
[docs] def filter_dict(dictionary, exclude_keys=None): if exclude_keys is None: return dictionary dictionary_ = deepcopy(dictionary) for key in dictionary.keys(): if key in exclude_keys or key[0] == '_': del dictionary_[key] elif isinstance(dictionary[key], dict): dictionary_[key] = filter_dict(dictionary_[key], exclude_keys) return dictionary_
# class Fields(object): # """Essentially a wrapper of inspect.signature # to store argument names and default value in a readable json format. # This is mainly for the documentation website""" # def __init__(self, func): # signature = inspect.signature(func) # for key, parameter in signature.parameters.items(): # setattr(self, str(parameter.name), str(parameter.default))
[docs] class APIBaseObject(object): """Abstract class on which all COOLEST template classes are based. This handles the filtering of attributes and automatic documentation attributes. """ def __init__(self): """Creates a `documentation` attribute based on the docstring of the child class. """ #self.type, self._api_inheritance = get_class_names(self) if not hasattr(self, 'documentation') or self.documentation is None: if self.__doc__ is not None: self.documentation = self.__doc__.strip() else: self.documentation = "" # self.fields = Fields(self.__init__)
[docs] def to_JSON(self, indent=2, exclude_keys=None): """Returns a JSON representation of `self`, filtering out specific attributes based on their name. Parameters ---------- indent : int, optional Indentation to be used in the JSON representation, by default 2 exclude_keys : list, optional List of attribute names to be excluded from the JSON representation (see `standard` submodule for examples), by default None """ return json.dumps(self, default=lambda o: filter_dict(o.__dict__, exclude_keys), sort_keys=True, indent=indent)