class RunConfigurationOptions(metaclass=OrderedClassMembers): """AUnit test run configuration carrier Usage: run = RunConfiguration() run.options.uri_type.value = UriTypeOptionValue.SEMANTIC run.options.test_determination_strategy.same_program = 'true' run.options.test_determination_strategy.assigned_tests = 'false' run.options.test_determination_strategy.append_assigned_tests_preview = 'true' run.options.test_risk_levels.harmless = 'true' run.options.test_risk_levels.dangerous = 'true' run.options.test_risk_levels.critical = 'true' run.options.test_durations.short = 'true' run.options.test_durations.medium = 'true' run.options.test_durations.long = 'true' run.options.with_navigation_uri.enabled = 'false' """ uri_type = XmlNodeProperty('uriType') test_determination_strategy = XmlNodeProperty('testDeterminationStrategy') test_risk_levels = XmlNodeProperty('testRiskLevels') test_durations = XmlNodeProperty('testDurations') with_navigation_uri = XmlNodeProperty('withNavigationUri') def __init__(self): self.uri_type = UriTypeOption() self.test_determination_strategy = TestDeterminationStrategy() self.test_risk_levels = TestRiskLevelSettings() self.test_durations = TestDurationSettings() self.with_navigation_uri = WithNavigationUriOption()
class WorkList(metaclass=OrderedClassMembers): """atcworklist:worklist XML Node""" objtype = ADTObjectType(None, None, XMLNS_ATCWORKLIST, 'application/xml', None, 'worklist') worklist_id = XmlNodeAttributeProperty('atcworklist:id') timestamp = XmlNodeAttributeProperty('atcworklist:timestamp') used_objectset = XmlNodeAttributeProperty('atcworklist:usedObjectSet') object_set_is_complete = XmlNodeAttributeProperty('atcworklist:objectSetIsComplete') object_sets = XmlNodeProperty('atcworklist:objectSets', factory=WorkListObjectSetList) objects = XmlNodeProperty('atcworklist:objects', factory=ATCObjectList)
class CheckResults(metaclass=OrderedClassMembers): """Activation Run Check Results""" objtype = ADTObjectType(None, None, XMLNS_CHKL, None, None, 'messages') properties = XmlNodeProperty('chkl:properties', factory=CheckProperties) messages = XmlListNodeProperty('msg', value=[], factory=CheckMessage) @property def has_errors(self): """Returns true if the results contains an error message""" return any((message.is_error for message in self.messages)) @property def has_warnings(self): """Returns true if the results contains a warning message""" return any((message.is_warning for message in self.messages)) @property def generated(self): """Returns true if the activation left the objects generated""" if self.properties is None: return not self.has_errors return self.properties.generated != 'false'
class XmlNodePropertyADTObject(metaclass=OrderedClassMembers): def __init__(self): self.objtype = ADTObjectType( None, None, XMLNamespace('mock', 'https://example.org/mock'), 'application/xml', None, 'xmlnodeparent') child = XmlNodeProperty('mock:child', factory=DummyChild)
class RunResponse(metaclass=OrderedClassMembers): """Worklist run Response""" objtype = ADTObjectType(None, None, XMLNS_ATCWORKLIST, 'application/xml', None, 'worklistRun') worklist_id = xml_text_node_property('atcworklist:worklistId') timestamp = xml_text_node_property('atcworklist:worklistTimestamp') infos = XmlNodeProperty('atcworklist:infos', factory=ATCInfoList)
class DummyADTObjectWithVersions(ADTObject): OBJTYPE = ADTObjectType( None, None, XMLNamespace('mock', 'https://github.com/jfilak/sapcli/mock'), None, None, 'versioned') elemverfst = XmlNodeProperty('mock:elemverfst', kind=XmlElementKind.TEXT, version='V1') elemverboth = XmlNodeProperty('mock:elemverboth', kind=XmlElementKind.TEXT, version=['V1', 'V2']) attrverfst = XmlNodeAttributeProperty('mock:attrverfst', version='V1') attrverboth = XmlNodeAttributeProperty('mock:attrverboth', version=['V1', 'V2']) def __init__(self): super(DummyADTObjectWithVersions, self).__init__(None, None) self._elemverall = 'Init-elem-all' self.elemverfst = 'Init-elem-fst' self.elemverboth = 'Init-elem-both' self._attrverall = 'Init-attr-all' self.attrverfst = 'Init-attr-fst' self.attrverboth = 'Init-attr-both' @xml_element('mock:elemverall', kind=XmlElementKind.TEXT) def elemverall(self): return self._elemverall @elemverall.setter def elemverall(self, value): self._elemverall = value @xml_attribute('mock:attrverall') def attrverall(self): return self._attrverall @attrverall.setter def attrverall(self, value): self._attrverall = value
def test_xml_node_property_init(self): template = XmlElementProperty('element', None) node = XmlNodeProperty('element') self.assertIsNone(node.default_value) self.assertEqual(node.name, template.name) self.assertEqual(node.kind, template.kind) self.assertEqual(node.factory, template.factory) self.assertEqual(node.deserialize, template.deserialize) self.assertEqual(node.version, template.version) node = XmlNodeProperty('element', value='value', deserialize=False, factory=str, kind=XmlElementKind.TEXT, version='v2') self.assertEqual(node.default_value, 'value') self.assertEqual(node.name, 'element') self.assertEqual(node.kind, XmlElementKind.TEXT) self.assertEqual(node.factory, str) self.assertFalse(node.deserialize) self.assertEqual(node.version, 'v2')
class CheckReport(metaclass=OrderedClassMembers): """Group of messages for a single reporter""" reporter = XmlNodeAttributeProperty('chkrun:reporter') triggering_uri = XmlNodeAttributeProperty('chkrun:triggeringUri') status = XmlNodeAttributeProperty('chkrun:status') status_text = XmlNodeAttributeProperty('chkrun:statusText') messages = XmlNodeProperty('chkrun:checkMessageList') def __init__(self): self.messages = CheckMessageList()
class ATCObject(metaclass=OrderedClassMembers): """atcobject:object XML Node""" objtype = ADTObjectType(None, None, XMLNS_ATCOBJECT, 'application/xml', None, 'object') uri = XmlNodeAttributeProperty('adtcore:uri') typ = XmlNodeAttributeProperty('adtcore:type') name = XmlNodeAttributeProperty('adtcore:name') package_name = XmlNodeAttributeProperty('adtcore:packageName') author = XmlNodeAttributeProperty('atcobject:author') object_type_id = XmlNodeAttributeProperty('atcobject:objectTypeId') findings = XmlNodeProperty('atcobject:findings', factory=ATCFindingList)
def test_xml_node_property_get_set(self): node = XmlNodeProperty('element', value='value') obj = node self.assertEqual(node.get(obj), 'value') node.set(obj, 'foo') self.assertEqual(node.get(obj), 'foo') self.assertEqual(node.default_value, 'value')
class RunConfiguration(metaclass=OrderedClassMembers): """ABAP Unit Test run configuration Usage with all possible options re-set to default values: run = RunConfiguration() run.external.coverage.active = 'false' run.options.uri_type.value = UriTypeOptionValue.SEMANTIC run.options.test_determination_strategy.same_program = 'true' run.options.test_determination_strategy.assigned_tests = 'false' run.options.test_determination_strategy.append_assigned_tests_preview = 'true' run.options.test_risk_levels.harmless = 'true' run.options.test_risk_levels.dangerous = 'true' run.options.test_risk_levels.critical = 'true' run.options.test_durations.short = 'true' run.options.test_durations.medium = 'true' run.options.test_durations.long = 'true' run.options.with_navigation_uri.enabled = 'false' """ objtype = ADTObjectType( None, 'abapunit/testruns', XMLNS_AUNIT, 'application/vnd.sap.adt.abapunit.testruns.config.v4+xml', None, 'runConfiguration') external = XmlNodeProperty('external') options = XmlNodeProperty('options') objects = XmlNodeProperty(XmlElementProperty.NAME_FROM_OBJECT) def __init__(self, objects): self.external = RunConfigurationOptionsExternal() self.options = RunConfigurationOptions() self.objects = objects
class RunConfigurationOptionsExternal(metaclass=OrderedClassMembers): """External configuration of an ABAP Unit Test run. This class servers the option box purpose. Usage: run = RunConfiguration() run.external.coverage.active = 'false' """ coverage = XmlNodeProperty('coverage') def __init__(self): self.coverage = CoverageOption()
class Query(metaclass=OrderedClassMembers): """ABAP Coverage Query """ objtype = ADTObjectType(None, 'runtime/traces/coverage/measurements/{identifier}', XMLNS_COV, 'application/xml', None, 'query') objects = XmlNodeProperty(XmlElementProperty.NAME_FROM_OBJECT) def __init__(self, identifier, objects): self.objtype.basepath = self.objtype.basepath.format(identifier=identifier) self.objects = objects
class Binding(metaclass=OrderedClassMembers): """The node serviceBinding/binding""" # [ODATA] typ = XmlNodeAttributeProperty('srvb:type') # [V2,V4] version = XmlNodeAttributeProperty('srvb:version') # [0] category = XmlNodeAttributeProperty('srvb:category') # Holds Name of the Business Service Binding object implementation = XmlNodeProperty('srvb:implementation', factory=Implementation) @property def term(self): """Rerturns code for URL. The name 'term' comes from /sap/bc/adt/discovery. """ return f'{self.typ.lower()}{self.version.lower()}'
class CheckMessage(metaclass=OrderedClassMembers): """Run Check result message""" obj_descr = XmlNodeAttributeProperty('objDescr') typ = XmlNodeAttributeProperty('type') line = XmlNodeAttributeProperty('line') href = XmlNodeAttributeProperty('href') force_supported = XmlNodeAttributeProperty('forceSupported') short_text = XmlNodeProperty('shortText', factory=CheckMessageText) @property def is_error(self): """Returns true if the message is an error""" return self.typ == 'E' @property def is_warning(self): """Returns true if the message is an error""" return self.typ == 'W'
class DefinitionLink(metaclass=OrderedClassMembers): """The node serviceBinding/services/content""" version = XmlNodeAttributeProperty('srvb:version') release_state = XmlNodeAttributeProperty('srvb:releaseState') definition = XmlNodeProperty('srvb:serviceDefinition', factory=Definition)
class ServiceBinding(ADTObject): """Business Service binding abstraction""" OBJTYPE = ADTObjectType( 'SRVB/SVB', 'businessservices/bindings', XMLNS_SRVB, [ 'application/vnd.sap.adt.businessservices.servicebinding.v2+xml', 'application/vnd.sap.adt.businessservices.servicebinding.v1+xml' ], {}, 'serviceBinding') release_supported = XmlNodeAttributeProperty('srvb:releaseSupported') published = XmlNodeAttributeProperty('srvb:published') bindingCreated = XmlNodeAttributeProperty('srvb:bindingCreated') services = XmlNodeProperty('srvb:services', factory=ServicesContainer) binding = XmlNodeProperty('srvb:binding', factory=Binding) def __init__(self, connection, name, metadata=None): super().__init__(connection, name, metadata) def find_service(self, service_name=None, service_version=None): """Returns a first service matching the given parameters. If any parameter is None, the parameter is not considered for comparison. """ if service_name and service_version: return next((item for item in self.services if item.definition.name == service_name and item.version == service_version), None) if service_name is not None: return next((item for item in self.services if item.definition.name == service_name), None) if service_version is not None: return next( (item for item in self.services if item.version == service_version), None) raise SAPCliError( "You must specify either Service Name or Service Version or both") def publish(self, service): """Publish service definition""" references = ADTObjectReferences() references.add_object(self) response = self.connection.execute( 'POST', f'businessservices/{self.binding.term}/publishjobs', params={ 'servicename': self.name, 'serviceversion': service.version, }, headers={ # pylint: disable=line-too-long 'Accept': 'application/xml, application/vnd.sap.as+xml;charset=UTF-8;dataname=com.sap.adt.StatusMessage', 'Content-Type': 'application/xml' }, body=Marshal().serialize(references)) return from_xml(StatusMessage(), response.text, root_elem="DATA")