Skip to content

Commit ddb130b

Browse files
author
Joel Collins
committed
Added basic support for dictionary PUT generation
1 parent a9b6cf5 commit ddb130b

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed

examples/builder.py

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import uuid
2+
import types
3+
import functools
24

35
from labthings.server.quick import create_app
46
from labthings.server.view import View
@@ -8,11 +10,25 @@
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

1315
from 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+
1632
class 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

3355
def 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
74107
labthing.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)

examples/components/pdf_component.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ def __init__(self):
1313
self.x_range = range(-100, 100)
1414
self.magic_denoise = 200
1515

16+
self.magic_dictionary = {
17+
"voltage": 5,
18+
"volume": [5, 10],
19+
"mode": "spectrum",
20+
"light_on": True,
21+
"user": {"name": "Squidward", "id": 1},
22+
}
23+
1624
def noisy_pdf(self, x, mu=0.0, sigma=25.0):
1725
"""
1826
Generate a noisy gaussian function (to act as some pretend data)

0 commit comments

Comments
 (0)