Name | rtest JSON |
Version |
0.0.31
JSON |
| download |
home_page | None |
Summary | Python test runner built in Rust |
upload_time | 2025-07-23 02:34:16 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | MIT |
keywords |
testing
pytest
rust
performance
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# rtest
[](https://badge.fury.io/py/rtest)
[](https://pypi.org/project/rtest/)
[](https://opensource.org/licenses/MIT)
A Python test runner built with Rust, currently supporting high-performance test-collection, with the goal of being a drop-in replacement for [`pytest`](https://pytest.org).
> **⚠️ Development Status**: This project is in early development (v0.0.x). Expect bugs, breaking changes, and evolving features as we work toward stability.
## Performance
*Benchmarks performed using [hyperfine](https://github.com/sharkdp/hyperfine) with 20 runs, 3 warmup runs per measurement, on an M4 Macbook Pro with 14 cores and 48GB RAM.* **More sophisticated benchmarks will be implemented in the future.**
### Against the [`flask`](https://github.com/pallets/flask) Repository
```
hyperfine --command-name pytest --command-name rtest "pytest --collect-only" "rtest --collect-only" --warmup 3 --runs 20
Benchmark 1: pytest
Time (mean ± σ): 229.9 ms ± 2.6 ms [User: 184.5 ms, System: 37.4 ms]
Range (min … max): 226.0 ms … 235.4 ms 20 runs
Benchmark 2: rtest
Time (mean ± σ): 35.8 ms ± 1.2 ms [User: 18.1 ms, System: 10.7 ms]
Range (min … max): 34.2 ms … 40.3 ms 20 runs
Summary
rtest ran
6.41 ± 0.23 times faster than pytest
```
### Against the [`httpx`](https://github.com/encode/httpx) Repository
```
hyperfine --command-name pytest --command-name rtest "pytest --collect-only" "rtest --collect-only" --warmup 3 --runs 20
Benchmark 1: pytest
Time (mean ± σ): 310.1 ms ± 18.6 ms [User: 259.3 ms, System: 42.6 ms]
Range (min … max): 291.0 ms … 344.4 ms 20 runs
Benchmark 2: rtest
Time (mean ± σ): 20.6 ms ± 1.0 ms [User: 12.5 ms, System: 5.5 ms]
Range (min … max): 18.6 ms … 21.9 ms 20 runs
Summary
rtest ran
15.06 ± 1.15 times faster than pytest
```
### Against the [`pydantic`](https://github.com/pydantic/pydantic) Repository
```
hyperfine --command-name pytest --command-name rtest "pytest --collect-only" "rtest --collect-only" --warmup 3 --runs 20
Benchmark 1: pytest
Time (mean ± σ): 2.777 s ± 0.031 s [User: 2.598 s, System: 0.147 s]
Range (min … max): 2.731 s … 2.864 s 20 runs
Benchmark 2: rtest
Time (mean ± σ): 61.2 ms ± 1.1 ms [User: 40.1 ms, System: 14.4 ms]
Range (min … max): 60.1 ms … 64.2 ms 20 runs
Summary
rtest ran
45.39 ± 0.95 times faster than pytest
```
## Quick Start
### Installation
```bash
pip install rtest
```
*Requires Python 3.9+*
### Basic Usage
```bash
rtest --collect-only
```
## Roadmap
Support executing tests, with parallelization built out of the box (bypassing [`pytest-xdist`](https://pypi.org/project/pytest-xdist/)). Currently, this works for some cases, but is not yet stable.
## Known Limitations
### Parametrized Test Discovery
`rtest` currently discovers only the base function names for parametrized tests (created with `@pytest.mark.parametrize`), rather than expanding them into individual test items during collection. For example:
```python
@pytest.mark.parametrize("value", [1, 2, 3])
def test_example(value):
assert value > 0
```
**pytest collection shows:**
```
test_example[1]
test_example[2]
test_example[3]
```
**rtest collection shows:**
```
test_example
```
However, when `rtest` executes tests using pytest as the executor, passing the base function name (`test_example`) to pytest results in identical behavior - pytest automatically runs all parametrized variants. This means test execution is functionally equivalent between the tools, but collection counts may differ.
### Test Class Inheritance Collection
When a test class inherits from another test class, `rtest` collects inherited test methods differently than `pytest`. While `pytest` shows inherited methods under each subclass that inherits them, `rtest` currently shows inherited methods only under the base class where they are defined. For example:
```python
# test_example.py
class TestAddNumbers:
def test_add_positive_numbers(self):
pass
def test_add_negative_numbers(self):
pass
# test_floating_numbers.py
from tests.test_example import TestAddNumbers
class TestAddFloatingNumbers(TestAddNumbers):
def test_add_simple_floats(self):
pass
```
**pytest collection shows:**
```
test_example.py::TestAddNumbers::test_add_positive_numbers
test_example.py::TestAddNumbers::test_add_negative_numbers
test_floating_numbers.py::TestAddNumbers::test_add_positive_numbers
test_floating_numbers.py::TestAddNumbers::test_add_negative_numbers
test_floating_numbers.py::TestAddFloatingNumbers::test_add_positive_numbers
test_floating_numbers.py::TestAddFloatingNumbers::test_add_negative_numbers
test_floating_numbers.py::TestAddFloatingNumbers::test_add_simple_floats
```
**rtest collection shows:**
```
test_example.py::TestAddNumbers::test_add_positive_numbers
test_example.py::TestAddNumbers::test_add_negative_numbers
test_floating_numbers.py::TestAddFloatingNumbers::test_add_positive_numbers
test_floating_numbers.py::TestAddFloatingNumbers::test_add_negative_numbers
test_floating_numbers.py::TestAddFloatingNumbers::test_add_simple_floats
```
We believe this difference is desirable, in that `TestAddNumbers` isn't collected twice from different modules.
### Path Separator Handling
`rtest` uses platform-specific path separators in test nodeids, while `pytest` normalizes all paths to use forward slashes (`/`) regardless of platform. For example:
**On Windows:**
- pytest shows: `tests/unit/test_example.py::test_function`
- rtest shows: `tests\unit\test_example.py::test_function`
**On Unix/macOS:**
- Both show: `tests/unit/test_example.py::test_function`
This difference is intentional as `rtest` preserves the native path format of the operating system.
## Contributing
We welcome contributions! See [Contributing Guide](CONTRIBUTING.rst).
## License
MIT - see [LICENSE](LICENSE) file for details.
---
## Acknowledgments
This project takes inspiration from [Astral](https://astral.sh) and leverages crates from [`ruff`].
Raw data
{
"_id": null,
"home_page": null,
"name": "rtest",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "testing, pytest, rust, performance",
"author": null,
"author_email": "Hugh Han <hughhan1@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/ec/80/59eab3eafb1eb8a393c4ebda82253b0bded2e77bf33e26a82fe4001a6c7e/rtest-0.0.31.tar.gz",
"platform": null,
"description": "# rtest\n\n[](https://badge.fury.io/py/rtest)\n[](https://pypi.org/project/rtest/)\n[](https://opensource.org/licenses/MIT)\n\nA Python test runner built with Rust, currently supporting high-performance test-collection, with the goal of being a drop-in replacement for [`pytest`](https://pytest.org).\n\n> **\u26a0\ufe0f Development Status**: This project is in early development (v0.0.x). Expect bugs, breaking changes, and evolving features as we work toward stability.\n\n## Performance\n\n*Benchmarks performed using [hyperfine](https://github.com/sharkdp/hyperfine) with 20 runs, 3 warmup runs per measurement, on an M4 Macbook Pro with 14 cores and 48GB RAM.* **More sophisticated benchmarks will be implemented in the future.**\n\n### Against the [`flask`](https://github.com/pallets/flask) Repository\n```\nhyperfine --command-name pytest --command-name rtest \"pytest --collect-only\" \"rtest --collect-only\" --warmup 3 --runs 20\nBenchmark 1: pytest\n Time (mean \u00b1 \u03c3): 229.9 ms \u00b1 2.6 ms [User: 184.5 ms, System: 37.4 ms]\n Range (min \u2026 max): 226.0 ms \u2026 235.4 ms 20 runs\n \nBenchmark 2: rtest\n Time (mean \u00b1 \u03c3): 35.8 ms \u00b1 1.2 ms [User: 18.1 ms, System: 10.7 ms]\n Range (min \u2026 max): 34.2 ms \u2026 40.3 ms 20 runs\n \nSummary\n rtest ran\n 6.41 \u00b1 0.23 times faster than pytest\n```\n\n### Against the [`httpx`](https://github.com/encode/httpx) Repository\n```\nhyperfine --command-name pytest --command-name rtest \"pytest --collect-only\" \"rtest --collect-only\" --warmup 3 --runs 20\nBenchmark 1: pytest\n Time (mean \u00b1 \u03c3): 310.1 ms \u00b1 18.6 ms [User: 259.3 ms, System: 42.6 ms]\n Range (min \u2026 max): 291.0 ms \u2026 344.4 ms 20 runs\n \nBenchmark 2: rtest\n Time (mean \u00b1 \u03c3): 20.6 ms \u00b1 1.0 ms [User: 12.5 ms, System: 5.5 ms]\n Range (min \u2026 max): 18.6 ms \u2026 21.9 ms 20 runs\n \nSummary\n rtest ran\n 15.06 \u00b1 1.15 times faster than pytest\n```\n\n### Against the [`pydantic`](https://github.com/pydantic/pydantic) Repository\n```\nhyperfine --command-name pytest --command-name rtest \"pytest --collect-only\" \"rtest --collect-only\" --warmup 3 --runs 20\nBenchmark 1: pytest\n Time (mean \u00b1 \u03c3): 2.777 s \u00b1 0.031 s [User: 2.598 s, System: 0.147 s]\n Range (min \u2026 max): 2.731 s \u2026 2.864 s 20 runs\n \nBenchmark 2: rtest\n Time (mean \u00b1 \u03c3): 61.2 ms \u00b1 1.1 ms [User: 40.1 ms, System: 14.4 ms]\n Range (min \u2026 max): 60.1 ms \u2026 64.2 ms 20 runs\n \nSummary\n rtest ran\n 45.39 \u00b1 0.95 times faster than pytest\n```\n\n## Quick Start\n\n### Installation\n\n```bash\npip install rtest\n```\n\n*Requires Python 3.9+*\n\n### Basic Usage\n\n```bash\nrtest --collect-only\n```\n\n## Roadmap\nSupport executing tests, with parallelization built out of the box (bypassing [`pytest-xdist`](https://pypi.org/project/pytest-xdist/)). Currently, this works for some cases, but is not yet stable.\n\n## Known Limitations\n\n### Parametrized Test Discovery\n`rtest` currently discovers only the base function names for parametrized tests (created with `@pytest.mark.parametrize`), rather than expanding them into individual test items during collection. For example:\n\n```python\n@pytest.mark.parametrize(\"value\", [1, 2, 3])\ndef test_example(value):\n assert value > 0\n```\n\n**pytest collection shows:**\n```\ntest_example[1]\ntest_example[2] \ntest_example[3]\n```\n\n**rtest collection shows:**\n```\ntest_example\n```\n\nHowever, when `rtest` executes tests using pytest as the executor, passing the base function name (`test_example`) to pytest results in identical behavior - pytest automatically runs all parametrized variants. This means test execution is functionally equivalent between the tools, but collection counts may differ.\n\n### Test Class Inheritance Collection\nWhen a test class inherits from another test class, `rtest` collects inherited test methods differently than `pytest`. While `pytest` shows inherited methods under each subclass that inherits them, `rtest` currently shows inherited methods only under the base class where they are defined. For example:\n\n```python\n# test_example.py\nclass TestAddNumbers:\n def test_add_positive_numbers(self):\n pass\n \n def test_add_negative_numbers(self):\n pass\n\n# test_floating_numbers.py \nfrom tests.test_example import TestAddNumbers\n\nclass TestAddFloatingNumbers(TestAddNumbers):\n def test_add_simple_floats(self):\n pass\n```\n\n**pytest collection shows:**\n```\ntest_example.py::TestAddNumbers::test_add_positive_numbers\ntest_example.py::TestAddNumbers::test_add_negative_numbers\ntest_floating_numbers.py::TestAddNumbers::test_add_positive_numbers\ntest_floating_numbers.py::TestAddNumbers::test_add_negative_numbers\ntest_floating_numbers.py::TestAddFloatingNumbers::test_add_positive_numbers\ntest_floating_numbers.py::TestAddFloatingNumbers::test_add_negative_numbers\ntest_floating_numbers.py::TestAddFloatingNumbers::test_add_simple_floats\n```\n\n**rtest collection shows:**\n```\ntest_example.py::TestAddNumbers::test_add_positive_numbers\ntest_example.py::TestAddNumbers::test_add_negative_numbers\ntest_floating_numbers.py::TestAddFloatingNumbers::test_add_positive_numbers\ntest_floating_numbers.py::TestAddFloatingNumbers::test_add_negative_numbers\ntest_floating_numbers.py::TestAddFloatingNumbers::test_add_simple_floats\n```\n\nWe believe this difference is desirable, in that `TestAddNumbers` isn't collected twice from different modules.\n\n### Path Separator Handling\n`rtest` uses platform-specific path separators in test nodeids, while `pytest` normalizes all paths to use forward slashes (`/`) regardless of platform. For example:\n\n**On Windows:**\n- pytest shows: `tests/unit/test_example.py::test_function`\n- rtest shows: `tests\\unit\\test_example.py::test_function`\n\n**On Unix/macOS:**\n- Both show: `tests/unit/test_example.py::test_function`\n\nThis difference is intentional as `rtest` preserves the native path format of the operating system.\n\n## Contributing\n\nWe welcome contributions! See [Contributing Guide](CONTRIBUTING.rst).\n\n## License\n\nMIT - see [LICENSE](LICENSE) file for details.\n\n---\n\n## Acknowledgments\n\nThis project takes inspiration from [Astral](https://astral.sh) and leverages crates from [`ruff`].\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python test runner built in Rust",
"version": "0.0.31",
"project_urls": {
"Homepage": "https://github.com/hughhan1/rtest",
"Issues": "https://github.com/hughhan1/rtest/issues",
"Repository": "https://github.com/hughhan1/rtest.git"
},
"split_keywords": [
"testing",
" pytest",
" rust",
" performance"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "929a302441f4af23e3d1069c017a8128736f160e9bbd9a00428c588c38a603d3",
"md5": "f284af7132386bf45a036ef4d637db39",
"sha256": "d0ad363f0df512eabdf5a00c198c5ab901059bcc2ea64bddcb5474e2130ffc81"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f284af7132386bf45a036ef4d637db39",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1532274,
"upload_time": "2025-07-23T02:33:41",
"upload_time_iso_8601": "2025-07-23T02:33:41.067357Z",
"url": "https://files.pythonhosted.org/packages/92/9a/302441f4af23e3d1069c017a8128736f160e9bbd9a00428c588c38a603d3/rtest-0.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f8c9ab70ba0927c154b214b59d7ced2cb2928f82e3ac96b211722b79efa7768d",
"md5": "3ce6785670d0a45bc7039bde6cd4e299",
"sha256": "c126ea51849bcbd9ceab1757a702529400e6eac9c515d98b07c261d17745c3d1"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp310-cp310-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "3ce6785670d0a45bc7039bde6cd4e299",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1492019,
"upload_time": "2025-07-23T02:33:42",
"upload_time_iso_8601": "2025-07-23T02:33:42.685575Z",
"url": "https://files.pythonhosted.org/packages/f8/c9/ab70ba0927c154b214b59d7ced2cb2928f82e3ac96b211722b79efa7768d/rtest-0.0.31-cp310-cp310-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c2e52cabe11ec009c6c26629ea46b8adad2004a4240095ff69464c072967be19",
"md5": "5a9863cbf4adc01514cefd1739d9793b",
"sha256": "9578f87b69c450e93a51881b2255de0a771126bd0b1810e80042b89a612bfb3e"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "5a9863cbf4adc01514cefd1739d9793b",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1335417,
"upload_time": "2025-07-23T02:33:43",
"upload_time_iso_8601": "2025-07-23T02:33:43.868674Z",
"url": "https://files.pythonhosted.org/packages/c2/e5/2cabe11ec009c6c26629ea46b8adad2004a4240095ff69464c072967be19/rtest-0.0.31-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4974705b12fd9cf436b5d90e705abece8fcdad96363fae141cd9d85b4d9068ff",
"md5": "8d95094a73a38cebed1f0d5cdde59d22",
"sha256": "03d0824a4ff32e7288ed9873f4920ffeb9409124e0b4ec89db47a40ee2807670"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "8d95094a73a38cebed1f0d5cdde59d22",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1452641,
"upload_time": "2025-07-23T02:33:47",
"upload_time_iso_8601": "2025-07-23T02:33:47.107594Z",
"url": "https://files.pythonhosted.org/packages/49/74/705b12fd9cf436b5d90e705abece8fcdad96363fae141cd9d85b4d9068ff/rtest-0.0.31-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "470f53a5e22b2be1c92c4364f790ae73102a0341938b011086af0de4de65a37e",
"md5": "c92a368d510cb7189940d8af9ac88c48",
"sha256": "5700f56fa8f71bd181e3a614c01568ad396c66a68a34d68428fe9d88993509cd"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "c92a368d510cb7189940d8af9ac88c48",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1412334,
"upload_time": "2025-07-23T02:33:48",
"upload_time_iso_8601": "2025-07-23T02:33:48.105310Z",
"url": "https://files.pythonhosted.org/packages/47/0f/53a5e22b2be1c92c4364f790ae73102a0341938b011086af0de4de65a37e/rtest-0.0.31-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1852b8a7f451c77e0886f6c427f3286259cf0eff4bc8a5cfceb2d7049329a644",
"md5": "a89caf39017173d5ec3af5c0222ae141",
"sha256": "15ccc176c0a1ae9c4efa803364fd49524dc4ceab98b200192c8db60325147382"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "a89caf39017173d5ec3af5c0222ae141",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1531749,
"upload_time": "2025-07-23T02:33:49",
"upload_time_iso_8601": "2025-07-23T02:33:49.443991Z",
"url": "https://files.pythonhosted.org/packages/18/52/b8a7f451c77e0886f6c427f3286259cf0eff4bc8a5cfceb2d7049329a644/rtest-0.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ae59ae7b1b0692208515aa59fbf9ee7a24a17a015cc585c021e23f4fd068d971",
"md5": "20032eeb4bbd95a08b898425595df336",
"sha256": "98183ca1f55a45a9fcfd9998e4c91357ce05644d18bdd10588838e1427ddabc8"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp311-cp311-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "20032eeb4bbd95a08b898425595df336",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1491861,
"upload_time": "2025-07-23T02:33:50",
"upload_time_iso_8601": "2025-07-23T02:33:50.691453Z",
"url": "https://files.pythonhosted.org/packages/ae/59/ae7b1b0692208515aa59fbf9ee7a24a17a015cc585c021e23f4fd068d971/rtest-0.0.31-cp311-cp311-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7b388983829b8c9ed5773d4a669dc34240787f2fad8fe07093743df9aff4459b",
"md5": "cb64f9aa4add3844f6e64a16f184ff7f",
"sha256": "531374a0d488fb587744f3fe4e2d1e5d2c0477c648970fa6565a3bd4cd9242fe"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "cb64f9aa4add3844f6e64a16f184ff7f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1335507,
"upload_time": "2025-07-23T02:33:51",
"upload_time_iso_8601": "2025-07-23T02:33:51.759132Z",
"url": "https://files.pythonhosted.org/packages/7b/38/8983829b8c9ed5773d4a669dc34240787f2fad8fe07093743df9aff4459b/rtest-0.0.31-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7d1abd1d7a6abdb1e41ad235d210ed4b1e1aa45be11546b1056f215850d6f763",
"md5": "b21043931764a6cff468c43dfd8b3f24",
"sha256": "5f437404be87c24234d9ae6b8ac41b4bd0645a038ff5bc31a11b4c04724aa4b2"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "b21043931764a6cff468c43dfd8b3f24",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1448531,
"upload_time": "2025-07-23T02:33:52",
"upload_time_iso_8601": "2025-07-23T02:33:52.760151Z",
"url": "https://files.pythonhosted.org/packages/7d/1a/bd1d7a6abdb1e41ad235d210ed4b1e1aa45be11546b1056f215850d6f763/rtest-0.0.31-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5dbc58b5f32b606f7762860c044776600b8681199429a7f20089777a2bb4afc0",
"md5": "445f354d74aa202a993ba108d74c4572",
"sha256": "c9b2fc45b21c162306e85a3f210e255b2552cfe346c2b0a30267fd43cbb90e3c"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "445f354d74aa202a993ba108d74c4572",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1409395,
"upload_time": "2025-07-23T02:33:53",
"upload_time_iso_8601": "2025-07-23T02:33:53.710565Z",
"url": "https://files.pythonhosted.org/packages/5d/bc/58b5f32b606f7762860c044776600b8681199429a7f20089777a2bb4afc0/rtest-0.0.31-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e5bdf0252193d50047f591aaef4f72e688ac540b4a0cca751e40d8e445247d99",
"md5": "c9463f983803befd871ed0673abec95e",
"sha256": "dc38280589b736f7c47a549ebe8c0d331c28d4a2c8685145df44454101247b32"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c9463f983803befd871ed0673abec95e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1531078,
"upload_time": "2025-07-23T02:33:54",
"upload_time_iso_8601": "2025-07-23T02:33:54.678440Z",
"url": "https://files.pythonhosted.org/packages/e5/bd/f0252193d50047f591aaef4f72e688ac540b4a0cca751e40d8e445247d99/rtest-0.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bd87d48b66939010bd22ac4cf559254ed663a336cb7bb4981e56aa1732713715",
"md5": "a37b89a6314749c694153b1f9efbd3d5",
"sha256": "509263fe8f3ddc9ee36fef241dbb37da7570a848c7083dd1fa582f2735f8ac5c"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp312-cp312-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "a37b89a6314749c694153b1f9efbd3d5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1491165,
"upload_time": "2025-07-23T02:33:55",
"upload_time_iso_8601": "2025-07-23T02:33:55.928279Z",
"url": "https://files.pythonhosted.org/packages/bd/87/d48b66939010bd22ac4cf559254ed663a336cb7bb4981e56aa1732713715/rtest-0.0.31-cp312-cp312-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2cc67b87c565ccb6035ea9902c0e1b9b95ff35ebac718f80e82e934086467579",
"md5": "53a3cb9ba059c73bc92c6f5c85e6f45a",
"sha256": "e07303c58147d98158e95ad66e5530e7b0b85b71eaafe1d81dc5c983a21ac02b"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "53a3cb9ba059c73bc92c6f5c85e6f45a",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1335434,
"upload_time": "2025-07-23T02:33:57",
"upload_time_iso_8601": "2025-07-23T02:33:57.041125Z",
"url": "https://files.pythonhosted.org/packages/2c/c6/7b87c565ccb6035ea9902c0e1b9b95ff35ebac718f80e82e934086467579/rtest-0.0.31-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3ccdc3682148d2136771d18634fe66226cef1c5c8b9d1dc58a82c7b055058b0e",
"md5": "a1571d2fe34a2e0718a7d0d9fa10a429",
"sha256": "59646866b38dfd339ae1d0f2a02565ada7309df8dc49b5bbf23780cc369671f2"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "a1571d2fe34a2e0718a7d0d9fa10a429",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1448635,
"upload_time": "2025-07-23T02:33:58",
"upload_time_iso_8601": "2025-07-23T02:33:58.325975Z",
"url": "https://files.pythonhosted.org/packages/3c/cd/c3682148d2136771d18634fe66226cef1c5c8b9d1dc58a82c7b055058b0e/rtest-0.0.31-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "11280d474a8df2c9db735c25fa304a61c952911366273f6a5953d551e95fa9d6",
"md5": "a87e82aedf393ac1e4012b8462c02d38",
"sha256": "f8817cf1e9809c3d0dff392430b8207b79d787a2e41eca36ed5fea29503a5adc"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "a87e82aedf393ac1e4012b8462c02d38",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1409423,
"upload_time": "2025-07-23T02:33:59",
"upload_time_iso_8601": "2025-07-23T02:33:59.770337Z",
"url": "https://files.pythonhosted.org/packages/11/28/0d474a8df2c9db735c25fa304a61c952911366273f6a5953d551e95fa9d6/rtest-0.0.31-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "97ba5f6edfe6f2d6ebf5f713773133be6416af9470afd5e1a5ebcae80c9fe730",
"md5": "b1ac88daf45fc2931c22b37a7da78750",
"sha256": "9295abe1f70f02efc63260ebc0f8f5c03d0b4896167ef2e845f4debea7f9119e"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b1ac88daf45fc2931c22b37a7da78750",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1530745,
"upload_time": "2025-07-23T02:34:01",
"upload_time_iso_8601": "2025-07-23T02:34:01.112807Z",
"url": "https://files.pythonhosted.org/packages/97/ba/5f6edfe6f2d6ebf5f713773133be6416af9470afd5e1a5ebcae80c9fe730/rtest-0.0.31-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a80cc6765f44407d42bc380d9dfbe2ee157ae6242734afffd8f6828d726d9ec1",
"md5": "c116a7f46e9866a41a5d17a98b2e043b",
"sha256": "208af13da3606fa6ffb2b939234ab66c87d3fd1696483227bcf10bd6ff8e2784"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp313-cp313-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "c116a7f46e9866a41a5d17a98b2e043b",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1490894,
"upload_time": "2025-07-23T02:34:02",
"upload_time_iso_8601": "2025-07-23T02:34:02.315337Z",
"url": "https://files.pythonhosted.org/packages/a8/0c/c6765f44407d42bc380d9dfbe2ee157ae6242734afffd8f6828d726d9ec1/rtest-0.0.31-cp313-cp313-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a85df1d7ce6ad16919e7006e068ca682432eb1e3518aeab5817daf7f58d3e7de",
"md5": "ae050b1f65ce4b8744a189c9cf4f0eee",
"sha256": "08a66d40bde0c62ac97c352f0853ca6b3972bcbf8d3e182afdf0d1efdb9f95c1"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp313-cp313t-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "ae050b1f65ce4b8744a189c9cf4f0eee",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1491658,
"upload_time": "2025-07-23T02:34:04",
"upload_time_iso_8601": "2025-07-23T02:34:04.653386Z",
"url": "https://files.pythonhosted.org/packages/a8/5d/f1d7ce6ad16919e7006e068ca682432eb1e3518aeab5817daf7f58d3e7de/rtest-0.0.31-cp313-cp313t-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dbc3ed83d8ac6beacf4c523341ea1e88706467fc4f09c94b93897201f45bac36",
"md5": "46f81c4b32e79f50d38f2cce058763ec",
"sha256": "4405952d3835a61cd4ed99c84b3abc24f05ec6ee0a5207cf59984c162f0f8ac7"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "46f81c4b32e79f50d38f2cce058763ec",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1335161,
"upload_time": "2025-07-23T02:34:03",
"upload_time_iso_8601": "2025-07-23T02:34:03.275221Z",
"url": "https://files.pythonhosted.org/packages/db/c3/ed83d8ac6beacf4c523341ea1e88706467fc4f09c94b93897201f45bac36/rtest-0.0.31-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "05d138dfda73f28241df4ce15b41c6644860e98e909677b42322e9f01599cc03",
"md5": "e1552d8be80cec34e3955ffdc16c3d6b",
"sha256": "1130b1eb625c6961ad65dc55bf77db4938e4c9f87fce1c5ed414990ea9d7b3c9"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e1552d8be80cec34e3955ffdc16c3d6b",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 1531050,
"upload_time": "2025-07-23T02:34:05",
"upload_time_iso_8601": "2025-07-23T02:34:05.653227Z",
"url": "https://files.pythonhosted.org/packages/05/d1/38dfda73f28241df4ce15b41c6644860e98e909677b42322e9f01599cc03/rtest-0.0.31-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8a1770a382aa716e08c3203d2b66b1e3aa4b474bc914850fd61a92fca565f6a3",
"md5": "a85ce8227114acdaa7a64c62491b772b",
"sha256": "f9593c55af680570323a903722fc0653e493694a24348634d7ece5c28dcc5cd9"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "a85ce8227114acdaa7a64c62491b772b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1532587,
"upload_time": "2025-07-23T02:34:06",
"upload_time_iso_8601": "2025-07-23T02:34:06.836876Z",
"url": "https://files.pythonhosted.org/packages/8a/17/70a382aa716e08c3203d2b66b1e3aa4b474bc914850fd61a92fca565f6a3/rtest-0.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "efd267769e91a9d099050dd26e73d87cabca17bc6f7116ccac3cd729a25f98ec",
"md5": "801e809b3fa4feba6988ef67c78d73ed",
"sha256": "3d5e85460705c163c4cafaa607b1df784bd9eda130c2318168426e8059f93ecf"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp39-cp39-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "801e809b3fa4feba6988ef67c78d73ed",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1492328,
"upload_time": "2025-07-23T02:34:07",
"upload_time_iso_8601": "2025-07-23T02:34:07.976155Z",
"url": "https://files.pythonhosted.org/packages/ef/d2/67769e91a9d099050dd26e73d87cabca17bc6f7116ccac3cd729a25f98ec/rtest-0.0.31-cp39-cp39-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "39b8ab37eb27e0ce16e52ce6fd105cd2c264b34405059bfd7735e6c86835756e",
"md5": "777a9dd91a1f4080ac351cb6d594d847",
"sha256": "58b7f950ccb196f5c7ccb519f8b187dfb863bfd74d16d366712efab8dbe1f0a6"
},
"downloads": -1,
"filename": "rtest-0.0.31-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "777a9dd91a1f4080ac351cb6d594d847",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1335475,
"upload_time": "2025-07-23T02:34:09",
"upload_time_iso_8601": "2025-07-23T02:34:09.015635Z",
"url": "https://files.pythonhosted.org/packages/39/b8/ab37eb27e0ce16e52ce6fd105cd2c264b34405059bfd7735e6c86835756e/rtest-0.0.31-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d44d015209ec8c8d7fea59c2b9b10a809b96b753a96063695d6ab498ab4a4f14",
"md5": "82fb0fe2ab190bc6f928b25611b5c3e7",
"sha256": "a3a3ab68926e8ad8cd718971ec3750c835e9e205f925820f6734b3929eaee0cb"
},
"downloads": -1,
"filename": "rtest-0.0.31-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "82fb0fe2ab190bc6f928b25611b5c3e7",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 1533154,
"upload_time": "2025-07-23T02:34:10",
"upload_time_iso_8601": "2025-07-23T02:34:10.015039Z",
"url": "https://files.pythonhosted.org/packages/d4/4d/015209ec8c8d7fea59c2b9b10a809b96b753a96063695d6ab498ab4a4f14/rtest-0.0.31-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fedd4e0cbfdae1a9a868c437cda89d0e7a83908ff8fb723bd1325fa811468dea",
"md5": "8c6cb750c04fcbd325c13b13922fd8ef",
"sha256": "2be175885260795f6ea3a2c1f323521e35d5ceea884245698dbae39821a6cda6"
},
"downloads": -1,
"filename": "rtest-0.0.31-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "8c6cb750c04fcbd325c13b13922fd8ef",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 1493040,
"upload_time": "2025-07-23T02:34:11",
"upload_time_iso_8601": "2025-07-23T02:34:11.315946Z",
"url": "https://files.pythonhosted.org/packages/fe/dd/4e0cbfdae1a9a868c437cda89d0e7a83908ff8fb723bd1325fa811468dea/rtest-0.0.31-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "09226a0b9d663e3fb86b928734ad9c615f607b839234722760d2505f7cd7c387",
"md5": "cd0d76d5080dde40a821a65a1b3b1381",
"sha256": "d79b96e63e93aa22caa2ac192d8f45802bbc69cd05a73f29f271e84e3133f305"
},
"downloads": -1,
"filename": "rtest-0.0.31-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "cd0d76d5080dde40a821a65a1b3b1381",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.9",
"size": 1532776,
"upload_time": "2025-07-23T02:34:12",
"upload_time_iso_8601": "2025-07-23T02:34:12.438859Z",
"url": "https://files.pythonhosted.org/packages/09/22/6a0b9d663e3fb86b928734ad9c615f607b839234722760d2505f7cd7c387/rtest-0.0.31-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fa27a78243bfb5399028eafcd35048ea36da827a7c0425d2a744378f8120c77d",
"md5": "2d970f60f71c2429010321ae83285ace",
"sha256": "b7b989cdba5c775ce7d74c96c425da7b2dc41ff681280fc8a1ee23a75d0d7104"
},
"downloads": -1,
"filename": "rtest-0.0.31-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "2d970f60f71c2429010321ae83285ace",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.9",
"size": 1492673,
"upload_time": "2025-07-23T02:34:13",
"upload_time_iso_8601": "2025-07-23T02:34:13.901928Z",
"url": "https://files.pythonhosted.org/packages/fa/27/a78243bfb5399028eafcd35048ea36da827a7c0425d2a744378f8120c77d/rtest-0.0.31-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c3bb514cd91b91e3215225ee5fac4771f541784a8b1271a1b84d0610f3bfcc1d",
"md5": "1dd109688fd1cdf0b0f4f9d8b5b850b4",
"sha256": "7ed4944a6e2e18f8ebcf0226dac9069ebe6c01095cac482d4357d2b1b341c56a"
},
"downloads": -1,
"filename": "rtest-0.0.31-pp39-pypy39_pp73-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "1dd109688fd1cdf0b0f4f9d8b5b850b4",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 1492713,
"upload_time": "2025-07-23T02:34:15",
"upload_time_iso_8601": "2025-07-23T02:34:15.346555Z",
"url": "https://files.pythonhosted.org/packages/c3/bb/514cd91b91e3215225ee5fac4771f541784a8b1271a1b84d0610f3bfcc1d/rtest-0.0.31-pp39-pypy39_pp73-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ec8059eab3eafb1eb8a393c4ebda82253b0bded2e77bf33e26a82fe4001a6c7e",
"md5": "03b6fd4e06bee3120252ec21cc25d625",
"sha256": "76f48786477e680c8f4bfa77e1d51dd24afd6408e9d07cc6d1e1f4c570951858"
},
"downloads": -1,
"filename": "rtest-0.0.31.tar.gz",
"has_sig": false,
"md5_digest": "03b6fd4e06bee3120252ec21cc25d625",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 1938054,
"upload_time": "2025-07-23T02:34:16",
"upload_time_iso_8601": "2025-07-23T02:34:16.725394Z",
"url": "https://files.pythonhosted.org/packages/ec/80/59eab3eafb1eb8a393c4ebda82253b0bded2e77bf33e26a82fe4001a6c7e/rtest-0.0.31.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-23 02:34:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "hughhan1",
"github_project": "rtest",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "rtest"
}