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.
Files changed (34) hide show
  1. ys_zentao_api-0.2.0/PKG-INFO +289 -0
  2. ys_zentao_api-0.2.0/README.md +281 -0
  3. ys_zentao_api-0.2.0/pyproject.toml +19 -0
  4. ys_zentao_api-0.2.0/setup.cfg +4 -0
  5. ys_zentao_api-0.2.0/tests/test_p0_methods.py +184 -0
  6. ys_zentao_api-0.2.0/tests/test_p1_package.py +112 -0
  7. ys_zentao_api-0.2.0/tests/test_p2_helpers.py +206 -0
  8. ys_zentao_api-0.2.0/tests/test_p3_cli.py +168 -0
  9. ys_zentao_api-0.2.0/tests/test_p4_create_story.py +80 -0
  10. ys_zentao_api-0.2.0/tests/test_p5_data_refactor.py +140 -0
  11. ys_zentao_api-0.2.0/tests/test_p6_shape_fix.py +136 -0
  12. ys_zentao_api-0.2.0/tests/test_p7_env_config.py +228 -0
  13. ys_zentao_api-0.2.0/ys_zentao_api.egg-info/PKG-INFO +289 -0
  14. ys_zentao_api-0.2.0/ys_zentao_api.egg-info/SOURCES.txt +32 -0
  15. ys_zentao_api-0.2.0/ys_zentao_api.egg-info/dependency_links.txt +1 -0
  16. ys_zentao_api-0.2.0/ys_zentao_api.egg-info/entry_points.txt +2 -0
  17. ys_zentao_api-0.2.0/ys_zentao_api.egg-info/requires.txt +1 -0
  18. ys_zentao_api-0.2.0/ys_zentao_api.egg-info/top_level.txt +1 -0
  19. ys_zentao_api-0.2.0/zentao_api/__init__.py +3 -0
  20. ys_zentao_api-0.2.0/zentao_api/cli.py +373 -0
  21. ys_zentao_api-0.2.0/zentao_api/client/__init__.py +23 -0
  22. ys_zentao_api-0.2.0/zentao_api/client/_credentials.py +56 -0
  23. ys_zentao_api-0.2.0/zentao_api/client/_legacy.py +108 -0
  24. ys_zentao_api-0.2.0/zentao_api/client/base.py +297 -0
  25. ys_zentao_api-0.2.0/zentao_api/client/bugs.py +476 -0
  26. ys_zentao_api-0.2.0/zentao_api/client/builds.py +165 -0
  27. ys_zentao_api-0.2.0/zentao_api/client/plans.py +150 -0
  28. ys_zentao_api-0.2.0/zentao_api/client/products.py +193 -0
  29. ys_zentao_api-0.2.0/zentao_api/client/projects.py +270 -0
  30. ys_zentao_api-0.2.0/zentao_api/client/qa.py +541 -0
  31. ys_zentao_api-0.2.0/zentao_api/client/releases.py +199 -0
  32. ys_zentao_api-0.2.0/zentao_api/client/stories.py +264 -0
  33. ys_zentao_api-0.2.0/zentao_api/client/tasks.py +117 -0
  34. 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*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+