Skip to content

Commit 42ab04b

Browse files
author
Joel Collins
committed
Moved Thing Description into the root representation
1 parent 25d667c commit 42ab04b

File tree

5 files changed

+47
-51
lines changed

5 files changed

+47
-51
lines changed

examples/builder.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
# Create LabThings Flask app
1111
app, labthing = create_app(
1212
__name__,
13-
prefix="/api",
14-
title=f"My Lab Device API",
13+
title="My Lab Device API",
1514
description="Test LabThing-based API",
1615
version="0.1.0",
1716
)

labthings/server/labthing.py

Lines changed: 15 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from .views.extensions import ExtensionList
1515
from .views.tasks import TaskList, TaskView
16-
from .views.docs import docs_blueprint, SwaggerUIView, W3CThingDescriptionView
16+
from .views.docs import docs_blueprint, SwaggerUIView
1717

1818
from ..core.utilities import get_docstring
1919

@@ -110,14 +110,19 @@ def teardown(self, exception):
110110

111111
def _create_base_routes(self):
112112
# Add root representation
113-
self.app.add_url_rule(self._complete_url("/", ""), "rootrep", self.rootrep)
113+
self.app.add_url_rule(self._complete_url("/", ""), "root", self.root)
114114
# Add thing descriptions
115-
self.app.register_blueprint(docs_blueprint, url_prefix=self.url_prefix)
115+
self.app.register_blueprint(
116+
docs_blueprint, url_prefix=f"{self.url_prefix}/docs"
117+
)
118+
self.add_root_link(SwaggerUIView, "docs")
116119

117120
# Add extension overview
118121
self.add_view(ExtensionList, "/extensions", endpoint=EXTENSION_LIST_ENDPOINT)
122+
self.add_root_link(ExtensionList, "extensions")
119123
# Add task routes
120124
self.add_view(TaskList, "/tasks", endpoint=TASK_LIST_ENDPOINT)
125+
self.add_root_link(TaskList, "tasks")
121126
self.add_view(TaskView, "/tasks/<task_id>", endpoint=TASK_ENDPOINT)
122127

123128
# Device stuff
@@ -277,44 +282,15 @@ def url_for(self, view, **values):
277282
def owns_endpoint(self, endpoint):
278283
return endpoint in self.endpoints
279284

280-
def add_root_link(self, view, title, kwargs=None):
285+
def add_root_link(self, view, rel, kwargs=None, params=None):
281286
if kwargs is None:
282287
kwargs = {}
283-
self.custom_root_links[title] = (view, kwargs)
288+
if params is None:
289+
params = {}
290+
self.custom_root_links[rel] = (view, params)
291+
self.thing_description.add_link(view, rel, kwargs=kwargs, params=params)
284292

285293
# Description
286-
def rootrep(self):
294+
def root(self):
287295
"""Root representation"""
288-
# TODO: Allow custom root representations
289-
290-
rr = {
291-
"id": url_for("rootrep", _external=True),
292-
"title": self.title,
293-
"description": self.description,
294-
"links": {
295-
"thingDescription": {
296-
"href": url_for("labthings_docs.w3c_td", _external=True),
297-
"description": get_docstring(W3CThingDescriptionView),
298-
},
299-
"swaggerUI": {
300-
"href": url_for("labthings_docs.swagger_ui", _external=True),
301-
**description_from_view(SwaggerUIView),
302-
},
303-
"extensions": {
304-
"href": self.url_for(ExtensionList, _external=True),
305-
**description_from_view(ExtensionList),
306-
},
307-
"tasks": {
308-
"href": self.url_for(TaskList, _external=True),
309-
**description_from_view(TaskList),
310-
},
311-
},
312-
}
313-
314-
for title, (view, kwargs) in self.custom_root_links.items():
315-
rr["links"][title] = {
316-
"href": self.url_for(view, **kwargs, _external=True),
317-
**description_from_view(view),
318-
}
319-
320-
return jsonify(rr)
296+
return self.thing_description.to_dict()

labthings/server/quick.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
def create_app(
1313
import_name,
14-
prefix: str = "/api",
14+
prefix: str = "",
1515
title: str = "",
1616
description: str = "",
1717
version: str = "0.0.0",

labthings/server/spec/td.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,44 @@ def __init__(self, apispec: APISpec):
4747
self.properties = []
4848
self.actions = []
4949
self.events = []
50+
self._links = []
5051
super().__init__()
5152

53+
@property
54+
def links(self):
55+
td_links = []
56+
for link_description in self._links:
57+
td_links.append(
58+
{
59+
"rel": link_description.get("rel"),
60+
"href": current_labthing().url_for(
61+
link_description.get("view"),
62+
**link_description.get("params"),
63+
_external=True,
64+
),
65+
**link_description.get("kwargs"),
66+
}
67+
)
68+
return td_links
69+
70+
def add_link(self, view, rel, kwargs=None, params=None):
71+
if kwargs is None:
72+
kwargs = {}
73+
if params is None:
74+
params = {}
75+
self._links.append(
76+
{"rel": rel, "view": view, "params": params, "kwargs": kwargs}
77+
)
78+
5279
def to_dict(self):
5380
return {
5481
"@context": "https://www.w3.org/2019/wot/td/v1",
55-
"id": url_for("labthings_docs.w3c_td", _external=True),
82+
"id": url_for("root", _external=True),
5683
"title": current_labthing().title,
5784
"description": current_labthing().description,
5885
"properties": self.properties,
5986
"actions": self.actions,
87+
"links": self.links,
6088
}
6189

6290
def view_to_thing_property(self, rules: list, view: View):

labthings/server/views/docs/__init__.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,6 @@ def get(self):
1919
return make_response(render_template("swagger-ui.html"))
2020

2121

22-
class W3CThingDescriptionView(View):
23-
"""W3C-style Thing Description"""
24-
25-
def get(self):
26-
return current_labthing().thing_description.to_dict()
27-
28-
2922
docs_blueprint = Blueprint(
3023
"labthings_docs", __name__, static_folder="./static", template_folder="./templates"
3124
)
@@ -34,4 +27,4 @@ def get(self):
3427
docs_blueprint.add_url_rule(
3528
"/swagger-ui", view_func=SwaggerUIView.as_view("swagger_ui")
3629
)
37-
docs_blueprint.add_url_rule("/td", view_func=W3CThingDescriptionView.as_view("w3c_td"))
30+
SwaggerUIView.endpoint = "labthings_docs.swagger_ui"

0 commit comments

Comments
 (0)