asterisk/build_tools/post_process_documentation.py
Matthew Jordan 36878ed1d1 build_tools: Skip managerEvent combining for AMI action responses
AMI action responses can (and will) reference AMI events that they return.
These event references and definitions should not be combined with AMI events
raised elsewhere in the code, as they are specifically tied to the AMI action
that raised them.

ASTERISK-24156 #close
Reported by: Rusty Newton


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@420289 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-08-07 03:04:49 +00:00

109 lines
3.6 KiB
Python

#! /usr/bin/env python
# vin: sw=3 et:
'''
Copyright (C) 2012, Digium, Inc.
Matt Jordan <mjordan@digium.com>
This program is free software, distributed under the terms of
the GNU General Public License Version 2.
'''
import sys
import os
import optparse
import xml.dom.minidom
from xml.dom.minidom import Element, parse
def merge_parameter_information(managerEvent):
''' Merge the parameter information across all managerEventInstances
within a managerEvent node '''
def __swap_parameter_documentation(one, two):
# See who has the better documentation and use it
if (one.hasChildNodes() and not two.hasChildNodes()):
two.parentNode.replaceChild(one.cloneNode(True), two)
elif (two.hasChildNodes() and not one.hasChildNodes()):
one.parentNode.replaceChild(two.cloneNode(True), one)
def __merge_parameter(param, other_instances):
# Compare the parameter to every other instance's set of parameters
for other in other_instances:
other_parameters = other.getElementsByTagName("parameter")
match = [p for p in other_parameters
if p.getAttribute('name') == param.getAttribute('name')]
if (match):
# See who has the better documentation and use it
__swap_parameter_documentation(param, match[0])
instances = managerEvent.getElementsByTagName("managerEventInstance")
merged = []
for instance in instances:
others = [i for i in instances if i != instance]
parameters = instance.getElementsByTagName("parameter")
for parameter in parameters:
if parameter not in merged:
merged.append(parameter)
__merge_parameter(parameter, others)
def collapse_event_pair(managerEventOne, managerEventTwo):
# Move all children of managerEventTwo to managerEventOne
for node in managerEventTwo.childNodes:
managerEventOne.appendChild(node.cloneNode(True))
return managerEventOne
def collapse_manager_events(rootNode, managerEvents):
events = {}
for managerEvent in managerEvents:
if (managerEvent.parentNode.nodeName == 'list-elements'
or managerEvent.parentNode.nodeName == 'responses'):
continue
managerEvent.parentNode.removeChild(managerEvent)
attr = managerEvent.getAttribute('name')
if attr in events:
# match, collapse the two managerEvents
events[attr] = collapse_event_pair(events[attr], managerEvent)
else:
events[attr] = managerEvent
# Combine parameter information and re-add the manager Events
for k, event in events.items():
merge_parameter_information(event)
rootNode.appendChild(event)
return
def main(argv=None):
if argv is None:
argv = sys.argv
parser = optparse.OptionParser()
parser.add_option('-i', '--input', dest='input_file',
default='doc/core-full-en_US.xml',
help='The XML file to process')
parser.add_option('-o', '--output', dest='output_file',
default='doc/core-en_US.xml',
help='The XML file to create')
(options, args) = parser.parse_args(argv)
dom = parse(options.input_file)
datasource = open(options.output_file, 'w')
docs = dom.getElementsByTagName("docs")[0]
managerEvents = dom.getElementsByTagName("managerEvent")
if (managerEvents):
collapse_manager_events(docs, managerEvents)
dom.writexml(datasource)
datasource.close()
return 0
if __name__ == "__main__":
sys.exit(main() or 0)