Skip to content

Commit 58d9318

Browse files
author
Joel Collins
committed
Moved json.paths functions into json.schemas
1 parent 5fee550 commit 58d9318

File tree

7 files changed

+101
-94
lines changed

7 files changed

+101
-94
lines changed

src/labthings/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,27 @@
3535
from . import json
3636

3737
__all__ = [
38+
"LabThing",
39+
"create_app",
40+
"Server",
3841
"current_labthing",
3942
"registered_extensions",
4043
"registered_components",
4144
"find_extension",
4245
"find_component",
46+
"StrictLock",
47+
"CompositeLock",
48+
"ClientEvent",
49+
"current_task",
50+
"current_task_stopped"
51+
"update_task_progress"
52+
"update_task_data"
53+
"TaskKillException",
54+
"extensions",
55+
"views",
56+
"fields",
57+
"schema",
58+
"semantics",
59+
"json",
4360
]
4461

src/labthings/apispec/apispec.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from apispec import APISpec
2-
from ..json.paths import rule_to_path, rule_to_params
2+
from ..json.schemas import rule_to_path, rule_to_params
33
from .utilities import convert_to_schema_or_json
44

55
from ..utilities import get_docstring, get_summary

src/labthings/json/paths.py

Lines changed: 0 additions & 78 deletions
This file was deleted.

src/labthings/json/schemas.py

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,80 @@
1+
import werkzeug.routing
2+
import re
13
from marshmallow import Schema, fields
2-
from .marshmallow_jsonschema import JSONSchema
34
from collections.abc import Mapping
5+
from .marshmallow_jsonschema import JSONSchema
6+
7+
8+
PATH_RE = re.compile(r"<(?:[^:<>]+:)?([^<>]+)>")
9+
# Conversion map of werkzeug rule converters to Javascript schema types
10+
CONVERTER_MAPPING = {
11+
werkzeug.routing.UnicodeConverter: ("string", None),
12+
werkzeug.routing.IntegerConverter: ("integer", "int32"),
13+
werkzeug.routing.FloatConverter: ("number", "float"),
14+
}
15+
16+
DEFAULT_TYPE = ("string", None)
17+
18+
19+
def rule_to_path(rule):
20+
"""Convert a Flask rule into an JSON schema formatted URL path
21+
22+
Args:
23+
rule: Flask rule object
24+
25+
Returns:
26+
str: URL path
27+
"""
28+
return PATH_RE.sub(r"{\1}", rule.rule)
29+
30+
31+
def rule_to_params(rule, overrides=None):
32+
"""Convert a Flask rule into JSON schema URL parameters description
33+
34+
Args:
35+
rule: Flask rule object
36+
overrides (dict, optional): Optional dictionary to override params with
37+
38+
Returns:
39+
dict: Dictionary of URL parameters
40+
"""
41+
overrides = overrides or {}
42+
result = [
43+
argument_to_param(argument, rule, overrides.get(argument, {}))
44+
for argument in rule.arguments
45+
]
46+
for key in overrides.keys():
47+
if overrides[key].get("in") in ("header", "query"):
48+
overrides[key]["name"] = overrides[key].get("name", key)
49+
result.append(overrides[key])
50+
return result
51+
52+
53+
def argument_to_param(argument, rule, override=None):
54+
"""Convert a Flask rule into APISpec URL parameters description
55+
56+
Args:
57+
argument (str): URL argument
58+
rule: Flask rule object
59+
override (dict, optional): Optional dictionary to override params with
60+
61+
Returns:
62+
dict: Dictionary of URL parameter description
63+
"""
64+
param = {"in": "path", "name": argument, "required": True}
65+
type_, format_ = CONVERTER_MAPPING.get(
66+
# skipcq: PYL-W0212
67+
type(rule._converters[argument]),
68+
DEFAULT_TYPE,
69+
)
70+
param["schema"] = {}
71+
param["schema"]["type"] = type_
72+
if format_ is not None:
73+
param["format"] = format_
74+
if rule.defaults and argument in rule.defaults:
75+
param["default"] = rule.defaults[argument]
76+
param.update(override or {})
77+
return param
478

579

680
def field_to_property(field):

src/labthings/schema.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@
1010

1111
__all__ = [
1212
"Schema",
13-
"FieldSchema",
14-
"TaskSchema",
15-
"ExtensionSchema",
16-
"ActionSchema",
17-
"build_action_schema",
1813
"pre_load",
1914
"pre_dump",
2015
"validate",

src/labthings/td.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
from .views import View
44
from .event import Event
5-
from .json.schemas import schema_to_json
6-
from .json.paths import rule_to_params, rule_to_path
5+
from .json.schemas import schema_to_json, rule_to_params, rule_to_path
76
from .find import current_labthing
87
from .utilities import get_docstring, snake_to_camel
98

tests/test_json_paths.py renamed to tests/test_json_schemas.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from labthings.json import paths
1+
from labthings.json import schemas
22

33

44
def make_rule(app, path, **kwargs):
@@ -17,19 +17,19 @@ def make_param(in_location="path", **kwargs):
1717

1818
def test_rule_to_path(app):
1919
rule = make_rule(app, "/path/<id>/")
20-
assert paths.rule_to_path(rule) == "/path/{id}/"
20+
assert schemas.rule_to_path(rule) == "/path/{id}/"
2121

2222

2323
def test_rule_to_param(app):
2424
rule = make_rule(app, "/path/<id>/")
25-
assert paths.rule_to_params(rule) == [
25+
assert schemas.rule_to_params(rule) == [
2626
{"in": "path", "name": "id", "required": True, "schema": {"type": "string"}}
2727
]
2828

2929

3030
def test_rule_to_param_typed(app):
3131
rule = make_rule(app, "/path/<int:id>/")
32-
assert paths.rule_to_params(rule) == [
32+
assert schemas.rule_to_params(rule) == [
3333
{
3434
"in": "path",
3535
"name": "id",
@@ -42,7 +42,7 @@ def test_rule_to_param_typed(app):
4242

4343
def test_rule_to_param_typed_default(app):
4444
rule = make_rule(app, "/path/<int:id>/", defaults={"id": 1})
45-
assert paths.rule_to_params(rule) == [
45+
assert schemas.rule_to_params(rule) == [
4646
{
4747
"in": "path",
4848
"name": "id",
@@ -57,7 +57,7 @@ def test_rule_to_param_typed_default(app):
5757
def test_rule_to_param_overrides(app):
5858
rule = make_rule(app, "/path/<id>/")
5959
overrides = {"override_key": {"in": "header", "name": "header_param"}}
60-
assert paths.rule_to_params(rule, overrides=overrides) == [
60+
assert schemas.rule_to_params(rule, overrides=overrides) == [
6161
{"in": "path", "name": "id", "required": True, "schema": {"type": "string"}},
6262
*overrides.values(),
6363
]
@@ -66,6 +66,6 @@ def test_rule_to_param_overrides(app):
6666
def test_rule_to_param_overrides_invalid(app):
6767
rule = make_rule(app, "/path/<id>/")
6868
overrides = {"override_key": {"in": "invalid", "name": "header_param"}}
69-
assert paths.rule_to_params(rule, overrides=overrides) == [
69+
assert schemas.rule_to_params(rule, overrides=overrides) == [
7070
{"in": "path", "name": "id", "required": True, "schema": {"type": "string"}}
7171
]

0 commit comments

Comments
 (0)