Skip to main content

企业级 API 自动化测试引擎,使用 YAML 声明式语法,支持 HTTP/HTTPS、数据库操作、数据驱动测试、并发执行和 WebSocket 实时推送。

Project description

Sisyphus API Engine

Sisyphus Python License Version Status

企业级 API 自动化测试引擎

基于 YAML 的声明式测试框架,支持复杂的 API 测试场景

功能特性快速开始文档示例


📖 目录


✨ 功能特性

🎯 核心能力

  • YAML 声明式测试 - 使用简洁的 YAML 语法定义测试用例
  • 多环境管理 - 支持多环境配置(dev/test/prod),一键切换
  • 变量系统 - 强大的变量管理(全局变量、环境变量、动态提取)
  • 模板渲染 - 基于 Jinja2 的模板引擎,支持变量引用和计算
  • 🆓 变量嵌套引用(v1.0.2+) - 支持变量间的相互引用,实现配置复用
  • 🆓 微秒时间戳(v1.0.2+) - 支持微秒级精度时间戳,确保测试数据唯一性

🔌 HTTP 测试

  • 全方法支持 - GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS
  • 请求定制 - 自定义 headers、params、body、cookies
  • 响应验证 - 状态码、响应体、响应头验证
  • 变量提取 - JSONPath(支持过滤表达式、通配符、数组索引等)、正则表达式、Header、Cookie 提取

🗄️ 数据库集成

  • 多数据库支持 - MySQL、PostgreSQL、SQLite
  • 多种操作 - 查询、执行、批量操作、脚本执行
  • 参数化查询 - 防止 SQL 注入的预编译语句

🔧 高级特性

  • 重试机制 - 支持固定、指数退避、线性等重试策略
  • 步骤控制 - 条件执行(skip_if/only_if)、依赖管理(depends_on)
  • 流程控制 - 等待(固定延迟和条件等待)、For 循环、While 循环
  • 数据驱动 - 支持 CSV、JSON、数据库作为数据源
  • 钩子函数 - 全局和步骤级别的 setup/teardown
  • 并发测试 - 支持多线程并发执行和性能测试
  • 脚本执行 - 支持 Python 脚本执行(安全沙箱)
  • Mock 服务 - 内置 Mock 服务器,支持接口模拟

📊 结果输出

  • 多种格式 - JSON、CSV、HTML(支持中英文)、JUnit XML、Allure 报告
  • 性能指标 - DNS、TCP、TLS、服务器处理时间等详细性能数据
  • 错误分类 - 智能错误分类和诊断信息
  • 实时推送 - WebSocket 实时推送测试进度和结果
  • 变量追踪 - 调试模式下追踪变量变化
  • 🆕 彩色输出(v1.0.3+) - 支持 ANSI 颜色和 Emoji 图标,中英文双语界面
  • 🆕 增强型验证器(v2.0.0+) - YAML 语法检查、未定义关键字检测、美观中文提示

