ys-zentao-api 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ys_zentao_api-0.2.0/PKG-INFO +289 -0
- ys_zentao_api-0.2.0/README.md +281 -0
- ys_zentao_api-0.2.0/pyproject.toml +19 -0
- ys_zentao_api-0.2.0/setup.cfg +4 -0
- ys_zentao_api-0.2.0/tests/test_p0_methods.py +184 -0
- ys_zentao_api-0.2.0/tests/test_p1_package.py +112 -0
- ys_zentao_api-0.2.0/tests/test_p2_helpers.py +206 -0
- ys_zentao_api-0.2.0/tests/test_p3_cli.py +168 -0
- ys_zentao_api-0.2.0/tests/test_p4_create_story.py +80 -0
- ys_zentao_api-0.2.0/tests/test_p5_data_refactor.py +140 -0
- ys_zentao_api-0.2.0/tests/test_p6_shape_fix.py +136 -0
- ys_zentao_api-0.2.0/tests/test_p7_env_config.py +228 -0
- ys_zentao_api-0.2.0/ys_zentao_api.egg-info/PKG-INFO +289 -0
- ys_zentao_api-0.2.0/ys_zentao_api.egg-info/SOURCES.txt +32 -0
- ys_zentao_api-0.2.0/ys_zentao_api.egg-info/dependency_links.txt +1 -0
- ys_zentao_api-0.2.0/ys_zentao_api.egg-info/entry_points.txt +2 -0
- ys_zentao_api-0.2.0/ys_zentao_api.egg-info/requires.txt +1 -0
- ys_zentao_api-0.2.0/ys_zentao_api.egg-info/top_level.txt +1 -0
- ys_zentao_api-0.2.0/zentao_api/__init__.py +3 -0
- ys_zentao_api-0.2.0/zentao_api/cli.py +373 -0
- ys_zentao_api-0.2.0/zentao_api/client/__init__.py +23 -0
- ys_zentao_api-0.2.0/zentao_api/client/_credentials.py +56 -0
- ys_zentao_api-0.2.0/zentao_api/client/_legacy.py +108 -0
- ys_zentao_api-0.2.0/zentao_api/client/base.py +297 -0
- ys_zentao_api-0.2.0/zentao_api/client/bugs.py +476 -0
- ys_zentao_api-0.2.0/zentao_api/client/builds.py +165 -0
- ys_zentao_api-0.2.0/zentao_api/client/plans.py +150 -0
- ys_zentao_api-0.2.0/zentao_api/client/products.py +193 -0
- ys_zentao_api-0.2.0/zentao_api/client/projects.py +270 -0
- ys_zentao_api-0.2.0/zentao_api/client/qa.py +541 -0
- ys_zentao_api-0.2.0/zentao_api/client/releases.py +199 -0
- ys_zentao_api-0.2.0/zentao_api/client/stories.py +264 -0
- ys_zentao_api-0.2.0/zentao_api/client/tasks.py +117 -0
- ys_zentao_api-0.2.0/zentao_api/client/writes.py +705 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ys-zentao-api
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: 禅道项目管理 API 客户端与命令行工具
|
|
5
|
+
Requires-Python: >=3.8
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: requests>=2.28.0
|
|
8
|
+
|
|
9
|
+
# zentao-cli
|
|
10
|
+
|
|
11
|
+
命令行禅道项目管理工具。
|
|
12
|
+
|
|
13
|
+
## 特性
|
|
14
|
+
|
|
15
|
+
- **轻量**:纯 Python + `requests`,装一个包就能用
|
|
16
|
+
- **凭证外置**:`.env` 文件配置,与代码分离,方便轮转密码
|
|
17
|
+
- **只读优先**:7 个 GET 类子命令 + 5 个写操作子命令(含确认 prompt)
|
|
18
|
+
- **集成 Python 库**:也可作为 `from zentao_api.client import ZenTaoClient` 在代码中使用
|
|
19
|
+
- 148 个方法覆盖:产品、项目、需求、任务、Bug、QA 测试、发布、版本、计划
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
推荐用 [pipx](https://pypa.github.io/pipx/) 全局安装 CLI 工具——它会为每个工具建独立虚拟环境,但命令暴露到 `$PATH`,不污染项目依赖。
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# 首次使用先装 pipx
|
|
27
|
+
brew install pipx # macOS
|
|
28
|
+
apt install pipx # Debian/Ubuntu
|
|
29
|
+
pipx ensurepath # 把 ~/.local/bin 加到 PATH
|
|
30
|
+
|
|
31
|
+
# 装 ys-zentao-api(命令 zentao 可用)
|
|
32
|
+
pipx install ys-zentao-api
|
|
33
|
+
|
|
34
|
+
# 试用不装:直接跑最新版的命令
|
|
35
|
+
pipx run --spec ys-zentao-api zentao --help
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
需要 Python 3.8+。
|
|
39
|
+
|
|
40
|
+
### 从源码开发
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git clone <repo>
|
|
44
|
+
cd ys-zentao-api
|
|
45
|
+
pipx install -e . # 可编辑装到全局
|
|
46
|
+
# 或者
|
|
47
|
+
python3 -m venv .venv
|
|
48
|
+
source .venv/bin/activate
|
|
49
|
+
pip install -e .
|
|
50
|
+
pytest tests/ -v
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 配置
|
|
54
|
+
|
|
55
|
+
凭证放在 `~/.config/zentao-cli/.env`(格式:`.env`):
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
mkdir -p ~/.config/zentao-cli
|
|
59
|
+
cat > ~/.config/zentao-cli/.env <<EOF
|
|
60
|
+
endpoint=http://zentao.xxx.com/zentao
|
|
61
|
+
username=xxx
|
|
62
|
+
password=xxx
|
|
63
|
+
EOF
|
|
64
|
+
chmod 600 ~/.config/zentao-cli/.env
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
字段说明:
|
|
68
|
+
|
|
69
|
+
| 字段 | 说明 |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `endpoint` | 禅道地址,含 `http(s)://` 和子路径(如 `/zentao`) |
|
|
72
|
+
| `username` | 登录账号 |
|
|
73
|
+
| `password` | 登录密码 |
|
|
74
|
+
|
|
75
|
+
也可通过 `--env-file PATH` 指定其他路径(不指定则用默认):
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
zentao --env-file /path/to/.env products
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> `--help` 不会读凭证,可随时运行。
|
|
82
|
+
|
|
83
|
+
## 使用
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
zentao --help
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
输出所有 12 个子命令。语法:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
zentao [-h] [--env-file ENV_FILE]
|
|
93
|
+
{products,projects,executions,stories,tasks,bugs,productplans,
|
|
94
|
+
create-story,create-task,batch-create-tasks,create-productplan,review-story}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 只读命令
|
|
98
|
+
|
|
99
|
+
#### `products` — 查询产品列表
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
zentao products
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
📋 查询禅道产品列表
|
|
107
|
+
|
|
108
|
+
✅ 共 22 条
|
|
109
|
+
|
|
110
|
+
ID | 产品名称 | 状态 | 负责人
|
|
111
|
+
---+------------+----+----
|
|
112
|
+
35 | xxx | |
|
|
113
|
+
34 | xxx | |
|
|
114
|
+
...
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### `projects [--status STATUS]` — 查询项目列表
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
zentao projects # 默认 status=doing
|
|
121
|
+
zentao projects --status all # 全部状态
|
|
122
|
+
zentao projects --status closed
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### `executions --project-id ID` — 查询执行列表
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
zentao executions --project-id 45
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### `stories --project-id ID [--limit N]` — 查询需求列表
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
zentao stories --project-id 45
|
|
135
|
+
zentao stories --project-id 45 --limit 10
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### `tasks --execution-id ID [--limit N]` — 查询任务列表
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
zentao tasks --execution-id 200
|
|
142
|
+
zentao tasks --execution-id 200 --limit 20
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### `bugs --product-id ID [--limit N]` — 查询缺陷列表
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
zentao bugs --product-id 35
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### `productplans --product-id ID` — 查询发布计划
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
zentao productplans --product-id 35
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 写操作命令
|
|
158
|
+
|
|
159
|
+
写操作前会打印操作详情并要求输入 `y/n` 确认。CI/脚本中可管道 `echo y |` 自动确认。
|
|
160
|
+
|
|
161
|
+
#### `create-story` — 新建需求
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
zentao create-story \
|
|
165
|
+
--product-id 35 \
|
|
166
|
+
--execution-id 200 \
|
|
167
|
+
--title "xxx流程改造" \
|
|
168
|
+
--plan-id 0 \
|
|
169
|
+
--reviewer alice
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
#### `create-task` — 新建任务
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
zentao create-task \
|
|
176
|
+
--execution-id 200 \
|
|
177
|
+
--story-id 1234 \
|
|
178
|
+
--name "xxx登录页面" \
|
|
179
|
+
--assign-to alice \
|
|
180
|
+
--parent-id 999 # 可选,指定为子任务
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### `batch-create-tasks` — 批量创建子任务
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
zentao batch-create-tasks \
|
|
187
|
+
--execution-id 200 \
|
|
188
|
+
--parent-id 999 \
|
|
189
|
+
--tasks "前端开发:8,后端开发:16,联调测试:4"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
`--tasks` 格式:`名称1:工时,名称2:工时`。
|
|
193
|
+
|
|
194
|
+
#### `create-productplan` — 新建发布计划
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
zentao create-productplan --product-id 35 --title "Q3 计划"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### `review-story` — 评审需求
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
zentao review-story --story-id 1234
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## 退出码
|
|
207
|
+
|
|
208
|
+
| 码 | 含义 |
|
|
209
|
+
|---|---|
|
|
210
|
+
| `0` | 成功 |
|
|
211
|
+
| `1` | 凭证缺失或读失败 |
|
|
212
|
+
| `2` | argparse 参数错误(如缺 `--project-id`) |
|
|
213
|
+
| 其他 | 工具内部异常 |
|
|
214
|
+
|
|
215
|
+
## 故障排查
|
|
216
|
+
|
|
217
|
+
**`❌ 未找到凭证文件:~/.config/zentao-cli/.env`**
|
|
218
|
+
凭证未创建或权限不够。重新创建并 `chmod 600`。
|
|
219
|
+
|
|
220
|
+
**`认证失败`**
|
|
221
|
+
`endpoint` 是否带子路径(如 `/zentao`)、用户名密码是否对、账号是否被禁用。
|
|
222
|
+
|
|
223
|
+
**CLI 命令列出了 0 条但实际有数据**
|
|
224
|
+
端点路径可能与禅道实际路径不一致。检查 `endpoint` 末尾的子路径。
|
|
225
|
+
|
|
226
|
+
**`--limit 0` 没有限制效果**
|
|
227
|
+
设计如此:`--limit 0` 等同于不传。要限制请传正整数。
|
|
228
|
+
|
|
229
|
+
## 作为 Python 库
|
|
230
|
+
|
|
231
|
+
```python
|
|
232
|
+
from zentao_api.client import ZenTaoClient
|
|
233
|
+
|
|
234
|
+
client = ZenTaoClient(
|
|
235
|
+
endpoint="http://zentao.xxx.com/zentao",
|
|
236
|
+
username="xxx",
|
|
237
|
+
password="xxx",
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# 列出产品
|
|
241
|
+
ok, products = client.get_products()
|
|
242
|
+
print(f"{len(products)} products")
|
|
243
|
+
|
|
244
|
+
# 查项目下的需求
|
|
245
|
+
ok, stories = client.get_stories("45")
|
|
246
|
+
for s in stories:
|
|
247
|
+
print(f"[{s['id']}] {s['title']}")
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## 项目结构
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
ys-zentao-api/
|
|
254
|
+
├── zentao_api/
|
|
255
|
+
│ ├── __init__.py
|
|
256
|
+
│ ├── cli.py # argparse + 命令字典分发
|
|
257
|
+
│ └── client/ # 12 个 mixin 组成的包
|
|
258
|
+
│ ├── _base.py # 鉴权 + old_request + _data helpers
|
|
259
|
+
│ ├── _credentials.py # .env 读取
|
|
260
|
+
│ ├── _legacy.py # 老 API 兜底
|
|
261
|
+
│ ├── products.py # 产品
|
|
262
|
+
│ ├── projects.py # 项目
|
|
263
|
+
│ ├── stories.py # 需求
|
|
264
|
+
│ ├── tasks.py # 任务
|
|
265
|
+
│ ├── bugs.py # 缺陷
|
|
266
|
+
│ ├── qa.py # QA 测试
|
|
267
|
+
│ ├── releases.py # 发布
|
|
268
|
+
│ ├── builds.py # 版本
|
|
269
|
+
│ ├── plans.py # 计划
|
|
270
|
+
│ └── writes.py # 状态变更 + get_my_*
|
|
271
|
+
├── tests/ # 97 个 mock 单元测试
|
|
272
|
+
├── .github/workflows/test.yml
|
|
273
|
+
├── pyproject.toml
|
|
274
|
+
└── README.md
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## 测试
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
pip install -e .
|
|
281
|
+
pip install pytest
|
|
282
|
+
pytest tests/ -v
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
97 个 mock 测试覆盖所有 mixin 的核心方法、CLI 命令分发、`.env` 解析。CI 在 3 OS × 3 Python 版本(3.8/3.10/3.12)矩阵上跑。
|
|
286
|
+
|
|
287
|
+
## 许可证
|
|
288
|
+
|
|
289
|
+
MIT
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# zentao-cli
|
|
2
|
+
|
|
3
|
+
命令行禅道项目管理工具。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- **轻量**:纯 Python + `requests`,装一个包就能用
|
|
8
|
+
- **凭证外置**:`.env` 文件配置,与代码分离,方便轮转密码
|
|
9
|
+
- **只读优先**:7 个 GET 类子命令 + 5 个写操作子命令(含确认 prompt)
|
|
10
|
+
- **集成 Python 库**:也可作为 `from zentao_api.client import ZenTaoClient` 在代码中使用
|
|
11
|
+
- 148 个方法覆盖:产品、项目、需求、任务、Bug、QA 测试、发布、版本、计划
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
推荐用 [pipx](https://pypa.github.io/pipx/) 全局安装 CLI 工具——它会为每个工具建独立虚拟环境,但命令暴露到 `$PATH`,不污染项目依赖。
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# 首次使用先装 pipx
|
|
19
|
+
brew install pipx # macOS
|
|
20
|
+
apt install pipx # Debian/Ubuntu
|
|
21
|
+
pipx ensurepath # 把 ~/.local/bin 加到 PATH
|
|
22
|
+
|
|
23
|
+
# 装 ys-zentao-api(命令 zentao 可用)
|
|
24
|
+
pipx install ys-zentao-api
|
|
25
|
+
|
|
26
|
+
# 试用不装:直接跑最新版的命令
|
|
27
|
+
pipx run --spec ys-zentao-api zentao --help
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
需要 Python 3.8+。
|
|
31
|
+
|
|
32
|
+
### 从源码开发
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
git clone <repo>
|
|
36
|
+
cd ys-zentao-api
|
|
37
|
+
pipx install -e . # 可编辑装到全局
|
|
38
|
+
# 或者
|
|
39
|
+
python3 -m venv .venv
|
|
40
|
+
source .venv/bin/activate
|
|
41
|
+
pip install -e .
|
|
42
|
+
pytest tests/ -v
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 配置
|
|
46
|
+
|
|
47
|
+
凭证放在 `~/.config/zentao-cli/.env`(格式:`.env`):
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
mkdir -p ~/.config/zentao-cli
|
|
51
|
+
cat > ~/.config/zentao-cli/.env <<EOF
|
|
52
|
+
endpoint=http://zentao.xxx.com/zentao
|
|
53
|
+
username=xxx
|
|
54
|
+
password=xxx
|
|
55
|
+
EOF
|
|
56
|
+
chmod 600 ~/.config/zentao-cli/.env
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
字段说明:
|
|
60
|
+
|
|
61
|
+
| 字段 | 说明 |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `endpoint` | 禅道地址,含 `http(s)://` 和子路径(如 `/zentao`) |
|
|
64
|
+
| `username` | 登录账号 |
|
|
65
|
+
| `password` | 登录密码 |
|
|
66
|
+
|
|
67
|
+
也可通过 `--env-file PATH` 指定其他路径(不指定则用默认):
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
zentao --env-file /path/to/.env products
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
> `--help` 不会读凭证,可随时运行。
|
|
74
|
+
|
|
75
|
+
## 使用
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
zentao --help
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
输出所有 12 个子命令。语法:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
zentao [-h] [--env-file ENV_FILE]
|
|
85
|
+
{products,projects,executions,stories,tasks,bugs,productplans,
|
|
86
|
+
create-story,create-task,batch-create-tasks,create-productplan,review-story}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 只读命令
|
|
90
|
+
|
|
91
|
+
#### `products` — 查询产品列表
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
zentao products
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
📋 查询禅道产品列表
|
|
99
|
+
|
|
100
|
+
✅ 共 22 条
|
|
101
|
+
|
|
102
|
+
ID | 产品名称 | 状态 | 负责人
|
|
103
|
+
---+------------+----+----
|
|
104
|
+
35 | xxx | |
|
|
105
|
+
34 | xxx | |
|
|
106
|
+
...
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### `projects [--status STATUS]` — 查询项目列表
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
zentao projects # 默认 status=doing
|
|
113
|
+
zentao projects --status all # 全部状态
|
|
114
|
+
zentao projects --status closed
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### `executions --project-id ID` — 查询执行列表
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
zentao executions --project-id 45
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### `stories --project-id ID [--limit N]` — 查询需求列表
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
zentao stories --project-id 45
|
|
127
|
+
zentao stories --project-id 45 --limit 10
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### `tasks --execution-id ID [--limit N]` — 查询任务列表
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
zentao tasks --execution-id 200
|
|
134
|
+
zentao tasks --execution-id 200 --limit 20
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
#### `bugs --product-id ID [--limit N]` — 查询缺陷列表
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
zentao bugs --product-id 35
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### `productplans --product-id ID` — 查询发布计划
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
zentao productplans --product-id 35
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 写操作命令
|
|
150
|
+
|
|
151
|
+
写操作前会打印操作详情并要求输入 `y/n` 确认。CI/脚本中可管道 `echo y |` 自动确认。
|
|
152
|
+
|
|
153
|
+
#### `create-story` — 新建需求
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
zentao create-story \
|
|
157
|
+
--product-id 35 \
|
|
158
|
+
--execution-id 200 \
|
|
159
|
+
--title "xxx流程改造" \
|
|
160
|
+
--plan-id 0 \
|
|
161
|
+
--reviewer alice
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
#### `create-task` — 新建任务
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
zentao create-task \
|
|
168
|
+
--execution-id 200 \
|
|
169
|
+
--story-id 1234 \
|
|
170
|
+
--name "xxx登录页面" \
|
|
171
|
+
--assign-to alice \
|
|
172
|
+
--parent-id 999 # 可选,指定为子任务
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
#### `batch-create-tasks` — 批量创建子任务
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
zentao batch-create-tasks \
|
|
179
|
+
--execution-id 200 \
|
|
180
|
+
--parent-id 999 \
|
|
181
|
+
--tasks "前端开发:8,后端开发:16,联调测试:4"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
`--tasks` 格式:`名称1:工时,名称2:工时`。
|
|
185
|
+
|
|
186
|
+
#### `create-productplan` — 新建发布计划
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
zentao create-productplan --product-id 35 --title "Q3 计划"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
#### `review-story` — 评审需求
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
zentao review-story --story-id 1234
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## 退出码
|
|
199
|
+
|
|
200
|
+
| 码 | 含义 |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `0` | 成功 |
|
|
203
|
+
| `1` | 凭证缺失或读失败 |
|
|
204
|
+
| `2` | argparse 参数错误(如缺 `--project-id`) |
|
|
205
|
+
| 其他 | 工具内部异常 |
|
|
206
|
+
|
|
207
|
+
## 故障排查
|
|
208
|
+
|
|
209
|
+
**`❌ 未找到凭证文件:~/.config/zentao-cli/.env`**
|
|
210
|
+
凭证未创建或权限不够。重新创建并 `chmod 600`。
|
|
211
|
+
|
|
212
|
+
**`认证失败`**
|
|
213
|
+
`endpoint` 是否带子路径(如 `/zentao`)、用户名密码是否对、账号是否被禁用。
|
|
214
|
+
|
|
215
|
+
**CLI 命令列出了 0 条但实际有数据**
|
|
216
|
+
端点路径可能与禅道实际路径不一致。检查 `endpoint` 末尾的子路径。
|
|
217
|
+
|
|
218
|
+
**`--limit 0` 没有限制效果**
|
|
219
|
+
设计如此:`--limit 0` 等同于不传。要限制请传正整数。
|
|
220
|
+
|
|
221
|
+
## 作为 Python 库
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
from zentao_api.client import ZenTaoClient
|
|
225
|
+
|
|
226
|
+
client = ZenTaoClient(
|
|
227
|
+
endpoint="http://zentao.xxx.com/zentao",
|
|
228
|
+
username="xxx",
|
|
229
|
+
password="xxx",
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
# 列出产品
|
|
233
|
+
ok, products = client.get_products()
|
|
234
|
+
print(f"{len(products)} products")
|
|
235
|
+
|
|
236
|
+
# 查项目下的需求
|
|
237
|
+
ok, stories = client.get_stories("45")
|
|
238
|
+
for s in stories:
|
|
239
|
+
print(f"[{s['id']}] {s['title']}")
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## 项目结构
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
ys-zentao-api/
|
|
246
|
+
├── zentao_api/
|
|
247
|
+
│ ├── __init__.py
|
|
248
|
+
│ ├── cli.py # argparse + 命令字典分发
|
|
249
|
+
│ └── client/ # 12 个 mixin 组成的包
|
|
250
|
+
│ ├── _base.py # 鉴权 + old_request + _data helpers
|
|
251
|
+
│ ├── _credentials.py # .env 读取
|
|
252
|
+
│ ├── _legacy.py # 老 API 兜底
|
|
253
|
+
│ ├── products.py # 产品
|
|
254
|
+
│ ├── projects.py # 项目
|
|
255
|
+
│ ├── stories.py # 需求
|
|
256
|
+
│ ├── tasks.py # 任务
|
|
257
|
+
│ ├── bugs.py # 缺陷
|
|
258
|
+
│ ├── qa.py # QA 测试
|
|
259
|
+
│ ├── releases.py # 发布
|
|
260
|
+
│ ├── builds.py # 版本
|
|
261
|
+
│ ├── plans.py # 计划
|
|
262
|
+
│ └── writes.py # 状态变更 + get_my_*
|
|
263
|
+
├── tests/ # 97 个 mock 单元测试
|
|
264
|
+
├── .github/workflows/test.yml
|
|
265
|
+
├── pyproject.toml
|
|
266
|
+
└── README.md
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## 测试
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
pip install -e .
|
|
273
|
+
pip install pytest
|
|
274
|
+
pytest tests/ -v
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
97 个 mock 测试覆盖所有 mixin 的核心方法、CLI 命令分发、`.env` 解析。CI 在 3 OS × 3 Python 版本(3.8/3.10/3.12)矩阵上跑。
|
|
278
|
+
|
|
279
|
+
## 许可证
|
|
280
|
+
|
|
281
|
+
MIT
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "ys-zentao-api"
|
|
7
|
+
version = "0.2.0"
|
|
8
|
+
description = "禅道项目管理 API 客户端与命令行工具"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"requests>=2.28.0",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
[project.scripts]
|
|
16
|
+
zentao = "zentao_api.cli:main"
|
|
17
|
+
|
|
18
|
+
[tool.setuptools.packages.find]
|
|
19
|
+
include = ["zentao_api*"]
|