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

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

回顾

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

解析apidoc数据

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

其中有几个字段我们提取的,如:标题title、函数名name、description描述信息、group业务线名、permission负责人、filename文件名、parameter入参、success返参...

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

  • 去除P标签

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

  • 去除fields中P标签

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

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

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

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

1.number类型全部转成整型 2.Boolean类型全部转成Python中的布尔值 3.String类型可选值去除双引号 4.Array类型默认值补充"]"

以上处理具体可看__fields_value_change方法

  • body解析

先去除P标签、补充字段再进行默认值/示例值转换

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

这里可有可无,到时候脚本不维护也ok

  • response解析

这里默认取200,跟body解析一样

  • 返回示例解析

这里跟请求示例一样

  • 其他信息解析

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

  • 组装case对象信息

清洗之后数据如下:

case的组装信息

param_in信息 到这里的话,解析apidoc数据差不多完成了,但是这里object类型的参数我们并没有处理,正常来说f参数应该挂载在e字段下面

接着,来进行最后一步的操作,处理生成树形数据

  • 生成树形数据

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

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

找出子参数,涉及到递归,大家结合gitee上的demo试着体会一下

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

最后测试一下~

设计表结构

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

python 复制代码
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数据步骤,下篇继续完成同步入库和消息处理~

相关推荐
头发还在的女程序员31 分钟前
三天搞定招聘系统!附完整源码
开发语言·python
温轻舟36 分钟前
Python自动办公工具06-设置Word文档中表格的格式
开发语言·python·word·自动化工具·温轻舟
花酒锄作田1 小时前
[python]FastAPI-Tracking ID 的设计
python·fastapi
AI-智能1 小时前
别啃文档了!3 分钟带小白跑完 Dify 全链路:从 0 到第一个 AI 工作流
人工智能·python·自然语言处理·llm·embedding·agent·rag
d***95622 小时前
爬虫自动化(DrissionPage)
爬虫·python·自动化
APIshop2 小时前
Python 零基础写爬虫:一步步抓取商品详情(超细详解)
开发语言·爬虫·python
二川bro3 小时前
AutoML自动化机器学习:Python实战指南
python·机器学习·自动化
杨超越luckly3 小时前
基于 Overpass API 的城市电网基础设施与 POI 提取与可视化
python·数据可视化·openstreetmap·电力数据·overpass api
q***23574 小时前
python的sql解析库-sqlparse
数据库·python·sql
18你磊哥4 小时前
Django WEB 简单项目创建与结构讲解
前端·python·django·sqlite