🌟 v2.0.5 新功能亮点

  • 🆕 项目级全局配置文件(v2.0.5+) - 支持项目根目录的 .sisyphus/config.yaml 全局配置

    • 配置自动向上搜索,支持子目录中的测试用例
    • 三级配置优先级:测试用例 config > 全局 config > 默认值
    • 深度合并策略,支持部分覆盖
    • 完全向后兼容现有测试用例
  • 🆕 版本化配置支持(v2.0.5+) - 支持多版本 API 管理

    • 嵌套 profiles 结构(如 v1.dev, v2.prod
    • 自动展平嵌套结构为可访问的路径
    • 模板中可使用 ${config.profiles.v2.dev.base_url} 访问

使用示例:

# .sisyphus/config.yaml (项目根目录)
profiles:
  v1:  # API v1 版本
    dev:
      base_url: "https://v1.api.dev.com"
      variables:
        api_version: "v1"
    prod:
      base_url: "https://v1.api.prod.com"
  v2:  # API v2 版本
    dev:
      base_url: "https://v2.api.dev.com"
      variables:
        api_version: "v2"

active_profile: "v2.dev"

variables:
  common_headers:
    User-Agent: "Sisyphus/2.0"

优势

  • ✅ 配置集中管理,所有环境配置在一个文件中
  • ✅ 一键切换环境,无需修改用例
  • ✅ 配置复用,多个用例共享同一配置
  • ✅ 支持多版本 API 并行测试

🌟 v2.0.0 新功能亮点

  • 🆕 变量嵌套引用增强 - 支持在顶层 variables 中嵌套引用 config.profiles.*
  • 🆕 异步轮询机制 - 新增 poll 步骤类型,支持等待异步操作完成
  • 🆕 多种轮询策略 - 支持 fixed/exponential/linear 退避策略
  • 🆕 超时处理 - 支持 fail/continue 两种超时行为
  • 🆕 提取器默认值(v2.0.1+) - 提取器支持默认值,字段不存在时使用默认值
  • 🆕 自定义错误消息(v2.0.1+) - 验证失败时显示自定义错误消息,提升测试报告可读性
  • 彩色命令行输出 - ANSI 颜色 + Emoji 图标 + 中英文双语
  • JSONPath 过滤表达式 - 支持 $.users[?(@.role == 'admin')] 语法
  • 微秒时间戳 - now_us() 返回 20 位唯一时间戳
  • 数组通配符 - $.items[*].name 获取所有元素的字段

🚀 安装指南

环境要求

  • Python 3.12 或更高版本(推荐使用 Python 3.14)
  • uv 包管理器(推荐)或 pip

安装步骤

方法一:使用 uv(推荐)

# 克隆仓库
git clone https://github.com/koco-co/Sisyphus-api-engine.git
cd Sisyphus-api-engine

# 创建虚拟环境(Python 3.14)
uv venv -p 3.14 .venv

# 激活虚拟环境
source .venv/bin/activate  # macOS/Linux
# .venv\Scripts\activate   # Windows

# 安装项目(开发模式)
uv pip install -e .

# 或安装包含开发依赖
uv pip install -e ".[dev]"

方法二:使用 pip

# 克隆仓库
git clone https://github.com/koco-co/Sisyphus-api-engine.git
cd Sisyphus-api-engine

# 安装依赖
pip install -e .

# 或使用 pip 直接安装
pip install Sisyphus-api-engine

验证安装

# 查看帮助
sisyphus --help

# 验证 YAML 文件语法(新增关键字检测、!include 支持、简写语法)
sisyphus-validate examples/24_最佳实践.yaml

# 验证多个文件
sisyphus-validate test1.yaml test2.yaml test3.yaml

# 验证目录中的所有文件
sisyphus-validate tests/

# 静默模式(仅显示汇总)
sisyphus-validate examples/ -q

# 运行示例测试
sisyphus --cases examples/24_最佳实践.yaml

🎬 快速开始

1. 创建第一个测试用例

创建 my_first_test.yaml

name: "我的第一个测试"
description: "测试 HTTPBIN API"

config:
  profiles:
    prod:
      base_url: "https://httpbin.org"

steps:
  - 测试GET请求:
      type: request
      url: "${config.profiles.prod.base_url}/get"
      method: GET
      validations:
        - type: eq
          path: "$.url"
          expect: "https://httpbin.org/get"
          description: "验证URL正确"

2. 运行测试

# 基本运行(单个文件,中文彩色输出)
sisyphus --cases my_first_test.yaml

# 英文界面
sisyphus --lang en --cases my_first_test.yaml

# 禁用颜色(适合脚本)
sisyphus --no-color --cases my_first_test.yaml

# 禁用 Emoji
sisyphus --no-emoji --cases my_first_test.yaml

# 详细输出(显示每个步骤的详细信息)
sisyphus --cases my_first_test.yaml -v

# 运行多个测试文件
sisyphus --cases test1.yaml test2.yaml test3.yaml

# 运行目录中的所有测试
sisyphus --cases tests/

# 混合文件和目录
sisyphus --cases smoke_test.yaml tests/ integration/

# 保存结果到 JSON
sisyphus --cases my_first_test.yaml -o result.json

# 导出为 CSV
sisyphus --cases my_first_test.yaml --format csv -o result.csv

# 导出为 HTML(中文报告)
sisyphus --cases my_first_test.yaml --format html --report-lang zh -o report.html

# 导出为 HTML(英文报告)
sisyphus --cases my_first_test.yaml --format html --report-lang en -o report.html

# 生成 Allure 报告
sisyphus --cases my_first_test.yaml --allure

# 查看 Allure 报告(会自动打开浏览器)
allure serve allure-results

# 或者生成静态 HTML 报告
allure generate allure-results --clean -o allure-report
allure open allure-report

# 启用 WebSocket 实时推送
sisyphus --cases my_first_test.yaml --ws-server

3. 查看结果

测试执行后,你将看到:

Executing: 我的第一个测试
Description: 测试 HTTPBIN API
Steps: 1

============================================================
Status: PASSED
Duration: 0.85s
Statistics:
  Total:   1
  Passed:  1 ✓
  Failed:  0 ✗
  Skipped: 0 ⊘
Pass Rate: 100.0%
============================================================

🎓 核心概念

测试用例结构

name: "测试用例名称"          # 必填:用例名称
description: "测试描述"       # 可选:用例描述

config:                       # 可选:全局配置
  profiles: {}               # 环境配置
  variables: {}              # 全局变量
  timeout: 30                # 超时时间

steps: []                     # 必填:测试步骤列表

步骤类型

类型 说明 适用场景
request HTTP 请求 API 测试
database 数据库操作 数据验证
wait 等待/延迟 异步场景
loop 循环控制 批量操作
concurrent 并发执行 性能测试
script 脚本执行 自定义逻辑

变量作用域

全局变量 (config.variables)
    ↓
环境变量 (config.profiles.{profile}.variables)
    ↓
提取变量 (extractors)  ← 优先级最高

📚 示例说明

项目提供了从入门到精通的完整示例,位于 examples/ 目录:

⭐ 入门级 (1-7)

⭐⭐ 中级 (8-14)

⭐⭐⭐ 进阶级 (15-18)

⭐⭐⭐⭐ 高级 (19-22)

⭐⭐⭐⭐⭐ 专家级 (23-26)


🌍 环境切换与配置管理

为什么需要配置管理?

当项目有大量测试用例时,如果每个用例都单独配置环境信息,会导致:

  • ❌ 配置分散,难以维护
  • ❌ 修改环境需要改动多个文件
  • ❌ 容易出现配置不一致的问题

解决方案:全局配置 + 环境切换

方案一:使用全局配置文件

创建 config/global_config.yaml:

# 全局配置文件
profiles:
  dev:
    base_url: "http://dev-api.example.com"
    variables:
      api_key: "dev-key-12345"
  staging:
    base_url: "http://staging-api.example.com"
    variables:
      api_key: "staging-key-67890"
  prod:
    base_url: "https://api.example.com"
    variables:
      api_key: "prod-key-abcde"

active_profile: "dev"

在测试用例中引入:

name: "我的测试"
config: !include ../config/global_config.yaml

steps:
  - 测试请求:
      type: request
      url: "${config.profiles.${active_profile}.base_url}/api/users"
      headers:
        X-API-Key: "${config.profiles.${active_profile}.variables.api_key}"

方案二:使用 !include 分层配置

创建分层配置文件:

# config/environments.yaml (仅环境配置)
profiles:
  dev: {base_url: "http://dev.example.com"}
  prod: {base_url: "https://api.example.com"}
active_profile: "dev"

# 测试用例文件
config: !include config/environments.yaml

方案三(推荐):使用 .sisyphus/config.yaml 全局配置 (v2.0.5+)

在项目根目录创建 .sisyphus/config.yaml:

# .sisyphus/config.yaml
profiles:
  dev:
    base_url: "http://dev.example.com"
    variables:
      api_key: "dev-key-12345"
  prod:
    base_url: "https://api.example.com"
    variables:
      api_key: "prod-key-abcde"

active_profile: "dev"

测试用例中无需配置(自动使用全局配置):

name: "我的测试"
# 无需 config 部分,自动使用 .sisyphus/config.yaml

steps:
  - name: "测试请求"
    type: request
    url: "${config.profiles.dev.base_url}/api/users"

如需覆盖全局配置,在测试用例中添加 config 部分:

name: "我的测试"
config:
  profiles:
    dev:
      base_url: "http://override.example.com"  # 覆盖全局配置

配置优先级(从高到低):

  1. 测试用例中的 config
  2. .sisyphus/config.yaml 全局配置
  3. 系统默认值

一键切换环境:

# 开发环境
sisyphus --cases test.yaml --profile dev

# 预发布环境
sisyphus --cases test.yaml --profile staging

# 生产环境
sisyphus --cases test.yaml --profile prod

优势

配置集中管理 - 所有环境配置在一个文件中 ✅ 一键切换环境 - 通过 --profile 参数,无需修改用例 ✅ 配置复用 - 多个用例共享同一配置,修改一处全部生效 ✅ 分层配置 - 支持全局配置 + 用例特定配置 ✅ 敏感信息保护 - 配合环境变量使用,避免硬编码敏感信息

示例参考

📁 目录结构

查看完整示例列表和运行方式

运行 YAML 测试用例

# 验证所有 YAML 示例
for file in examples/*.yaml; do
    sisyphus-validate "$file"
done

# 运行所有 YAML 示例
for file in examples/*.yaml; do
    sisyphus --cases "$file"
done

学习路径

  1. 01_HTTP请求方法.yaml 开始理解基本结构
  2. 学习 02_请求参数配置.yaml 掌握请求定制
  3. 通过 03_变量基础语法.yaml 学习变量系统
  4. 实践 04_内置模板函数.yaml 掌握模板函数
  5. 进阶 05_基础断言验证.yaml 理解验证机制
  6. 掌握 06_环境配置切换.yaml 理解多环境管理
  7. 精通 07_使用全局配置.yaml 掌握配置复用
  8. 学习 08_输出格式配置.yaml 掌握结果导出
  9. 实践 09_变量提取器.yaml 学习数据提取
  10. 进阶 10_高级断言验证.yaml 掌握复杂验证
  11. 学习 11_JSONPath函数演示.yaml 掌握 JSONPath 增强函数
  12. 实践 12_步骤控制.yaml 理解流程控制
  13. 学习 13_重试机制.yaml 掌握重试策略
  14. 实践 14_等待机制.yaml 掌握异步处理
  15. 学习 15_循环控制.yaml 掌握循环逻辑
  16. 实践 16_并发执行.yaml 理解并发测试
  17. 学习 17_数据驱动测试.yaml 掌握数据驱动
  18. 实践 18_脚本执行.yaml 理解脚本扩展
  19. 通过 19_完整流程测试.yaml 综合运用所学
  20. 学习 20_Mock服务器测试.yaml 理解 Mock 服务
  21. 实践 21_WebSocket实时推送.yaml 掌握实时推送
  22. 学习 22_性能测试.yaml 理解性能测试
  23. 实践 23_数据库操作.yaml 掌握数据库集成
  24. 最后学习 24_最佳实践.yaml 掌握生产级实践

⚙️ 配置参考

环境配置

config:
  profiles:
    dev:
      base_url: "http://dev-api.example.com"
      variables:
        api_key: "dev_key"
    prod:
      base_url: "https://api.example.com"
      variables:
        api_key: "prod_key"

  active_profile: "dev"  # 当前激活环境

重试策略

steps:
  - name: "带重试的请求"
    retry_policy:
      max_attempts: 3           # 最大重试次数
      strategy: exponential      # 策略: fixed/exponential/linear
      base_delay: 1.0           # 基础延迟(秒)
      max_delay: 10.0           # 最大延迟(秒)
      backoff_multiplier: 2.0   # 退避倍数
      jitter: true              # 是否添加随机抖动

数据驱动测试

config:
  data_source:
    type: csv
    file_path: "数据驱动测试.csv"
    delimiter: ","
    has_header: true
  data_iterations: true
  variable_prefix: "user_"

验证器类型

类型 说明 示例
eq 等于 - eq: ["$.status", 200]
ne 不等于 - ne: ["$.error", null]
contains 包含 - contains: ["$.message", "success"]
regex 正则匹配 - regex: ["$.email", "^[\\w\\.]+@"]
type 类型检查 - type: ["$.count", "number"]

更多验证器请参考输入协议规范

🆕 提取器默认值(v2.0.1+)

提取器现在支持 default 参数,当提取的字段不存在时,使用指定的默认值:

extractors:
  # 字段存在时提取实际值
  - type: jsonpath
    name: user_id
    path: "$.user.id"
    default: "anonymous"  # 字段不存在时使用默认值

  # 正则表达式匹配失败时使用默认值
  - type: regex
    name: order_id
    path: "$.response"
    pattern: "Order ID: (\\d+)"
    default: "N/A"

  # Header 不存在时使用默认值
  - type: header
    name: auth_token
    path: "Authorization"
    default: "Bearer default_token"

适用场景

  • 可选字段提取(如用户昵称、头像等)
  • 向后兼容测试(新版本新增字段)
  • 降级处理(字段不存在时使用默认逻辑)

🆕 自定义错误消息(v2.0.1+)

验证器现在支持 error_message 参数,验证失败时显示自定义错误消息:

validations:
  # 简单验证 - 自定义错误消息
  - type: eq
    path: "$.status"
    expect: "success"
    error_message: "❌ 状态错误: 响应状态必须为'success',请检查后端服务"
    description: "验证状态为success"

  # 数值验证 - 带详细说明
  - type: between
    path: "$.age"
    expect: [18, 65]
    error_message: "⚠️ 年龄限制: 用户年龄必须在18-65岁之间,当前值不符合要求"
    description: "验证年龄范围"

  # 逻辑运算符 - 统一错误消息
  - type: and
    error_message: "❌ 业务验证失败: 状态必须为success且码为1"
    sub_validations:
      - type: eq
        path: "$.status"
        expect: "success"
      - type: eq
        path: "$.code"
        expect: 1

优势

  • ✅ 更清晰的错误提示,快速定位问题
  • ✅ 支持多语言错误消息(中文/英文)
  • ✅ 提升测试报告的可读性
  • ✅ 便于向开发团队反馈具体问题

JSONPath 增强函数

Sisyphus API Engine 支持 20+ 种 JSONPath 增强函数,包括:

  • 数组操作: length(), first(), last(), reverse(), sort(), unique(), flatten()
  • 数值计算: sum(), avg(), min(), max()
  • 字符串处理: upper(), lower(), trim(), split(), join()
  • 检查函数: contains(), starts_with(), ends_with(), matches(), is_empty(), is_null()
  • 对象操作: keys(), values()

函数链式调用示例

validations:
  # 链式调用:去重后计数
  - type: eq
    path: "$.data.unique().length()"
    expect: 5

  # 排序后取最小值
  - type: eq
    path: "$.numbers.sort().first()"
    expect: 1

详细文档请参考:


📖 文档

核心文档


🔧 开发指南

项目结构

Sisyphus-api-engine/
├── apirun/
│   ├── core/           # 核心数据模型
│   ├── parser/         # YAML 解析器
│   ├── executor/       # 测试执行器
│   ├── validation/     # 断言验证引擎
│   ├── extractor/      # 变量提取器
│   ├── data_driven/    # 数据驱动测试
│   ├── result/         # 结果收集器
│   ├── mock/           # Mock 服务器
│   ├── websocket/      # WebSocket 实时推送
│   └── utils/          # 工具函数
├── examples/           # 示例用例
├── docs/               # 项目文档
└── tests/              # 测试文件

核心架构

输入 YAML
    ↓
V2YamlParser → TestCase
    ↓
TestCaseExecutor
    ↓
VariableManager (变量管理)
    ↓
StepExecutor (API/Database/Wait/Loop)
    ↓
ValidationEngine (验证)
    ↓
ResultCollector (结果收集)
    ↓
输出 JSON

扩展指南

添加自定义验证器

apirun/validation/comparators.py 中添加:

def custom_comparator(actual: Any, expected: Any) -> bool:
    """自定义比较器"""
    # 实现比较逻辑
    return actual == expected

# 注册比较器
COMPARATORS = {
    # ... 其他比较器
    "custom": custom_comparator,
}
添加新的步骤类型
  1. 创建执行器类:
# apirun/executor/my_executor.py
from apirun.executor.step_executor import StepExecutor

class MyExecutor(StepExecutor):
    def _execute_step(self, rendered_step):
        # 实现执行逻辑
        pass
  1. TestCaseExecutor 中注册:
if step.type == "my_type":
    executor = MyExecutor(...)

🤝 贡献指南

欢迎贡献代码、报告问题或提出建议!

贡献流程

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 提交 Pull Request

代码规范

项目使用现代化 Python 开发工具链:

🛠️ 开发工具

  • uv - 极速包管理器(替代 pip)
  • Ruff - 代码检查和格式化(替代 black/isort/flake8)
  • Pyright - 静态类型检查(替代 mypy)
  • pre-commit - Git 钩子自动化
  • rich - 终端美化输出

工具安装方式

  • 项目级:通过 uv pip install -e ".[dev]" 安装(推荐用于贡献者)
  • 全局级:通过 uv tool install 安装(推荐用于多项目开发者) 两种方式都可以,选择适合你的方式即可。

📝 开发工作流

# 1. 激活虚拟环境
source .venv/bin/activate

# 2. 安装项目依赖(包含开发工具)
uv pip install -e ".[dev]"

# 3. 安装 pre-commit 钩子
pre-commit install

# 4. 代码格式化
ruff format .

# 5. 代码检查并自动修复
ruff check . --fix

# 6. 类型检查
pyright .

# 7. 运行测试
pytest

# 8. 提交代码(pre-commit 自动运行检查)
git add .
git commit -m "feat: add new feature"

🔍 代码质量要求

  • 遵循 Google Python Style Guide
  • 使用类型注解(Pyright strict mode)
  • 单元测试覆盖率 ≥ 80%
  • 所有注释使用中文
  • 通过 pre-commit 钩子检查

📋 Ruff 配置

[tool.ruff]
target-version = "py312"
line-length = 88

[tool.ruff.lint]
select = ["E", "W", "F", "I", "UP", "C4", "TID", "ARG", "PTH"]

🔬 类型检查

项目使用 Pyright strict mode:

{
  "typeCheckingMode": "strict",
  "pythonVersion": "3.12"
}

❓ 常见问题

如何切换测试环境?

使用 --profile 参数:

sisyphus --cases test.yaml --profile staging

或在 YAML 中设置:

config:
  active_profile: "staging"
如何调试失败的测试?

使用 -v 参数查看详细输出:

sisyphus --cases test.yaml -v

这将显示每个步骤的详细信息,包括请求、响应、验证结果等。

如何处理动态数据?

使用 Jinja2 模板语法:

steps:
  - name: "创建用户"
    body:
      username: "user_${now().strftime('%Y%m%d%H%M%S')}"
      email: "${random_string(10)}@example.com"
数据驱动测试需要外部文件吗?

不需要,可以内联数据:

config:
  data_source:
    - {username: "user1", age: 25}
    - {username: "user2", age: 30}
  data_iterations: true

💡 查看完整更新日志:详见 CHANGELOG.md 了解所有版本详细变更记录


📄 许可证

本项目采用 MIT License 开源协议。


👥 作者

koco-co


🙏 致谢


📮 联系我们


如果这个项目对你有帮助,请给个 ⭐️ Star!

Made with ❤️ by koco-co

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sisyphus_api_engine-2.1.0.tar.gz (296.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sisyphus_api_engine-2.1.0-py3-none-any.whl (254.1 kB view details)

Uploaded Python 3

File details

Details for the file sisyphus_api_engine-2.1.0.tar.gz.

File metadata

  • Download URL: sisyphus_api_engine-2.1.0.tar.gz
  • Upload date:
  • Size: 296.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for sisyphus_api_engine-2.1.0.tar.gz
Algorithm Hash digest
SHA256 6ebef5a6e17231fc1a6f0056f1d43d948b53b9cf62acb4ae9d5f3c6dc6b9d921
MD5 8c4066acc4f46594055b40ce9a672049
BLAKE2b-256 abce260c5ae26c11bf3176e7664ff8479d64cd617a19f97d288ee0b8c9ec0387

See more details on using hashes here.

File details

Details for the file sisyphus_api_engine-2.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for sisyphus_api_engine-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 051775db074d3b9f45eae6bbc68025460797b586d0ee7f0f81201f7e782fb430
MD5 e755daadb4bdc2a8de27109335c0faf9
BLAKE2b-256 25119ffb02977fb75ba1ac7c3a603052a3bc07ed88c180c494372c8ffb21a251

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page