Enable tag inheritance

This commit is contained in:
Joel Collins 2020-01-07 21:23:42 +00:00
parent ed13749abe
commit eaf2fc5f7d
3 changed files with 17 additions and 1 deletions

View file

@ -42,6 +42,7 @@ class CaptureAPI(Resource):
) )
@marshal_with(capture_schema) @marshal_with(capture_schema)
@doc_response(200, description="Capture successful") @doc_response(200, description="Capture successful")
@doc(tags=["foo"])
def post(self, args): def post(self, args):
""" """
Create a new capture Create a new capture

View file

@ -37,6 +37,12 @@ def view2path(rule: str, view: Resource, spec: APISpec):
def view2operations(view: Resource, spec: APISpec): def view2operations(view: Resource, spec: APISpec):
# Operations inherit tags from parent
inherited_tags = []
if hasattr(view, "__apispec__"):
inherited_tags = getattr(view, "__apispec__").get("tags", [])
# Build dictionary of operations (HTTP methods)
ops = {} ops = {}
for method in Resource.methods: for method in Resource.methods:
if hasattr(view, method): if hasattr(view, method):
@ -47,6 +53,7 @@ def view2operations(view: Resource, spec: APISpec):
{ {
"description": get_docstring(getattr(view, method)), "description": get_docstring(getattr(view, method)),
"summary": get_summary(getattr(view, method)), "summary": get_summary(getattr(view, method)),
"tags": inherited_tags,
}, },
) )

View file

@ -19,10 +19,18 @@ def get_summary(obj):
def rupdate(d, u): def rupdate(d, u):
for k, v in u.items(): for k, v in u.items():
if isinstance(v, collections.abc.Mapping): # Merge lists if they're present in both objects
if isinstance(v, list):
if not k in d:
d[k] = []
if isinstance(d[k], list):
d[k].extend(v)
# Recursively merge dictionaries if the element is a dictionary
elif isinstance(v, collections.abc.Mapping):
if not k in d: if not k in d:
d[k] = {} d[k] = {}
d[k] = rupdate(d.get(k, {}), v) d[k] = rupdate(d.get(k, {}), v)
# If not a list or dictionary, overwrite old value with new value
else: else:
d[k] = v d[k] = v
return d return d