2
2
import types
3
3
import functools
4
4
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
10
6
11
7
from components .pdf_component import PdfComponent
12
8
13
9
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
-
70
10
# Create LabThings Flask app
71
11
app , labthing = create_app (
72
12
__name__ ,
@@ -77,16 +17,17 @@ def _put(self, args):
77
17
)
78
18
79
19
# Attach an instance of our component
20
+ # Usually a Python object controlling some piece of hardware
80
21
my_component = PdfComponent ()
81
22
labthing .add_component (my_component , "org.labthings.example.mycomponent" )
82
23
83
24
# Add routes for the API views we created
84
25
labthing .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" ),
86
27
"/denoise" ,
87
28
)
88
29
labthing .add_view (
89
- gen_property (
30
+ property_of (
90
31
my_component ,
91
32
"magic_dictionary" ,
92
33
description = "A big dictionary of little properties" ,
0 commit comments