コード例 #1
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
    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
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
 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)
コード例 #5
0
ファイル: my_impl.py プロジェクト: marinaoy/MyPythonProject
    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()
コード例 #6
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
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)
コード例 #7
0
    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)
コード例 #8
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
 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})
コード例 #9
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
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)
コード例 #10
0
    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
コード例 #11
0
    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
コード例 #12
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
    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)
コード例 #13
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
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)
コード例 #14
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
 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
コード例 #15
0
ファイル: my_tools.py プロジェクト: marinaoy/MyPythonProject
 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
コード例 #16
0
ファイル: my_impl.py プロジェクト: marinaoy/MyPythonProject
 def exe_args(self, **args):
     smsg = "" + self.__module__ + "." + self.__class__.__name__
     raise MyException("Я неизвестный науке зверь!" + smsg, -300)