summaryrefslogtreecommitdiff
path: root/rest-api-templates/asterisk_processor.py
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2013-05-10 13:13:06 +0000
committerKinsey Moore <kmoore@digium.com>2013-05-10 13:13:06 +0000
commit7ce05bfb9b5f06c18451e37bb5b91cd543d6ba84 (patch)
treeb4e833909ec2ba776d39848ecf8d28f74b341424 /rest-api-templates/asterisk_processor.py
parent2cfedc12adf64cc24e855bd9ea30df3aa1b759ce (diff)
Add channel events for res_stasis apps
This change adds a framework in res_stasis for handling events from channel topics. JSON event generation and validation code is created from event documentation in rest-api/api-docs/events.json to assist in JSON event generation, ensure consistency, and ensure that accurate documentation is available for ALL events that are received by res_stasis applications. The userevent application has been refactored along with the code that handles userevent channel blob events to pass the headers as key/value pairs in the JSON blob. As a side-effect, app_userevent now handles duplicate keys by overwriting the previous value. Review: https://reviewboard.asterisk.org/r/2428/ (closes issue ASTERISK-21180) Patch-By: Kinsey Moore <kmoore@digium.com> git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@388275 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'rest-api-templates/asterisk_processor.py')
-rw-r--r--rest-api-templates/asterisk_processor.py53
1 files changed, 52 insertions, 1 deletions
diff --git a/rest-api-templates/asterisk_processor.py b/rest-api-templates/asterisk_processor.py
index 81aefbb39..b1fac013a 100644
--- a/rest-api-templates/asterisk_processor.py
+++ b/rest-api-templates/asterisk_processor.py
@@ -107,7 +107,6 @@ class PathSegment(Stringify):
"""
return len(self.__children)
-
class AsteriskProcessor(SwaggerPostProcessor):
"""A SwaggerPostProcessor which adds fields needed to generate Asterisk
RESTful HTTP binding code.
@@ -145,6 +144,18 @@ class AsteriskProcessor(SwaggerPostProcessor):
segment = resource_api.root_path.get_child(api.path.split('/'))
for operation in api.operations:
segment.operations.append(operation)
+ resource_api.api_declaration.has_events = False
+ for model in resource_api.api_declaration.models:
+ if model.id == "Event":
+ resource_api.api_declaration.has_events = True
+ break
+ if resource_api.api_declaration.has_events:
+ resource_api.api_declaration.events = \
+ [self.process_model(model, context) for model in \
+ resource_api.api_declaration.models if model.id != "Event"]
+ else:
+ resource_api.api_declaration.events = []
+
# Since every API path should start with /[resource], root should
# have exactly one child.
if resource_api.root_path.num_children() != 1:
@@ -177,3 +188,43 @@ class AsteriskProcessor(SwaggerPostProcessor):
parameter.c_space = ''
else:
parameter.c_space = ' '
+
+ def process_model(self, model, context):
+ model.c_id = snakify(model.id)
+ model.channel = False
+ model.channel_desc = ""
+ model.bridge = False
+ model.bridge_desc = ""
+ model.properties = [self.process_property(model, prop, context) for prop in model.properties]
+ model.properties = [prop for prop in model.properties if prop]
+ model.has_properties = (len(model.properties) != 0)
+ return model
+
+ def process_property(self, model, prop, context):
+ # process channel separately since it will be pulled out
+ if prop.name == 'channel' and prop.type == 'Channel':
+ model.channel = True
+ model.channel_desc = prop.description or ""
+ return None
+
+ # process bridge separately since it will be pulled out
+ if prop.name == 'bridge' and prop.type == 'Bridge':
+ model.bridge = True
+ model.bridge_desc = prop.description or ""
+ return None
+
+ prop.c_name = snakify(prop.name)
+ if prop.type in self.type_mapping:
+ prop.c_type = self.type_mapping[prop.type]
+ prop.c_convert = self.convert_mapping[prop.c_type]
+ else:
+ prop.c_type = "Property type %s not mappable to a C type" % (prop.type)
+ prop.c_convert = "Property type %s not mappable to a C conversion" % (prop.type)
+ #raise SwaggerError(
+ # "Invalid property type %s" % prop.type, context)
+ # You shouldn't put a space between 'char *' and the variable
+ if prop.c_type.endswith('*'):
+ prop.c_space = ''
+ else:
+ prop.c_space = ' '
+ return prop