# --------------------------------------------------------------------------------------------------------- # Author : Ulrich Carmesin # Source : gitea.ucarmesin.de # --------------------------------------------------------------------------------------------------------- import os import basic.toolHandling import basic.componentHandling import basic.constants as B import model.entity import tools.path_const as P import tools.data_const as D import tools.config_tool import tools.file_tool import tools.git_tool TABLE_NAME = "step" """ system-name for this entity """ FIELD_ID = "spid" FIELD_NAME = "name" FIELD_VARIANT = B.SUBJECT_VARIANT # variant FIELD_COMPONENT = B.SUBJECT_COMP # variant FIELD_SORTNR = "sortnr" # testcase FIELD_STEPNR = "stepnr" # testcase FIELD_DATAREF = "dataref" # testcase FIELD_ATTRIBUTES = B.NODE_ATTRIBUTES LIST_FIELDS = [FIELD_ID, FIELD_NAME, FIELD_VARIANT, FIELD_COMPONENT, FIELD_SORTNR, FIELD_STEPNR, FIELD_DATAREF] """ list of object-attributes """ LIST_NODES = [B.NODE_ATTRIBUTES, B.DATA_NODE_TOPICS] LIST_SUBTABLES = [] PREFIX_SUBTABLE = "" FILE_EXTENSION = D.DFILE_TYPE_YML UNIQUE_FIELDS = [FIELD_NAME] """ unique business field as human identifer """ IDENTIFYER_FIELDS = [FIELD_ID] """ unique technical field as technical identifer """ class Step(model.entity.Entity): """ this class describes execution steps in a formal language = fields, in testcase-specification it describe the start-point of an action, here the business information are specified like * variant * reference of program-step, sorting-nr, reference to testdata which are specified above * entity which implements the action * further business-arguments as json-string the detailed steps (build the request, send the request, get the response, ..) are configured in the component in sub-steps of the specified step, here the technical information are configured like * topic and type which implements the detail-step * further arguments inside the dict """ FIELD_ID = "spid" FIELD_SORTNR = "sortnr" # testcase FIELD_STEPNR = "stepnr" # testcase FIELD_DATAREF = "dataref" # testcase LIST_FIELDS = [FIELD_ID, D.FIELD_NAME, B.SUBJECT_VARIANT, B.SUBJECT_COMP, FIELD_SORTNR, FIELD_STEPNR, FIELD_DATAREF] """ list of object-attributes """ LIST_NODES = [B.NODE_ATTRIBUTES, B.DATA_NODE_TOPICS] LIST_SUBTABLES = [] name = "" # variant variant = "" sortnr = 0 """ sorting, alternative step may have the same sortnr, then the correct step is selected by program-variant """ stepnr = 0 """ in order to filter the steps for specific program-executions """ dataref = "" component = "" # the name of the component or of the parameter "testcases" attributes = {} topics = "" # is set by component-configuration def read_unique_names(self, job, project, application, gran, args, ttype: str=""): """ reads the entity-names from file-storage :param job: :param opt. project: select-criteria if used and defined :param opt. application: select-criteria if used and defined :param opt. gran: granularity values testcase / testsuite / testplan :param opt. args additional args :return: list of entity-names """ config = self.getConfig(job, P.KEY_BASIC, B.SUBJECT_VARIANTS, tools.config_tool.get_plain_filename(job, ""), B.SUBJECT_STEP) outList = list(config[B.SUBJECT_VARIANTS].keys()) return outList def read_entity(self, job, name): """ reads the entity from the file-system :param job: :param name: :return: """ config = self.getConfig(job, P.KEY_BASIC, B.SUBJECT_VARIANTS, tools.config_tool.get_plain_filename(job, name), B.SUBJECT_STEP) return self.setAttributes(job, config, name, LIST_FIELDS, LIST_NODES, LIST_SUBTABLES) @staticmethod def rebuild_data(job, data: dict) -> dict: """ gets the subtable-tag from filecsv and sets the subtables in order to workable entity-elements :param job: :param data: :return: """ data = tools.file_type.popSubjectsNode(job, data) # data = tools.file_type.popNameNode(job, data) return data @staticmethod def check_data(job, data: dict) -> dict: checkNodes = {} checkNodes[tools.file_type.MUST_NODES] = [] checkNodes[tools.file_type.MUSTNT_NODES] = [B.DATA_NODE_OPTION, B.DATA_NODE_DATA, B.DATA_NODE_FIELDS, B.DATA_NODE_HEADER] checkNodes[tools.file_type.OPT_NODES] = [B.SUBJECT_COMP, B.NODE_ATTRIBUTES] return tools.file_type.check_nodes(job, data, checkNodes) def getIDName(self): """ it returns the name as unique-id - maybe build from few attributes :return: """ return "{:02d}_{}".format(int(self.sortnr), self.variant)