数据工厂系列(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数据步骤,下篇继续完成同步入库和消息处理~

相关推荐
AndrewHZ3 小时前
【python与生活】如何用Python写一个简单的自动整理文件的脚本?
开发语言·python·生活·脚本·文件整理
binbinaijishu883 小时前
Python爬虫入门指南:从零开始的网络数据获取之旅
开发语言·爬虫·python·其他
Python代狂魔5 小时前
Redis
数据库·redis·python·缓存
做科研的周师兄6 小时前
【机器学习入门】1.2 初识机器学习:从数据到智能的认知之旅
大数据·数据库·人工智能·python·机器学习·数据分析·机器人
王小王-1237 小时前
基于Python的游戏推荐与可视化系统的设计与实现
python·游戏·游戏推荐系统·游戏可视化
KevinWang_7 小时前
让 AI 写一个给图片加水印的 Python 脚本
python
go&Python8 小时前
检索模型与RAG
开发语言·python·llama
阿里云大数据AI技术8 小时前
ODPS 十五周年实录 | Data + AI,MaxCompute 下一个15年的新增长引擎
大数据·python·sql
RainbowJie18 小时前
Gemini CLI 与 MCP 服务器:释放本地工具的强大潜力
java·服务器·spring boot·后端·python·单元测试·maven
工作碎碎念8 小时前
NumPy------数值计算
python