数据工厂系列(24)项目同步-下篇

大家好~我是小方,欢迎大家关注笋货测试笔记 体完记得俾个like

回顾

在上篇最后环节,我们只是设计了脚本表结构,同步逻辑暂未编写完毕,今天目标:把剩下的步骤完成

同步逻辑设计

同步逻辑,其实就是apidoc数据跟表里的数据相互比对,先查询,后根据比对结果进行增删改操作,所以接下来,先设计cases的crud功能

  • 新增逻辑
python 复制代码
    @classmethod
    def insert_case(cls, project_id: int , title: str, name: str, description: str, group_name: str, header: str, owner: str, path: str,
                    param_in: str, param_out: str, example_param_in: str, example_param_out: str, user: dict) -> None:
        """
        新增造数场景
        :param project_id: 项目id
        :param title: 标题
        :param name: 方法名
        :param description: 描述信息
        :param group_name: 分组名
        :param header: 请求头
        :param owner: 负责人
        :param path: 路径
        :param param_in: 请求参数
        :param param_out: 返回参数
        :param example_param_in: 请求示例
        :param example_param_out: 返回示例
        :param user: 用户数据
        :return:
        """
        ant = cls.get_with_existed(project_id = project_id, name = name)
        if ant:
            raise BusinessException("造数场景已存在!!!")
        case = DataFactoryCases(project_id, title, name, description, group_name, header, owner, path, param_in,
                                 param_out, example_param_in, example_param_out, user)
        cls.insert_by_model(model_obj = case)

这里我没用模型进行入参,因为考虑到解析回来的apidoc数据都是dict类型,到时候直接**xxx解析进去,至于如何用模型入参,有兴趣的小伙伴可以尝试一下

  • 更新逻辑
python 复制代码
@classmethod
    def update_case(cls, cases_id: int, title: str, name: str, description: str, group_name: str, header: str, owner: str, path: str,
                    param_in: str, param_out: str, example_param_in: str, example_param_out: str, user: dict) -> None:
        """
        更新造数场景
        :param cases_id: 主键id
        :param title: 标题
        :param name: 方法名
        :param description: 描述信息
        :param group_name: 分组名
        :param header: 请求头
        :param owner: 负责人
        :param path: 路径
        :param param_in: 请求参数
        :param param_out: 返回参数
        :param example_param_in: 请求示例
        :param example_param_out: 返回示例
        :param user: 用户数据
        :return:
        """
        ant = cls.get_with_existed(id=cases_id)
        if not ant:
            raise BusinessException("造数场景不存在!!!")
        update_map = {
            "id": cases_id,
            "title": title,
            "name": name,
            "description": description,
            "group_name": group_name,
            "header": header,
            "owner": owner,
            "path": path,
            "param_in": param_in,
            "param_out": param_out,
            "example_param_in": example_param_in,
            "example_param_out": example_param_out
        }
        cls.update_by_id(model = update_map, user = user)
  • 删除逻辑
python 复制代码
    @classmethod
    def delete_case(cls, cases_id: int, user: dict) -> None:
        """
        删除造数场景
        :param cases_id: 主键id
        :param user: 用户数据
        :return:
        """
        ant = cls.get_with_existed(id=cases_id)
        if not ant:
            raise BusinessException("造数场景不存在!!!")
        cls.delete_by_id(id = cases_id, user = user)
  • 根据项目id查询case数据
python 复制代码
    @classmethod
    def get_projet_case(cls, project_id: int) -> DataFactoryCases:
        """
        获取项目下的所有造数场景
        :param project_id: 项目id
        :return:
        """
        case_infos = cls.get_with_params(project_id = project_id, _fields = CaseDto)
        return case_infos

上面的这几个增删改查逻辑比较简单,大家有空可以看看源码

  • 数据比对 这里数据比对,主要分为两种,第一种,以apidoc数据为准,遍历表里的数据,第二种,以表里的数据为准,反匹配apidoc的数据

