Exemple #1
0
    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)
Exemple #2
0
    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
Exemple #3
0
 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]
Exemple #4
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
Exemple #5
0
    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)
Exemple #6
0
    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,
        }
Exemple #7
0
    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)
Exemple #8
0
    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