SpecTree: Yet another tool to generate OpenAPI document and validate request & response with Python annotations.
之前分别跟 Flask 和 Flacon 写了插件来做这件事,本来想着可能不太会去做一个 general core 了,够用就行了。然而马上就被打脸了。
目前遇到的问题主要有:
- 两者有不少共同的逻辑,每次需要调整的时候两边都需要改,还不敢保证效果一致
- 写 test 的话,又要写很多重复的 test case 了,文档同理
- 如果想支持其他 framework,例如 starlette 就需要从头写了,虽然可以参考
- 两个包也存在一部分不一致的地方,感觉设计的时候很多地方欠考虑
我想造轮子了
说干就干……然后 spectree 就这样诞生了。主要完成了以下改进:
- 作为一个 core,可以增加对其他 framework 的支持,只需要实现几个方法即可
- 增加了 test,不然每次都搞不清楚改动是不是影响到其他模块了,不写测试心里没底
- 参考了一些 API design guideline,重新设计了 response 的格式,显式声明 status code 和对应的 data model
- 统一的 request data 获取方式,都从
request.context
中获取 - 使用各个 framework 原生的返回样式,减少代码的修改量
- 关于 design 方面的考虑,都写进 issue 里面打上 ‘design’ 的 label,方面之后查询
- 顺手增加了 headers 和 cookies 的支持
- 尽可能拆分开 core 部分处理的内容和针对每个 framework 需要做的不同处理,可以适配 sync 和 async
- 添加了 lgtm.com 检查代码中的问题,当然这个 code quality 真的就是看着开心,A/A+ 大概是常态……
简单写点感想吧:
- 动手之前很有必要广泛阅读相关的各种 standard,guidelines,或 best practice
- 中间遇到设计上的考量,写到 issue 里备查,方便自己和他人查阅
- release 最终版之前,最好留点余地,说不定会发现什么 bug 或者 interface 设计问题
- 必要的测试真的很有必要,这样每次添加 feature 或者修改 bug 都能心里有点底,写测试的过程也有助于发现一些小问题
- 多跟社区的人交流一下,广泛听取群众的意见……
- 还是不太会推广,就简单去 framework 的 add-ons 页面加了一条
- Python descriptor 确实很复杂……