likes
comments
collection
share

数据工厂系列(23)项目同步-中篇

作者站长头像
站长
· 阅读数 14

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

回顾

在上篇中,我们已经前面2个步骤的设计,整个同步逻辑还有最后3个步骤需要设计,今天继续把它完成

解析apidoc数据

执行apidoc命令后,doc目录会生成api_data.json文件,整个数据结构如图

数据工厂系列(23)项目同步-中篇 其中有几个字段我们提取的,如:标题title、函数名name、description描述信息、group业务线名、permission负责人、filename文件名、parameter入参、success返参...

其实可以发现,上面的几乎是接口文档的基本信息...其实解析的逻辑也比较简单,遍历整个数组,再从字典取出关键信息...

  • 去除P标签

description这个字段直接带有P标签,这里需要用到正则去除掉

数据工厂系列(23)项目同步-中篇

  • 去除fields中P标签

description这个字段在fields中也会有,这里直接遍历去除好了,顺便也补充一下字段,主要是补充两个字段id和child字段,因为这里的请求参数和返回参数,需要在前端展示,object类型的字段肯定会有子,相当于树形,element中,展示树形数据必须有row-key... 数据工厂系列(23)项目同步-中篇

数据工厂系列(23)项目同步-中篇

  • 字段默认值和可选值数据转换

这里默认值是要展示在前端的,类似下图的;可选值其实就是一个枚举值,到时候动态生成表单,类似一个下拉框进行选择~~(先画个饼)~~

数据工厂系列(23)项目同步-中篇

我们要处理类型有number、Boolean、String、Array

1.number类型全部转成整型 数据工厂系列(23)项目同步-中篇 2.Boolean类型全部转成Python中的布尔值 数据工厂系列(23)项目同步-中篇 3.String类型可选值去除双引号 数据工厂系列(23)项目同步-中篇 4.Array类型默认值补充"]" 数据工厂系列(23)项目同步-中篇

以上处理具体可看__fields_value_change方法 数据工厂系列(23)项目同步-中篇

  • body解析

先去除P标签、补充字段再进行默认值/示例值转换 数据工厂系列(23)项目同步-中篇

  • 请求示例解析 在api_data.json中,其实就是字符串,直接取出来之后,直接json.loads

数据工厂系列(23)项目同步-中篇

数据工厂系列(23)项目同步-中篇

  • header解析

这里可有可无,到时候脚本不维护也ok 数据工厂系列(23)项目同步-中篇

  • response解析

这里默认取200,跟body解析一样 数据工厂系列(23)项目同步-中篇

  • 返回示例解析

这里跟请求示例一样 数据工厂系列(23)项目同步-中篇

  • 其他信息解析

其他信息的解析,暂不讲解了,大家可以看看代码,无非就是一层层判断下去,再进行获取

  • 组装case对象信息 数据工厂系列(23)项目同步-中篇

清洗之后数据如下:

case的组装信息 数据工厂系列(23)项目同步-中篇

param_in信息 数据工厂系列(23)项目同步-中篇 到这里的话,解析apidoc数据差不多完成了,但是这里object类型的参数我们并没有处理,正常来说f参数应该挂载在e字段下面

数据工厂系列(23)项目同步-中篇 接着,来进行最后一步的操作,处理生成树形数据

  • 生成树形数据

从上面的图片,其实可以发现object类型底下的参数,field都有记录着路径,譬如e.f,表明f是挂载在e下面...所有只要我们根据.切割字符串,默认取列表后两位,就能知道父key和子key

先遍历param_list,如果发现有child字段,就需要挂载子参数,有child字段的,可能有两种情况,一是本身就已经是父参数,field字段无需变更,二是该参数是嵌套参数,譬如a.b.c.d,这里的父参数就是c,子参数就是d,需要把field设置为d。最后通过__find_son_params方法,找出需要挂载的子参数

数据工厂系列(23)项目同步-中篇

找出子参数,涉及到递归,大家结合gitee上的demo试着体会一下 数据工厂系列(23)项目同步-中篇

这段代码不知道会不会有bug,不过应该是会满足大家的需求,因为脚本的入参大多都不会很复杂,一般就2层结构

数据工厂系列(23)项目同步-中篇

数据工厂系列(23)项目同步-中篇

最后测试一下~ 数据工厂系列(23)项目同步-中篇

设计表结构

apidoc数据算是清洗完毕了,接着就是同步数据的逻辑了,首先先设计表结构,表结构的话,跟case对象信息一致

from sqlalchemy import Column, String, Text, INT
from app.models.base import FunBaseModel

class DataFactoryCases(FunBaseModel):
    """脚本表"""
    __tablename__ = 'data_factory_cases'
    project_id = Column(INT, nullable=False, comment="项目id")
    title = Column(String(255), nullable=False, comment="标题")
    name = Column(String(255), nullable=False, comment="方法名")
    description = Column(String(512), nullable=False, comment="描述信息")
    group_name = Column(String(255), nullable=False, comment="分组名")
    header = Column(Text, nullable=True, comment="请求头")
    owner = Column(String(255), nullable=False, comment="负责人")
    path = Column(String(255), nullable=False, comment="脚本路径")
    param_in = Column(Text, nullable=True, comment="请求参数")
    param_out = Column(Text, nullable=True, comment="返回参数")
    example_param_in = Column(Text, nullable=True, comment="请求示例")
    example_param_out = Column(Text, nullable=True, comment="返回示例")


    def __init__(self, project_id, title, name, description, group_name, header, owner, path, param_in, param_out, example_param_in, example_param_out, user, del_flag=0, id=None):
        super().__init__(create_id=user['id'], create_name=user['username'], del_flag=del_flag, id=id)
        self.project_id = project_id
        self.title = title
        self.name = name
        self.description = description
        self.group_name = group_name
        self.header = header
        self.owner = owner
        self.path = path
        self.param_in = param_in
        self.param_out = param_out
        self.example_param_in = example_param_in
        self.example_param_out = example_param_out

总结

今天完成了解析apidoc数据步骤,下篇继续完成同步入库和消息处理~