跳转到主要内容

并行asyncio Python设置。(cfg|py)测试运行器

项目描述

🏃‍♀️ ptr - Python 测试运行器 🏃‍♂️

Code style: black Actions Status PyPI Downloads

Python 测试运行器(ptr)是为了在任意代码库中以有意见的方式运行测试而诞生的。ptr支持许多在其setup.(cfg|py)文件中定义了单元测试的Python项目。ptr允许开发者通过使用单个测试虚拟环境在一个Python环境中测试多个项目/模块。

  • ptr需要>= python 3.7
  • ptr本身使用ptr来运行其测试 👌🏼
  • ptrLinuxMacOS + Windows操作系统上受支持并经过测试

通过将 ptr 配置添加到您的 pyproject.tomlsetup.cfgsetup.py 之一中,您可以让 ptr 为每个测试套件并行执行以下操作

  • 运行您的测试套件
  • 检查和强制执行覆盖率要求(通过 coverage),
  • 格式化代码(通过 black
  • 执行静态类型分析(通过 mypy

快速入门

  • 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.tomlsetup.cfg,则通过 configparser/tomli 加载,并优先使用如果存在 [ptr] 部分
  • 创建一个 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 支持在 iniConfigParser)格式中的一般配置。可以在存储库的根目录或任何目录中放置一个 .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.pysetup.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: #pythontestrunnerFreeNode

查看 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长周末发布

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首次贡献来自那里!感谢!

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 (33.6 kB 查看哈希值)

上传时间 源代码

构建版本

ptr-22.7.12-py3-none-any.whl (21.3 kB 查看哈希值)

上传时间 Python 3

由以下支持