Name | rtest JSON |
Version |
0.0.36
JSON |
| download |
home_page | None |
Summary | Python test runner built in Rust |
upload_time | 2025-08-06 17:43:11 |
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/38/03/f113f002336f9523ddfd5368455ab07f0266fa42409e3826fcb6a4f09f46/rtest-0.0.36.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.36",
"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": "529369792aa30aed0648e186a128b6034482974a188b33f29ca61ddbc4706c1f",
"md5": "702d5d237cc6cbfc05d4771f7da275ba",
"sha256": "50a9c638505418ccecea0646acc19e4bebc4c8d4d09e8da6bbaeeea65307a777"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "702d5d237cc6cbfc05d4771f7da275ba",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1536700,
"upload_time": "2025-08-06T17:42:34",
"upload_time_iso_8601": "2025-08-06T17:42:34.007628Z",
"url": "https://files.pythonhosted.org/packages/52/93/69792aa30aed0648e186a128b6034482974a188b33f29ca61ddbc4706c1f/rtest-0.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "02f4c0ea3c776bb4ec8777058e8429bee82578f5176614f0ff24f8f45bf13646",
"md5": "cdef61df34fc54402b20bac3cd71f731",
"sha256": "b476bd7075dbc5d6e45993dcd511f7bab02af2d38562ddc0a7d544284e556277"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp310-cp310-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "cdef61df34fc54402b20bac3cd71f731",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1497032,
"upload_time": "2025-08-06T17:42:35",
"upload_time_iso_8601": "2025-08-06T17:42:35.842787Z",
"url": "https://files.pythonhosted.org/packages/02/f4/c0ea3c776bb4ec8777058e8429bee82578f5176614f0ff24f8f45bf13646/rtest-0.0.36-cp310-cp310-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "63a35068d3ed743ac0800da4ba3f1a4e4903634202f132ae5a24bb6a49a511ee",
"md5": "883627d9fee2aa1080f0faf576958692",
"sha256": "950845c7b87d0d21b9e8526438eb462c74c7c06cbcea6bd56a30fbc1b5c300b0"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "883627d9fee2aa1080f0faf576958692",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 1341251,
"upload_time": "2025-08-06T17:42:37",
"upload_time_iso_8601": "2025-08-06T17:42:37.231702Z",
"url": "https://files.pythonhosted.org/packages/63/a3/5068d3ed743ac0800da4ba3f1a4e4903634202f132ae5a24bb6a49a511ee/rtest-0.0.36-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "86a441ff1492e2f52ec7e7d6b8aef24e337363411b0b15c9b45ea9627c1ce830",
"md5": "2ec1e87660d3934738a4e1db5d9641cc",
"sha256": "6acc583469f602a6e490255497fb3191be1225d8ad7c28ffae23053b576f4b2f"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "2ec1e87660d3934738a4e1db5d9641cc",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1456163,
"upload_time": "2025-08-06T17:42:38",
"upload_time_iso_8601": "2025-08-06T17:42:38.285144Z",
"url": "https://files.pythonhosted.org/packages/86/a4/41ff1492e2f52ec7e7d6b8aef24e337363411b0b15c9b45ea9627c1ce830/rtest-0.0.36-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7479762d5cbc4f713c7ea1204e165962a4a7b9902fb55adbc925b0c0b714e500",
"md5": "7d10e74d4119c71085522c70b372ce23",
"sha256": "1355e100e521570c194dd59aa4730223cb79d21310607a9a18e5e2df5560db4e"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "7d10e74d4119c71085522c70b372ce23",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1414765,
"upload_time": "2025-08-06T17:42:39",
"upload_time_iso_8601": "2025-08-06T17:42:39.560686Z",
"url": "https://files.pythonhosted.org/packages/74/79/762d5cbc4f713c7ea1204e165962a4a7b9902fb55adbc925b0c0b714e500/rtest-0.0.36-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6e4fd90136d33807f9a7dd4210e8cbddb159526b57fc2f8c71e5429e13cb0cce",
"md5": "08409edb4abff4ac0ac52d039275547d",
"sha256": "051b6dbc1b9f21b33bed0c89bdaaf3cd57ed35a45a6ff746f4318e2af22d9f15"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "08409edb4abff4ac0ac52d039275547d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1536227,
"upload_time": "2025-08-06T17:42:41",
"upload_time_iso_8601": "2025-08-06T17:42:41.073282Z",
"url": "https://files.pythonhosted.org/packages/6e/4f/d90136d33807f9a7dd4210e8cbddb159526b57fc2f8c71e5429e13cb0cce/rtest-0.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8fc26acd0845d50160d6972185e22dd8fe098f776fcdf61fcb8acccfa4971c71",
"md5": "2c111c681e7ef03f186c8fb3c238a4b8",
"sha256": "5ef42a63b5d015a6edaa78c3aec8fc6bbddabfdeffa48ca9336eeb0ea0d00796"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp311-cp311-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "2c111c681e7ef03f186c8fb3c238a4b8",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1496406,
"upload_time": "2025-08-06T17:42:42",
"upload_time_iso_8601": "2025-08-06T17:42:42.171816Z",
"url": "https://files.pythonhosted.org/packages/8f/c2/6acd0845d50160d6972185e22dd8fe098f776fcdf61fcb8acccfa4971c71/rtest-0.0.36-cp311-cp311-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "81c979a33177cf404c953e3288405a67ff2ee5417e24a8abf2bf92fb0553b7e6",
"md5": "db734d93331fb3f2508c134822c092a4",
"sha256": "c846ff2e60a2326c54f6f85561463e91b202a0c426d46f255e1fe15b53466a1a"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "db734d93331fb3f2508c134822c092a4",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 1341088,
"upload_time": "2025-08-06T17:42:43",
"upload_time_iso_8601": "2025-08-06T17:42:43.539867Z",
"url": "https://files.pythonhosted.org/packages/81/c9/79a33177cf404c953e3288405a67ff2ee5417e24a8abf2bf92fb0553b7e6/rtest-0.0.36-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "659a0a4c23a37268b8304565584b9472bd5e45a80c86eec1c33a0b25e22acf15",
"md5": "35ffaaa75e82274348e0f3fd626e9eca",
"sha256": "e4d8ca3b7924cbc183a5817cc5aac4ad0d706dac50986f30d9bc3d0de20fb904"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "35ffaaa75e82274348e0f3fd626e9eca",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1451802,
"upload_time": "2025-08-06T17:42:44",
"upload_time_iso_8601": "2025-08-06T17:42:44.726342Z",
"url": "https://files.pythonhosted.org/packages/65/9a/0a4c23a37268b8304565584b9472bd5e45a80c86eec1c33a0b25e22acf15/rtest-0.0.36-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f0e46c18473c37f0a2895dadb6b39208f165daf83d1927499b5952e413d056e3",
"md5": "7e8715c597cea3642259e51a1a018385",
"sha256": "8113d8c55e56bf2c7bf332952431d6723089ec7de74b17390351284efeb5e3dc"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "7e8715c597cea3642259e51a1a018385",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1413015,
"upload_time": "2025-08-06T17:42:46",
"upload_time_iso_8601": "2025-08-06T17:42:46.138340Z",
"url": "https://files.pythonhosted.org/packages/f0/e4/6c18473c37f0a2895dadb6b39208f165daf83d1927499b5952e413d056e3/rtest-0.0.36-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6d6f9c28918244c62ff56b98118406c6124e8d640f4bd2d057b22078bc3c9c4c",
"md5": "35de43843999d5a0bd9f7c993cc5086e",
"sha256": "68cea9287d8b837592ac1735a8c14a7a9dc1e96d375a66cb046b84418e8bb3ba"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "35de43843999d5a0bd9f7c993cc5086e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1535136,
"upload_time": "2025-08-06T17:42:47",
"upload_time_iso_8601": "2025-08-06T17:42:47.223324Z",
"url": "https://files.pythonhosted.org/packages/6d/6f/9c28918244c62ff56b98118406c6124e8d640f4bd2d057b22078bc3c9c4c/rtest-0.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cf199cffe2ed557a1e9591b22d7ae58b9298bc40e34f5d488c538ecef346fc50",
"md5": "4b85139bd12b3135f943989170430156",
"sha256": "3f38805ccd9eb18ff1c84478bac16f72807289daedee4f034acb3481c4c14940"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp312-cp312-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "4b85139bd12b3135f943989170430156",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1495859,
"upload_time": "2025-08-06T17:42:48",
"upload_time_iso_8601": "2025-08-06T17:42:48.337626Z",
"url": "https://files.pythonhosted.org/packages/cf/19/9cffe2ed557a1e9591b22d7ae58b9298bc40e34f5d488c538ecef346fc50/rtest-0.0.36-cp312-cp312-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "24327a08de53970e6c9df88008d322ca89ef7d37cc9734de072506a4e4727870",
"md5": "28e54cc4e0ce12055bcbc85a7f62e554",
"sha256": "b903e68784465cd4b12aebc0b8c6a23ab33b658e0f8e6dd7a2f6463c5a16e2cc"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "28e54cc4e0ce12055bcbc85a7f62e554",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 1340165,
"upload_time": "2025-08-06T17:42:49",
"upload_time_iso_8601": "2025-08-06T17:42:49.447875Z",
"url": "https://files.pythonhosted.org/packages/24/32/7a08de53970e6c9df88008d322ca89ef7d37cc9734de072506a4e4727870/rtest-0.0.36-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "58e854b8de8ca76012bb6568dee73ec3d0f0e4e4b39eacfbe985567b0d49ba64",
"md5": "db20c3e7f20f21e2a90518e88db71f62",
"sha256": "b7fa37815b7614ee5aebed91e4e75d0828abc5df2c43402b3796fa8dc508b43b"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "db20c3e7f20f21e2a90518e88db71f62",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1451781,
"upload_time": "2025-08-06T17:42:50",
"upload_time_iso_8601": "2025-08-06T17:42:50.507902Z",
"url": "https://files.pythonhosted.org/packages/58/e8/54b8de8ca76012bb6568dee73ec3d0f0e4e4b39eacfbe985567b0d49ba64/rtest-0.0.36-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c12e8a62d0c84aae79446324cb1f4ae2cefce15a1680d9b0d65beaf9679d1a52",
"md5": "623bf543f86d854bd73772427978617a",
"sha256": "54b9b48acb0430d7d3587859dd85ec8594188f97bffd7dba657feec626b929e1"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "623bf543f86d854bd73772427978617a",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1413048,
"upload_time": "2025-08-06T17:42:51",
"upload_time_iso_8601": "2025-08-06T17:42:51.722931Z",
"url": "https://files.pythonhosted.org/packages/c1/2e/8a62d0c84aae79446324cb1f4ae2cefce15a1680d9b0d65beaf9679d1a52/rtest-0.0.36-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1979e40f596997b089b485d1f282b011f12ed437f2855265022c1f57412feb21",
"md5": "191d8c5a27cce515ae81b3f0f6d34cdf",
"sha256": "99d737f1917bb40e22b97e29fc79a023f42737df456d9ca1cf416f4ba3a5eb5c"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "191d8c5a27cce515ae81b3f0f6d34cdf",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1535030,
"upload_time": "2025-08-06T17:42:52",
"upload_time_iso_8601": "2025-08-06T17:42:52.823167Z",
"url": "https://files.pythonhosted.org/packages/19/79/e40f596997b089b485d1f282b011f12ed437f2855265022c1f57412feb21/rtest-0.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1d852c4bf0060751405bb158d70a73167d7247b25d89540ea7de319b5c866554",
"md5": "d3b358ed74b90ba480291cd153c710d6",
"sha256": "512514bfa3124a5c5ccbc3246420c0cf1f8ec8a0924c7e43c80f6c082addd736"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp313-cp313-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "d3b358ed74b90ba480291cd153c710d6",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1495426,
"upload_time": "2025-08-06T17:42:54",
"upload_time_iso_8601": "2025-08-06T17:42:54.252599Z",
"url": "https://files.pythonhosted.org/packages/1d/85/2c4bf0060751405bb158d70a73167d7247b25d89540ea7de319b5c866554/rtest-0.0.36-cp313-cp313-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6ce5dea72d3196a6e41b5d7e4564829e74f4c98014fb66667029fd83eff54801",
"md5": "adc45df773e599cacd17ab7f6ba72b3d",
"sha256": "1a0cfffe3fcdb1442a92911a7367916e2dbd7cd923a14e47147c0340ec2f384f"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp313-cp313t-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "adc45df773e599cacd17ab7f6ba72b3d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1495894,
"upload_time": "2025-08-06T17:42:56",
"upload_time_iso_8601": "2025-08-06T17:42:56.740826Z",
"url": "https://files.pythonhosted.org/packages/6c/e5/dea72d3196a6e41b5d7e4564829e74f4c98014fb66667029fd83eff54801/rtest-0.0.36-cp313-cp313t-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e0e41af0187da5523abf8058fa0eff8853e66e310aea77887875d3093011aaec",
"md5": "23951b48e31c75e5f4e96767e87468ab",
"sha256": "c8c98882c62ea1c8791f4cf737105723a1af72edca24df48caf3b8cb751b8fe1"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "23951b48e31c75e5f4e96767e87468ab",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 1340116,
"upload_time": "2025-08-06T17:42:55",
"upload_time_iso_8601": "2025-08-06T17:42:55.613099Z",
"url": "https://files.pythonhosted.org/packages/e0/e4/1af0187da5523abf8058fa0eff8853e66e310aea77887875d3093011aaec/rtest-0.0.36-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bf9e9b6aa88c4d85f0d2b0eb3939c47fe28444ee1983f609c318622f95e7b7ae",
"md5": "f5a51a43d358a3e377fecd799b1b0177",
"sha256": "111986995643eebd791b3c2bb4a27e39f74a3cbced476489dc7847f10f0383f0"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f5a51a43d358a3e377fecd799b1b0177",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 1535048,
"upload_time": "2025-08-06T17:42:58",
"upload_time_iso_8601": "2025-08-06T17:42:58.550646Z",
"url": "https://files.pythonhosted.org/packages/bf/9e/9b6aa88c4d85f0d2b0eb3939c47fe28444ee1983f609c318622f95e7b7ae/rtest-0.0.36-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d79bfdc9269b6d1693b3e750cac355df2f5074372a32300244d82cf2bee5bb94",
"md5": "96077dda25ff8b508bb1a6e667fb4d74",
"sha256": "96cc3be82da0bacd371bb406380ebd8cec2814b550d67a2e177cf8cfd54489f7"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "96077dda25ff8b508bb1a6e667fb4d74",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1537078,
"upload_time": "2025-08-06T17:42:59",
"upload_time_iso_8601": "2025-08-06T17:42:59.955793Z",
"url": "https://files.pythonhosted.org/packages/d7/9b/fdc9269b6d1693b3e750cac355df2f5074372a32300244d82cf2bee5bb94/rtest-0.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b23a55c1a2bd1f0ea6c757c07e45bb7a43bedf9b6e06d0629590319da930573e",
"md5": "bc992a986532af69041ca81a05352022",
"sha256": "68045258a04d51543c0b5be90fc03a3e48b10235ffb697a624efb470f068c6df"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp39-cp39-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "bc992a986532af69041ca81a05352022",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1497013,
"upload_time": "2025-08-06T17:43:01",
"upload_time_iso_8601": "2025-08-06T17:43:01.133796Z",
"url": "https://files.pythonhosted.org/packages/b2/3a/55c1a2bd1f0ea6c757c07e45bb7a43bedf9b6e06d0629590319da930573e/rtest-0.0.36-cp39-cp39-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "11932bb06541516f44a44dfdeff5dd5a379af1a08639179effb2bcd13b06faa0",
"md5": "5b26d0b18b28077d3c3bf985f67159b7",
"sha256": "41a4e355205ca4036419b1c3285ddc4097c8d98991756b17d9593af8fabcf996"
},
"downloads": -1,
"filename": "rtest-0.0.36-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "5b26d0b18b28077d3c3bf985f67159b7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 1341181,
"upload_time": "2025-08-06T17:43:02",
"upload_time_iso_8601": "2025-08-06T17:43:02.440538Z",
"url": "https://files.pythonhosted.org/packages/11/93/2bb06541516f44a44dfdeff5dd5a379af1a08639179effb2bcd13b06faa0/rtest-0.0.36-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "931b221d461c4a1e4abc570e321d02d8784137a7eb61d3def64b15fb57dcef7e",
"md5": "87196f5b0d79458e7b41b4589eea0d51",
"sha256": "365a3e7fd65f1363f9ff359805049b53476d886ee6d1130da96a9ac22b2a00b0"
},
"downloads": -1,
"filename": "rtest-0.0.36-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "87196f5b0d79458e7b41b4589eea0d51",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 1537740,
"upload_time": "2025-08-06T17:43:03",
"upload_time_iso_8601": "2025-08-06T17:43:03.510901Z",
"url": "https://files.pythonhosted.org/packages/93/1b/221d461c4a1e4abc570e321d02d8784137a7eb61d3def64b15fb57dcef7e/rtest-0.0.36-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "455319618e2b9b30bb7c2deb0cf4991694dc121201bf94ec0f01ca25c61b4efc",
"md5": "7aa9fdf865d74b0c06d7493a378d57a5",
"sha256": "57922b15955cf2af835a7f520b486f8eb46176f82f0eaab725767b6f5f72c997"
},
"downloads": -1,
"filename": "rtest-0.0.36-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "7aa9fdf865d74b0c06d7493a378d57a5",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 1497496,
"upload_time": "2025-08-06T17:43:05",
"upload_time_iso_8601": "2025-08-06T17:43:05.000277Z",
"url": "https://files.pythonhosted.org/packages/45/53/19618e2b9b30bb7c2deb0cf4991694dc121201bf94ec0f01ca25c61b4efc/rtest-0.0.36-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c836ee92753096fe1ecd0f854efe9f88c028a3a54bd40604c72cf3b6110f7fd4",
"md5": "6c3c657eb230d636c03475970aebaea0",
"sha256": "847cfe130c89b42120b59363f8c735b10596a3857f94f817ad5c6b47888f4e21"
},
"downloads": -1,
"filename": "rtest-0.0.36-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "6c3c657eb230d636c03475970aebaea0",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.9",
"size": 1537349,
"upload_time": "2025-08-06T17:43:07",
"upload_time_iso_8601": "2025-08-06T17:43:07.318823Z",
"url": "https://files.pythonhosted.org/packages/c8/36/ee92753096fe1ecd0f854efe9f88c028a3a54bd40604c72cf3b6110f7fd4/rtest-0.0.36-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e7c97cfddcb6ed0e82f7064e23089c641b76b3870b994121e6f7b6119e9b4e84",
"md5": "6765bbd547ca07c587e9b1f935a94816",
"sha256": "988415a170b82cad094d8ca6eb61e39d321ae6f3b00648a2d15eef594f9fc771"
},
"downloads": -1,
"filename": "rtest-0.0.36-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "6765bbd547ca07c587e9b1f935a94816",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.9",
"size": 1497366,
"upload_time": "2025-08-06T17:43:08",
"upload_time_iso_8601": "2025-08-06T17:43:08.795954Z",
"url": "https://files.pythonhosted.org/packages/e7/c9/7cfddcb6ed0e82f7064e23089c641b76b3870b994121e6f7b6119e9b4e84/rtest-0.0.36-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9cf7e361e9e84583a8c069e37649fe2af14b4cbffd5d336cb1ee27745cf1966d",
"md5": "62ed4c2ba09e55756af9b2d12dead9aa",
"sha256": "9d889722523d82a955faeb8a9773955a28084f6ab7b518f20880609b7b4d8458"
},
"downloads": -1,
"filename": "rtest-0.0.36-pp39-pypy39_pp73-manylinux_2_34_aarch64.whl",
"has_sig": false,
"md5_digest": "62ed4c2ba09e55756af9b2d12dead9aa",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 1497365,
"upload_time": "2025-08-06T17:43:09",
"upload_time_iso_8601": "2025-08-06T17:43:09.974547Z",
"url": "https://files.pythonhosted.org/packages/9c/f7/e361e9e84583a8c069e37649fe2af14b4cbffd5d336cb1ee27745cf1966d/rtest-0.0.36-pp39-pypy39_pp73-manylinux_2_34_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3803f113f002336f9523ddfd5368455ab07f0266fa42409e3826fcb6a4f09f46",
"md5": "e6119df15753575b94f5d35d0b9f50c0",
"sha256": "f820fdb1b820603de38dda3454d2ee9b09fa5be7d9eb5d94bbb80d819665e8c8"
},
"downloads": -1,
"filename": "rtest-0.0.36.tar.gz",
"has_sig": false,
"md5_digest": "e6119df15753575b94f5d35d0b9f50c0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 2034237,
"upload_time": "2025-08-06T17:43:11",
"upload_time_iso_8601": "2025-08-06T17:43:11.158358Z",
"url": "https://files.pythonhosted.org/packages/38/03/f113f002336f9523ddfd5368455ab07f0266fa42409e3826fcb6a4f09f46/rtest-0.0.36.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-06 17:43:11",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "hughhan1",
"github_project": "rtest",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "rtest"
}