并行asyncio Python设置。(cfg|py)测试运行器
项目描述
🏃♀️ ptr
- Python 测试运行器 🏃♂️
Python 测试运行器(ptr)是为了在任意代码库中以有意见的方式运行测试而诞生的。ptr
支持许多在其setup.(cfg|py)
文件中定义了单元测试的Python项目。ptr
允许开发者通过使用单个测试虚拟环境在一个Python环境中测试多个项目/模块。
ptr
需要>=
python 3.7ptr
本身使用ptr
来运行其测试 👌🏼ptr
在Linux、MacOS + Windows操作系统上受支持并经过测试
通过将 ptr
配置添加到您的 pyproject.toml
、setup.cfg
或 setup.py
之一中,您可以让 ptr
为每个测试套件并行执行以下操作
快速入门
- 将
ptr
安装到您的虚拟环境中pip安装ptr
- 确保您的测试有一个可以直接执行的基准文件
- 例如,
python3 test.py
(可能使用unittest.main()
)
- 例如,
- 在 setup.py 中添加
ptr_params
(见下例)后运行
cd repo
ptr
那么 ptr
是如何实现这一魔法的?🎩
很高兴您问了。在幕后,ptr
执行以下操作
- 递归地从
BASE_DIR
(默认为您的 "当前工作目录"(CWD))搜索setup.(cfg|py)
文件- 通过 AST 解析每个
setup.py
测试要求中的配置 - 如果存在
pyproject.toml
或setup.cfg
,则通过 configparser/tomli 加载,并优先使用如果存在[ptr]
部分
- 通过 AST 解析每个
- 创建一个 Python 虚拟环境(可选 指向内部 PyPI 镜像)
- 并行运行
ATONCE
测试套件(即每个 setup.(cfg|ptr)) - 将为每个套件运行所有步骤,并且只有 失败的 运行将输出写入 stdout
用法 🤓
要使用 ptr
,您只需将 cd 切换到您的项目或通过 -b
设置基本目录,然后执行
$ ptr [-dk] [-b some/path] [--venv /tmp/existing_venv]
为了在测试时获得更快的运行速度,建议重用虚拟环境
-k
- 保留ptr
创建的虚拟环境。- 使用
--venv VENV_PATH
重用用户创建的现有虚拟环境。
帮助输出 🙋♀️ 🙋♂️
usage: ptr.py [-h] [-a ATONCE] [-b BASE_DIR] [-d] [-e] [-k] [-m MIRROR]
[--print-cov] [--print-non-configured]
[--progress-interval PROGRESS_INTERVAL] [--run-disabled]
[--stats-file STATS_FILE] [--system-site-packages] [--venv VENV]
[--venv-timeout VENV_TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-a ATONCE, --atonce ATONCE
How many tests to run at once [Default: 6]
-b BASE_DIR, --base-dir BASE_DIR
Path to recursively look for setup.py files [Default:
/Users/cooper/repos/ptr]
-d, --debug Verbose debug output
-e, --error-on-warnings
Have Python warnings raise DeprecationWarning on tests
run
-k, --keep-venv Do not remove created venv
-m MIRROR, --mirror MIRROR
URL for pip to use for Simple API [Default:
https://pypi.ac.cn/simple/]
--print-cov Print modules coverage report
--print-non-configured
Print modules not configured to run ptr
--progress-interval PROGRESS_INTERVAL
Seconds between status update on test running
[Default: Disabled]
--run-disabled Force any disabled tests suites to run
--stats-file STATS_FILE
JSON statistics file [Default: /var/folders/tc/hbwxh76
j1hn6gqjd2n2sjn4j9k1glp/T/ptr_stats_12510]
--system-site-packages
Give the virtual environment access to the system
site-packages dir
--venv VENV Path to venv to reuse
--venv-timeout VENV_TIMEOUT
Timeout in seconds for venv creation + deps install
[Default: 120]
配置 🧰
ptr
通过在以下文件之一中放置指令进行配置。 .ptrconfig
为存储库中的所有项目提供基本配置和默认值,而每个 setup.(cfg|py)
覆盖它们定义的各自包的基本配置。
.ptrconfig
ptr
支持在 ini
(ConfigParser)格式中的一般配置。可以在存储库的根目录或任何目录中放置一个 .ptrconfig
文件。通过递归遍历到根目录(POSIX 系统中的 "/")找到的第一个 .ptrconfig
文件将被使用。
请参阅 ptrconfig.sample
了解可用的选项。
setup.py
这是存储库中的每个项目。以下是一个基于 ptr
自身的简单示例
# Specific Python Test Runner (ptr) params for Unit Testing Enforcement
ptr_params = {
# Where mypy will run to type check your program
"entry_point_module": "ptr",
# Base Unittest file
"test_suite": "ptr_tests",
"test_suite_timeout": 300,
# Relative path from setup.py to module (e.g. ptr == ptr.py)
"required_coverage": {"ptr.py": 99, "TOTAL": 99},
# Run `black --check` or not
"run_black": False,
# Run mypy or not
"run_mypy": True,
}
pyproject.toml
这是存储库中的每个项目,如果存在,则优先于 setup.py
和 setup.cfg
。
请参阅 pyproject.toml
了解可用的选项 + 格式。
setup.cfg
这是存储库中的每个项目,如果存在,则优先于 setup.py
。
请参阅 setup.cfg.sample
了解可用的选项 + 格式。
mypy 特定细节
当启用时(在 setup.(cfg|py)
中),mypy 可以支持为每个 setup.py(模块)定义使用自定义 mypy.ini
。
要使 ptr
使用您的配置运行 mypy
- 在与
setup.py
相同的目录中创建一个mypy.ini
- 或向
setup.cfg
添加 [mypy] 部分
有关 mypy
配置文档的信息,请参阅 此处
- 这里可以查看一个示例
setup.cfg
文件:在此处。
示例输出 📝
以下是一些示例运行。
成功的 ptr
运行
这就是你在 CI 日志中想要看到的内容!
[2019-02-06 21:51:45,442] INFO: Starting ptr.py (ptr.py:782)
[2019-02-06 21:51:59,471] INFO: Successfully created venv @ /var/folders/tc/hbwxh76j1hn6gqjd2n2sjn4j9k1glp/T/ptr_venv_24397 to run tests (14s) (ptr.py:547)
[2019-02-06 21:51:59,472] INFO: Installing /Users/cooper/repos/ptr/setup.py + deps (ptr.py:417)
[2019-02-06 21:52:00,726] INFO: Running /Users/cooper/repos/ptr/ptr_tests.py tests via coverage (ptr.py:417)
[2019-02-06 21:52:04,153] INFO: Analyzing coverage report for /Users/cooper/repos/ptr/setup.py (ptr.py:417)
[2019-02-06 21:52:04,368] INFO: Running mypy for /Users/cooper/repos/ptr/setup.py (ptr.py:417)
[2019-05-03 14:54:09,915] INFO: Running flake8 for /Users/cooper/repos/ptr/setup.py (ptr.py:417)
[2019-05-03 14:54:10,422] INFO: Running pylint for /Users/cooper/repos/ptr/setup.py (ptr.py:417)
[2019-05-03 14:54:14,020] INFO: Running pyre for /Users/cooper/repos/ptr/setup.py (ptr.py:417)
[2019-02-06 21:52:07,733] INFO: /Users/cooper/repos/ptr/setup.py has passed all configured tests (ptr.py:509)
-- Summary (total time 22s):
✅ PASS: 1
❌ FAIL: 0
⌛️ TIMEOUT: 0
💩 TOTAL: 1
-- 1 / 1 (100%) `setup.py`'s have `ptr` tests running
失败的 ptr
运行示例
以下是运行失败的示例。任何 "步骤" 都可能失败。所有输出主要是底层工具的结果。
单元测试失败
[2019-02-06 21:53:58,121] INFO: Starting ptr.py (ptr.py:782)
[2019-02-06 21:53:58,143] INFO: Installing /Users/cooper/repos/ptr/setup.py + deps (ptr.py:417)
[2019-02-06 21:53:59,698] INFO: Running /Users/cooper/repos/ptr/ptr_tests.py tests via coverage (ptr.py:417)
-- Summary (total time 5s):
✅ PASS: 0
❌ FAIL: 1
⌛️ TIMEOUT: 0
💩 TOTAL: 1
-- 1 / 1 (100%) `setup.py`'s have `ptr` tests running
-- Failure Output --
/Users/cooper/repos/ptr/setup.py (failed 'tests_run' step):
...F....................
======================================================================
FAIL: test_config (__main__.TestPtr)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/cooper/repos/ptr/ptr_tests.py", line 125, in test_config
self.assertEqual(len(sc["ptr"]["venv_pkgs"].split()), 4)
AssertionError: 5 != 4
----------------------------------------------------------------------
Ran 24 tests in 3.221s
FAILED (failures=1)
覆盖率
[2019-02-06 21:55:42,947] INFO: Starting ptr.py (ptr.py:782)
[2019-02-06 21:55:42,969] INFO: Installing /Users/cooper/repos/ptr/setup.py + deps (ptr.py:417)
[2019-02-06 21:55:44,920] INFO: Running /Users/cooper/repos/ptr/ptr_tests.py tests via coverage (ptr.py:417)
[2019-02-06 21:55:49,628] INFO: Analyzing coverage report for /Users/cooper/repos/ptr/setup.py (ptr.py:417)
-- Summary (total time 7s):
✅ PASS: 0
❌ FAIL: 1
⌛️ TIMEOUT: 0
💩 TOTAL: 1
-- 1 / 1 (100%) `setup.py`'s have `ptr` tests running
-- Failure Output --
/Users/cooper/repos/ptr/setup.py (failed 'analyze_coverage' step):
The following files did not meet coverage requirements:
ptr.py: 84 < 99 - Missing: 146-147, 175, 209, 245, 269, 288-291, 334-336, 414-415, 425-446, 466, 497, 506, 541-543, 562, 611-614, 639-688
black
[2019-02-06 22:34:20,029] INFO: Starting ptr.py (ptr.py:804)
[2019-02-06 22:34:20,060] INFO: Installing /Users/cooper/repos/ptr/setup.py + deps (ptr.py:430)
[2019-02-06 22:34:21,614] INFO: Running /Users/cooper/repos/ptr/ptr_tests.py tests via coverage (ptr.py:430)
[2019-02-06 22:34:25,208] INFO: Analyzing coverage report for /Users/cooper/repos/ptr/setup.py (ptr.py:430)
[2019-02-06 22:34:25,450] INFO: Running mypy for /Users/cooper/repos/ptr/setup.py (ptr.py:430)
[2019-02-06 22:34:26,422] INFO: Running black for /Users/cooper/repos/ptr/setup.py (ptr.py:430)
-- Summary (total time 7s):
✅ PASS: 0
❌ FAIL: 1
⌛️ TIMEOUT: 0
💩 TOTAL: 1
-- 1 / 1 (100%) `setup.py`'s have `ptr` tests running
-- Failure Output --
/Users/cooper/repos/ptr/setup.py (failed 'black_run' step):
would reformat /Users/cooper/repos/ptr/ptr.py
All done! 💥 💔 💥
1 file would be reformatted, 4 files would be left unchanged.
mypy
[2019-02-06 22:35:39,480] INFO: Starting ptr.py (ptr.py:802)
[2019-02-06 22:35:39,531] INFO: Installing /Users/cooper/repos/ptr/setup.py + deps (ptr.py:428)
[2019-02-06 22:35:41,203] INFO: Running /Users/cooper/repos/ptr/ptr_tests.py tests via coverage (ptr.py:428)
[2019-02-06 22:35:45,156] INFO: Analyzing coverage report for /Users/cooper/repos/ptr/setup.py (ptr.py:428)
[2019-02-06 22:35:45,413] INFO: Running mypy for /Users/cooper/repos/ptr/setup.py (ptr.py:428)
-- Summary (total time 6s):
✅ PASS: 0
❌ FAIL: 1
⌛️ TIMEOUT: 0
💩 TOTAL: 1
-- 1 / 1 (100%) `setup.py`'s have `ptr` tests running
-- Failure Output --
/Users/cooper/repos/ptr/setup.py (failed 'mypy_run' step):
/Users/cooper/repos/ptr/ptr.py: note: In function "_write_stats_file":
/Users/cooper/repos/ptr/ptr.py:179: error: Argument 1 to "open" has incompatible type "Path"; expected "Union[str, bytes, int]"
/Users/cooper/repos/ptr/ptr.py: note: In function "run_tests":
/Users/cooper/repos/ptr/ptr.py:700: error: Argument 1 to "_write_stats_file" has incompatible type "str"; expected "Path"
pyre
cooper-mbp1:ptr cooper$ /tmp/tp/bin/ptr --venv /var/folders/tc/hbwxh76j1hn6gqjd2n2sjn4j9k1glp/T/ptr_venv_49117
[2019-05-03 14:51:43,623] INFO: Starting /tmp/tp/bin/ptr (ptr.py:1023)
[2019-05-03 14:51:43,657] INFO: Installing /Users/cooper/repos/ptr/setup.py + deps (ptr.py:565)
[2019-05-03 14:51:44,840] INFO: Running ptr_tests tests via coverage (ptr.py:565)
[2019-05-03 14:51:47,361] INFO: Analyzing coverage report for /Users/cooper/repos/ptr/setup.py (ptr.py:565)
[2019-05-03 14:51:47,559] INFO: Running mypy for /Users/cooper/repos/ptr/setup.py (ptr.py:565)
[2019-05-03 14:51:47,827] INFO: Running black for /Users/cooper/repos/ptr/setup.py (ptr.py:565)
[2019-05-03 14:51:47,996] INFO: Running flake8 for /Users/cooper/repos/ptr/setup.py (ptr.py:565)
[2019-05-03 14:51:48,566] INFO: Running pylint for /Users/cooper/repos/ptr/setup.py (ptr.py:565)
[2019-05-03 14:51:52,301] INFO: Running pyre for /Users/cooper/repos/ptr/setup.py (ptr.py:565)
[2019-05-03 14:51:54,983] INFO: /Users/cooper/repos/ptr/setup.py has passed all configured tests (ptr.py:668)
-- Summary (total time 11s):
✅ PASS: 1
❌ FAIL: 0
⌛️ TIMEOUT: 0
💩 TOTAL: 1
-- 1 / 1 (100%) `setup.py`'s have `ptr` tests running
-- Failure Output --
/Users/cooper/repos/ptr/setup.py (failed 'pyre_run' step):
2019-05-03 14:54:14,173 INFO No binary specified, looking for `pyre.bin` in PATH
2019-05-03 14:54:14,174 INFO Found: `/var/folders/tc/hbwxh76j1hn6gqjd2n2sjn4j9k1glp/T/ptr_venv_49117/bin/pyre.bin`
... *(truncated)* ...
ptr.py:602:25 Undefined name [18]: Global name `stdout` is not defined, or there is at least one control flow path that doesn't define `stdout`.
usort
如果你的导入没有使 usort
满意,它会看起来像这样
[2021-05-29 09:30:56,044] INFO: Starting /tmp/tp/bin/ptr (ptr.py:1129)
[2021-05-29 09:30:56,051] INFO: Installing /Users/cooper/repos/ptr/setup.py + deps (ptr.py:637)
[2021-05-29 09:30:56,587] INFO: Running ptr_tests tests via coverage (ptr.py:637)
[2021-05-29 09:30:58,238] INFO: Analyzing coverage report for /Users/cooper/repos/ptr/setup.py (ptr.py:637)
[2021-05-29 09:30:58,341] INFO: Running mypy for /Users/cooper/repos/ptr/setup.py (ptr.py:637)
[2021-05-29 09:30:58,436] INFO: Running usort for /Users/cooper/repos/ptr/setup.py (ptr.py:637)
-- Summary (total time 2s):
✅ PASS: 0
❌ FAIL: 1
️⌛ TIMEOUT: 0
🔒 DISABLED: 0
💩 TOTAL: 1
-- 1 / 1 (100%) `setup.py`'s have `ptr` tests running
-- Failure Output --
/Users/cooper/repos/ptr/setup.py (failed 'usort_run' step):
Would sort /Users/cooper/repos/ptr/setup.py
常见问题解答 ⁉️
问:我该如何调试?我需要输出!
ptr
开发者建议,如果你需要输出,请让测试失败- 例如
raise ZeroDivisionError
- 例如
- 另一个推荐的方式是使用
ptr
创建的 venv 以默认方式运行测试切换到 /my/code
/tmp/venv/bin/python setup.py test
问:我如何获取 black、coverage、mypy 等的具体版本?
- 只需简单地在你的仓库中的 .ptrconfig 中硬编码版本,或者在使用
ptr
运行之前使用requirements.txt
预先安装 - 支持所有
pip
PEP 440 版本说明符
问:为什么 venv 创建过程如此缓慢?
ptr
尝试从 PyPI 兼容的镜像(PEP 381)或 PyPI 本身更新- 运行包缓存或本地镜像可以大大提高速度。以下是一些示例软件
- bandersnatch:可以执行选择或完整的 PyPI 镜像。维护者看起来也特别迷人。
- devpi:可以运行并用作本地代理,当 pip 去获取你的依赖项时使用。
- 请确保你正在使用
-k
或--venv
选项,以便在调试测试时不要在每次运行时重新创建虚拟环境!
问:为什么 ptr 无法在 Windows 上运行 pyre
?
pyre
(PyPI 上的 pyre-check)没有附带带有 ocaml pyre.bin 的 Windows 轮子
问:为什么你依赖于 >= coverage 5.0.1?
coverage
5.0 引入了使用 sqlite,我们不希望 ptr 中有 4.x 和 5.x 的混合使用- < 5.0 可能仍然可以工作,因为我们现在确保使用 subprocess 从 setup_py.parent CWD 运行每个项目的测试
联系或加入 ptr 社区 💬
要实时聊天,请在我们所在的 IRC 上联系我们。否则,GitHub 问题始终欢迎!IRC: #pythontestrunner
在 FreeNode
查看 CONTRIBUTING 文件了解如何提供帮助。
许可
ptr
是 MIT 许可证,如 LICENSE 文件 中所述。
使用条款 + 隐私政策
版权 © Meta Platforms, Inc. 和其关联公司
ptr
更新历史
我将为每个发布到 PyPI 的版本提供一个代表我在世界某个地方的位置的代号 🌏。
2022.7.12
代号: 西雅图 🦑
这个版本以我上周访问西雅图的荣誉命名……
- 3.11 支持 - 添加了元数据 + 使 3.11 CI 通过 - PR #121
- 添加
pyproject.toml
用户配置支持 - PR #120 - 添加基本 Hypothesis 模糊测试 - PR #118
- 2022 年美国 PyCon 期间所学
- 添加
pyproject.toml
基本的 PEP517 构建 support - PR #117 - 这将再次是最后一个 3.7 支持的版本
- 我忘了删除 + CI 仍然通过,所以现在先留下
2022.2.2
代号: Richie 2 for 22 🏏
这个版本以已故的伟大 Richie Benaud 的荣誉命名
- 这将将是最后一个 3.7 支持的版本
- 为什么?希望有一个更稳定的
asyncio.run
来启动 asyncio
- 为什么?希望有一个更稳定的
- 在 CI 中重新激活
pylint
- 将所有 ptr 字符串转换为 f-string
- 删除 python 3.6 CI + 支持
- 我们现在是 Meta - 由于公司更名,更新版权信息
3.11 CI测试失败,原因是依赖问题。将尽快进行监控和修复。
2021.11.23
代号:A 🅰️
发布版本支持'Three dot Ten'和十六进制中的A == 10
- 添加对Python 3.10的官方支持和CI
- 这将是3.6版本的最后一个发布版(如果没有任何错误出现)
- 同时启动ci_latest运行3.11
2021.5.28
代号:Memorial Day 🇺
在Memorial Day长周末发布
- 将usort添加到CI选项系列中
2021.3.16
代号:Wildwood 🪵
首次从我的南湖塔霍住所发布
- 在
required_coverage
中支持浮点数进行覆盖率比较 - PR #108 - 将
--print-cov
改为在ptr配置中不存在required_coverage
时工作 - PR #109 - 将测试从安装中移除,但在sdist中包含 - PR #99 - 感谢@jayvdb
- 通过deadsnakes测试3.10 alpha - PR #110
- 其他f-string + lint/typing修复
2020.2.26
代号:Straya Day之后的月份 🇦🇺🇺
自从@cooperlees在澳大利亚日访问澳大利亚以来已经过去了一个月!
- 现在Python 3.8完全支持,启用pyre
2019.12.25
代号:维尔诺山,IL 🎅
@cooperlees正在IL拜访女友的家人
- 修复一些新参数的文档 - 感谢@omikader
- Windows现在默认更新pip + setuptools
- 通过subprocess依赖设置当前工作目录,并移除覆盖率文件环境设置
- 现在我们>= 3.6,通过flynt使用f-string everything - flynt
2019.12.13
代号:College Park, MD 🐢
@omikader曾在马里兰大学公园分校学习
- 添加创建部分
.ptrconfig
文件的能力 - PR: #83 - 使用黑和flake8的原生递归文件搜索 - PR: #81
2019.12.12
代号:Sapporo, Japan 🇯🇵
@omikader将于2月去那里滑雪
- 在创建venv期间支持传递
--system-site-packages
- PR: #80
2019.11.21
代号:Santa Clara, CA
@thatch住在这里!*
- 为@thatch添加许可文件 - PR: #77 - 感谢@thatch
2019.11.15
代号:Russian River, CA 🇺🇸
@cooperlees明天要去俄罗斯河
- 即使没有提供test_suite,也运行ptr - PR: #73 - 感谢@spurav
- 移除已弃用的setuptools
test
选项的使用 - 迁移到GitHub Actions进行CI + 发布
2019.11.2
代号:Mumbai, India 🇮🇳
@spurav来自印度孟买
- 修复os.cpu_count除以1/2的数学错误 - PR: #69 - 感谢@spurav
- 使GitHub Actions CI运行 - PR: #68 + #70 - 感谢@adhaamehab
2019.10.22
代号:Cairo, Egypt 🇪🇬
@adhaamehab首次贡献来自那里!感谢!
- 当文件不存在时,打印更有用的错误进行覆盖率检查 - PR: #51
- 正式支持Python 3.8并强制执行通过测试
- 由于不支持,禁用pyre-check >=3.8
2019.10.6
代号:Stanford, CA
@cooperlees昨天在那里尾随 🚐🏈
- 处理OSX /private在覆盖率报告中 - PR: #60
2019.9.14
代号:Clowntown 🤡
- 修复
--print-cov
+--error-on-warnings
的坏布尔值传递
2019.9.11
代号:Rathbone Square
@cooperlees正在从FB伦敦办公室发布这个版本
- 添加CLI选项以启用对所有警告的报错 - 问题:#57
2019.8.7
代号:Ellicott City
@omikader报告并测试了AST解析修复的修复者来自那里。 Ellicott City也是美国现存最古老的火车站之一!
- 修复AST解析以忽略没有
id
属性的AST目标 - 问题:#54 - 由于现在在> 3.7上运行,默认重新启用
black
- 问题:#41 - 修复--venv-timeout以存储整数
- 重构_get_test_modules函数以消除lint错误 - PR:#53 - 感谢@TomasFeeney
2019.7.16
代号:加利福尼亚城市
一个过度发展的沙漠,基础设施完善,人口很少人口
- 添加
--print-non-configured
以查找库中的非ptr
模块 - 问题:#50
2019.6.15
代号:康科德
🛫 @cooperlees今天在康科德,CA玩澳式足球 🏈
- 添加禁用测试套件的功能,并添加
--run-disabled
选项以强制运行 - 问题:#46 - Azure CI现在再次在Mac和Windows上运行
2019.5.3
代号:克利夫兰
🇺🇸 @cooperlees + @jreese在俄亥俄州克利夫兰的PyCon US上 🦅
- 在失败输出中打印步骤名称 - 问题:#31
- 添加对
pyre
类型检查步骤的支持 - 问题:#38 + #40
已知问题:black.exe
在Windows 3.7上无法运行 - 默认在Windows上的Python 3.7上禁用
2019.3.5
代号:斋普尔
🇮🇳 @cooperlees在印度斋普尔参加婚礼时发布 💒
- 初步的Windows支持现已准备好测试 - 问题:#2
- 在setup.py路径的CWD中运行测试/mypy/flake8等。 - Issue #23 - 感谢@jreese
- 添加对flake8和pylint的lint支持 - Issue #20 - 感谢@jreese
- 在运行black时忽略点目录 - PR #19 - 感谢@jreese
已知问题:black.exe
在Windows 3.7上无法运行 - 默认在Windows上的Python 3.7上禁用
2019.2.12
代号:福布斯
福布斯,新南威尔士州,澳大利亚是@aijayadams 👨🏻🦰🇦🇺的家
- 将套件文件覆盖率%添加到统计JSON文件中 - 问题:#16 - 感谢@aijayadams
- 在运行black时忽略隐藏的'.'(点)目录 - PR: #19 - 感谢@jreese
2019.2.10
代号:狂欢节
🇧🇷 @cooperlees三年前在里约热内卢,巴西过狂欢节 🇧🇷
- 为ptr_params添加ptr
setup.cfg
支持 - 问题:#1 - 将JSON统计验证添加到
ci.py
- 问题:#7 - 修复了一个允许默认运行的步骤的bug - 问题:#11
2019.2.8.post1/2
- 修复
setup.py
URL指向ptr GitHub - 其他各种
setup.py
修复 - 例如分类器+许可信息
2019.2.8
代号:雪鸟
美国犹他州Snowbird最近的滑雪活动 🏂 🇺🇸
- 向全世界发布初始版本!
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建版本
ptr-22.7.12.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 68889d0443320b50082871cb56ee5fc8a601fe0dd9aadfc21fbff5f6f9bb8291 |
|
MD5 | 95e5dd652ea1922c76d2d60294de9e37 |
|
BLAKE2b-256 | 6ac016097bfc3ee1c4da9e3f42b364c4faec81dfde03b847b219fff9cdeb394c |
ptr-22.7.12-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e8056e0b049454586779fd457460032909e2bf4937da5da26963e3aecb5fc552 |
|
MD5 | 305147fd67c421b36e8b9721aa38eaf2 |
|
BLAKE2b-256 | 545b4b04d5ece9a5aafe340a80e36ccc667c0a1a8c5a9d4f05cf4798cf7cf5e7 |