22import types
33import functools
44
5- from labthings .server .quick import create_app
6- from labthings .server .view import View
7- from labthings .server .decorators import ThingProperty , PropertySchema , use_args , Doc
8-
9- from labthings .server .types import value_to_field , data_dict_to_schema
5+ from labthings .server .quick import create_app , property_of
106
117from components .pdf_component import PdfComponent
128
139
14- def gen_property (
15- property_object , property_name , name : str = None , readonly = False , description = None
16- ):
17-
18- # Create a class name
19- if not name :
20- name = type (property_object ).__name__ + f"_{ property_name } "
21-
22- # Create inner functions
23- def _get (self ):
24- return getattr (property_object , property_name )
25-
26- def _post (self , args ):
27- setattr (property_object , property_name , args )
28- return getattr (property_object , property_name )
29-
30- def _put (self , args ):
31- getattr (property_object , property_name ).update (args )
32- return getattr (property_object , property_name )
33-
34- # Generate a basic property class
35- generated_class = type (
36- name ,
37- (View , object ),
38- {
39- "property_object" : property_object ,
40- "property_name" : property_name ,
41- "get" : _get ,
42- },
43- )
44-
45- # Override read-write capabilities
46- if not readonly :
47- generated_class .post = _post
48- # Enable PUT requests for dictionaries
49- if type (getattr (property_object , property_name )) == dict :
50- generated_class .put = _put
51-
52- # Add decorators for arguments etc
53- initial_property_value = getattr (property_object , property_name )
54- if type (initial_property_value ) == dict :
55- property_schema = data_dict_to_schema (initial_property_value )
56- else :
57- property_schema = value_to_field (initial_property_value )
58-
59- generated_class = PropertySchema (property_schema )(generated_class )
60- generated_class = ThingProperty (generated_class )
61-
62- if description :
63- generated_class = Doc (description = description , summary = description )(
64- generated_class
65- )
66-
67- return generated_class
68-
69-
7010# Create LabThings Flask app
7111app , labthing = create_app (
7212 __name__ ,
@@ -77,16 +17,17 @@ def _put(self, args):
7717)
7818
7919# Attach an instance of our component
20+ # Usually a Python object controlling some piece of hardware
8021my_component = PdfComponent ()
8122labthing .add_component (my_component , "org.labthings.example.mycomponent" )
8223
8324# Add routes for the API views we created
8425labthing .add_view (
85- gen_property (my_component , "magic_denoise" , description = "A magic denoise property" ),
26+ property_of (my_component , "magic_denoise" , description = "A magic denoise property" ),
8627 "/denoise" ,
8728)
8829labthing .add_view (
89- gen_property (
30+ property_of (
9031 my_component ,
9132 "magic_dictionary" ,
9233 description = "A big dictionary of little properties" ,
0 commit comments