11import uuid
2+ import types
3+ import functools
24
35from labthings .server .quick import create_app
46from labthings .server .view import View
810 use_args ,
911)
1012
11- from labthings .server .types import value_to_field
13+ from labthings .server .types import value_to_field , data_dict_to_schema
1214
1315from components .pdf_component import PdfComponent
1416
1517
18+ def copy_func (f ):
19+ """Based on http://stackoverflow.com/a/6528148/190597 (Glenn Maynard)"""
20+ g = types .FunctionType (
21+ f .__code__ ,
22+ f .__globals__ ,
23+ name = f .__name__ ,
24+ argdefs = f .__defaults__ ,
25+ closure = f .__closure__ ,
26+ )
27+ g = functools .update_wrapper (g , f )
28+ g .__kwdefaults__ = f .__kwdefaults__
29+ return g
30+
31+
1632class BasePropertyResource (View ):
1733 def __init__ (self ):
1834 super ().__init__ ()
@@ -22,13 +38,19 @@ def __init__(self):
2238 property_name: String name of property of object
2339 """
2440
25- def get (self ):
41+ def _get (self ):
2642 return getattr (self .property_object , self .property_name )
2743
28- def post (self , args ):
44+ def _post (self , args ):
2945 setattr (self .property_object , self .property_name , args )
3046 return getattr (self .property_object , self .property_name )
3147
48+ def _put (self , args ):
49+ if type (getattr (self .property_object , self .property_name )) != dict :
50+ raise TypeError ("Cannot PUT to a property that isn't an object/dictionary" )
51+ getattr (self .property_object , self .property_name ).update (args )
52+ return getattr (self .property_object , self .property_name )
53+
3254
3355def gen_property (property_object , property_name , name : str = None , post = True ):
3456
@@ -40,18 +62,29 @@ def gen_property(property_object, property_name, name: str = None, post=True):
4062 generated_class = type (
4163 name ,
4264 (BasePropertyResource , object ),
43- {"property_object" : property_object , "property_name" : property_name ,},
65+ {
66+ "property_object" : property_object ,
67+ "property_name" : property_name ,
68+ "get" : copy_func (BasePropertyResource ._get ),
69+ },
4470 )
4571
72+ # Enable PUT requests for dictionaries
73+ if type (getattr (property_object , property_name )) == dict :
74+ generated_class .put = copy_func (BasePropertyResource ._put )
75+
4676 # Override read-write capabilities
47- if not post :
48- generated_class .post = None
77+ if post :
78+ generated_class .post = copy_func ( BasePropertyResource . _post )
4979
5080 # Add decorators for arguments etc
5181 initial_property_value = getattr (property_object , property_name )
52- generated_class = PropertySchema (value_to_field (initial_property_value ))(
53- generated_class
54- )
82+ if type (initial_property_value ) == dict :
83+ property_schema = data_dict_to_schema (initial_property_value )
84+ else :
85+ property_schema = value_to_field (initial_property_value )
86+
87+ generated_class = PropertySchema (property_schema )(generated_class )
5588 generated_class = ThingProperty (generated_class )
5689
5790 return generated_class
@@ -72,7 +105,8 @@ def gen_property(property_object, property_name, name: str = None, post=True):
72105
73106# Add routes for the API views we created
74107labthing .add_view (gen_property (my_component , "magic_denoise" ), "/denoise" )
108+ labthing .add_view (gen_property (my_component , "magic_dictionary" ), "/dictionary" )
75109
76110# Start the app
77- if __name__ == "__main__" :
78- app .run (host = "0.0.0.0" , port = "5000" , threaded = True , debug = True , use_reloader = False )
111+ # if __name__ == "__main__":
112+ # app.run(host="0.0.0.0", port="5000", threaded=True, debug=True, use_reloader=False)
0 commit comments