使用rust开发的高性能python压测工具
Project description
atomic-bomb-engine-py
atomic-bomb-engine的python包装实现
前端仓库
atomic-bomb-engine-front
使用条件:
- python版本 >= 3.8
- windows(x86), linux(x86), mac
使用方法:
-
准备开始
通过pip安装 (0.5.0版本之前)
pip install atomic-bomb-engine-py
在python中引用时注意,需要引用atomic_bomb_engine, 而不是atomic_bomb_engine_py
为了避免混淆,0.5.0版本之后,pip更换了包名,更改为atomic-bomb-engine,
pip install atomic-bomb-engine
在python中导入
import atomic_bomb_engine
异步使用的时候,还需要引用asyncio
import asyncio
-
开始压测
-
单接口压测(功能与多接口压测重叠,已废除) -
多接口压测
-
多接口压测可以使用batch_async方法进行操作,函数签名和解释如下
async def batch_async(
test_duration_secs: int,
concurrent_requests: int,
api_endpoints:List[Dict],
step_option:Dict[str, int]|None=None,
setup_options:List[Dict[str, Any]]|None=None,
verbose:bool=False,
should_prevent:bool=False,
assert_channel_buffer_size:int=1024,
timeout_secs=0,
cookie_store_enable=True
) ->Dict:
"""
批量压测
:param test_duration_secs: 测试持续时间
:param concurrent_requests: 并发数
:param api_endpoints: 接口信息
:param step_option: 阶梯加压选项
:param setup_options: 初始化选项
:param verbose: 打印详细信息
:param should_prevent: 是否禁用睡眠
:param assert_channel_buffer_size: 断言队列buffer大小
:param timeout_secs: http超时时间
:param cookie_store_enable: 是否为客户端启用持久性cookie存储。
"""
使用assert_option方法可以返回断言选项字典
assert_options=[
atomic_bomb_engine.assert_option("$.code", 429),
atomic_bomb_engine.assert_option("$.code", 200)
])
jsonpath如果不会用的话,建议去jsonpath学习
使用step_option方法可以返回阶梯加压选项字典
def step_option(increase_step: int, increase_interval: int) -> Dict[str, int]:
"""
生成step option
:param increase_step: 阶梯步长
:param increase_interval: 阶梯间隔
"""
同样的本包中也包含了一个对api_endpoint的包装:endpoint方法,方便调用,endpoint中的assert_options中也可以套用assert_option方法
async def run_batch():
result = await atomic_bomb_engine.batch_async(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
print(result)
return result
监听时可以使用BatchListenIter生成器
async def listen_batch():
iterator = atomic_bomb_engine.BatchListenIter()
for message in iterator:
if message:
print(message)
else:
await asyncio.sleep(0.3)
压测+同时监听
async def main():
await asyncio.gather(
run_batch(),
listen_batch(),
)
if __name__ == "__main__":
asyncio.run(main())
压测时使用ui界面监控
0.5.0版本后,添加了ui页面,支持批量压测方法
导入
from atomic_bomb_engine import server
使用
import asyncio
import atomic_bomb_engine
from atomic_bomb_engine import server
@server.ui(port=8000)
async def run_batch():
result = await atomic_bomb_engine.batch_async(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
print(result)
return result
if __name__ == '__main__':
asyncio.run(run_batch())
使用server.ui装饰器,可以给批量压测方法启动一个简单的web服务器,不需要再手动监听BatchListenIter生成器
内部架构图
[0.19.0] - 2024-04-16
Added
- 增加了初始化和参数模版功能
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)]
上述实例展示了如何在初始化的时候调用某个接口,并且通过jsonpath将数据提取出来,保存在全局变量test-msg和test-code中 提取完全局变量后,就可以在后续的api_endpoints中使用
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
]
上述实例展示了如何在请求中使用全局变量,使用双大括号即可使用
Fixed
- 修复了如果http状态码错误时,不会记录
- 修复了json反序列化的问题
[0.20.0] - 2024-04-17
Added
断言更改为异步生产消费,提升性能
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
[0.22.0] - 2024-04-18
Added
前端进行了性能优化
[0.24.0] - 2024-04-22
Added
异步断言使用了补偿消息,保证消息的一致性
[0.25.0] - 2024-04-23
Added
在endpoints中增加思考时间,模拟用户行为
think_time_option(min_millis=200, max_millis=300)
- min_millis:最小思考时间(毫秒)
- max_millis:最大思考时间(毫秒)
使用时在endpoint中增加think_time_option参数
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-1",
url="http://localhost:8080/a",
method="POST",
weight=1,
timeout_secs=10,
json={"name": "{{test-msg}}", "number": "{{test-code}}"},
think_time_option=atomic_bomb_engine.think_time_option(min_millis=200, max_millis=300),
),
]
[0.26.0] - 2024-04-24
Added
- 增加endpoint中的setup,在并发中可以做接口断言
- 增加有关联条件下的cookie自动管理功能
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
)
- 参数cookie_store_enable控制是否自动管理cookie,前置条件的cookie会带入到最终的压测接口中
- 在endpoint中使用setup_options可以传入多个接口,并且提取参数
- 提取到的参数如果和全局的setup的key冲突,会覆盖全局提取到的参数
- 接口中提取的参数只能在本线程(v-user)中使用
- ⚠️ 使用时注意:setup_options是顺序执行的,没有并发,但是相当于添加了think time
[0.28.0] - 2024-04-25
Added
- 将持久化cookie添加到全局选项中
- 复用http client
- 选择性开启断言任务
- 接口初始化时出现错误等待后重试##
[0.29.0] - 2024-04-25
Added
- 优化并发逻辑
- 前端更改为web worker发送心跳
[0.38.0] - 2024-05-7
Added
- 增加附件上传功能
- 在初始化和每个接口中增加了multipart_options参数用于附件上传
- 增加multipart_option方法封装附件参数
- form_key: form表单的key
- path: 附件路径
- file_name: 附件名
- mime: 附件类型 (类型可以参考这里)
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-file",
url="http://127.0.0.1:8888/upload",
method="post",
weight=100,
multipart_options=[atomic_bomb_engine.multipart_option(form_key="file", path="./ui.py", file_name="ui.py", mime="text/plain")],
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.message", reference_object="File uploaded successfully!"),
],
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),]
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
TODO
- 前端展示页面 ✅
- 接口关联 ✅
- 每个接口可以配置思考时间 ✅
- 增加form支持 ✅
- 增加代理支持
- 增加附件支持 ✅
- 断言支持不等于等更多表达方式
联系方式
- 邮箱:qyzhg@qyzhg.com
- 微信:qy-zhg
👏🏻👏🏻👏🏻欢迎加群交流
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Hashes for atomic_bomb_engine-0.39.0rc1-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c1dba070bd8e19fa737daa8b0db37e12d0123e67ad8a5a48b3d0452d647cb0f7 |
|
MD5 | 1717ccba94f429d67b50ff16bd860eae |
|
BLAKE2b-256 | 476b64500d1d33d8fe1722a9748398dc4130387f7cf61466b6967bcfc1d23e56 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dab55086427f1eb4ba5829e4107af09b98ce3f637317d1ce739588d55d726c6f |
|
MD5 | 5840aed40c3d9343bfb18a721068d247 |
|
BLAKE2b-256 | e141815b839d7cf820ca28919efc05b119728ed4cd0365b9a6d5436f64e7ed3b |
Hashes for atomic_bomb_engine-0.39.0rc1-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0d6ca12d6627cf912c7f8577bbb314abff21d04da7e3d6580f3cd66201a7ab96 |
|
MD5 | 0ace26b8cac0709d7ed79066ff4b6cea |
|
BLAKE2b-256 | bc454f1f30bd963b13eb6a94cc1ada6ec45ef0e47fbfce3c510161490999bb4f |
Hashes for atomic_bomb_engine-0.39.0rc1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 88269bb34ca2156a5a68532c45ab56728b4dcb4eb6ac2a4adef003d44014997c |
|
MD5 | da892332d3d5054e9fce5a15e41a9ce6 |
|
BLAKE2b-256 | e4f79bb9d60f14b4610eaa762e95eca72c1de97606cbd7476b199210b69d9018 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9ca291f40654ff94568ec25c62c6964f4a9e0677ebac18b1dbc2e69a724b047b |
|
MD5 | dc1951c6b2a9d70db555522cd2baac95 |
|
BLAKE2b-256 | 774cd4f74d5bdfa622313cfa4b7388e47846d5edfdfd0f5019de9da9a2a51992 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4108ebf36ef0930817402b444bde09d2295d6f354998ead8bfcc38c8fb9dde09 |
|
MD5 | 9dbfa3af510596fc36a26ab23a5fe186 |
|
BLAKE2b-256 | 304ba80a52706c1b8d75bbdb609607b1bad89b3b3f8e7923ae84244a0991e456 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3055e80d68b39432b22e8186c32e6416c678d3bdd7085cbce7d1f6b7e8c7ec82 |
|
MD5 | 35be7bcc8f48ff0b6180f0d9bc978ad7 |
|
BLAKE2b-256 | b4ba0e5a6ba5c2b569771893bfb185af6b8c6a5459fd4f272d7ecc16c216fdd5 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d7817e821bdf480db2d1edb78c8b7d950cc57dafb236afdacc3ca1ed8f680b3e |
|
MD5 | 2fe90d93f87e514bbca30ca9ef39eb68 |
|
BLAKE2b-256 | f12e3f993b8c678960b8da1abea3565b9d9df9c2c22e008c1dfed945d571a866 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5c69488d682fc2819d07ca52efdc8872678512266cef1e108a995cf5cac6d09 |
|
MD5 | df0ed38c7a29c986fd5214945c95ef07 |
|
BLAKE2b-256 | a9b6023d9603cf30ffc54357641b0b676c9022379f6123e6f40a947242c424bd |
Hashes for atomic_bomb_engine-0.39.0rc1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8ca7018f50e80b53c52dcded20389a098277430473baf582e65aa0f55605602b |
|
MD5 | 6bd0187d0a295971e4fb3ef1281eea4f |
|
BLAKE2b-256 | aec6a536aee8714beb439eecff9f3cfa51085340df383fd44e64feec00050ad6 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e06fb6289da5e0c386cfacf7e48bc70eb199cb009ec5cd64636a126400d66068 |
|
MD5 | c658b42df01e6756289cece09f961b16 |
|
BLAKE2b-256 | 77ec0e9c5fbd853be38264652ea11196cead5494feafde72edaa82a23add16d0 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 792c4fc379fdda7ef569db99fae6fa90cf165500a89d0a840859b68184f69716 |
|
MD5 | 5dab11d4c01c66d323340600fed8f1e9 |
|
BLAKE2b-256 | c792c23e4e94d1ab12572bd8d3a129c522de5bcd0e62c57a3897a187aabc7a2f |
Hashes for atomic_bomb_engine-0.39.0rc1-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8af4e8a43538741be8ddefe2301a3234fcc6e391aa2c8ab44deeb98505afcdb1 |
|
MD5 | 48d050bf5995cf87ccac431846bbce14 |
|
BLAKE2b-256 | 1305b2a72bdc2a14b954dfd944a21770e5e190c3da306e3e13fd499ca13f7f75 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0cdd76f0acdff3464b2e78f64a80199163104fd7e73e261056e86ee9474fc990 |
|
MD5 | adbd992ad2bebbb0222122242ce80fd5 |
|
BLAKE2b-256 | 525c1f8508037368d566f4dd375fb1b9bf3c752cef13a8430600f57638a089b0 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1ea2f61db5155d869ae0292dd144c65876830bf3394ad78df9792a5d6850973e |
|
MD5 | 2a703ade6cfa4988de5176cef30b045e |
|
BLAKE2b-256 | dacfae20ba4f6d6a1474aedc161df30826dd4c1913b72b29c03854aa355056b0 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ac33594cefecee2ac1af20662a68821aed52fbccb476b4f2a6c724c915bb0216 |
|
MD5 | 7765222d2f525c46ad6fe44a1cd47536 |
|
BLAKE2b-256 | 0e418a28a1bf978da5b6a0ff4ac455b98c4af3655e92837a670a79ab0c1a0ad6 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c59a4d04332c2429d40e52bd6ffab240326f233fe7da67c4e836ce4ef5db237e |
|
MD5 | 66168b8d304a08f546f21b339d7400f2 |
|
BLAKE2b-256 | a3f23bb957fb4eaf7ba9d9a5ab7dc241edb9c0de53255869ebbfce6394dafbf8 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0aba36dade8a9136b740f1f81684c68ea883da41c3ec5719be13042124435fec |
|
MD5 | 280ee3da067126c0a595259a6aa71467 |
|
BLAKE2b-256 | 2169643fd7efdc7a72e30bd1620d3985fc019deef8f03ebf512e36ce9a723652 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cffe6022060a9bbd01b9c7e22966109b157c743bf70570c9d49b9d1299bdef2b |
|
MD5 | 36501ed5e31c4a5b5cc0a6fa1257acd0 |
|
BLAKE2b-256 | 261cfeeadc52d77aa317cf0fb6bac949a161b0ecaeb82da959fa83aa81301bf0 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8337b500bc1134130b36961c75b9a62761c12e24faac69e0812c41d034a12374 |
|
MD5 | ed5adbbb25ee3d0e63bf97ae9caf5988 |
|
BLAKE2b-256 | bf2e654ab42db280dea9912049c433028557ef981de569675b78cd11b2775870 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 652b4e67a3c653217e9503f409348dd5093fb3690b95326a0b14b6d5f1ebb16c |
|
MD5 | a8e93a78ff5ae54e9a71482d705e792d |
|
BLAKE2b-256 | ac4a60d14715be580d24235281e2cf07c7c863c4806102956789f5eaf91e1441 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 700c7c5ee070e32c2406179ccb5dc4a7748af81032ca6801912bb7742b91eb4b |
|
MD5 | f0d801ff604a5c6f9741cfff01c1c204 |
|
BLAKE2b-256 | dbf88c496ecb9506dc7740ff51757db718d9eb65c4a9e5968bad8f9f7134a11c |
Hashes for atomic_bomb_engine-0.39.0rc1-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6923305156ee5fe1cfe1aa9df83b0cc700b7cc9abeee4995909207f9f7936c1b |
|
MD5 | 06a6759ef4d799bf48a3c39984c11d03 |
|
BLAKE2b-256 | 3be9a800415c7b1dade3886184b85fee34e22ec2b36659f0dbebf6d7b3034989 |
Hashes for atomic_bomb_engine-0.39.0rc1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 13affce1cb49e222997858c005c04940ee471225c85269c4764b83a6b58bb7d0 |
|
MD5 | 9af0b6e9f82dc4257d65c074feacc1e4 |
|
BLAKE2b-256 | e00262f08b50747d02dc8dbfc0fdc3a8bffae00313c96e563450896b7a301c1f |
Hashes for atomic_bomb_engine-0.39.0rc1-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1d912579986682301002bd201f9aa4e04dbb897593e385a4ae081fc2217ac775 |
|
MD5 | 7011961cde26c78f7664b97dbec09c01 |
|
BLAKE2b-256 | 19053233e2b40712b43cb41ea71fb0e3dc966a358f5a3afb17efa96471fcb71f |