Skip to content

Commit dfab585

Browse files
author
Joel Collins
committed
Massively simplified property view class builder
1 parent 82ff5e3 commit dfab585

File tree

1 file changed

+18
-48
lines changed

1 file changed

+18
-48
lines changed

examples/builder.py

Lines changed: 18 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,78 +4,48 @@
44

55
from labthings.server.quick import create_app
66
from labthings.server.view import View
7-
from labthings.server.decorators import (
8-
ThingProperty,
9-
PropertySchema,
10-
use_args,
11-
)
7+
from labthings.server.decorators import ThingProperty, PropertySchema, use_args
128

139
from labthings.server.types import value_to_field, data_dict_to_schema
1410

1511
from components.pdf_component import PdfComponent
1612

1713

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-
14+
def gen_property(property_object, property_name, name: str = None, readonly=False):
3115

32-
class BasePropertyResource(View):
33-
def __init__(self):
34-
super().__init__()
35-
"""
36-
Properties to be added by constructor function:
37-
property_object: Object containing the property
38-
property_name: String name of property of object
39-
"""
16+
# Create a class name
17+
if not name:
18+
name = type(property_object).__name__ + f"_{property_name}"
4019

20+
# Create inner functions
4121
def _get(self):
42-
return getattr(self.property_object, self.property_name)
22+
return getattr(property_object, property_name)
4323

4424
def _post(self, args):
45-
setattr(self.property_object, self.property_name, args)
46-
return getattr(self.property_object, self.property_name)
25+
setattr(property_object, property_name, args)
26+
return getattr(property_object, property_name)
4727

4828
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-
54-
55-
def gen_property(property_object, property_name, name: str = None, post=True):
56-
57-
# Create a class name
58-
if not name:
59-
name = type(property_object).__name__ + f"_{property_name}"
29+
getattr(property_object, property_name).update(args)
30+
return getattr(property_object, property_name)
6031

6132
# Generate a basic property class
6233
generated_class = type(
6334
name,
64-
(BasePropertyResource, object),
35+
(View, object),
6536
{
6637
"property_object": property_object,
6738
"property_name": property_name,
68-
"get": copy_func(BasePropertyResource._get),
39+
"get": _get,
6940
},
7041
)
7142

72-
# Enable PUT requests for dictionaries
73-
if type(getattr(property_object, property_name)) == dict:
74-
generated_class.put = copy_func(BasePropertyResource._put)
75-
7643
# Override read-write capabilities
77-
if post:
78-
generated_class.post = copy_func(BasePropertyResource._post)
44+
if not readonly:
45+
generated_class.post = _post
46+
# Enable PUT requests for dictionaries
47+
if type(getattr(property_object, property_name)) == dict:
48+
generated_class.put = _put
7949

8050
# Add decorators for arguments etc
8151
initial_property_value = getattr(property_object, property_name)

0 commit comments

Comments
 (0)