added snippet interface and httpclient
This commit is contained in:
72
scilog/snippet.py
Normal file
72
scilog/snippet.py
Normal file
@ -0,0 +1,72 @@
|
||||
from typing import Type, get_type_hints, TypeVar
|
||||
import functools
|
||||
|
||||
def typechecked(func):
|
||||
@functools.wraps(func)
|
||||
def typechecked_call(*args, **kwargs):
|
||||
func_types = get_type_hints(func)
|
||||
for index, key in enumerate(func_types.keys()):
|
||||
if key != "return":
|
||||
assert func_types[key] == type(args[index+1]), f"{repr(func)} expected to receive input of type {func_types[key].__name__} but received {type(args[index+1]).__name__}"
|
||||
return func(*args, **kwargs)
|
||||
return typechecked_call
|
||||
|
||||
def property_maker(cls, name, type_name):
|
||||
storage_name = '_' + name
|
||||
|
||||
@property
|
||||
def prop(self) -> type_name:
|
||||
return getattr(self, storage_name)
|
||||
|
||||
@prop.setter
|
||||
@typechecked
|
||||
def prop(self, value: type_name) -> None:
|
||||
setattr(self, storage_name, value)
|
||||
|
||||
return prop
|
||||
|
||||
class Snippet(dict):
|
||||
def __init__(self, **kwargs):
|
||||
self._properties = []
|
||||
self.set_properties(**kwargs)
|
||||
|
||||
def set_properties(self, **kwargs):
|
||||
for key, value in kwargs.items():
|
||||
storage_name = '_' + key
|
||||
setattr(Snippet, storage_name, None)
|
||||
setattr(Snippet, key, property_maker(self, key, value))
|
||||
self._properties.append(key)
|
||||
|
||||
def to_dict(self, include_none=True):
|
||||
if include_none:
|
||||
return {key: getattr(self, key) for key in self._properties }
|
||||
else:
|
||||
return {key: getattr(self, key) for key in self._properties if getattr(self, key) is not None}
|
||||
|
||||
def import_dict(self, properties):
|
||||
for key in properties.keys():
|
||||
setattr(self, key, properties[key])
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, properties):
|
||||
tmp = cls()
|
||||
tmp.import_dict(properties)
|
||||
return tmp
|
||||
|
||||
def __str__(self):
|
||||
return f"{type(self).__name__}"
|
||||
|
||||
@classmethod
|
||||
def from_http_response(cls, response):
|
||||
if type(response)==list:
|
||||
return [cls.from_dict(resp) for resp in response]
|
||||
else:
|
||||
return cls.from_dict(response)
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
tmp = Snippet(id=str, textcontent=str, defaultOrder=int)
|
||||
print(tmp.id)
|
||||
tmp.id = 2
|
Reference in New Issue
Block a user