added snippet interface and httpclient

This commit is contained in:
2021-05-31 21:18:25 +02:00
parent 6d207c1db9
commit a1856a68e5
8 changed files with 257 additions and 50 deletions

72
scilog/snippet.py Normal file
View 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