先来第一种... 以apidoc数据为准,通过函数名,查找匹配数据,匹配到了,进行俩俩比对,数据没变化,不更新数据,数据有变化,更新数据;如果没匹配到,就是新数据,直接新增一条数据

第二种... 以表里数据为准,通过函数名,查找匹配数据,匹配到了,不处理数据,匹配不到数据,说明最新的apidoc数据里没有这条数据

  • 最终返回 最后返回一个字典,里面存放新增/删除/更新的case标题

处理同步信息

这里为了前端展示更加好看,用了p标签和span标签包裹着同步信息--此idea来源于pity,无敌哥yyds

数据同步逻辑补充

还记得之前的步骤么?这里我们算是设计完整个同步逻辑,将这些步骤都放进去吧~ project_logic.py补充逻辑

python 复制代码
def sync_project_logic(id: int):
    # 记录是谁同步脚本,顺便判断一下权限
    user = REQUEST_CONTEXT.get().user
    project = ProjectDao.project_detail(id, user)
    
    # step1 git pull 更新项目
    project_path, script_path = ProjectPath.get(project.git_project, project.directory)
    Git.git_pull(project_path, project.git_branch)
    api_doc = ApiDocParse(project_path, script_path)
    
    # step2 执行api_doc命令, 生成api_data.json
    api_doc.exec()
    
    # step3 解析apidoc数据入库,暂时先返回api_data.json数据
    api_data = api_doc.parse_apidoc()
    
    # step4 获取该项目的所有造数场景
    from fastapi.encoders import jsonable_encoder
    project_cases = CaseDao.get_projet_case(project.id)
    project_cases = jsonable_encoder(project_cases)
    
    # step5 处理同步数据
    msg_dict = api_doc.sync_data(project.id, api_data, project_cases, user)
    
    # step6 处理同步消息
    msg = api_doc.sync_msg(**msg_dict)
    return msg

效果展示

好像有点翻车,看看前端代码,用的是哪个字段 前端用的是msg字段的数据进行展示,emmmm,那我们改一下返参吧

修改后,展示效果

总结

截止今天,已经完成了同步项目的逻辑设计,完结撒花,接下来就是围绕case相关的功能设计,点赞、收藏、参数组合、case展示、case运行、case运行日志、平台数据统计...

相关推荐
m***记4 分钟前
Python字符串操作:如何判断子串是否存在
linux·服务器·python
小白银子44 分钟前
零基础从头教学Linux(Day 56)
linux·运维·python
B站计算机毕业设计之家1 小时前
计算机视觉:python手写数字识别系统 手写数字检测 CNN算法 卷积神经网络 OpenCV和Keras模型 大数据毕业设计(建议收藏)✅
python·神经网络·opencv·计算机视觉·cnn·手写数字·数字识别
B站计算机毕业设计之家1 小时前
Python手势识别检测系统 基于MediaPipe的改进SSD算法 opencv+mediapipe 深度学习 大数据 (建议收藏)✅
python·深度学习·opencv·计算机视觉·1024程序员节
程序员二黑1 小时前
状态迁移与场景法:搞定复杂业务流测试的利器
面试·单元测试·测试
分布式存储与RustFS2 小时前
RustFS:MinIO的“平替”还是“乱杀”?
python·rust·对象存储·minio·存储·企业存储·rustfs
爱幻想-hjyp2 小时前
【Python】uv包管理器常用命令
开发语言·python·uv
用什么都重名2 小时前
UV工具安装配置使用教程
python·uv·包管理器
Python×CATIA工业智造2 小时前
Python装饰器解包装技术详解:从原理到高级应用
python·pycharm
王哈哈^_^2 小时前
PyTorch vs TensorFlow:从入门到落地的全方位对比
人工智能·pytorch·python·深度学习·计算机视觉·tensorflow·1024程序员节