def add_remote_hub(self, name, url, branch='master'): """增加远程策略仓库 :param str name: 本地仓库名称(自行起名) :param str url: git 仓库地址 :param str branch: git 仓库分支 """ record = self._session.query(HubModel).filter( HubModel.name == name).first() checkif(record is not None, name, HubNameRepeatError) record = self._session.query(HubModel).filter( and_(HubModel.url == url, HubModel.branch == branch)).first() # 下载远程仓库 local_dir = "{}/{}".format(self.remote_cache_dir, name) self.download_remote_hub(local_dir, url, branch) # 导入仓库各部件策略信息 record = HubModel(name=name, hub_type='remote', url=url, branch=branch, local_base=name, local=local_dir) self.import_part_to_db(record) # 更新仓库记录 self._session.add(record)
def get_part(self, name, **kwargs): """获取指定策略部件 :param str name: 策略部件名称 :param kwargs: 其他部件相关参数 """ name_parts = name.split('.') checkif( len(name_parts) < 2 or (name_parts[-2] not in ('af', 'cn', 'ev', 'mm', 'pg', 'se', 'sg', 'sp', 'st', 'prtflo', 'sys')), name, PartNameError) # 未指定仓库名,则默认使用 'default' 仓库 part_name = 'default.{}'.format(name) if len(name_parts) == 2 else name part_model = self._session.query(PartModel).filter_by( name=part_name).first() checkif(part_model is None, part_name, PartNotFoundError, cause='仓库中不存在') try: part_module = importlib.import_module(part_model.module_name) except ModuleNotFoundError: raise PartNotFoundError(part_name, '请检查部件对应路径是否存在') part = part_module.part(**kwargs) part.name = part_model.name part.info = self.get_part_info(part.name) return part
def get_hub_path(self, name): """获取仓库所在的本地路径 :param str name: 仓库名 """ path = self._session.query(HubModel.local).filter_by(name=name).first() checkif(path is None, name, HubNotFoundError) return path[0]
def get_current_hub(self, filename): """用于在仓库part.py中获取当前所在的仓库名 示例: get_current_hub(__file__) """ abs_path = os.path.abspath(filename) #当前文件的绝对路径 path_parts = pathlib.Path(abs_path).parts local_base = path_parts[-4] if path_parts[-3] in ('prtflo', 'sys') else path_parts[5] hub_model = self._session.query(HubModel.name).filter_by(local_base=local_base).first() checkif(hub_model is None, local_base, HubNotFoundError) return hub_model.name
def update_house(self, name): """更新指定仓库 :param str name: 仓库名称 """ house_model = self._session.query(HouseModel).filter_by(name=name).first() checkif(house_model is None, '指定的仓库({})不存在!'.format(name)) self._session.query(PartModel).filter_by(house_name=name).delete() if house_model.house_type == 'remote': self.download_remote_house(house_model.local, house_model.url, house_model.branch) self.import_part_to_db(house_model)
def get_part_info(self, name): """获取策略部件信息 :param str name: 部件名称 """ part_model = self._session.query(PartModel).filter_by(name=name).first() checkif(part_model is None, name, PartNotFoundError, cause='仓库中不存在') return { 'name': name, 'author': part_model.author, 'version': part_model.version, 'doc': part_model.doc, }
def add_local_house(self, path): """增加本地数据仓库 :param str path: 本地全路径 """ checkif(not os.path.lexists(path), '找不到指定的路径("{}")'.format(path)) # 获取绝对路径 local_path = os.path.abspath(path) name = os.path.basename(local_path) record = self._session.query(HouseModel).filter(HouseModel.name == name).first() checkif(record is not None, name, HouseNameRepeatError) #assert record is None, '本地仓库名重复' # 将本地路径的上一层路径加入系统路径 sys.path.append(os.path.dirname(path)) # 检查仓库目录名称是否与其他 python 模块存在冲突 tmp = importlib.import_module(name) checkif( tmp.__path__[0] != local_path, name, ModuleConflictError, conflict_module=tmp.__path__[0], house_path=local_path ) # 导入部件信息 house_model = HouseModel(name=name, house_type='local', local=local_path) self.import_part_to_db(house_model) # 更新仓库记录 self._session.add(house_model)
def get_part(self, name, **kwargs): """获取指定策略部件 :param str name: 策略部件名称 :param kwargs: 其他部件相关参数 """ name_parts = name.split('.') checkif( len(name_parts) < 2 or ( name_parts[-2] not in ('af', 'cn', 'ev', 'mm', 'pg', 'se', 'sg', 'sp', 'st', 'prtflo', 'sys') ), name, PartNameError ) if len(name_parts) == 2: # 未指定仓库名,尝试获取所在仓库名,并重新组装名称 abs_path = os.path.abspath(__file__) #当前文件的绝对路径 path_parts = pathlib.Path(abs_path).parts cause = '当前文件("{}")并非仓库中的策略文件,请手工指定仓库名'.format(abs_path) if name_parts[0] in ('prtflo', 'sys'): checkif(len(path_parts) < 4, name, PartNotFoundError, cause=cause) part_name = '{}.{}'.format(path_parts[-4], name) else: checkif(len(path_parts) < 5, name, PartNotFoundError, cause=cause) part_name = '{}.{}'.format(path_parts[-5], name) else: part_name = name part_model = self._session.query(PartModel).filter_by(name=part_name).first() checkif(part_model is None, part_name, PartNotFoundError, cause='仓库中不存在') try: part_module = importlib.import_module(part_model.module_name) except ModuleNotFoundError: raise PartNotFoundError(part_name, '请检查部件对应路径是否存在') part = part_module.part(**kwargs) part.name = part_model.name return part