def create_tool_instance(cls, sName: str, **cfgDict) -> object: # создать именованный экземпляр инструмента в соответствии с # конфигурацией if cfgDict is None: # если конфигурации нет - создать пустое чучело своего класса tool = cls.create_instance() tool.sName = sName return tool modulename = cfgDict.get(MODULE_ARG) if modulename is None: raise MyException( getResourceMsg("MSG:Config value is none {0}.{" "1}").format(sName, MODULE_ARG), EX_CONFIG_NONE) classname = cfgDict.get(CLASS_ARG) if classname is None: raise MyException( getResourceMsg("MSG:Config value is none {0}.{" "1}").format(sName, CLASS_ARG), EX_CONFIG_NONE) # Получить класс инструмента по имени toolClass = strName2Class(modulename, classname, cls) # Создать экземпляр и проинициализировать по имени иконфигурации tool = toolClass.create_new_instance(sName, **cfgDict) if not isinstance(tool, cls): # это не тот класс который ждали! raise MyException( getResourceMsg("MSG:Config item {0} is {1}. But {" "2} is expected").format( sName, tool, cls.getClassTitle()), EX_CONFIG_INVALID) return tool
def strName2Class(modulename, classname): try: __import__(modulename) return getattr(sys.modules[modulename], classname) except Exception as ex: strmsg = 'Ошибка при получении класса по имени {:s}'.format(classname) raise MyException(strmsg, -200, ex) except BaseException as ex: strmsg = 'Ошибка злая при получении класса по имени {:s}'.format( classname) raise MyException(strmsg, -200, ex)
def readDataFrame(**dataCfg) -> pd.DataFrame: sReader = dataCfg.get(CFG_KEY_READER) if CSV_READER == sReader: return readDataCSV(**dataCfg) raise MyException( "MSG_UNKNOWN_READER: {0} = {1}".format(CFG_KEY_READER, sReader), EX_UNKNOWN_READER)
def initTool(self, applyName, toolCfg) -> object: tool = ToolApplied.create_tool_instance(applyName, **toolCfg) if isinstance(tool, ToolApplied): return tool raise MyException( getResourceMsg("MSG_UNSUPPORTED_TOOL_INSTANCE {" "0}").format(tool), EX_CLASS)
def exe_args(self, **args): if self.file is not None: raise MyException("Некий файл уже в работе!", -101) if args is None: args = {} try: # считаем слова, логируем результат. filename = args.get(FILENAME_ARG) if filename is None: raise MyException("не указано имя файла", -102) with open(filename, 'r+', encoding='utf-8') as self.file: file_data = self.file.read() words = file_data.split(" ") final_word_count: int = len(words) strinfo = 'Count = {:d} words'.format(final_word_count) logger.info(strinfo) self.file.write(strinfo) # print(strinfo) self.release() if final_word_count > 10: raise my_exceptions.MyException( 'Очень много слов {:d}! Устай!'.format( final_word_count), -10) return final_word_count except my_exceptions.MyException as e: logger.exception(e, exc_info=True) return e.getcode() except OSError as e: logger.exception(e, exc_info=True) return -11 except Exception as e: logger.error("Неопознанная ошибка: %s", traceback.format_exc()) try: my = my_exceptions.MyException( 'что-то сдохло', my_exceptions.MY_EXCEPTION_CODE_UNK, e) raise my except Exception as mye: tb = sys.exc_info()[2] logger.exception(mye.with_traceback(tb)) return False finally: self.release()
def strName2Class(modulename, classname, asClass): # получение класса по имени с возможной проверкой соответствия классу try: __import__(modulename) nClass = getattr(sys.modules[modulename], classname) if asClass is not None: if not (issubclass(nClass, asClass)): raise MyException( getResourceMsg("MSG:{0} class is " "expected").format(asClass), EX_CLASS) return nClass except Exception as ex: strmsg = getResourceMsg('MSG:Exception on access class by name {0} ' '\\ {1}').format(modulename, classname) raise MyException(strmsg, EX_CLASS, ex) except BaseException as ex: strmsg = getResourceMsg('MSG:BaseException on access class by name {' '0} \\ {1}').format(modulename, classname) raise MyException(strmsg, EX_CLASS, ex)
def create_obj_exe(self, **args) -> MyArgsExe: if args is None: return None modulename = args.get(TOOL_FACTORY_MODULE_ARG) if (modulename is None): raise MyException( "Не указан исполняющий модуль " + TOOL_FACTORY_MODULE_ARG, -200) toolname = args.get(TOOL_FACTORY_CLASS_ARG) if (toolname is None): raise MyException( "Не указан исполняющий класс " + TOOL_FACTORY_CLASS_ARG, -200) toolClass = strName2Class(modulename, toolname) tool = toolClass.create_instance(**args) if isinstance(tool, MyArgsExe): toolexe: MyArgsExe = tool return toolexe raise MyException('Не исполнялка это ' + toolname, ncode=-200)
def startExecute(self): if self.bOnExecute: raise MyException(getResourceMsg("MSG_V_OCHERED!"), EX_V_OCHERED) self.bOnExecute = True self.startTime = datetime.datetime.now() self.exeTime = None self.result = OrderedDict() if isinstance(self.data, dict): sData = self.data.get(DATA_SRC_KEY) if isinstance(sData, dict): sData = sData.copy() self.result.update({RESULT_SRC_DATA_KEY: sData})
def initTools(cfgDict: dict, cfgKeyTools, cfgKeyApplyList) -> OrderedDict: # формирование списка инструментов tools = OrderedDict() if (cfgDict is None) or (cfgDict.get(cfgKeyTools, None) is None): # список инструментов вообще не определен return tools try: allTools: dict = OrderedDict() toolsCfg: dict = cfgDict.get(cfgKeyTools) apply_list = toolsCfg.get(cfgKeyApplyList) toolSets: list = toolsCfg.get("toolSets") for toolSetCfg in toolSets: if not isinstance(toolSetCfg, dict): logger.warning("toolSets item must be dict. Not: {" "0}".format(json.dumps(toolSetCfg))) else: # разбираем словарь toolsDict: dict if TOOLS_FILE_NAME in toolSetCfg.keys(): # читаем инструменты из файла fileName = toolSetCfg.get(TOOLS_FILE_NAME) if TOOLS_FILE_KEY in toolSetCfg.keys(): # из файла получить указанный набор инструментов file_toolSetName = toolSetCfg.get(TOOLS_FILE_KEY) toolsDict = ToolJsonConfigReader( fileName, mainKey=file_toolSetName).readMainConfig() else: # из файла получить набор инструментов, # который в нем по умолчанию toolsDict = ToolJsonConfigReader( fileName).readMainConfig() else: # считаем, что это словарь инструментов toolsDict = toolSetCfg allTools.update(toolsDict) #завершили цикл - собрали полный словарь инструментов if apply_list is None: # если список вызова отсутствует - будут работать как придется tools.update(allTools) else: # работать только перечисленным и в указанном порядке for apply_name in apply_list: tool = allTools.get(apply_name) if tool is None: # конфигурации на этот инструмент нет tool = ToolAppliedNone.create_named_instance(apply_name) tools.update({apply_name: tool}) return tools except Exception as ex: raise MyException("MSG:CANNOT_GET_TOOLS", EX_CONFIG_NO_TOOLS, ex)
def readInt(self, strValue, nMin, nMax): try : smsg = "Требуется целое число." if (nMin is not None): smsg = smsg + " {:d} <= N".format(nMin) if (nMax is not None): smsg = smsg + " => {:d}".format(nMax) elif (nMax is not None): smsg = smsg + " N => {:d}".format(nMax) intValue = int(strValue) if (nMin is not None and intValue < nMin): raise MyException("Нарушена нижняя граница {:d}".format( nMin), -400) if (nMax is not None and intValue > nMax): raise MyException( "Нарушена верхняя граница {:d}".format(nMax), -400) return intValue except Exception as ex: print(ex) print(smsg.format(strValue)) return -2000
def impl_apply(self, env: ToolExeEnv) -> ToolApplyResult: # оценивает результаты person # не слишком ли пациент старый, толстый, нищий... # и решает стоит ли его лечить result = ToolApplyResult() about_v: AboutValue b_good = True try: v: object if 'src' == self.value_source[0]: v = env.getSrcDataValue(self.value_name) elif 'res' == self.value_source[0]: res_name = None vkey = list() i = 0 while i < len(self.value_source): if i > 0: if i == 1: res_name = self.value_source[i] else: vkey.append(self.value_source[i]) i = i + 1 vkey.append(self.value_name) v = env.getResultDataValue(res_name, vkey) else: raise MyException( "Unknown value source {0}".format(self.value_source), -200) v_float = float(v) about_v = self.value_bound.verify(v_float) b_good = b_good & about_v.what_b result.updateValues({"b_value": b_good}) if b_good: result.updateValues({"Norma": v_float}) else: result.updateValues({"Problem": v_float}) result.updateValues(about_v.why_dict) result.setComplete(True) return result except WaitDataException as ex: result.setComplete(False) result.setFailReason({"data_required": ex.getWaitList()}) return result except Exception as ex: sReason = "On error {0}".format(ex) logger.exception(sReason, exc_info=True) result.setComplete(False) result.setFailReason({"Shit happens": sReason}) return result
def readMainConfig(self) -> dict: with open(self.fileConfigName, 'r', encoding='utf-8') as f: dictConfig = json.load(f) config = dictConfig.get(self.mainkey) try: configMain: dict if config is None: sMsg = getResourceMsg("MSG:Config name is not defined by {0}") raise MyException(sMsg.format(self.mainkey), EX_CONFIG_INVALID) if isinstance(config, dict): configMain = config else: configMain = dictConfig.get(config) if (configMain is None) or (not isinstance(configMain, dict)): sMsg = getResourceMsg( "MSG:Config is not found by name {0}") raise MyException(sMsg.format(config), EX_CONFIG_INVALID) return configMain except Exception as ex: raise MyException( getResourceMsg("MSG:Undefined config {0}:{1}:{" "2}").format(self.fileConfigName, self.mainkey, config), EX_CONFIG_INVALID, ex)
def readDataDict(cfgDict: dict, cfgKeyData) -> dict: data = dict() if cfgDict is None: return data try: dataCfg: dict = cfgDict.get(cfgKeyData) if DATA_FILE_NAME in dataCfg.keys(): if DATA_FILE_KEY in dataCfg.keys(): dataCfg = ToolJsonConfigReader( dataCfg.get(DATA_FILE_NAME), mainKey=dataCfg.get(DATA_FILE_KEY)).readMainConfig() else: dataCfg = ToolJsonConfigReader( dataCfg.get(DATA_FILE_NAME)).readMainConfig() # исходная конфигурация данных data.update({DATA_SRC_KEY: dataCfg}) # таблицы данных df_keys: list = list() df_frames: list = list() dfCfg = dataCfg.get(DATA_SRC_FRAMES_KEY) if isinstance(dfCfg, dict): dfKeys = list(dfCfg.keys()) for dfKey in dfKeys: cfg = dfCfg.get(dfKey) dataFrame: pd.DataFrame = readDataFrame(**cfg) df_keys.append(dfKey) df_frames.append(dataFrame) data.update({DATA_FRAMES_KEYS: df_keys, DATA_FRAMES_TABLES: df_frames}) return data except MyException as ex: raise ex except Exception as ex: raise MyException("MSG:CANNOT_GET_DATA", EX_CONFIG_NO_DATA, ex)
def getCfg(self) -> dict: if self.cfgDict is None: raise MyException( getResourceMsg("MSG:None Instance {0}").format( self.getClassTitle()), EX_TOOL_NONE) return self.cfgDict
def getName(self) -> str: if self.sName is None: raise MyException( getResourceMsg("MSG:None Instance {0}").format( self.getClassTitle()), EX_TOOL_NONE) return self.sName
def exe_args(self, **args): smsg = "" + self.__module__ + "." + self.__class__.__name__ raise MyException("Я неизвестный науке зверь!" + smsg, -300)