summaryrefslogtreecommitdiff
path: root/python-a-api-server.spec
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-15 08:48:53 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-15 08:48:53 +0000
commitd55efffedc19704b4377fb29e28a0a0d225ece5b (patch)
tree59dd8e240e0f5ccbd15a37152cc2b887f4a98683 /python-a-api-server.spec
parent7401e48240328639a624ab60d77a4f54319d4c8d (diff)
automatic import of python-a-api-server
Diffstat (limited to 'python-a-api-server.spec')
-rw-r--r--python-a-api-server.spec826
1 files changed, 826 insertions, 0 deletions
diff --git a/python-a-api-server.spec b/python-a-api-server.spec
new file mode 100644
index 0000000..f951529
--- /dev/null
+++ b/python-a-api-server.spec
@@ -0,0 +1,826 @@
+%global _empty_manifest_terminate_build 0
+Name: python-A-Api-Server
+Version: 1.1.5
+Release: 1
+Summary: 自建一个Resful风格的接口自助服务,方便API自动化测试工具的开发与调试!
+License: MIT
+URL: https://github.com/zhuifengshen/a-api-server
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/b8/09/e79f7c02b7ed55f76cbd2f47c6c0c2c40603b2bf0e99db502f703477a2f0/A_Api_Server-1.1.5.tar.gz
+BuildArch: noarch
+
+Requires: python3-flask
+
+%description
+### 2. 具体接口说明
+#### 2.1. 获取令牌
+- 请求路径:/api/get-token
+- 请求方法:post
+- 请求头
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ----------- | -------- | ---------- | ---- |
+| User-Agent | String | 用户代理 | |
+| device_sn | String | 设备序列号 | |
+| os_platform | String | 系统平台 | |
+| app_version | String | 应用版本 | |
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------ | -------- | -------- | ------------------------ |
+| sign | String | 加密签名 | 根据请求头和密钥加密生成 |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---------- |
+| success | Boolean | 是否成功 | |
+| token | String | 访问令牌 | 长度 16 位 |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'token': "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aW"
+}
+```
+- 失败返回
+```
+状态码:403
+响应体:
+{
+ 'success': false,
+ 'msg': "Authorization failed!"
+}
+```
+- 签名生成算法
+```python
+def get_sign(*args):
+ SECRECT_KEY = 'YouMi'
+ content = ''.join(args).encode('ascii')
+ sign_key = SECRECT_KEY.encode('ascii')
+ sign = hmac.new(sign_key, content, hashlib.sha1).hexdigest()
+ return sign
+sign = get_sign(user_agent, device_sn, os_platform, app_version)
+```
+#### 2.2. 新建用户
+- 请求路径:/api/users/:id
+- 请求方法:post
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| msg | String | 说明信息 | |
+- 成功返回
+```
+状态码:201
+响应体:
+{
+ 'success': true,
+ 'msg': "user created successfully."
+}
+```
+- 失败返回
+```
+状态码:422
+响应体:
+{
+ 'success': false,
+ 'msg': "user already existed."
+}
+```
+#### 2.3. 根据 ID 查询用户信息
+- 请求路径:/api/users/:id
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.4. 更新用户信息
+- 请求路径:/api/users/:id
+- 请求方法:put
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| data | Dict | 用户信息 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.5. 删除用户信息
+- 请求路径:/api/users/:id
+- 请求方法:delete
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------ | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| data | Dict | 用户信息 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.6. 用户数据列表
+- 请求路径:/api/users
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | ------------ | ---- |
+| success | Boolean | 是否成功 | |
+| count | Int | 用户总数 | |
+| items | Array | 用户数据集合 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'count': 3,
+ 'items': [
+ {'name': 'admin1', 'password': '123456'},
+ {'name': 'admin2', 'password': '123456'},
+ {'name': 'admin3', 'password': '123456'}
+ ]
+}
+```
+#### 2.7. 清空用户数据
+- 请求路径:/api/reset-all
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true
+}
+```
+## 三、自动化发布:一键打 Tag 并上传至 PYPI
+每次在 ** about **.py 更新版本号后,运行以下命令,实现自动化更新打包上传至 [PYPI](https://pypi.org/) ,同时根据其版本号自动打 Tag 并推送到仓库:
+```
+python3 setup.py pypi
+```
+注意:上传前需提前在 twine 工具中配置自己的 Pypi 的账号信息!!!
+### 四、CHANGELOG
+```
+v1.0.0
+1、实现对用户账号进行增删改查功能的 API 服务,包含了接口的签名校验机制;
+2、完善了 API 使用文档;
+3、添加了自动化打包脚本;
+```
+## 五、致谢
+**A-Api-Server** 工具的产生和打包,主要参考了开源项目 [HttpRunner](https://github.com/httprunner/httprunner),受益多多,感谢!
+## LICENSE
+```
+MIT License
+Copyright (c) 2019 Devin https://zhangchuzhao.site
+Copyright (c) 2017 Toby Qin
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
+
+%package -n python3-A-Api-Server
+Summary: 自建一个Resful风格的接口自助服务,方便API自动化测试工具的开发与调试!
+Provides: python-A-Api-Server
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-A-Api-Server
+### 2. 具体接口说明
+#### 2.1. 获取令牌
+- 请求路径:/api/get-token
+- 请求方法:post
+- 请求头
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ----------- | -------- | ---------- | ---- |
+| User-Agent | String | 用户代理 | |
+| device_sn | String | 设备序列号 | |
+| os_platform | String | 系统平台 | |
+| app_version | String | 应用版本 | |
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------ | -------- | -------- | ------------------------ |
+| sign | String | 加密签名 | 根据请求头和密钥加密生成 |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---------- |
+| success | Boolean | 是否成功 | |
+| token | String | 访问令牌 | 长度 16 位 |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'token': "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aW"
+}
+```
+- 失败返回
+```
+状态码:403
+响应体:
+{
+ 'success': false,
+ 'msg': "Authorization failed!"
+}
+```
+- 签名生成算法
+```python
+def get_sign(*args):
+ SECRECT_KEY = 'YouMi'
+ content = ''.join(args).encode('ascii')
+ sign_key = SECRECT_KEY.encode('ascii')
+ sign = hmac.new(sign_key, content, hashlib.sha1).hexdigest()
+ return sign
+sign = get_sign(user_agent, device_sn, os_platform, app_version)
+```
+#### 2.2. 新建用户
+- 请求路径:/api/users/:id
+- 请求方法:post
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| msg | String | 说明信息 | |
+- 成功返回
+```
+状态码:201
+响应体:
+{
+ 'success': true,
+ 'msg': "user created successfully."
+}
+```
+- 失败返回
+```
+状态码:422
+响应体:
+{
+ 'success': false,
+ 'msg': "user already existed."
+}
+```
+#### 2.3. 根据 ID 查询用户信息
+- 请求路径:/api/users/:id
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.4. 更新用户信息
+- 请求路径:/api/users/:id
+- 请求方法:put
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| data | Dict | 用户信息 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.5. 删除用户信息
+- 请求路径:/api/users/:id
+- 请求方法:delete
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------ | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| data | Dict | 用户信息 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.6. 用户数据列表
+- 请求路径:/api/users
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | ------------ | ---- |
+| success | Boolean | 是否成功 | |
+| count | Int | 用户总数 | |
+| items | Array | 用户数据集合 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'count': 3,
+ 'items': [
+ {'name': 'admin1', 'password': '123456'},
+ {'name': 'admin2', 'password': '123456'},
+ {'name': 'admin3', 'password': '123456'}
+ ]
+}
+```
+#### 2.7. 清空用户数据
+- 请求路径:/api/reset-all
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true
+}
+```
+## 三、自动化发布:一键打 Tag 并上传至 PYPI
+每次在 ** about **.py 更新版本号后,运行以下命令,实现自动化更新打包上传至 [PYPI](https://pypi.org/) ,同时根据其版本号自动打 Tag 并推送到仓库:
+```
+python3 setup.py pypi
+```
+注意:上传前需提前在 twine 工具中配置自己的 Pypi 的账号信息!!!
+### 四、CHANGELOG
+```
+v1.0.0
+1、实现对用户账号进行增删改查功能的 API 服务,包含了接口的签名校验机制;
+2、完善了 API 使用文档;
+3、添加了自动化打包脚本;
+```
+## 五、致谢
+**A-Api-Server** 工具的产生和打包,主要参考了开源项目 [HttpRunner](https://github.com/httprunner/httprunner),受益多多,感谢!
+## LICENSE
+```
+MIT License
+Copyright (c) 2019 Devin https://zhangchuzhao.site
+Copyright (c) 2017 Toby Qin
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
+
+%package help
+Summary: Development documents and examples for A-Api-Server
+Provides: python3-A-Api-Server-doc
+%description help
+### 2. 具体接口说明
+#### 2.1. 获取令牌
+- 请求路径:/api/get-token
+- 请求方法:post
+- 请求头
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ----------- | -------- | ---------- | ---- |
+| User-Agent | String | 用户代理 | |
+| device_sn | String | 设备序列号 | |
+| os_platform | String | 系统平台 | |
+| app_version | String | 应用版本 | |
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------ | -------- | -------- | ------------------------ |
+| sign | String | 加密签名 | 根据请求头和密钥加密生成 |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---------- |
+| success | Boolean | 是否成功 | |
+| token | String | 访问令牌 | 长度 16 位 |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'token': "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aW"
+}
+```
+- 失败返回
+```
+状态码:403
+响应体:
+{
+ 'success': false,
+ 'msg': "Authorization failed!"
+}
+```
+- 签名生成算法
+```python
+def get_sign(*args):
+ SECRECT_KEY = 'YouMi'
+ content = ''.join(args).encode('ascii')
+ sign_key = SECRECT_KEY.encode('ascii')
+ sign = hmac.new(sign_key, content, hashlib.sha1).hexdigest()
+ return sign
+sign = get_sign(user_agent, device_sn, os_platform, app_version)
+```
+#### 2.2. 新建用户
+- 请求路径:/api/users/:id
+- 请求方法:post
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| msg | String | 说明信息 | |
+- 成功返回
+```
+状态码:201
+响应体:
+{
+ 'success': true,
+ 'msg': "user created successfully."
+}
+```
+- 失败返回
+```
+状态码:422
+响应体:
+{
+ 'success': false,
+ 'msg': "user already existed."
+}
+```
+#### 2.3. 根据 ID 查询用户信息
+- 请求路径:/api/users/:id
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.4. 更新用户信息
+- 请求路径:/api/users/:id
+- 请求方法:put
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| -------- | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+| name | String | 用户名 | |
+| password | String | 密码 | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| data | Dict | 用户信息 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.5. 删除用户信息
+- 请求路径:/api/users/:id
+- 请求方法:delete
+- 请求参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------ | -------- | -------- | ---- |
+| id | Int | 用户 ID | |
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+| data | Dict | 用户信息 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'data': {
+ 'name': 'admin',
+ 'password': '123456'
+ }
+}
+```
+- 失败返回
+```
+状态码:404
+响应体:
+{
+ 'success': fasle,
+ 'data': {}
+}
+```
+#### 2.6. 用户数据列表
+- 请求路径:/api/users
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | ------------ | ---- |
+| success | Boolean | 是否成功 | |
+| count | Int | 用户总数 | |
+| items | Array | 用户数据集合 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true,
+ 'count': 3,
+ 'items': [
+ {'name': 'admin1', 'password': '123456'},
+ {'name': 'admin2', 'password': '123456'},
+ {'name': 'admin3', 'password': '123456'}
+ ]
+}
+```
+#### 2.7. 清空用户数据
+- 请求路径:/api/reset-all
+- 请求方法:get
+- 响应参数
+| 参数名 | 参数类型 | 参数说明 | 备注 |
+| ------- | -------- | -------- | ---- |
+| success | Boolean | 是否成功 | |
+- 成功返回
+```
+状态码:200
+响应体:
+{
+ 'success': true
+}
+```
+## 三、自动化发布:一键打 Tag 并上传至 PYPI
+每次在 ** about **.py 更新版本号后,运行以下命令,实现自动化更新打包上传至 [PYPI](https://pypi.org/) ,同时根据其版本号自动打 Tag 并推送到仓库:
+```
+python3 setup.py pypi
+```
+注意:上传前需提前在 twine 工具中配置自己的 Pypi 的账号信息!!!
+### 四、CHANGELOG
+```
+v1.0.0
+1、实现对用户账号进行增删改查功能的 API 服务,包含了接口的签名校验机制;
+2、完善了 API 使用文档;
+3、添加了自动化打包脚本;
+```
+## 五、致谢
+**A-Api-Server** 工具的产生和打包,主要参考了开源项目 [HttpRunner](https://github.com/httprunner/httprunner),受益多多,感谢!
+## LICENSE
+```
+MIT License
+Copyright (c) 2019 Devin https://zhangchuzhao.site
+Copyright (c) 2017 Toby Qin
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
+
+%prep
+%autosetup -n A-Api-Server-1.1.5
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-A-Api-Server -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Mon May 15 2023 Python_Bot <Python_Bot@openeuler.org> - 1.1.5-1
+- Package Spec generated