贡献指南¶
开发环境¶
需要先安装 uv。
uv sync --all-extras
项目结构¶
larkify/
├── feishu.py, core.py 客户端、请求、响应检查、重试循环
├── auth/ 认证策略
├── cache/ token 缓存
├── response.py 响应包装
├── rest/
│ ├── paginator.py 分页
│ └── <项目>/<版本>/ [生成] 接口客户端
├── models/<项目>/<版本>/ [生成] pydantic 模型与 TypedDict
├── webhooks/
│ ├── dispatcher.py 事件路由、验签
│ ├── crypto.py AES 解密、签名
│ ├── callbacks.py 卡片回调模型(文档目录未收录,手写)
│ └── events/ [生成] 事件模型
└── ws/ 长连接与帧编解码
codegen/ 代码生成器
docs/ 文档站
scripts/ 生成结果校验、发布脚本
schema/ 文档元数据快照(不入库)
代码生成¶
uv run python -m codegen fetch # 抓取元数据到 schema/,约 6 分钟,可断点续传
uv run python -m codegen build # 生成代码
飞书没有公开的 OpenAPI 文件,数据来自开放平台文档站点使用的接口:
| 来源 | 内容 |
|---|---|
/api/tools/server-side-api/list |
接口目录 |
/api_explorer/v1/api_definition |
机器可读定义,字段全集、精确类型、token、上传下载标记 |
/document_portal/v1/document/get_detail |
渲染后的文档,更可靠的 required、枚举、描述和示例 |
/api/tools/server-side-event/list |
事件目录,事件结构从文档表格和示例中解析 |
Warning
这些是文档站内部接口,不是公开 API,结构可能变化,fetch 届时需要调整。
生成流程值得注意的几点:
- 接口路径取自
definition.apiPath。目录的url字段有 10 处错误,比如缺版本号或路径参数。 definition.pagination漏标约三分之一的分页接口,所以按结构判断:传入page_token且响应有后续标记。- 文档把递归结构全部内联(docx 单个接口的元数据达 7MB),模型按「名称 + 结构签名」去重,1753 个接口收敛为 4846 个模型。
- 文档示例和声明类型冲突的字段放宽为
Any,避免一个字段让整个响应解析失败。当前共 11 处。
测试¶
uv run pytest
依赖 schema/ 快照的校验脚本:
uv run python scripts/check_generated.py # 构建全部模型
uv run python scripts/check_endpoints.py # 调用全部接口,比对 method、路径、参数、token
PYTHONPATH=. uv run python scripts/check_examples.py # 用文档示例回放接口模型
PYTHONPATH=. uv run python scripts/check_events.py # 用文档示例回放事件模型
PYTHONPATH=. uv run python scripts/check_official_sdk.py /path/to/oapi-sdk-python
这些校验覆盖的内容见覆盖范围。
文档¶
uv run --group docs mkdocs serve # 本地预览
uv run --group docs mkdocs build --strict # 与 CI 相同的检查
推送到 main 后由 .github/workflows/docs.yml 构建并发布到 GitHub Pages。
发布¶
提交信息遵循 Conventional Commits,版本号和 CHANGELOG.md 都由 git-cliff 从提交历史生成,配置在 cliff.toml。
uv run python scripts/release.py # 版本号根据提交推算
uv run python scripts/release.py 1.0.0 # 或者手动指定
脚本会更新 pyproject.toml、uv.lock 和 CHANGELOG.md,然后提交并打 tag,但不会推送。确认无误后执行脚本最后打印的命令:
git push --atomic origin main vX.Y.Z
推送 tag 后由 .github/workflows/release.yml 依次运行测试、发布到 PyPI、创建 GitHub Release。
| 提交类型 | 版本变化 |
|---|---|
破坏性变更(feat!: 或 BREAKING CHANGE:) |
0.x 阶段升 minor,1.0 之后升 major |
feat |
升 minor |
fix、perf、refactor、docs、build |
升 patch |
chore、ci、style、test 不写入 changelog。自上个 tag 以来只有这些提交时没有可发布的内容,脚本会直接退出。