Initial reqif implementation
This commit is contained in:
parent
f85ab38ec0
commit
ab366754df
67
__init__.py
Normal file
67
__init__.py
Normal file
@ -0,0 +1,67 @@
|
||||
import os
|
||||
from reqif import xml_parser
|
||||
|
||||
|
||||
class reqif_dict(dict):
|
||||
KEY_TITLE = 'titel'
|
||||
KEY_COMMENT = 'comment'
|
||||
KEY_ITEM_DICT = 'item_dict'
|
||||
KEY_UID_LIST_SORTED = 'uid_list_sorted'
|
||||
|
||||
def __init__(self, filename, specification_key, specification_identifier):
|
||||
dict.__init__(self)
|
||||
self.rd = reqif(filename)
|
||||
self[self.KEY_TITLE] = self.rd.get_title()
|
||||
self[self.KEY_COMMENT] = self.rd.get_comment()
|
||||
self[self.KEY_UID_LIST_SORTED] = []
|
||||
for specification in self.rd.get_specifications():
|
||||
if specification.get(specification_key) == specification_identifier:
|
||||
sw_spec = specification
|
||||
break
|
||||
#
|
||||
self[self.KEY_ITEM_DICT] = {}
|
||||
for obj_id in sw_spec.children:
|
||||
item = self.rd.get_spec_object(obj_id)
|
||||
req_id = item.get('system_uid')
|
||||
self[self.KEY_ITEM_DICT][req_id] = item
|
||||
if req_id is not None:
|
||||
self[self.KEY_UID_LIST_SORTED].append(req_id)
|
||||
|
||||
|
||||
class reqif(object):
|
||||
def __init__(self, filename):
|
||||
self._data = xml_parser.parse(filename)
|
||||
|
||||
def get_comment(self):
|
||||
return self._data._comment
|
||||
|
||||
def get_data_types(self):
|
||||
return self._data._datatypes
|
||||
|
||||
def get_relations_by_id(self, obj_id):
|
||||
rv = dict()
|
||||
rv['incomming'] = list()
|
||||
rv['outgoing'] = list()
|
||||
for relation in self._data._relations:
|
||||
if obj_id == relation[xml_parser.KEY_SOURCE]:
|
||||
rv['outgoing'].append(relation)
|
||||
elif obj_id == relation[xml_parser.KEY_TARGET]:
|
||||
rv['incomming'].append(relation)
|
||||
return rv
|
||||
|
||||
def get_specifications(self):
|
||||
return self._data._specifications
|
||||
|
||||
def get_specification_by_id(self, obj_id):
|
||||
for specification in self._data._specifications:
|
||||
if obj_id == specification[xml_parser.KEY_SYSTEM_UID]:
|
||||
return specification
|
||||
|
||||
def get_spec_object(self, obj_id):
|
||||
return self._data._spec_objects[obj_id]
|
||||
|
||||
def get_spec_types(self):
|
||||
return self._data._spec_types
|
||||
|
||||
def get_title(self):
|
||||
return self._data._title
|
185
templates/template.reqif
Executable file
185
templates/template.reqif
Executable file
@ -0,0 +1,185 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/rmf/pror/toolextensions/1.0" xmlns:headline="http://pror.org/presentation/headline" xmlns:id="http://pror.org/presentation/id">
|
||||
<THE-HEADER>
|
||||
<REQ-IF-HEADER IDENTIFIER="rmf-bc146358-b038-4fcd-ba39-a6d37d59f09b">
|
||||
<COMMENT>Comment</COMMENT>
|
||||
<CREATION-TIME>2019-05-14T09:16:28.691+02:00</CREATION-TIME>
|
||||
<REQ-IF-TOOL-ID>ProR (http://pror.org)</REQ-IF-TOOL-ID>
|
||||
<REQ-IF-VERSION>1.0</REQ-IF-VERSION>
|
||||
<SOURCE-TOOL-ID>ProR (http://pror.org)</SOURCE-TOOL-ID>
|
||||
<TITLE>Title</TITLE>
|
||||
</REQ-IF-HEADER>
|
||||
</THE-HEADER>
|
||||
<CORE-CONTENT>
|
||||
<REQ-IF-CONTENT>
|
||||
<DATATYPES>
|
||||
<DATATYPE-DEFINITION-STRING IDENTIFIER="_jk-t8HYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:19:00.618+02:00" LONG-NAME="T_String_Heading_LVL_1" MAX-LENGTH="512"/>
|
||||
<DATATYPE-DEFINITION-STRING IDENTIFIER="_MR7eM3YYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:16:28.691+02:00" LONG-NAME="T_String_Heading_LVL_2" MAX-LENGTH="512"/>
|
||||
<DATATYPE-DEFINITION-STRING IDENTIFIER="_dTWX0HYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:18:17.348+02:00" LONG-NAME="T_String_REQ_ID" MAX-LENGTH="32"/>
|
||||
<DATATYPE-DEFINITION-STRING IDENTIFIER="_rk_RcHYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:19:55.400+02:00" LONG-NAME="T_String_Description" MAX-LENGTH="32000"/>
|
||||
</DATATYPES>
|
||||
<SPEC-TYPES>
|
||||
<SPECIFICATION-TYPE DESC="Specification" IDENTIFIER="_MR7eNnYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:16:28.691+02:00" LONG-NAME="Specification Type">
|
||||
<SPEC-ATTRIBUTES>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_MR7eN3YYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:16:28.691+02:00" LONG-NAME="Heading">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_MR7eM3YYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
</SPEC-ATTRIBUTES>
|
||||
</SPECIFICATION-TYPE>
|
||||
<SPEC-OBJECT-TYPE DESC="Heading" IDENTIFIER="_4-K5EHYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:21:15.160+02:00" LONG-NAME="Heading Type">
|
||||
<SPEC-ATTRIBUTES>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_7VrjAHYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:21:38.357+02:00" LONG-NAME="Heading">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_jk-t8HYYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_iq8ZoHvhEemborg4LxXa3A" LAST-CHANGE="2019-05-21T18:00:19.303+02:00" LONG-NAME="Description">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_rk_RcHYYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
</SPEC-ATTRIBUTES>
|
||||
</SPEC-OBJECT-TYPE>
|
||||
<SPEC-OBJECT-TYPE DESC="Requirement" IDENTIFIER="_MR7eNHYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:16:28.691+02:00" LONG-NAME="Requirement Type">
|
||||
<SPEC-ATTRIBUTES>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_MR7eNXYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:16:28.691+02:00" LONG-NAME="Heading">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_MR7eM3YYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_LiZCMHYZEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:23:25.158+02:00" LONG-NAME="ID">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_dTWX0HYYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_uC2ToHYbEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:41:39.522+02:00" LONG-NAME="Description">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_rk_RcHYYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_jIvPIHYeEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T10:01:55.246+02:00" LONG-NAME="Fitcriterion">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_rk_RcHYYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
<ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_pAz1wHYeEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T10:02:20.960+02:00" LONG-NAME="ReasonForImplementation">
|
||||
<TYPE>
|
||||
<DATATYPE-DEFINITION-STRING-REF>_rk_RcHYYEem_kd-7nxt1sg</DATATYPE-DEFINITION-STRING-REF>
|
||||
</TYPE>
|
||||
</ATTRIBUTE-DEFINITION-STRING>
|
||||
</SPEC-ATTRIBUTES>
|
||||
</SPEC-OBJECT-TYPE>
|
||||
</SPEC-TYPES>
|
||||
<SPEC-OBJECTS>
|
||||
<SPEC-OBJECT IDENTIFIER="_MR7eOHYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T12:27:33.387+02:00">
|
||||
<VALUES>
|
||||
<ATTRIBUTE-VALUE-STRING THE-VALUE="Chapter 1">
|
||||
<DEFINITION>
|
||||
<ATTRIBUTE-DEFINITION-STRING-REF>_7VrjAHYYEem_kd-7nxt1sg</ATTRIBUTE-DEFINITION-STRING-REF>
|
||||
</DEFINITION>
|
||||
</ATTRIBUTE-VALUE-STRING>
|
||||
</VALUES>
|
||||
<TYPE>
|
||||
<SPEC-OBJECT-TYPE-REF>_4-K5EHYYEem_kd-7nxt1sg</SPEC-OBJECT-TYPE-REF>
|
||||
</TYPE>
|
||||
</SPEC-OBJECT>
|
||||
<SPEC-OBJECT IDENTIFIER="_XzMFcHYZEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T12:27:40.466+02:00">
|
||||
<VALUES>
|
||||
<ATTRIBUTE-VALUE-STRING THE-VALUE="REQ-1">
|
||||
<DEFINITION>
|
||||
<ATTRIBUTE-DEFINITION-STRING-REF>_LiZCMHYZEem_kd-7nxt1sg</ATTRIBUTE-DEFINITION-STRING-REF>
|
||||
</DEFINITION>
|
||||
</ATTRIBUTE-VALUE-STRING>
|
||||
<ATTRIBUTE-VALUE-STRING THE-VALUE="Requirement 1">
|
||||
<DEFINITION>
|
||||
<ATTRIBUTE-DEFINITION-STRING-REF>_MR7eNXYYEem_kd-7nxt1sg</ATTRIBUTE-DEFINITION-STRING-REF>
|
||||
</DEFINITION>
|
||||
</ATTRIBUTE-VALUE-STRING>
|
||||
<ATTRIBUTE-VALUE-STRING THE-VALUE="Description 1.">
|
||||
<DEFINITION>
|
||||
<ATTRIBUTE-DEFINITION-STRING-REF>_uC2ToHYbEem_kd-7nxt1sg</ATTRIBUTE-DEFINITION-STRING-REF>
|
||||
</DEFINITION>
|
||||
</ATTRIBUTE-VALUE-STRING>
|
||||
<ATTRIBUTE-VALUE-STRING THE-VALUE="Fitcriterion 1.">
|
||||
<DEFINITION>
|
||||
<ATTRIBUTE-DEFINITION-STRING-REF>_jIvPIHYeEem_kd-7nxt1sg</ATTRIBUTE-DEFINITION-STRING-REF>
|
||||
</DEFINITION>
|
||||
</ATTRIBUTE-VALUE-STRING>
|
||||
<ATTRIBUTE-VALUE-STRING THE-VALUE="Reason for implementation 1.">
|
||||
<DEFINITION>
|
||||
<ATTRIBUTE-DEFINITION-STRING-REF>_pAz1wHYeEem_kd-7nxt1sg</ATTRIBUTE-DEFINITION-STRING-REF>
|
||||
</DEFINITION>
|
||||
</ATTRIBUTE-VALUE-STRING>
|
||||
</VALUES>
|
||||
<TYPE>
|
||||
<SPEC-OBJECT-TYPE-REF>_MR7eNHYYEem_kd-7nxt1sg</SPEC-OBJECT-TYPE-REF>
|
||||
</TYPE>
|
||||
</SPEC-OBJECT>
|
||||
</SPEC-OBJECTS>
|
||||
<SPECIFICATIONS>
|
||||
<SPECIFICATION IDENTIFIER="_MR7eOnYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T10:04:23.228+02:00" LONG-NAME="Specification Document">
|
||||
<VALUES>
|
||||
<ATTRIBUTE-VALUE-STRING THE-VALUE="Software Specification">
|
||||
<DEFINITION>
|
||||
<ATTRIBUTE-DEFINITION-STRING-REF>_MR7eN3YYEem_kd-7nxt1sg</ATTRIBUTE-DEFINITION-STRING-REF>
|
||||
</DEFINITION>
|
||||
</ATTRIBUTE-VALUE-STRING>
|
||||
</VALUES>
|
||||
<TYPE>
|
||||
<SPECIFICATION-TYPE-REF>_MR7eNnYYEem_kd-7nxt1sg</SPECIFICATION-TYPE-REF>
|
||||
</TYPE>
|
||||
<CHILDREN>
|
||||
<SPEC-HIERARCHY IDENTIFIER="_MR7ePHYYEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:16:28.691+02:00">
|
||||
<OBJECT>
|
||||
<SPEC-OBJECT-REF>_MR7eOHYYEem_kd-7nxt1sg</SPEC-OBJECT-REF>
|
||||
</OBJECT>
|
||||
</SPEC-HIERARCHY>
|
||||
<SPEC-HIERARCHY IDENTIFIER="_XzV2cXYZEem_kd-7nxt1sg" LAST-CHANGE="2019-05-14T09:24:47.216+02:00">
|
||||
<OBJECT>
|
||||
<SPEC-OBJECT-REF>_XzMFcHYZEem_kd-7nxt1sg</SPEC-OBJECT-REF>
|
||||
</OBJECT>
|
||||
</SPEC-HIERARCHY>
|
||||
</CHILDREN>
|
||||
</SPECIFICATION>
|
||||
</SPECIFICATIONS>
|
||||
</REQ-IF-CONTENT>
|
||||
</CORE-CONTENT>
|
||||
<TOOL-EXTENSIONS>
|
||||
<REQ-IF-TOOL-EXTENSION>
|
||||
<configuration:ProrToolExtension>
|
||||
<configuration:specViewConfigurations>
|
||||
<configuration:ProrSpecViewConfiguration specification="_MR7eOnYYEem_kd-7nxt1sg">
|
||||
<configuration:columns>
|
||||
<configuration:Column label="ID" width="100"/>
|
||||
<configuration:Column label="Heading" width="800"/>
|
||||
</configuration:columns>
|
||||
<configuration:leftHeaderColumn>
|
||||
<configuration:Column label="Lead Header Column" width="30"/>
|
||||
</configuration:leftHeaderColumn>
|
||||
</configuration:ProrSpecViewConfiguration>
|
||||
</configuration:specViewConfigurations>
|
||||
<configuration:generalConfiguration>
|
||||
<configuration:ProrGeneralConfiguration>
|
||||
<configuration:labelConfiguration>
|
||||
<configuration:LabelConfiguration>
|
||||
<defaultLabel>ID</defaultLabel>
|
||||
<defaultLabel>Heading</defaultLabel>
|
||||
</configuration:LabelConfiguration>
|
||||
</configuration:labelConfiguration>
|
||||
</configuration:ProrGeneralConfiguration>
|
||||
</configuration:generalConfiguration>
|
||||
<configuration:presentationConfigurations>
|
||||
<configuration:ProrPresentationConfigurations>
|
||||
<configuration:presentationConfigurations>
|
||||
<id:IdConfiguration datatype="_dTWX0HYYEem_kd-7nxt1sg" count="1"/>
|
||||
<headline:HeadlineConfiguration datatype="_MR7eM3YYEem_kd-7nxt1sg" size="11"/>
|
||||
<headline:HeadlineConfiguration datatype="_jk-t8HYYEem_kd-7nxt1sg" size="18"/>
|
||||
</configuration:presentationConfigurations>
|
||||
</configuration:ProrPresentationConfigurations>
|
||||
</configuration:presentationConfigurations>
|
||||
</configuration:ProrToolExtension>
|
||||
</REQ-IF-TOOL-EXTENSION>
|
||||
</TOOL-EXTENSIONS>
|
||||
</REQ-IF>
|
311
xml_parser.py
Normal file
311
xml_parser.py
Normal file
@ -0,0 +1,311 @@
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
|
||||
KEY_DESCRIPTION = 'description'
|
||||
"""Description (short) of an element"""
|
||||
KEY_DETAILED_DESCRIPTION = 'detailed_description'
|
||||
"""Description (short) of an element"""
|
||||
KEY_ITEM_ID = 'id'
|
||||
"""The human readable item id"""
|
||||
KEY_LAST_CHANGE = 'last_change'
|
||||
"""Date of the last change"""
|
||||
KEY_SOURCE = 'source'
|
||||
"""The source of a relation"""
|
||||
KEY_SPEC_DATA = 'data'
|
||||
"""A dict holding the data definition (key is the unique id of the data definition). Note this is not the datatype, but a reference to the datatype"""
|
||||
KEY_START_EXECUTION_FROM_LEVEL = 'start_execution_from_level'
|
||||
"""The level, of an spec object from where on the test should be executed"""
|
||||
KEY_SYSTEM_TYPE_UID = 'system_type_uid'
|
||||
"""The unique id of the corresponding type"""
|
||||
KEY_SYSTEM_UID = 'system_uid'
|
||||
"""A unique id"""
|
||||
KEY_TARGET = 'target'
|
||||
"""The target of a relation"""
|
||||
KEY_XML_TAG = 'xml_tag'
|
||||
"""The tag of the original xml object"""
|
||||
|
||||
PREFIX = '{http://www.omg.org/spec/ReqIF/20110401/reqif.xsd}'
|
||||
TAG_CHILDREN = '%sCHILDREN' % PREFIX
|
||||
TAG_DEFINITION = '%sDEFINITION' % PREFIX
|
||||
TAG_OBJECT = '%sOBJECT' % PREFIX
|
||||
TAG_OBJECT_REF = '%sSPEC-OBJECT-REF' % PREFIX
|
||||
TAG_PROPERTIES = '%sPROPERTIES' % PREFIX
|
||||
TAG_SOURCE = '%sSOURCE' % PREFIX
|
||||
TAG_SPECIFIED_VALUES = '%sSPECIFIED-VALUES' % PREFIX
|
||||
TAG_SPEC_ATTRIBUTES = '%sSPEC-ATTRIBUTES' % PREFIX
|
||||
TAG_TARGET = '%sTARGET' % PREFIX
|
||||
TAG_THE_VALUE = 'THE-VALUE'
|
||||
TAG_TYPE = '%sTYPE' % PREFIX
|
||||
TAG_VALUES = '%sVALUES' % PREFIX
|
||||
|
||||
|
||||
class base_object(dict):
|
||||
ATTRIB_KEY_DESC = 'DESC'
|
||||
ATTRIB_KEY_IDENTIFIER = 'IDENTIFIER'
|
||||
ATTRIB_KEY_LONG_NAME = 'LONG-NAME'
|
||||
ATTRIB_KEY_LAST_CHANGE = 'LAST-CHANGE'
|
||||
ATTRIB_DATA = {KEY_DESCRIPTION: ATTRIB_KEY_LONG_NAME,
|
||||
KEY_DETAILED_DESCRIPTION: ATTRIB_KEY_DESC,
|
||||
KEY_LAST_CHANGE: ATTRIB_KEY_LAST_CHANGE,
|
||||
KEY_SYSTEM_UID: ATTRIB_KEY_IDENTIFIER}
|
||||
|
||||
def __init__(self, xml_object):
|
||||
dict.__init__(self)
|
||||
for key in self.ATTRIB_DATA:
|
||||
data = xml_object.attrib.get(self.ATTRIB_DATA[key])
|
||||
if data is not None:
|
||||
self[key] = data
|
||||
self[KEY_XML_TAG] = xml_object.tag
|
||||
type_obj = xml_object.find(TAG_TYPE)
|
||||
if type_obj is not None:
|
||||
self[KEY_SYSTEM_TYPE_UID] = type_obj[0].text
|
||||
|
||||
def __str__(self):
|
||||
keys = self.keys()
|
||||
keys.sort()
|
||||
rv = ''
|
||||
for key in keys:
|
||||
rv += '%s: %s\n' % (key, self[key])
|
||||
return rv
|
||||
|
||||
|
||||
class datatype(base_object):
|
||||
ATTRIB_KEY_KEY = 'KEY'
|
||||
|
||||
def __init__(self, xml_datatype_object):
|
||||
base_object.__init__(self, xml_datatype_object)
|
||||
self.enmu_dict = dict()
|
||||
if 'ENUMERATION' in self[KEY_XML_TAG]:
|
||||
for child in xml_datatype_object.find(TAG_SPECIFIED_VALUES):
|
||||
key = child.attrib[self.ATTRIB_KEY_IDENTIFIER]
|
||||
value = None
|
||||
if child.find(TAG_PROPERTIES) is not None:
|
||||
try:
|
||||
value = int(child.find(TAG_PROPERTIES)[0].attrib.get(self.ATTRIB_KEY_KEY))
|
||||
except ValueError:
|
||||
value = child.find(TAG_PROPERTIES)[0].attrib.get(self.ATTRIB_KEY_KEY)
|
||||
value = value or child.attrib[self.ATTRIB_KEY_LONG_NAME]
|
||||
self.enmu_dict[key] = value
|
||||
|
||||
def xml_obj_to_value(self, xml_obj):
|
||||
if 'STRING' in self[KEY_XML_TAG]:
|
||||
data = xml_obj.attrib.get(TAG_THE_VALUE)
|
||||
return data
|
||||
elif 'INTEGER' in self[KEY_XML_TAG]:
|
||||
data = xml_obj.attrib.get(TAG_THE_VALUE)
|
||||
return int(data)
|
||||
elif 'BOOLEAN' in self[KEY_XML_TAG]:
|
||||
data = xml_obj.attrib.get(TAG_THE_VALUE)
|
||||
if data.lower() == 'false':
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
elif 'ENUMERATION' in self[KEY_XML_TAG]:
|
||||
if xml_obj.find(TAG_VALUES) is not None:
|
||||
return self.enmu_dict.get(xml_obj.find(TAG_VALUES)[0].text)
|
||||
|
||||
|
||||
class datatype_dict(dict):
|
||||
def __init__(self, xml_datatypes_object):
|
||||
dict.__init__(self)
|
||||
for child in xml_datatypes_object:
|
||||
dt = datatype(child)
|
||||
self[dt[KEY_SYSTEM_UID]] = dt
|
||||
|
||||
def __str__(self):
|
||||
rv = ''
|
||||
for key in self:
|
||||
rv += str(self[key]) + '\n'
|
||||
return rv
|
||||
|
||||
|
||||
class spec_type(base_object):
|
||||
def __init__(self, xml_spec_type_object):
|
||||
base_object.__init__(self, xml_spec_type_object)
|
||||
self[KEY_SPEC_DATA] = dict()
|
||||
for child in xml_spec_type_object.find(TAG_SPEC_ATTRIBUTES):
|
||||
a = base_object(child)
|
||||
self[KEY_SPEC_DATA][a[KEY_SYSTEM_UID]] = a
|
||||
|
||||
|
||||
class spec_types_dict(dict):
|
||||
def __init__(self, xml_spec_types_object):
|
||||
dict.__init__(self)
|
||||
for child in xml_spec_types_object:
|
||||
st = spec_type(child)
|
||||
self[st[KEY_SYSTEM_UID]] = st
|
||||
|
||||
def __str__(self):
|
||||
rv = ''
|
||||
for key in self:
|
||||
rv += str(self[key]) + '\n'
|
||||
return rv
|
||||
|
||||
|
||||
class spec_object(base_object):
|
||||
def __init__(self, xml_object, spec_types, data_types):
|
||||
base_object.__init__(self, xml_object)
|
||||
try:
|
||||
for child in xml_object.find(TAG_VALUES):
|
||||
attr_id = child.find(TAG_DEFINITION)[0].text
|
||||
stype = spec_types[self[KEY_SYSTEM_TYPE_UID]]
|
||||
if attr_id in stype[KEY_SPEC_DATA]:
|
||||
spec_attr = stype[KEY_SPEC_DATA][attr_id]
|
||||
data_type = data_types[spec_attr[KEY_SYSTEM_TYPE_UID]]
|
||||
self[spec_attr[KEY_DESCRIPTION]] = data_type.xml_obj_to_value(child)
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
|
||||
class spec_objects(dict):
|
||||
def __init__(self, xml_object, spec_types, data_types):
|
||||
dict.__init__(self)
|
||||
for child in xml_object:
|
||||
so = spec_object(child, spec_types, data_types)
|
||||
self[so[KEY_SYSTEM_UID]] = so
|
||||
|
||||
def __str__(self):
|
||||
rv = ''
|
||||
for key in self:
|
||||
rv += str(self[key]) + '\n'
|
||||
return rv
|
||||
|
||||
|
||||
class spec_relation(spec_object):
|
||||
def __init__(self, xml_object, spec_types, data_types):
|
||||
spec_object.__init__(self, xml_object, spec_types, data_types)
|
||||
self[KEY_SOURCE] = xml_object.find(TAG_SOURCE).find(TAG_OBJECT_REF).text
|
||||
self[KEY_TARGET] = xml_object.find(TAG_TARGET).find(TAG_OBJECT_REF).text
|
||||
|
||||
|
||||
class spec_relations(list):
|
||||
def __init__(self, xml_object, spec_types, data_types):
|
||||
list.__init__(self)
|
||||
for child in xml_object:
|
||||
self.append(spec_relation(child, spec_types, data_types))
|
||||
|
||||
def __str__(self):
|
||||
rv = ''
|
||||
for key in self:
|
||||
rv += str(self[key]) + '\n'
|
||||
return rv
|
||||
|
||||
|
||||
class id_tree(str):
|
||||
def __init__(self, system_uid):
|
||||
str.__init__(system_uid)
|
||||
self.children = list()
|
||||
|
||||
def append(self, child):
|
||||
self.children.append(child)
|
||||
|
||||
def get_flat_id_tree(self):
|
||||
"""
|
||||
This method returns an ordered but flat list of all id_tree elements.
|
||||
"""
|
||||
obj_list = list()
|
||||
for child in self.children:
|
||||
obj_list.append(child)
|
||||
obj_list.extend(child.get_flat_id_tree())
|
||||
return obj_list
|
||||
|
||||
def executed_or_has_executed_children(self, item_type_id, execution_level, get_spec_object_method, default_execution_level):
|
||||
spec_obj = get_spec_object_method(str(self))
|
||||
if spec_obj[KEY_SYSTEM_TYPE_UID] == item_type_id:
|
||||
if execution_level >= spec_obj.get(KEY_START_EXECUTION_FROM_LEVEL, default_execution_level):
|
||||
return True
|
||||
for child in self.children:
|
||||
if child.executed_or_has_executed_children(item_type_id, execution_level, get_spec_object_method, default_execution_level):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
class specification(spec_object):
|
||||
def __init__(self, xml_object, spec_types, data_types, spec_objects):
|
||||
spec_object.__init__(self, xml_object, spec_types, data_types)
|
||||
self._spec_objects = spec_objects
|
||||
self.children = list()
|
||||
self._add_hirarchy_objects(xml_object.find(TAG_CHILDREN), self.children)
|
||||
|
||||
def _add_hirarchy_objects(self, children, parent_list):
|
||||
for child in children:
|
||||
child_id = child.find('%s/%s' % (TAG_OBJECT, TAG_OBJECT_REF)).text
|
||||
child_tree_obj = id_tree(child_id)
|
||||
parent_list.append(child_tree_obj)
|
||||
next_children = child.find(TAG_CHILDREN)
|
||||
if next_children is not None:
|
||||
self._add_hirarchy_objects(next_children, child_tree_obj.children)
|
||||
|
||||
def get_system_uid_list_by_type(self, type_id):
|
||||
"""
|
||||
This method returns an ordered but flat list of all items of this specification with the specified type.
|
||||
"""
|
||||
obj_list = list()
|
||||
for child in self.children:
|
||||
if self._spec_objects[child][KEY_SYSTEM_TYPE_UID] == type_id:
|
||||
obj_list.append(str(child))
|
||||
for item_id in child.get_flat_id_tree():
|
||||
if self._spec_objects[item_id][KEY_SYSTEM_TYPE_UID] == type_id:
|
||||
obj_list.append(str(item_id))
|
||||
return obj_list
|
||||
|
||||
|
||||
class specifications(list):
|
||||
def __init__(self, xml_object, spec_types, data_types, spec_objects):
|
||||
list.__init__(self)
|
||||
for child in xml_object:
|
||||
self.append(specification(child, spec_types, data_types, spec_objects))
|
||||
|
||||
def __str__(self):
|
||||
rv = ''
|
||||
for i in self:
|
||||
rv += str(i) + '\n'
|
||||
return rv
|
||||
|
||||
|
||||
class parse(object):
|
||||
TAG_HEADER_MAIN = '%sTHE-HEADER' % PREFIX
|
||||
TAG_HEADER_REQIF = '%sREQ-IF-HEADER' % PREFIX
|
||||
TAG_TITLE = '%sTITLE' % PREFIX
|
||||
TAG_COMMENT = '%sCOMMENT' % PREFIX
|
||||
|
||||
TAG_CORE_CONTENT = '%sCORE-CONTENT' % PREFIX
|
||||
TAG_REQ_IF_CONTENT = '%sREQ-IF-CONTENT' % PREFIX
|
||||
TAG_DATATYPES = '%sDATATYPES' % PREFIX
|
||||
TAG_SPEC_RELATIONS = '%sSPEC-RELATIONS' % PREFIX
|
||||
TAG_SPEC_TYPES = '%sSPEC-TYPES' % PREFIX
|
||||
TAG_SPEC_OBJECTS = '%sSPEC-OBJECTS' % PREFIX
|
||||
TAG_SPECIFICATION = '%sSPECIFICATIONS' % PREFIX
|
||||
|
||||
def __init__(self, filename):
|
||||
tree = ET.parse(filename)
|
||||
req_if = tree.getroot()
|
||||
|
||||
self._title = req_if.find('./%s/%s/%s' % (self.TAG_HEADER_MAIN, self.TAG_HEADER_REQIF, self.TAG_TITLE)).text
|
||||
self._comment = req_if.find('./%s/%s/%s' % (self.TAG_HEADER_MAIN, self.TAG_HEADER_REQIF, self.TAG_COMMENT)).text
|
||||
|
||||
xml_obj = req_if.find('./%s/%s/%s' % (self.TAG_CORE_CONTENT, self.TAG_REQ_IF_CONTENT, self.TAG_DATATYPES))
|
||||
self._datatypes = datatype_dict(xml_obj)
|
||||
xml_obj = req_if.find('./%s/%s/%s' % (self.TAG_CORE_CONTENT, self.TAG_REQ_IF_CONTENT, self.TAG_SPEC_TYPES))
|
||||
self._spec_types = spec_types_dict(xml_obj)
|
||||
xml_obj = req_if.find('./%s/%s/%s' % (self.TAG_CORE_CONTENT, self.TAG_REQ_IF_CONTENT, self.TAG_SPEC_OBJECTS))
|
||||
self._spec_objects = spec_objects(xml_obj, self._spec_types, self._datatypes)
|
||||
xml_obj = req_if.find('./%s/%s/%s' % (self.TAG_CORE_CONTENT, self.TAG_REQ_IF_CONTENT, self.TAG_SPEC_RELATIONS))
|
||||
try:
|
||||
self._relations = spec_relations(xml_obj, self._spec_types, self._datatypes)
|
||||
except TypeError:
|
||||
self._relations = []
|
||||
xml_obj = req_if.find('./%s/%s/%s' % (self.TAG_CORE_CONTENT, self.TAG_REQ_IF_CONTENT, self.TAG_SPECIFICATION))
|
||||
self._specifications = specifications(xml_obj, self._spec_types, self._datatypes, self._spec_objects)
|
||||
|
||||
def __str__(self):
|
||||
rv = 'Title: %s' % self._title
|
||||
rv += 'Comment: %s' % self._comment
|
||||
rv += 'DATATYPES:\n----------\n'
|
||||
rv += str(self._datatypes)
|
||||
rv += str(self._spec_types)
|
||||
rv += '\n\n\nSPEC_OBJECTS:\n-------------\n'
|
||||
rv += str(self._spec_objects)
|
||||
rv += '\n\n\nSPECIFICATIONS:\n---------------\n'
|
||||
rv += str(self._specifications)
|
||||
return rv
|
Loading…
x
Reference in New Issue
Block a user